From ba9b20534cd46e9ecf33fbcb7b9dbf75e7b7c9b4 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 1 Aug 2022 12:42:05 -0600 Subject: [PATCH] [ft] Try working around fonts with transform set Fixes https://github.com/harfbuzz/harfbuzz/issues/3772 --- src/hb-buffer.h | 2 +- src/hb-ft.cc | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/hb-buffer.h b/src/hb-buffer.h index c6af759fb..8c1748983 100644 --- a/src/hb-buffer.h +++ b/src/hb-buffer.h @@ -145,7 +145,7 @@ typedef struct hb_glyph_info_t { * @HB_GLYPH_FLAG_SAFE_TO_INSERT_TATWEEL: In scripts that use elongation (Arabic, Mongolian, Syriac, etc.), this flag signifies that it is safe to insert a U+0640 TATWEEL - character *before* this cluster for elongation. + character before this cluster for elongation. This flag does not determine the script-specific elongation places, but only when it is safe to do the elongation without diff --git a/src/hb-ft.cc b/src/hb-ft.cc index ef073475c..542309732 100644 --- a/src/hb-ft.cc +++ b/src/hb-ft.cc @@ -431,9 +431,9 @@ hb_ft_get_glyph_h_advances (hb_font_t* font, void* font_data, #ifdef HAVE_FT_GET_TRANSFORM FT_Matrix matrix; FT_Get_Transform (ft_face, &matrix, nullptr); - float mult = matrix.xx / 65536.f; + float x_mult = sqrtf (matrix.xx * matrix.xx + matrix.xy * matrix.xy) / 65536.f; #else - float mult = font->x_scale < 0 ? -1 : +1; + float x_mult = font->x_scale < 0 ? -1 : +1; #endif for (unsigned int i = 0; i < count; i++) @@ -450,7 +450,7 @@ hb_ft_get_glyph_h_advances (hb_font_t* font, void* font_data, ft_font->advance_cache.set (glyph, v); } - *first_advance = (int) (v * mult + (1<<9)) >> 10; + *first_advance = (int) (v * x_mult + (1<<9)) >> 10; first_glyph = &StructAtOffsetUnaligned (first_glyph, glyph_stride); first_advance = &StructAtOffsetUnaligned (first_advance, advance_stride); } @@ -469,7 +469,7 @@ hb_ft_get_glyph_v_advance (hb_font_t *font, #ifdef HAVE_FT_GET_TRANSFORM FT_Matrix matrix; FT_Get_Transform (ft_font->ft_face, &matrix, nullptr); - float y_mult = matrix.yy / 65536.f; + float y_mult = sqrtf (matrix.yx * matrix.yx + matrix.yy * matrix.yy) / 65536.f; #else float y_mult = font->y_scale < 0 ? -1 : +1; #endif @@ -501,8 +501,8 @@ hb_ft_get_glyph_v_origin (hb_font_t *font, #ifdef HAVE_FT_GET_TRANSFORM FT_Matrix matrix; FT_Get_Transform (ft_face, &matrix, nullptr); - float x_mult = matrix.xx / 65536.f; - float y_mult = matrix.yy / 65536.f; + float x_mult = sqrtf (matrix.xx * matrix.xx + matrix.xy * matrix.xy) / 65536.f; + float y_mult = sqrtf (matrix.yx * matrix.yx + matrix.yy * matrix.yy) / 65536.f; #else float x_mult = font->x_scale < 0 ? -1 : +1; float y_mult = font->y_scale < 0 ? -1 : +1; @@ -556,8 +556,8 @@ hb_ft_get_glyph_extents (hb_font_t *font, #ifdef HAVE_FT_GET_TRANSFORM FT_Matrix matrix; FT_Get_Transform (ft_face, &matrix, nullptr); - float x_mult = matrix.xx / 65536.f; - float y_mult = matrix.yy / 65536.f; + float x_mult = sqrtf (matrix.xx * matrix.xx + matrix.xy * matrix.xy) / 65536.f; + float y_mult = sqrtf (matrix.yx * matrix.yx + matrix.yy * matrix.yy) / 65536.f; #else float x_mult = font->x_scale < 0 ? -1 : +1; float y_mult = font->y_scale < 0 ? -1 : +1; @@ -666,7 +666,7 @@ hb_ft_get_font_h_extents (hb_font_t *font HB_UNUSED, #ifdef HAVE_FT_GET_TRANSFORM FT_Matrix matrix; FT_Get_Transform (ft_face, &matrix, nullptr); - float y_mult = matrix.yy / 65536.f; + float y_mult = sqrtf (matrix.yx * matrix.yx + matrix.yy * matrix.yy) / 65536.f; #else float y_mult = font->y_scale < 0 ? -1 : +1; #endif