mantech 35 17 января, 2021 Опубликовано 17 января, 2021 · Жалоба Приветствую. Нужно сделать растеризатор шрифтов, все, что нашел из более-менее путного - это библиотека 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 вроде, как последние две как-раз и должны указывать на отступы перед символом, но там какая-то фигня... Кто в курсе, может работал с данной либой, как привести это все в путный вид (выровнять)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 17 января, 2021 Опубликовано 17 января, 2021 · Жалоба Подробностей сейчас не помню, но когда-то давно писал конвертер (еще с 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; } В общем, можно разобраться, что куда идет в результате. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 35 17 января, 2021 Опубликовано 17 января, 2021 · Жалоба 16 минут назад, aaarrr сказал: В общем, можно разобраться, disp_set_dot(x + rx, y + ry, c[a]); Это простая печать точки с заданным цветом? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 17 января, 2021 Опубликовано 17 января, 2021 · Жалоба 4 minutes ago, mantech said: Это простая печать точки с заданным цветом? Ага Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 35 17 января, 2021 Опубликовано 17 января, 2021 · Жалоба 6 минут назад, aaarrr сказал: Ага Понял, спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 35 17 января, 2021 Опубликовано 17 января, 2021 · Жалоба 1 час назад, aaarrr сказал: В общем, можно разобраться Все равно не заработало, задал координаты 0.0 считает у симв "!"-1.0 """ 0.0 "#"0.11 "$"0.13 что совсем не соотв тому, что считал GRC. Видимо эта либа очень своеобразна, по началу думал, что она дает готовый паттерн для отображения на экране, но тут видать еще нетривиальная матобработка нужна, ладно, попользуюсь пока GRC. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 17 января, 2021 Опубликовано 17 января, 2021 · Жалоба 7 minutes ago, mantech said: задал координаты 0.0 считает у симв "!"-1.0 """ 0.0 "#"0.11 "$"0.13 Что это за цифры? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 35 17 января, 2021 Опубликовано 17 января, 2021 (изменено) · Жалоба 6 минут назад, aaarrr сказал: Что это за цифры? Взял из вашей проги расчет координат начала отрисовки символа, как будто я хочу нарисовать с координат X=0 Y=0, на основе этого: x += glyph->x; y += font->height - font->bot - glyph->y; А что написал - это результаты для конкр. символа. Т.е. если б это считал GRC, то для символа "Й" должно быть 3.1 Изменено 17 января, 2021 пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 17 января, 2021 Опубликовано 17 января, 2021 · Жалоба И что смущает? отрицательное смещение по x? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 35 17 января, 2021 Опубликовано 17 января, 2021 (изменено) · Жалоба 4 минуты назад, aaarrr сказал: И что смущает? отрицательное смещение по x? Там нет ничего отрицательного, а смущает то, что смещение по Y для символов # $ доходит до 13, при размере самого символа 17, как это может быть? Я могу это понять такое смещение у символа запятой, т.к. она рисуется почти внизу, относительно других... Изменено 17 января, 2021 пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 17 января, 2021 Опубликовано 17 января, 2021 · Жалоба Символ "#": x = 1, y = 15, width = 12, height = 15, x_off = 14 font.height = 22 font.bot = 5 font->height - font->bot - glyph->y = 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 35 17 января, 2021 Опубликовано 17 января, 2021 · Жалоба 2 минуты назад, aaarrr сказал: Символ "#": Какой ttf шрифт был задан и его размер в ppt? x = 1, y = 15, - это начальные координаты? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 17 января, 2021 Опубликовано 17 января, 2021 · Жалоба 2 minutes ago, mantech said: Какой ttf шрифт был задан и его размер в ppt? LiberationSans-Regular.ttf, 17 1 minute ago, mantech said: x = 1, y = 15, - это начальные координаты? Для глифа "#". Вычисление экранных показал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 35 17 января, 2021 Опубликовано 17 января, 2021 · Жалоба 1 минуту назад, aaarrr сказал: Для глифа "#". Вычисление экранных показал. Хм.. а начальные тогда какие? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 17 января, 2021 Опубликовано 17 января, 2021 · Жалоба Just now, mantech said: Хм.. а начальные тогда какие? x += glyph->x; y += font->height - font->bot - glyph->y; 1 и 2 соответственно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться