Альфа. Баги нужно чистить и чистить.
Инструкция:
распаковать куда-нибудь. К файлу 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 - координаты относительно окна.