[PATCH 3/5] dwrite: Set glyph class properties when applying GPOS.

Nikolay Sivov nsivov at codeweavers.com
Mon May 25 06:54:29 CDT 2020


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/dwrite/opentype.c | 68 +++++++++++++++++++++++-------------------
 1 file changed, 37 insertions(+), 31 deletions(-)

diff --git a/dlls/dwrite/opentype.c b/dlls/dwrite/opentype.c
index 814e65b6cca..0b9c6067b59 100644
--- a/dlls/dwrite/opentype.c
+++ b/dlls/dwrite/opentype.c
@@ -3130,6 +3130,36 @@ static unsigned int opentype_layout_get_glyph_class(const struct dwrite_fonttabl
     return glyph_class;
 }
 
+static unsigned int opentype_set_glyph_props(struct scriptshaping_context *context, unsigned int g, UINT16 glyph)
+{
+    struct scriptshaping_cache *cache = context->cache;
+    unsigned int glyph_class = 0, props;
+
+    if (cache->gdef.classdef)
+    {
+        glyph_class = opentype_layout_get_glyph_class(&cache->gdef.table, cache->gdef.classdef, context->u.subst.glyphs[g]);
+    }
+
+    switch (glyph_class)
+    {
+        case GDEF_CLASS_BASE:
+            props = GLYPH_PROP_BASE;
+            break;
+        case GDEF_CLASS_LIGATURE:
+            props = GLYPH_PROP_LIGATURE;
+            break;
+        case GDEF_CLASS_MARK:
+            props = GLYPH_PROP_MARK;
+            break;
+        default:
+            props = 0;
+    }
+
+    context->glyph_infos[g].props = props;
+
+    return props;
+}
+
 struct coverage_compare_format1_context
 {
     UINT16 glyph;
@@ -4377,6 +4407,8 @@ void opentype_layout_apply_gpos_features(struct scriptshaping_context *context,
 
     opentype_layout_collect_lookups(context, script_index, language_index, features, &context->cache->gpos, &lookups);
 
+    for (i = 0; i < context->glyph_count; ++i)
+        opentype_set_glyph_props(context, i, context->u.pos.glyphs[i]);
     opentype_layout_set_glyph_masks(context, features);
 
     for (i = 0; i < lookups.count; ++i)
@@ -4691,36 +4723,6 @@ static unsigned int unicode_get_mirrored_char(unsigned int codepoint)
     return mirror ? mirror : codepoint;
 }
 
-static void opentype_subst_set_glyph_props(struct scriptshaping_context *context, unsigned int g)
-{
-    struct scriptshaping_cache *cache = context->cache;
-    unsigned int glyph_class = 0, props;
-
-    if (cache->gdef.classdef)
-    {
-        glyph_class = opentype_layout_get_glyph_class(&cache->gdef.table, cache->gdef.classdef, context->u.subst.glyphs[g]);
-    }
-
-    switch (glyph_class)
-    {
-        case GDEF_CLASS_BASE:
-            props = GLYPH_PROP_BASE;
-            break;
-        case GDEF_CLASS_LIGATURE:
-            props = GLYPH_PROP_LIGATURE;
-            break;
-        case GDEF_CLASS_MARK:
-            props = GLYPH_PROP_MARK;
-            context->u.subst.glyph_props[g].isDiacritic = 1;
-            context->u.subst.glyph_props[g].isZeroWidthSpace = 1;
-            break;
-        default:
-            props = 0;
-    }
-
-    context->glyph_infos[g].props = props;
-}
-
 static void opentype_get_nominal_glyphs(struct scriptshaping_context *context, const struct shaping_features *features)
 {
     unsigned int rtlm_mask = shaping_features_get_mask(features, DWRITE_MAKE_OPENTYPE_TAG('r','t','l','m'), NULL);
@@ -4761,7 +4763,11 @@ static void opentype_get_nominal_glyphs(struct scriptshaping_context *context, c
         context->u.subst.glyphs[g] = font->get_glyph(context->cache->context, codepoint);
         context->u.subst.glyph_props[g].justification = SCRIPT_JUSTIFY_CHARACTER;
         context->u.subst.glyph_props[g].isClusterStart = 1;
-        opentype_subst_set_glyph_props(context, g);
+        if (opentype_set_glyph_props(context, g, context->u.subst.glyphs[g]) == GLYPH_PROP_MARK)
+        {
+            context->u.subst.glyph_props[g].isDiacritic = 1;
+            context->u.subst.glyph_props[g].isZeroWidthSpace = 1;
+        }
         context->glyph_count++;
 
         clustermap[i] = i;
-- 
2.26.2




More information about the wine-devel mailing list