Nikolay Sivov : dwrite: Set lookup flags for joiners.

Alexandre Julliard julliard at winehq.org
Mon Jan 18 17:00:37 CST 2021


Module: wine
Branch: master
Commit: 9118160524334a79c2328501e62e72b7e3cb2239
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=9118160524334a79c2328501e62e72b7e3cb2239

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Mon Jan 18 15:05:38 2021 +0300

dwrite: Set lookup flags for joiners.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/dwrite/dwrite_private.h |  3 +++
 dlls/dwrite/opentype.c       | 23 +++++++++++++++--------
 dlls/dwrite/shape.c          | 12 ++++++------
 3 files changed, 24 insertions(+), 14 deletions(-)

diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h
index 7c9fe8a6873..632b2776bfc 100644
--- a/dlls/dwrite/dwrite_private.h
+++ b/dlls/dwrite/dwrite_private.h
@@ -615,6 +615,9 @@ enum shaping_feature_flags
 {
     FEATURE_GLOBAL = 0x1,
     FEATURE_GLOBAL_SEARCH = 0x2,
+    FEATURE_MANUAL_ZWNJ = 0x4,
+    FEATURE_MANUAL_ZWJ = 0x8,
+    FEATURE_MANUAL_JOINERS = FEATURE_MANUAL_ZWNJ | FEATURE_MANUAL_ZWJ,
 };
 
 struct shaping_feature
diff --git a/dlls/dwrite/opentype.c b/dlls/dwrite/opentype.c
index 260a0a8f5db..55ef482c42d 100644
--- a/dlls/dwrite/opentype.c
+++ b/dlls/dwrite/opentype.c
@@ -3508,6 +3508,8 @@ struct lookup
 
     unsigned int mask;
     unsigned int offset;
+    unsigned int auto_zwnj : 1;
+    unsigned int auto_zwj : 1;
 };
 
 static unsigned int opentype_layout_get_gsubgpos_subtable(const struct scriptshaping_context *context,
@@ -4337,8 +4339,8 @@ static int lookups_sorting_compare(const void *a, const void *b)
     return left->index < right->index ? -1 : left->index > right->index ? 1 : 0;
 };
 
-static BOOL opentype_layout_init_lookup(const struct ot_gsubgpos_table *table, unsigned short lookup_index, unsigned int mask,
-        struct lookup *lookup)
+static BOOL opentype_layout_init_lookup(const struct ot_gsubgpos_table *table, unsigned short lookup_index,
+        const struct shaping_feature *feature, struct lookup *lookup)
 {
     unsigned short subtable_count, lookup_type, flags, mark_filtering_set;
     const struct ot_lookup_table *lookup_table;
@@ -4372,8 +4374,13 @@ static BOOL opentype_layout_init_lookup(const struct ot_gsubgpos_table *table, u
     lookup->type = lookup_type;
     lookup->flags = flags;
     lookup->subtable_count = subtable_count;
-    lookup->mask = mask;
     lookup->offset = offset;
+    if (feature)
+    {
+        lookup->mask = feature->mask;
+        lookup->auto_zwnj = !(feature->flags & FEATURE_MANUAL_ZWNJ);
+        lookup->auto_zwj = !(feature->flags & FEATURE_MANUAL_ZWJ);
+    }
 
     return TRUE;
 }
@@ -4409,7 +4416,7 @@ static void opentype_layout_add_lookups(const struct ot_feature_list *feature_li
         if (lookup_index >= total_lookup_count)
             continue;
 
-        if (opentype_layout_init_lookup(table, lookup_index, feature->mask, &lookups->lookups[lookups->count]))
+        if (opentype_layout_init_lookup(table, lookup_index, feature, &lookups->lookups[lookups->count]))
             lookups->count++;
     }
 }
@@ -4567,6 +4574,8 @@ static void opentype_layout_collect_lookups(struct scriptshaping_context *contex
                 else
                 {
                     lookups->lookups[j].mask |= lookups->lookups[i].mask;
+                    lookups->lookups[j].auto_zwnj &= lookups->lookups[i].auto_zwnj;
+                    lookups->lookups[j].auto_zwj &= lookups->lookups[i].auto_zwj;
                 }
             }
             lookups->count = j + 1;
@@ -4648,8 +4657,7 @@ static void opentype_layout_set_glyph_masks(struct scriptshaping_context *contex
 static void opentype_layout_apply_gpos_context_lookup(struct scriptshaping_context *context, unsigned int lookup_index)
 {
     struct lookup lookup = { 0 };
-    /* Feature mask is intentionally zero, it's not used outside of main loop. */
-    if (opentype_layout_init_lookup(context->table, lookup_index, 0, &lookup))
+    if (opentype_layout_init_lookup(context->table, lookup_index, NULL, &lookup))
         opentype_layout_apply_gpos_lookup(context, &lookup);
 }
 
@@ -5742,8 +5750,7 @@ static BOOL opentype_is_gsub_lookup_reversed(const struct scriptshaping_context
 static void opentype_layout_apply_gsub_context_lookup(struct scriptshaping_context *context, unsigned int lookup_index)
 {
     struct lookup lookup = { 0 };
-    /* Feature mask is intentionally zero, it's not used outside of main loop. */
-    if (opentype_layout_init_lookup(context->table, lookup_index, 0, &lookup))
+    if (opentype_layout_init_lookup(context->table, lookup_index, NULL, &lookup))
         opentype_layout_apply_gsub_lookup(context, &lookup);
 }
 
diff --git a/dlls/dwrite/shape.c b/dlls/dwrite/shape.c
index be8a69c27c4..567ec5fa54f 100644
--- a/dlls/dwrite/shape.c
+++ b/dlls/dwrite/shape.c
@@ -189,12 +189,12 @@ static void shape_merge_features(struct scriptshaping_context *context, struct s
 
 HRESULT shape_get_positions(struct scriptshaping_context *context, const unsigned int *scripts)
 {
-    static const unsigned int common_features[] =
+    static const struct shaping_feature common_features[] =
     {
-        DWRITE_MAKE_OPENTYPE_TAG('a','b','v','m'),
-        DWRITE_MAKE_OPENTYPE_TAG('b','l','w','m'),
-        DWRITE_MAKE_OPENTYPE_TAG('m','a','r','k'),
-        DWRITE_MAKE_OPENTYPE_TAG('m','k','m','k'),
+        { DWRITE_MAKE_OPENTYPE_TAG('a','b','v','m') },
+        { DWRITE_MAKE_OPENTYPE_TAG('b','l','w','m') },
+        { DWRITE_MAKE_OPENTYPE_TAG('m','a','r','k'), FEATURE_MANUAL_JOINERS },
+        { DWRITE_MAKE_OPENTYPE_TAG('m','k','m','k'), FEATURE_MANUAL_JOINERS },
     };
     static const unsigned int horizontal_features[] =
     {
@@ -207,7 +207,7 @@ HRESULT shape_get_positions(struct scriptshaping_context *context, const unsigne
     struct shaping_features features = { 0 };
 
     for (i = 0; i < ARRAY_SIZE(common_features); ++i)
-        shape_add_feature(&features, common_features[i]);
+        shape_add_feature_full(&features, common_features[i].tag, FEATURE_GLOBAL | common_features[i].flags, 1);
 
     /* Horizontal features */
     if (!context->is_sideways)




More information about the wine-cvs mailing list