Nikolay Sivov : dwrite/arabic: Set per-glyph mask.

Alexandre Julliard julliard at winehq.org
Fri Jan 22 15:59:15 CST 2021


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Fri Jan 22 15:25:22 2021 +0300

dwrite/arabic: Set per-glyph mask.

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

---

 dlls/dwrite/dwrite_private.h |  2 ++
 dlls/dwrite/opentype.c       |  6 ++++++
 dlls/dwrite/shapers/arabic.c | 15 +++++++++++++++
 3 files changed, 23 insertions(+)

diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h
index 3f48c189a13..ac870fd215c 100644
--- a/dlls/dwrite/dwrite_private.h
+++ b/dlls/dwrite/dwrite_private.h
@@ -590,6 +590,8 @@ extern void shape_enable_feature(struct shaping_features *features, unsigned int
         unsigned int flags) DECLSPEC_HIDDEN;
 extern void shape_add_feature_full(struct shaping_features *features, unsigned int tag,
         unsigned int flags, unsigned int value) DECLSPEC_HIDDEN;
+extern unsigned int shape_get_feature_1_mask(const struct shaping_features *features,
+        unsigned int tag) DECLSPEC_HIDDEN;
 extern void shape_start_next_stage(struct shaping_features *features, stage_func func) DECLSPEC_HIDDEN;
 
 struct scriptshaping_context
diff --git a/dlls/dwrite/opentype.c b/dlls/dwrite/opentype.c
index 6fe85dd4991..7d89851bbaa 100644
--- a/dlls/dwrite/opentype.c
+++ b/dlls/dwrite/opentype.c
@@ -4632,6 +4632,12 @@ static unsigned int shaping_features_get_mask(const struct shaping_features *fea
     return feature->mask;
 }
 
+unsigned int shape_get_feature_1_mask(const struct shaping_features *features, unsigned int tag)
+{
+    unsigned int shift, mask = shaping_features_get_mask(features, tag, &shift);
+    return (1 << shift) & mask;
+}
+
 static void opentype_layout_get_glyph_range_for_text(struct scriptshaping_context *context, unsigned int start_char,
         unsigned int end_char, unsigned int *start_glyph, unsigned int *end_glyph)
 {
diff --git a/dlls/dwrite/shapers/arabic.c b/dlls/dwrite/shapers/arabic.c
index aaf57da42e4..cc701150a56 100644
--- a/dlls/dwrite/shapers/arabic.c
+++ b/dlls/dwrite/shapers/arabic.c
@@ -41,6 +41,7 @@ enum arabic_shaping_action
     MED2,
     INIT,
     NONE,
+    NUM_FEATURES = NONE,
 };
 
 static BOOL feature_is_syriac(unsigned int tag)
@@ -134,10 +135,17 @@ static void arabic_set_shaping_action(struct scriptshaping_context *context,
     context->glyph_infos[idx].props |= (action & 0xf) << 16;
 }
 
+static enum arabic_shaping_action arabic_get_shaping_action(const struct scriptshaping_context *context,
+        unsigned int idx)
+{
+    return (context->glyph_infos[idx].props >> 16) & 0xf;
+}
+
 static void arabic_setup_masks(struct scriptshaping_context *context,
         const struct shaping_features *features)
 {
     unsigned int i, prev = ~0u, state = 0;
+    unsigned int masks[NUM_FEATURES];
 
     for (i = 0; i < context->length; ++i)
     {
@@ -160,6 +168,13 @@ static void arabic_setup_masks(struct scriptshaping_context *context,
         prev = i;
         state = entry->next_state;
     }
+
+    for (i = 0; i < ARRAY_SIZE(masks); ++i)
+        masks[i] = shape_get_feature_1_mask(features, arabic_features[i]);
+
+    /* Unaffected glyphs get action NONE with zero mask. */
+    for (i = 0; i < context->length; ++i)
+        context->glyph_infos[i].mask |= masks[arabic_get_shaping_action(context, i)];
 }
 
 const struct shaper arabic_shaper =




More information about the wine-cvs mailing list