Nikolay Sivov : dwrite: Keep current lookup feature mask in context.

Alexandre Julliard julliard at winehq.org
Fri Jun 12 16:01:17 CDT 2020


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Fri Jun 12 14:22:28 2020 +0300

dwrite: Keep current lookup feature mask in context.

Lookups referenced from context-based lookups need to have access to
original feature mask, set it once instead of propagating it on every
recursive call. It's used for input matching and parametrized cases
like alternate substitutions.

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

---

 dlls/dwrite/dwrite_private.h |  1 +
 dlls/dwrite/opentype.c       | 10 +++++++---
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h
index 661e01123c..be3f4b719e 100644
--- a/dlls/dwrite/dwrite_private.h
+++ b/dlls/dwrite/dwrite_private.h
@@ -585,6 +585,7 @@ struct scriptshaping_context
         unsigned int range_count;
     } user_features;
     unsigned int global_mask;
+    unsigned int lookup_mask; /* Currently processed feature mask, set in main loop. */
     struct shaping_glyph_info *glyph_infos;
 
     unsigned int cur;
diff --git a/dlls/dwrite/opentype.c b/dlls/dwrite/opentype.c
index cb79a68d59..22159e2988 100644
--- a/dlls/dwrite/opentype.c
+++ b/dlls/dwrite/opentype.c
@@ -4802,6 +4802,8 @@ void opentype_layout_apply_gpos_features(struct scriptshaping_context *context,
         const struct lookup *lookup = &lookups.lookups[i];
 
         context->cur = 0;
+        context->lookup_mask = lookup->mask;
+
         while (context->cur < context->glyph_count)
         {
             ret = FALSE;
@@ -5037,8 +5039,8 @@ static BOOL opentype_layout_apply_gsub_alt_substitution(struct scriptshaping_con
         if (!count)
             return FALSE;
 
-        BitScanForward(&shift, lookup->mask);
-        alt_index = (lookup->mask & context->glyph_infos[idx].mask) >> shift;
+        BitScanForward(&shift, context->lookup_mask);
+        alt_index = (context->lookup_mask & context->glyph_infos[idx].mask) >> shift;
 
         if (alt_index > count || !alt_index)
             return FALSE;
@@ -5071,7 +5073,7 @@ static BOOL opentype_layout_context_match_input(const struct match_context *mc,
     match_positions[0] = context->cur;
 
     glyph_iterator_init(context, mc->lookup->flags, context->cur, count - 1, &iter);
-    iter.mask = mc->lookup->mask;
+    iter.mask = context->lookup_mask;
     iter.match_func = mc->match_func;
     iter.match_data = &match_data;
     iter.glyph_data = input;
@@ -5933,6 +5935,8 @@ void opentype_layout_apply_gsub_features(struct scriptshaping_context *context,
     {
         const struct lookup *lookup = &lookups.lookups[i];
 
+        context->lookup_mask = lookup->mask;
+
         if (!opentype_is_gsub_lookup_reversed(context, lookup))
         {
             context->cur = 0;




More information about the wine-cvs mailing list