Проблемы с позиционированием глифа в Harfbuzz по сравнению с GDI+C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Проблемы с позиционированием глифа в Harfbuzz по сравнению с GDI+

Сообщение 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.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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • C# Winforms - Кто -нибудь знает о библиотеке C# GDI, а не медленно GDI+
    Anonymous » » в форуме C#
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Раскраска шрифта. Объединение символов без отделения от базового глифа.
    Anonymous » » в форуме CSS
    0 Ответы
    26 Просмотры
    Последнее сообщение Anonymous
  • С# – Как измерить размер текста/отдельного глифа, как он будет отображаться в PDF-файле?
    Anonymous » » в форуме C#
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Как получить код Unicode в harfbuzz после вызова hb_shape?
    Anonymous » » в форуме C++
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Как исправить внешнюю зависимость harfbuzz в OS X 14.3 java 17 jpackage
    Anonymous » » в форуме JAVA
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»