TrueType

Discussing libraries simplifying applications development
  • Увеличил скорость отрисовки путем одноразовой загрузки шрифта в память, для этого добавлена новая функция font_init. Пока что она не грузит дополнительные шрифты, но поправить - дело двух минут. Вместо get_width стоит заглушка, её нужно исправить, но времени на это у меня сейчас нет.
    Исправленная версия дает терпимую скорость отрисовки в qemu и абсолютно достаточную для комфортной работы на реальной машине. Если бы рисовалось всё в фреймбуфер перед выводом на экран (чтоб не дергать по сто раз 7ю системную функцию) - скорость была бы отличной и в qemu.

    С этим нужно что-то делать.
    Attachments
    c.7z (608.25 KiB)
    Downloaded 387 times
  • Исходники можно?
    Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!
  • Специально загрузил файл, последний в этой теме. Убедился - исходники из него никуда не делись. Баги тоже :)
  • Так это последние наработки? Тогда всё, вопросов нет, кончились)
    Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!
  • На самом деле, у меня есть версия с нуля - но она пока что только в Linux работает. И её нужно конкретно править.
  • Я вот подкорректировал библиотеку для своих нужд. Сделал так, что она выводит Юникод-строки, загружает шрифт из файла (в архив положил один, с ним у меня она нормально работает). Рисует только на заданном фоне. И ещё умеет рисовать в память. Функция text_out_mem рисует строку в память и возвращает указатель на память с рисунком. Формат такой - dword ширина рисунка, BBGGRR...BBGGRR сам рисунок. Высота известна в параметре к функции потому и не добавлял в буфер. После использования его следует освободить ф. 68,13 . Вот. Пока я ей не занимаюсь(сейчас другие задачи, да и текущих функций мне хватает). В архив положил файлик с прототипами функций(вроде там по названиям всё понятно). Кушает много стека, я выделял 10КБ. Да ещё. Если не ошибаюсь, то раньше был баг с определением ширины строки. В результате появлялись лишние пробелы. Вот теперь этого бага не видно. Не знаю, в чём он был, но сейчас нету :|
    Attachments
    ttf.zip (230.21 KiB)
    Downloaded 354 times
    Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!
  • Переписка с Робертом. Что как делать, надеюсь, он не против.

    Насчёт шрифта два варианта: если библиотека та, что мной выложена, то в unsigned char *FontData находится путь к шрифту. Иначе шрифт зашит в библиотеке(но тогда там функция init_font выглядит так: int __stdcall init_font(stbtt_fontinfo *font) ).
    "stbtt_fontinfo *font - это что за структура??" - сам не знаю :D . Я просто давал пустой буфер в 200байт и всё отлично работало. Сейчас пример проги в читаемый вид переделаю.

    Так, пардон, ошибся. unsigned char *FontData - это загруженный в память файл шрифта(просто загруженный, без всякой обработки)

    Вот рабочий пример. Пути только поправить надо. Шрифты многие открывает, по крайней мере arial.ttf из ХРюши нормально рисует. Вот.
    И ещё.

    Code: Select all

    typedef struct stbtt_fontinfo
    {
    void * userdata;
    unsigned char * data; // pointer to .ttf file
    int fontstart; // offset of start of font
    
    int numGlyphs; // number of glyphs, needed for range checking
    
    int loca,head,glyf,hhea,hmtx,kern; // table locations as offset from start of .ttf
    int index_map; // a cmap mapping for our chosen character encoding
    int indexToLocFormat; // format needed to map from glyph index to glyph
    } stbtt_fontinfo;
    Так что 200байт - много :) Видимо просто личные данные шрифта для его рисования.
    Файл TTF.ASM

    Кирилл
    > Иначе шрифт зашит в библиотеке
    а в библиотеке уже есть зашитый шрифт?

    Роберт
    В правленной мной, нет. В прежних да.
    Attachments
    TTF.asm (2.66 KiB)
    Downloaded 340 times
    Из хаоса в космос
  • Вообще над этим портом нужно знатно поработать. Выбрать API, добавить менеджер шрифтов (чтоб не хранить по сто раз один и тот же шрифт в памяти).
  • Это второе. Первое, что надо сделать - это научить библиотеку нормально рисовать мелкие буквы. В винде мелкие буквы четко видно, в линуксе гораздо хуже. Точно не понял, но, видимо, где-то в файле шрифта лежат готовые буквы для маленького размера(ну не всегда, конечно). Их винда и юзает.
    Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!
  • Ноуп, это плохо. Потому что это издевательство над буквами. 256 градаций прозрачности достаточно для нормальных маленьких букв.
    И да, в шрифт не кладут маленькие буквы, плохие системы сами решают, как калечить несчастные буквы небольших размеров.
  • bubach wrote:here's a link to a small truetype support file in C.
    http://mollyrocket.com/forums/viewtopic.php?t=736
    SoUrcerer wrote:So, I managed to compile this library.
    The link seems broken. :cry:
    I would like to see the c source.
    Greetings from Seppe
  • You can find sources at svn, programs/libraries/truetype or something like this.
  • "Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -- and a lot of courage -- to move in the opposite direction." Albert Einstein
  • Из хаоса в космос
  • Who is online

    Users browsing this forum: No registered users and 5 guests