Перейти к содержанию
    

Нужна помощь по Freetype

Приветствую.

Нужно сделать растеризатор шрифтов, все, что нашел из более-менее путного - это библиотека fretype, сделал простой пример, и получил неясности, поясню лучше на примере:

Сейчас использую прогу от микрочипа Graphic resource convertor, она преобразует ttf фонт в такой вид:

* Character - 1049
 ***********************************/
.byte 0x00, 0x00, 0x00, 0x00        //                                 
.byte 0xE0, 0x07, 0xFC, 0x00        //      ******       ******        
.byte 0xE0, 0x07, 0xFC, 0x00        //      ******       ******        
.byte 0xE0, 0x07, 0xFC, 0x00        //      ******       ******        
.byte 0xC0, 0x0F, 0x7E, 0x00        //       ******     ******         
.byte 0x80, 0xFF, 0x3F, 0x00        //        ***************          
.byte 0x00, 0xFF, 0x1F, 0x00        //         *************           
.byte 0x00, 0xFC, 0x07, 0x00        //           *********             
.byte 0x00, 0x00, 0x00, 0x00        //                                 
.byte 0x00, 0x00, 0x00, 0x00        //                                 
.byte 0xF8, 0x03, 0xFC, 0x03        //    *******        ********      
.byte 0xF8, 0x03, 0xFC, 0x03        //    *******        ********      
.byte 0xF8, 0x03, 0xFE, 0x03        //    *******       *********      
.byte 0xF8, 0x03, 0xFE, 0x03        //    *******       *********      
.byte 0xF8, 0x03, 0xFF, 0x03        //    *******      **********      
.byte 0xF8, 0x03, 0xFF, 0x03        //    *******      **********      
.byte 0xF8, 0x83, 0xFF, 0x03        //    *******     ***********      
.byte 0xF8, 0x83, 0xFF, 0x03        //    *******     ***********      
.byte 0xF8, 0xC3, 0xFF, 0x03        //    *******    ************      
.byte 0xF8, 0xC3, 0xFF, 0x03        //    *******    ************      
.byte 0xF8, 0xE3, 0xFB, 0x03        //    *******   ***** *******      
.byte 0xF8, 0xF3, 0xFB, 0x03        //    *******  ****** *******      
.byte 0xF8, 0xF3, 0xF9, 0x03        //    *******  *****  *******      
.byte 0xF8, 0xFB, 0xF9, 0x03        //    ******* ******  *******      
.byte 0xF8, 0xFB, 0xF8, 0x03        //    ******* *****   *******      
.byte 0xF8, 0xFF, 0xF8, 0x03        //    *************   *******      
.byte 0xF8, 0x7F, 0xF8, 0x03        //    ************    *******      
.byte 0xF8, 0x7F, 0xF8, 0x03        //    ************    *******      
.byte 0xF8, 0x3F, 0xF8, 0x03        //    ***********     *******      
.byte 0xF8, 0x3F, 0xF8, 0x03        //    ***********     *******      
.byte 0xF8, 0x1F, 0xF8, 0x03        //    **********      *******      
.byte 0xF8, 0x0F, 0xF8, 0x03        //    *********       *******      
.byte 0xF8, 0x0F, 0xF8, 0x03        //    *********       *******      
.byte 0xF8, 0x07, 0xF8, 0x03        //    ********        *******      
.byte 0xF8, 0x07, 0xF8, 0x03        //    ********        *******      
.byte 0xF8, 0x03, 0xF8, 0x03        //    *******         *******      
.byte 0xF8, 0x03, 0xF8, 0x03        //    *******         *******      
.byte 0x00, 0x00, 0x00, 0x00        //                                 
.byte 0x00, 0x00, 0x00, 0x00        //                                 
.byte 0x00, 0x00, 0x00, 0x00        //                                 
.byte 0x00, 0x00, 0x00, 0x00        //                                 
.byte 0x00, 0x00, 0x00, 0x00        //                                 
.byte 0x00, 0x00, 0x00, 0x00        //                                 
.byte 0x00, 0x00, 0x00, 0x00        //                                 
.byte 0x00, 0x00, 0x00, 0x00        //          
 

Т.е. видно, что сверху и снизу символа есть пробелы(код 0)

И это не просто прихоть разработчика - символы бывают разной высоты, например (Д, Ц, Ё или Й) поэтому, чтобы строка смотрелась линейно, они и добавили эти пробелы, freetype - же, эти пробелы не добавляет, вот пример на рисунке:

 

