summaryrefslogtreecommitdiff
path: root/pango/pango-script.c
diff options
context:
space:
mode:
Diffstat (limited to 'pango/pango-script.c')
-rw-r--r--pango/pango-script.c23
1 files changed, 20 insertions, 3 deletions
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))
{