Вычисление ширины строки utf8, отображаемой по свободному типу

Я визуализировал строку 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;

    }

Горизонтальное пространство, занимаемое строкой, не обязательно равно сумме горизонтального пространства, занимаемого каждым глифом; например, в большинстве шрифтов Тедж короче, чем Т плюс е плюс j.

AlexP 09.08.2018 12:13

Вам необходимо учитывать кернинг (и кеминг).

Antti Haapala 09.08.2018 12:31

Благодарю за ответы, Чтение бесплатных документов типа 2, кажется, я не считаю Кернинг. Я прочитаю и улучшу свой код.

MHD 09.08.2018 12:52

в (как минимум) 3 операторах устанавливается переменная error, но код не может проверить полученное значение (в каждом операторе, где устанавливается error), чтобы убедиться, что оператор был успешным, а если не удалось, то передать соответствующую ошибку сообщение (через stderr) пользователю

user3629249 10.08.2018 03:07
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
469
0

Другие вопросы по теме