Но есть некоторые параметры полученные из структуры  bitmap = &face->glyph->bitmap


bitmap->width  - это ширина
bitmap->rows   - длина
bitmap->pitch - кол-во байт на строку

а вот эти что-то непонятное

face->glyph->advance.x
g->left
g->top
вроде, как последние две как-раз и должны указывать на отступы перед символом, но там какая-то фигня...

Кто в курсе, может работал с данной либой, как привести это все в путный вид (выровнять)?

 

fretype.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подробностей сейчас не помню, но когда-то давно писал конвертер (еще с cp1251, хе-хе):

fontconv.c

cp1251.h

 

Процедура вывода символа:

int gui_put_char(uint32_t ch, uint32_t x, uint32_t y, GUI_FONT *font,
		GUI_COLOR fcolor, GUI_COLOR bcolor)
{
	GLYPH_INFO *glyph = &font->glyphs[ch - font->first_ch];
	uint8_t *dataptr;
	uint32_t rx, ry, a;
	DISP_COLOR c[16];

	if((ch < font->first_ch) || (ch > font->last_ch))
		return 0;
	dataptr = &font->glyph_bitmaps[glyph->bm_offset[0] |
		glyph->bm_offset[1] << 8 | glyph->bm_offset[2] << 16];
	x += glyph->x;
	y += font->height - font->bot - glyph->y;

	c[0] = bcolor;
	for(a = 1; a < 15; a++)
		c[a] = gamma_corr(disp_cl_blend(fcolor, bcolor, a * 16));
	c[15] = fcolor;

	for(ry = 0; ry < glyph->height; ry++)
	{
		for(rx = 0; rx < glyph->width; rx++)
		{
			if((rx & 1) == 0)
				a = *dataptr >> 4;
			else
				a = *dataptr++ & 0xf;
			disp_set_dot(x + rx, y + ry, c[a]);
		}
		if(rx & 1)
			dataptr++;
	}
	return glyph->x_off;
}

 

В общем, можно разобраться, что куда идет в результате.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 минут назад, aaarrr сказал:

В общем, можно разобраться,

disp_set_dot(x + rx, y + ry, c[a]);

Это простая печать точки с заданным цветом?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, aaarrr сказал:

В общем, можно разобраться

Все равно не заработало, задал координаты 0.0  считает у симв "!"-1.0   """ 0.0  "#"0.11  "$"0.13  что совсем не соотв тому, что считал GRC.  Видимо эта либа очень своеобразна, по началу думал, что она дает готовый паттерн для отображения на экране, но тут видать еще нетривиальная матобработка нужна, ладно, попользуюсь пока GRC. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 minutes ago, mantech said:

задал координаты 0.0  считает у симв "!"-1.0   """ 0.0  "#"0.11  "$"0.13

Что это за цифры?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 минут назад, aaarrr сказал:

Что это за цифры?

Взял из вашей проги расчет координат начала отрисовки символа, как будто я хочу нарисовать с координат X=0 Y=0, 

на основе этого:

x += glyph->x;
y += font->height - font->bot - glyph->y;
 

А что написал -  это результаты для конкр. символа.

 

Т.е. если б это считал GRC, то для символа "Й" должно быть 3.1

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 минуты назад, aaarrr сказал:

И что смущает? отрицательное смещение по x?

Там нет ничего отрицательного, а смущает то, что смещение по Y для символов #  $ доходит до 13, при размере самого символа 17, как это может быть? Я могу это понять такое смещение у символа запятой, т.к. она рисуется почти внизу, относительно других...

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Символ "#":

x = 1, y = 15, width = 12, height = 15, x_off = 14

font.height = 22

font.bot = 5

font->height - font->bot - glyph->y = 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, aaarrr сказал:

Символ "#":

Какой ttf шрифт был задан и его размер в ppt?

x = 1, y = 15, - это начальные координаты?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, mantech said:

Какой ttf шрифт был задан и его размер в ppt?

LiberationSans-Regular.ttf, 17

 

1 minute ago, mantech said:

x = 1, y = 15, - это начальные координаты?

Для глифа "#". Вычисление экранных показал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, aaarrr сказал:

Для глифа "#". Вычисление экранных показал.

Хм.. а начальные тогда какие?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Just now, mantech said:

Хм.. а начальные тогда какие?

x += glyph->x;
y += font->height - font->bot - glyph->y;

1 и 2 соответственно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...