Я переписываю свой текстовый рендеринг из GDI+ в библиотеку Harfbuzz. Тем не менее, я столкнулся с проблемой с позициями глифа между этими двумя библиотеками. Текст, отображаемый с помощью Harfbuzz, кажется искаженным и неверным по сравнению с выходом GDI+. < /P>
На скриншоте ниже красный текст представляет собой выход из Harfbuzz, в то время как белый текст отображался с использованием GDI+: < /p>
При отладке я обнаружил, что Harfbuzz не применяет пересечение букв между парами персонажей, которые не требуют Kerning (например, «th» и «ti»). Нужно ли включить пересечение букв вручную? Вот соответствующая часть моего кода: < /p>
hb_font_helper::hb_font_helper( FT_Library ft )
{
FT_New_Face( ft, "C:\\Windows\\Fonts\\arial.ttf", 0, &ft_font );
FT_Set_Pixel_Sizes( ft_font, 0, 48 );
hb_font = hb_ft_font_create( ft_font, nullptr );
}
{
// Initialize FreeType
FT_Library ft_lib; FT_Init_FreeType( &ft_lib );
// Create font
hb_font_helper font( ft_lib );
// Create HarfBuzz buffer
hb_buffer_t* buffer = hb_buffer_create( );
// add string in UTF-8 for HarfBuzz
hb_buffer_add_utf8(buffer, utf8_buffer.data(), -1, 0, -1);
hb_buffer_guess_segment_properties( buffer );
// Shape the text
hb_shape( font.hb(), buffer, nullptr, 0 );
// Get glyph information
unsigned int glyph_count;
hb_glyph_position_t* positions = hb_buffer_get_glyph_positions( buffer, &glyph_count );
hb_glyph_info_t* infos = hb_buffer_get_glyph_infos( buffer, &glyph_count );
// Copy glyph positions and information
std::vector glyph_positions( positions, positions + glyph_count );
std::vector glyph_infos( infos, infos + glyph_count );
// Calculate baseline
int baseline = ( font.ft( )->size->metrics.ascender - font.ft( )->size->metrics.descender ) >> 6;
// Render each glyph
FT_GlyphSlot slot = font.ft( )->glyph;
int current_x = 0;
int current_y = baseline - ( font.ft( )->size->metrics.descender >> 6 ); // Adjust starting position;
for( size_t i = 0; i < glyph_positions.size( ); ++i ) {
FT_Load_Glyph( font.ft( ), glyph_infos.codepoint, FT_LOAD_RENDER );
FT_Bitmap* glyph_bitmap = &slot->bitmap;
FT_Glyph_Metrics metrics = font.ft( )->glyph->metrics;
// Glyph position (adjust y accounting for baseline)
int x = current_x + ( glyph_positions.x_offset /64 );
int y = current_y - ( slot->bitmap_top ) + ( glyph_positions.y_offset >> 6 );
// Draw glyph bitmap to target bitmap
Draw( x, y, glyph_bitmap );
current_x += glyph_positions.x_advance >> 6;
}
}
< /code>
Я пробовал различные флаги, но ни один из них, кажется, не решает проблему. Какие -либо понимания или предложений?
Подробнее здесь: https://stackoverflow.com/questions/796 ... red-to-gdi
Проблемы с позиционированием глифа в Harfbuzz по сравнению с GDI+ ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
С# – Как измерить размер текста/отдельного глифа, как он будет отображаться в PDF-файле?
Anonymous » » в форуме C# - 0 Ответы
- 13 Просмотры
-
Последнее сообщение Anonymous
-