diff options
-rw-r--r-- | meson.build | 2 | ||||
-rw-r--r-- | pango/fonts.c | 2 | ||||
-rw-r--r-- | pango/pango-script.c | 23 | ||||
-rw-r--r-- | pango/pangowin32-dwrite-fontmap.cpp | 16 | ||||
-rw-r--r-- | tests/itemize/three.expected | 9 | ||||
-rw-r--r-- | tests/itemize/three.items | 1 |
6 files changed, 43 insertions, 10 deletions
diff --git a/meson.build b/meson.build index 285ee3d4..538372ad 100644 --- a/meson.build +++ b/meson.build @@ -89,7 +89,6 @@ elif cc.get_id() == 'gcc' or cc.get_id() == 'clang' '-Wuninitialized', '-Wunused', '-Werror=address', - '-Werror=array-bounds', '-Werror=empty-body', '-Werror=implicit', '-Werror=implicit-fallthrough', @@ -132,7 +131,6 @@ elif cc.get_id() == 'gcc' or cc.get_id() == 'clang' '-Werror=sequence-point', '-Werror=return-type', '-Werror=trigraphs', - '-Werror=array-bounds', '-Werror=write-strings', '-Werror=address', '-Werror=int-to-pointer-cast', diff --git a/pango/fonts.c b/pango/fonts.c index e259f8c7..748f8a43 100644 --- a/pango/fonts.c +++ b/pango/fonts.c @@ -2402,7 +2402,7 @@ pango_font_family_get_property (GObject *object, switch (property_id) { case PROP_ITEM_TYPE: - g_value_set_gtype (value, PANGO_TYPE_FONT); + g_value_set_gtype (value, PANGO_TYPE_FONT_FACE); break; case PROP_N_ITEMS: diff --git a/pango/pango-script.c b/pango/pango-script.c index 71c519fd..fa9ab21d 100644 --- a/pango/pango-script.c +++ b/pango/pango-script.c @@ -286,12 +286,29 @@ get_pair_index (gunichar ch) return -1; } +static gboolean +is_cluster_extender (gunichar ch) +{ + GUnicodeType type = g_unichar_type (ch); + return (type >= G_UNICODE_SPACING_MARK && type <= G_UNICODE_NON_SPACING_MARK) || + (ch >= 0x200C && ch <= 0x200D) || /* ZWJ, ZWNJ */ + (ch >= 0xFF9E && ch <= 0xFF9F) || /* katakana sound marks */ + (ch >= 0x1F3FB && ch <= 0x1F3FF) || /* fitzpatrick skin tone modifiers */ + (ch >= 0xE0020 && ch <= 0xE007F); /* emoji (flag) tag characters */ +} + /* duplicated in pango-language.c */ #define REAL_SCRIPT(script) \ ((script) > PANGO_SCRIPT_INHERITED && (script) != PANGO_SCRIPT_UNKNOWN) -#define SAME_SCRIPT(script1, script2) \ - (!REAL_SCRIPT (script1) || !REAL_SCRIPT (script2) || (script1) == (script2)) +#define IS_CLUSTER_EXTENDER(ch) \ + g_unichar_type (ch) + +/* TODO: Use Unicode ScriptExtensions */ +#define SAME_SCRIPT(script1, script2, ch) \ + (!REAL_SCRIPT (script1) || !REAL_SCRIPT (script2) || \ + (script1) == (script2) || \ + is_cluster_extender (ch)) #define IS_OPEN(pair_index) (((pair_index) & 1) == 0) @@ -372,7 +389,7 @@ pango_script_iter_next (PangoScriptIter *iter) } } - if (SAME_SCRIPT (iter->script_code, sc)) + if (SAME_SCRIPT (iter->script_code, sc, ch)) { if (!REAL_SCRIPT (iter->script_code) && REAL_SCRIPT (sc)) { diff --git a/pango/pangowin32-dwrite-fontmap.cpp b/pango/pangowin32-dwrite-fontmap.cpp index 2db0972a..7e712b57 100644 --- a/pango/pangowin32-dwrite-fontmap.cpp +++ b/pango/pangowin32-dwrite-fontmap.cpp @@ -512,22 +512,30 @@ pango_win32_dwrite_font_check_is_hinted (PangoWin32Font *font) &table_ctx, &exists))) { - if (exists) + if (exists && table_size > 4) { guint16 version = DWRITE_NEXT_USHORT (table_data); if (version == 0 || version == 1) { guint16 num_ranges = DWRITE_NEXT_USHORT (table_data); - guint16 i; + UINT32 max_ranges = (table_size - 4) / (sizeof (guint16) * 2); + guint16 i = 0; - for (i = 0; !result && i < num_ranges && i < (table_size / sizeof (guint16)); i ++) + if (num_ranges > max_ranges) + num_ranges = max_ranges; + + for (i = 0; i < num_ranges; i++) { + G_GNUC_UNUSED guint16 ppem = DWRITE_NEXT_USHORT (table_data); guint16 behavior = DWRITE_NEXT_USHORT (table_data); if (behavior & (GASP_GRIDFIT | GASP_SYMMETRIC_GRIDFIT)) - result = TRUE; + { + result = TRUE; + break; + } } } } diff --git a/tests/itemize/three.expected b/tests/itemize/three.expected new file mode 100644 index 00000000..eb45fbd3 --- /dev/null +++ b/tests/itemize/three.expected @@ -0,0 +1,9 @@ +<span font="Cantarell 11" fallback="false">عַرַبִ</span> + +Items: عַرַبִ +Chars: 6(0) +Font: Cantarell 11 +Script: arabic +Lang: ar +Bidi: 1 +Attrs: 0 12 fallback false diff --git a/tests/itemize/three.items b/tests/itemize/three.items new file mode 100644 index 00000000..394767e5 --- /dev/null +++ b/tests/itemize/three.items @@ -0,0 +1 @@ +<span font="Cantarell 11" fallback="false">عַرַبִ</span> |