TrueType

Discussing libraries simplifying applications development
  • SoUrcerer
    Желание есть, а времени мало.
    Напиши что к чему, попробую прикрутить к плееру.
  • Не, пока что такое еще не прикручивается. :(
  • Поправил баги, добавил возможность получения 8-битной маски и вывода цветного текста на битмап. Добавлю функции вывода по координатам и подсчета размера выводимой строки - и тогда можно будет пользоваться.
  • SoUrcerer
    Так со статической линковкой ?
  • COFF-библиотека, обычная для Колибри...
  • SoUrcerer
    Ну они и статически линкуются при желании
  • Так статически линковать уже больше года можно. И freetype, и freetype2, и эту штуку - прям сразу так бац, и линковать.
  • Freetype толстый. Хотя для плеера это не критично.
  • Ну, эта штука - stb_truetype.h - просто подключается как один заголовочный файл, там 500 строк комментов, около 500 строк демок, включенных как if 0 ... end if, и остальное - код для файлов. Нужно загрузить файл ttf в переменную, затем инициализировать движок одной командой, получить высоту символа и вывести его. И так для всей строки.
  • tt_lib.7z (219.79 KiB)
    Downloaded 385 times
    Альфа. Баги нужно чистить и чистить.

    Инструкция:
    распаковать куда-нибудь. К файлу tttest рядом положить любой ttf-шрифт, обозвав его deja.ttf. Библиотеку truetype.obj скопировать в /rd/1/lib. Запускать tttest. Растянуть окошко, увидеть надпись.

    Почему оно так глючит?
    Не знаю, пока что разбираться нет сил.

    А чего truetype.obj такой большой? Потому что в библиотеку вкомпилирован шрифт DejaVu Sans.

    Почему оно так тормозит? Потому что сначала получает информацию о местоположении окна, затем читает с экрана область необходимого размера, затем делает слияние 8-битной маски прозрачности шрифта с прочитанным изображением, и затем выводит это изображение на экран. Полагаю, блиттер с поддержкой альфа-канала ускорил бы процесс отрисовки.

    Как эту дрянь скомпилировать? Для компилирования библиотеки, нужно поместить stb.h, font_droid.h и lib.c в одну папку. Затем компилятором, способным генерировать COFF, получить обычный o-файл. Что-то вроде
    i586-mingw32msvc-gcc -c lib.c -o lib.o -O2
    Библиотека готова, можно ее переименовывать и копировать на rd, чтобы проверять.

    Компиляция тестового файла не менее тривиальна. Требуется menuetlibc, настроенные переменные окружения (MENUETDEV то есть), и всё. Компилируется командой
    make -f make

    Какие функции поддерживаются?
    int (* __stdcall truetype)(char *text, char *buffer, char *screen, int width, int height);
    int (* __stdcall get_width)(char *text, char *buffer, int height);
    int (* __stdcall get_length)(char *text, char *buffer, int height, int max_len);
    int (* __stdcall text_out)(char *text, char *buffer, int height, int color, int x, int y);

    Здесь:
    buffer - это указатель на массив, содержащий в себе содержимое ttf-шрифта,
    text - указатель на текст, который нас интересует.
    Если buffer==-1, то используется шрифт, вкомпилированный в библиотеку (стандартный).

    truetype выводит 8-битную маску прозрачности текста в screen (переменную нужно заранее определить). Ширина и высота области передаются параметрами width и height, при этом высота текста будет подогнана под height.

    get_width возвращает длину текста в пикселах для заданной высоты. То есть, если мы хотим узнать, какой буфер нам нужен для строки "АБВГД" высотой 200 пикселов, то мы должны вызвать эту функцию.

    get_length возвращает количество символов, которые могут быть выведены данным шрифтом данной высоты при условии, что длина текста в пикселах не должна быть более max_len. То есть, у нас есть строка "АБВГД", но мы не знаем, поместится ли эта строка целиком в 100 пикселов, или нет. Мы должны вызвать get_length, и убедиться, что возвращенное значение равно длине строки. Эта функция может быть нужна для вывода многострочных и длинных текстов.

    text_out выводит строку символов на экран. color - это цвет в формате 0x00RRGGBB, x и y - координаты относительно окна.
    Attachments
    font_h.7z (98.95 KiB)
    Downloaded 341 times
  • Нашел и исправил. Сейчас перевыложу.
  • :mrgreen: такие вот дела.
    Attachments
    Screenshot-90.png
    Screenshot-90.png (23.89 KiB)
    Viewed 7512 times
    tt_lib.7z (220.74 KiB)
    Downloaded 347 times
  • Забыл сказать, что исправленная версия демки требует наличия шрифта 5.ttf в той же папке.
  • Судя по всему, ширина строк определяется не всегда корректно. Еще почему-то иногда падает. Надо разбираться.
  • Who is online

    Users browsing this forum: No registered users and 5 guests