FreeType 2. Как с ним работать, непонятно-о-о-о-о.

Тема в разделе "WASM.BEGINNERS", создана пользователем Z3N, 29 июн 2009.

  1. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Вопрос в общем-то состоит в том, что нет хорошей документации, а та, что висит на их сайте и идёт в комплекте - сумбурная и неполная. Тупо перечисление всех функций, нет даже внизу ссылок на похожие ф-ии (а-ля мсдн). С инициализацией всё хорошо и отрендерить я могу, а вот дальше. Во-первых, цвет - напрямую его установить нельзя, на сайте есть пример с каллбаком, но та картинка, которая получается меня не устраивает по качеству. Во-вторых, в каком формате возвращается картинка - RGB or RGBA? В третьих, как с помощью виндовс сделать битмап из того, что возвращает ФТ? Я пробовал CreateBitmap, вызов успешен, но при попытке получить размеры битмапа через GetBitmapDimensiosEX (как-то так) - облом. Может кто знает как с ней работать или ссылки на хорошую литературу (можно русскую). Буду благодарен.
     
  2. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Как сделать так, чтобы компилер перестал мнить себя умней чем я ???
    Объявляю я переменную, для доступа к данным...
    int *ziza;
    byte a;
    Если её объявить без звёздочки, то не получиться конструкция a=*ziza;, а если со звёздочкой, то хрень какая-то получается...
    Я делаю ziza+=3, компиллер делает что-то вроде этого ziza+=3*4. Я понимаю, что он три раза прибавил размер переменной ziza, но мне этого не надо. Я минут пять не мог понять почему я так резво вылетаю за границы буфера... пока не посмотел на дамп памяти, а он там скакал через 12-ть байтов.... memset - тоже козёл редкостный, насколько я понимаю, он должен вазвращать позицию, на которой остановился, а он всё время возвращает одно и тоже число (как должно быть на самом деле не знаю, забыл когда им пользовался). Хорошо, что я асм знаю лучше чем С... конструкция __asm add ziza,3; работает просто чудестно :). И на этом можно было бы и успокоиться, но мне интересно, можно ли тоже самое сделать не через жопу? Чисто академический интерес....
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Z3N
    > int *ziza ... делаю ziza+=3, компиллер делает что-то вроде этого ziza+=3*4.
    Для Си/Си++ это логично .

    ps За три дня мог бы и ссылку дать на то, с чем борешься.
     
  4. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Я пишу свой код с помощью FreeType2 (www.freetype.org), код тривиальный да и к тому-же его сейчас нет под рукой...
     
  5. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Z3N
    С FreeType 2 Overview, из раздела Requirements: "FreeType 2 is written in industry-standard ANSI C and should compile easily with any compliant C compiler. "
    Поэтому ответом на твой вопрос "Как сделать так, чтобы компилер перестал мнить себя умней чем я ???" будет - учи язык программирования Си.
     
  6. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Понял, в смысле я его должен научить нормально компилировать? А то он плохо учился в школе :):):).
    Я и так пишу на С, а учить его - это через край....

    Ещё. Может кто знает, почему если создаёшь див секцию CreateDibSection, то изображение в ней получается следующего формат ->
    Во-первых, это не RGB, а BGR!!
    Во-вторых, изображение перевёрнуто....
    Я всё делал по примерам и там ничего подобного не говорилось, может это зависит от конкретного компа?
    В-третьих, если использовать SetDiBits, то винда сначала создаст промежуточный контекст, скопирует в него, а потом уже из промежуточного контекста скопирует куда надо... так вот, а как обстоят дела с диб секцией? Это ведь тоже обман, не могу же я писать прямо в видеопамять ;). Но формат, в котором храниться изображение, говорит о том, что винда может копировать прямо в видеопамять нашу диб секцию.
    Вот код, может я что-то не так делаю (скомпилировать вы его всё равно не сможете)
    Код (Text):
    1. #include "FFF.h"
    2. HDC     ACDC;
    3. void UseFreeType(void)
    4. {
    5.     int             error;
    6.     FT_Library      library;
    7.     FT_Face         face;
    8.     int             *bmp;
    9.     int             wid;
    10.     int             hei;
    11.     int             i;
    12.     byte            tmp[4];
    13.     int             *ziza;
    14.     int             CoDC;
    15.     int             can_buff;
    16.     int             tmpq;
    17.     BITMAPINFOHEADER    bih={sizeof (BITMAPINFOHEADER),0,0,1,32,BI_RGB,0,0,0,0,0};
    18.     //BITMAPINFO        canvas={&bih,0};
    19.     error=FT_Init_FreeType(&library);
    20.     error=FT_New_Face(library,"G:\\freetype-2.3.9\\builds\\win32\\vc2008\\Debug\\CALIBRI.TTF", 0,&face);
    21.     error = FT_Set_Char_Size(face,
    22.         0,       /* char_width in 1/64th of points  */
    23.         320*64,   /* char_height in 1/64th of points *///16
    24.         96,     /* horizontal device resolution    */
    25.         96 );   /* vertical device resolution      */
    26. #pragma warning(disable:47 24)
    27.         error=FT_Load_Char(face,169,FT_LOAD_RENDER);//90
    28. #pragma warning(default:47 24)
    29.         bmp=face->glyph->bitmap.buffer;
    30.         wid=face->glyph->bitmap.width;
    31.         hei=face->glyph->bitmap.rows;
    32.         error=fopen("word.raw","wb");
    33.         fwrite(&wid,1,4,error);
    34.         fwrite(&hei,1,4,error);
    35.         fwrite(bmp,1,wid*hei,error);
    36.         ziza=malloc(wid*hei*4);
    37.         //////////////////////////////////////////////////////////////////////////
    38.         bih.biHeight=hei;
    39.         bih.biWidth=wid;
    40.         CoDC=CreateCompatibleDC(ACDC);
    41.         i=CreateDIBSection(ACDC,&bih,DIB_RGB_COLORS,&can_buff,0,0);
    42.         ziza=can_buff;
    43.         fread(can_buff,1,wid*hei*4,fopen("G:\\freetype-2.3.9\\builds\\win32\\vc2008\\Debug\\snowdrop.raw","rb"));
    44.         SelectObject(CoDC,i);
    45. /*
    46.         for (i=hei*wid;i!=0;i--)
    47.         {
    48.             //error-=4;
    49.             //memcpy(can_buff,error+(hei*wid*4),4);
    50.             __asm mov ecx,[can_buff];
    51.             __asm mov eax,[ecx];
    52.             __asm bswap eax;
    53.             //__asm sar eax,8;
    54.             __asm mov [ecx],eax;
    55.             can_buff+=4;
    56.         };*/
    57.  
    58.         //////////////////////////////////////////////////////////////////////////
    59.         for (i=0;i!=wid*hei;i++)
    60.         {
    61.             byte alpha;
    62.             __asm push eax;
    63.             __asm push ecx;
    64.             __asm mov eax,[ziza];
    65.             __asm mov eax,[eax];
    66.             __asm mov DWORD PTR [tmp],eax;
    67.             __asm mov ecx,[bmp];
    68.             __asm mov eax,[i]
    69.             __asm movzx eax,byte ptr[ecx+eax];
    70.             __asm mov [alpha],al;
    71.             __asm pop ecx;
    72.             __asm pop eax;
    73.             tmp[2]=(0xFF*alpha+((255-alpha)*tmp[2]))/255;
    74.             tmp[1]=(0x00*alpha+((255-alpha)*tmp[1]))/255;
    75.             tmp[0]=(0x00*alpha+((255-alpha)*tmp[0]))/255;
    76.             memcpy(ziza,&tmp,3);
    77.             __asm add ziza,4;
    78.         }
    79.  
    80.         i=BitBlt(ACDC,0,0,wid,hei,CoDC,0,0,SRCCOPY);
    81.         fwrite(can_buff,1,wid*hei*4,(fopen("color.raw","wb")));
    82.     return;
    83. };
    Сильно не ругаться - это черновик, где я обкатываю всё новое. Поэтому так нерационально написано.
     
  7. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Не принимайте ниже написанное близко к сердцу... или в крайнем случае поставте бутылочку с волокордином рядом :).
    Всем привет! Мне есть чем порадовать вас - я всё-таки нашёл как увеличить переменную типа *ziza на три байта, а не на двеннадцать, как того хочет компилятор. Всё оказалось очень просто, но! перед тем как прочитать дальше я прошу тех, кто настаивал на чтении документации по С++, пойти и попросить кого-нибудь, чтобы им плюнули в лицо.... Сделали?! Отлично! А теперь идите и умойтесь потому, что истина истиной - но правила гигиены ещё никто не отменял :). Вот собсвенно и способ:
    Код (Text):
    1. (DWORD)ziza+=3;
    Оказалось, что для того, чтобы узреть сию истнину не нужны книжки от лукавого, а нужно всего лишь чуточку дзена ;). Каюсь, в начале я свернул с истинной трапинки (ведь она было узкая и это был тернистый путь в прямом смысле слова...), и предпочёл шестиполосный хайвей. Я пролистал две книги по С++, но так и не нашёл нужного мне ответа. Но потом, медитируя над исходниками фритайп я увидел довольно занятную конструкцию, вроде той, что выше. И ещё даже не нажав на кнопку F5 я уже знал, что нашёл искомое. И фигня то, что мне понадобилась неделя для нахождения результата.... Дзен он на то и дзен - суеты не терпит.
    Одно только странно - тему просмотрело четыресто человек и никто не знал этого (или не хотел говорить...). Форум программистов вроде же %).Ну, да ладно, Бог с ним...
    P.S.:
    Вот, я тут решил не предовать анафеме книжки по С++, хоть те две, что я читал, были судя по всему дерьмовыми. Я уже после нахождения ответа читал книгу "C++ Inside" и там в контексте! (это очень важно, прямых описаний я пока не видел(всё ещё читаю эту книгу)) была подобная конструкция. Это в очередной раз доказывает, что книжки нужно использовать в последнюю очередь. Ведь если ты умираешь от жажды в пустыне, то нужно в начале пить вкусную и чистую воду, чтобы были силы, а горсть протухлой и зловонной воды оставить напоследок (да, это я так про книги). IMHO Умение хорошо программировать зависит не от количесва прочитанных книг, а вычесляется как сумма часов проведённых в попытках накодить что-нибудь полезное, время проведённое в отладчике, время потраченное на продумывание устройства программы и дальше по мелочи.... Что-то я разошёлся... надо с этим завязывать... Всё! Пока!
     
  8. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Z3N, не знаю, кто такой freetype2, но три байта лучше прибавлять так: ((void*)моя_переменная)+=3
    А то указатели, они такие, сволочи - сегодня 32 бита, а завтра могут и все 128 оказаться.
     
  9. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    CyberManiac
    > три байта лучше прибавлять так: ((void*)моя_переменная)+=3
    Какой компилятор такое переварит?

    Z3N
    > Что-то я разошёлся...
    IMHO единственная здравая мысль из #7.
     
  10. galileopro

    galileopro Олег

    Публикаций:
    0
    Регистрация:
    13 мар 2010
    Сообщения:
    36
    Адрес:
    Питер
    Z3N, я никак не пойму, почему нельзя прибавить 4 с помощью ассмовской вставки? Ассемблер уже не будет такого вытворять. Просто из-за перегрузки оператора присваивания в сях, компилятор мог неверно определить тип аргумента: указатель или число. Просто выгрузить эту премнную в регистр eax, прибавить 4 и отправить с помощью mov обратно. Или это н поможет?
     
  11. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Можно, но если так делать при любом случае, когда компилятор неверно интерпретирует, то получится программа на асме с С++ вставками :). Теперь я уже точно не помню, как я тогда выкрутился....

    P.S.:
    Компилятор FASM 3.0 - ассемблер, с возможностью вставки на С или Крестах, а также Диез.
     
  12. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Так ты вообще ничего не прибавишь.
    Не хочу тебя расстраивать, но компилятор обрабатывает исходник в соответствии со стандартом, а не с тем, что ты там думал когда код писал.
    Потому что прибавляется размер типа на который указывает указатель.
    Код (Text):
    1. int *ptr;
    2. ptr+=3
    прибавит к адресу 3*sizeof(int)
    Хочешь три байта - так и пиши ptr=(int *)((char *)ptr+3);
    И кто козёл? :)

    В общем как тебе уже правильно сказали - учи язык.
     
  13. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Вот точно не я. И после этих слов мне сразу стало понятно кто козёл... :).

    Я прекрасно знаю закон Мерфи "Компьютер делает не то, что вы хотите, а то, что вы ему приказали". Можно перенести и на кресты.

    Э, вы дату первого поста видели??? С того времени уже много байт утекло, а добавлял я так как вы написали. Только вот с подобными конструкциями код превращается в нечто эзотерическое (у меня было функция бленда).

    Неявная логика не есть гуд. Я до этого нигде в учебниках не встречал описания этих правил.
     
  14. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    Z3N
    это базовые правила арифметики ссылок. хорошо расписаны много где. например, у кернигана и ричи

    это дает возможность гибкости. если вам это сложно и непонятно - не используйте это. вас никто не заставляет. вы даже можете перейти на более простой в использовании язык. не имеющий арифметики ссылок. а С и С++ выбирают как раз заради этой "эзотерики".
     
  15. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    И чем тут дата поможет?
    Вот это написано сегодня:
    За пол года можно было бы осознать, что компилятор всегда интерпретирует верно, если он соответствует стандарту.
    И проблемы исключительно в твоём коде.
    Вообще-то закон Мерфи немного не о том: http://ru.wikipedia.org/wiki/Закон_Мёрфи
    Зачем объявлять указатель на int, если ты через него хочешь к байтам адресоваться?
    Не проще объявить указатель на char и писать своё любимое ptr+=3?
     
  16. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Вот насчёт всегда я очень сомневаюсь! Вы думаете, что если программа написана по стандарту, то она напрочь лишена ошибок???
    Наивный чукотский юноша!

    Вы так ослеплены своим стремлением обелить во что бы это ни стало кресты, что не заметели мои слова, которые я запостил.
    Это та же мысль, только выражена по-другому. Я согласен, что компилятор делает то, на что запрограммирован (иначе было бы странно). Читайте внимательно, пожалуйста!

    Видимо были причины... :) Если вы настаиваете, то я могу и поискать. Мой знакомы любил повторять в таких ситуациях "А можно и водку через стакан полизать...".

    Законы Мерфи это не только те законы которые придумал Мёрфи. Есть и другие, придуманные разными людьми. Позволю себе небольшое отступление, чтобы до вас лучше дошло.

    ПОМЕЩИК И ТРАВА

    Басня

    На родину со службы воротясь,
    Помещик молодой, любя во всем успехи,
    Собрал своих крестьян: «Друзья, меж нами связь —
    Залог утехи;
    Пойдемте же мои осматривать поля!»
    И, преданность крестьян сей речью воспаля,
    Пошел он с ними купно.
    «Что ж здесь мое?» — "Да все,— ответил голова.—
    Вот Тимофеева трава…»
    "Мошенник! — тот вскричал,— ты поступил преступно!

    Корысть мне недоступна;
    Чужого не ищу; люблю свои права!
    Мою траву отдать, конечно, пожалею;
    Но эту возвратить немедля Тимофею!»

    Оказия сия, по мне, уж не нова.
    Антонов есть огонь, но нет того закону,
    Чтобы всегда огонь принадлежал Антону.
     
  17. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    В этой теме басня про траву очень кстати надо отметить...