Я переписываю свой текстовый рендеринг из 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++
Программы на C++. Форум разработчиков
-
Anonymous
1746556816
Anonymous
Я переписываю свой текстовый рендеринг из 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[i].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[i].x_offset /64 );
int y = current_y - ( slot->bitmap_top ) + ( glyph_positions[i].y_offset >> 6 );
// Draw glyph bitmap to target bitmap
Draw( x, y, glyph_bitmap );
current_x += glyph_positions[i].x_advance >> 6;
}
}
< /code>
Я пробовал различные флаги, но ни один из них, кажется, не решает проблему. Какие -либо понимания или предложений?
Подробнее здесь: [url]https://stackoverflow.com/questions/79609201/issues-with-glyph-positioning-in-harfbuzz-compared-to-gdi[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия