Я визуализировал строку B презентации utf8 (например, "\xef\xbb\x9d\xef\xba\x8e\xef\xaf\xbe\xef\xba\xad\x20"
), используя freetype, и для вычисления выравнивания мне нужно получить ширину глифов визуализированной строки.
это мой код, и кажется, что полученное значение ширины недействительно. Тогда в чем проблема и как я могу рассчитать точный параметр ширины отображаемой строки без использования Harfbuzz или любой другой библиотеки более высокого уровня?
size_t len = utf8strlen( text);
FT_Library library;
FT_Face face;
FT_GlyphSlot slot;
FT_Error error;
int row = 0;
int wdt = 0;
int pch = 0;
error = FT_Init_FreeType( &library ); /* initialize library */
error = FT_New_Face( library, "font.ttf", 0, &face );/* create face object */
error = FT_Set_Pixel_Sizes( face, 52, 24 );
for ( size_t cntr = 0; cntr < len; cntr++ )
{
/* load glyph image into the slot (erase previous one) */
error = FT_Load_Char( face, text[cntr], FT_LOAD_RENDER );
if ( error )
continue; /* ignore errors */
// draw glyph image anti-aliased
FT_Render_Glyph( face->glyph, FT_RENDER_MODE_NORMAL );
// get dimensions of bitmap
row += face->glyph->bitmap.rows;
wdt += face->glyph->bitmap.width;
pch += face->glyph->bitmap.pitch;
}
Вам необходимо учитывать кернинг (и кеминг).
Благодарю за ответы, Чтение бесплатных документов типа 2, кажется, я не считаю Кернинг. Я прочитаю и улучшу свой код.
в (как минимум) 3 операторах устанавливается переменная error
, но код не может проверить полученное значение (в каждом операторе, где устанавливается error
), чтобы убедиться, что оператор был успешным, а если не удалось, то передать соответствующую ошибку сообщение (через stderr
) пользователю
Горизонтальное пространство, занимаемое строкой, не обязательно равно сумме горизонтального пространства, занимаемого каждым глифом; например, в большинстве шрифтов Тедж короче, чем Т плюс е плюс j.