Page 2 of 6

Re: TrueType

Posted: Mon Jun 18, 2012 11:36 am
by SoUrcerer
В качестве разминки для ума решил довести порт до конца. Уже умею получать рабочую библиотеку, которая генерирует битмапы, но еще не очень работает корректное масштабирование. Размер библиотеки получился меньше, чем box_lib.
В общем, править баги надо много и долго ещё. :)
Если кто-то желает помочь - пишите в ЛС, с удовольствием отправлю исходники и расскажу, как компилировать. Если никто не желает - займусь вылавливанием багов когда-нибудь в другой раз.

Re: TrueType

Posted: Mon Jun 18, 2012 1:36 pm
by Serge
SoUrcerer
Желание есть, а времени мало.
Напиши что к чему, попробую прикрутить к плееру.

Re: TrueType

Posted: Mon Jun 18, 2012 2:00 pm
by SoUrcerer
Не, пока что такое еще не прикручивается. :(

Re: TrueType

Posted: Mon Jun 18, 2012 2:43 pm
by SoUrcerer
Поправил баги, добавил возможность получения 8-битной маски и вывода цветного текста на битмап. Добавлю функции вывода по координатам и подсчета размера выводимой строки - и тогда можно будет пользоваться.

Re: TrueType

Posted: Mon Jun 18, 2012 2:50 pm
by Serge
SoUrcerer
Так со статической линковкой ?

Re: TrueType

Posted: Mon Jun 18, 2012 4:24 pm
by SoUrcerer
COFF-библиотека, обычная для Колибри...

Re: TrueType

Posted: Mon Jun 18, 2012 4:59 pm
by Serge
SoUrcerer
Ну они и статически линкуются при желании

Re: TrueType

Posted: Mon Jun 18, 2012 5:10 pm
by SoUrcerer
Так статически линковать уже больше года можно. И freetype, и freetype2, и эту штуку - прям сразу так бац, и линковать.

Re: TrueType

Posted: Mon Jun 18, 2012 5:12 pm
by Serge
Freetype толстый. Хотя для плеера это не критично.

Re: TrueType

Posted: Mon Jun 18, 2012 5:18 pm
by SoUrcerer
Ну, эта штука - stb_truetype.h - просто подключается как один заголовочный файл, там 500 строк комментов, около 500 строк демок, включенных как if 0 ... end if, и остальное - код для файлов. Нужно загрузить файл ttf в переменную, затем инициализировать движок одной командой, получить высоту символа и вывести его. И так для всей строки.

Re: TrueType

Posted: Wed Jun 20, 2012 11:02 am
by SoUrcerer
tt_lib.7z (219.79 KiB)
Downloaded 388 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 - координаты относительно окна.

Re: TrueType

Posted: Wed Jun 20, 2012 12:29 pm
by SoUrcerer
Нашел и исправил. Сейчас перевыложу.

Re: TrueType

Posted: Wed Jun 20, 2012 12:47 pm
by SoUrcerer
:mrgreen: такие вот дела.

Re: TrueType

Posted: Wed Jun 20, 2012 2:01 pm
by SoUrcerer
Забыл сказать, что исправленная версия демки требует наличия шрифта 5.ttf в той же папке.

Re: TrueType

Posted: Wed Jun 20, 2012 2:38 pm
by SoUrcerer
Судя по всему, ширина строк определяется не всегда корректно. Еще почему-то иногда падает. Надо разбираться.