Nikolay Sivov : dwrite/arabic: Mark glyphs with assigned action as unsafe to break.

Alexandre Julliard julliard at winehq.org
Thu Feb 11 15:37:14 CST 2021


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Thu Feb 11 11:10:20 2021 +0300

dwrite/arabic: Mark glyphs with assigned action as unsafe to break.

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       | 2 +-
 dlls/dwrite/shapers/arabic.c | 7 ++++++-
 3 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h
index e03ad6c6c6d..fa82a8d4376 100644
--- a/dlls/dwrite/dwrite_private.h
+++ b/dlls/dwrite/dwrite_private.h
@@ -690,6 +690,8 @@ extern void opentype_layout_apply_gpos_features(struct scriptshaping_context *co
 extern BOOL opentype_layout_check_feature(struct scriptshaping_context *context, unsigned int script_index,
         unsigned int language_index, struct shaping_feature *feature, unsigned int glyph_count,
         const UINT16 *glyphs, UINT8 *feature_applies) DECLSPEC_HIDDEN;
+extern void opentype_layout_unsafe_to_break(struct scriptshaping_context *context, unsigned int start,
+        unsigned int end) DECLSPEC_HIDDEN;
 extern BOOL opentype_has_vertical_variants(struct dwrite_fontface *fontface) DECLSPEC_HIDDEN;
 extern HRESULT opentype_get_vertical_glyph_variants(struct dwrite_fontface *fontface, unsigned int glyph_count,
         const UINT16 *nominal_glyphs, UINT16 *glyphs) DECLSPEC_HIDDEN;
diff --git a/dlls/dwrite/opentype.c b/dlls/dwrite/opentype.c
index 515d2440fcf..afae1b69d07 100644
--- a/dlls/dwrite/opentype.c
+++ b/dlls/dwrite/opentype.c
@@ -5127,7 +5127,7 @@ static BOOL opentype_layout_context_match_input(const struct match_context *mc,
 }
 
 /* Marks text segment as unsafe to break between [start, end) glyphs. */
-static void opentype_layout_unsafe_to_break(struct scriptshaping_context *context, unsigned int start,
+void opentype_layout_unsafe_to_break(struct scriptshaping_context *context, unsigned int start,
         unsigned int end)
 {
     unsigned int i;
diff --git a/dlls/dwrite/shapers/arabic.c b/dlls/dwrite/shapers/arabic.c
index cc598f834e5..720f18915a4 100644
--- a/dlls/dwrite/shapers/arabic.c
+++ b/dlls/dwrite/shapers/arabic.c
@@ -174,7 +174,12 @@ static void arabic_setup_masks(struct scriptshaping_context *context,
 
     /* Unaffected glyphs get action NONE with zero mask. */
     for (i = 0; i < context->glyph_count; ++i)
-        context->glyph_infos[i].mask |= masks[arabic_get_shaping_action(context, i)];
+    {
+        enum arabic_shaping_action action = arabic_get_shaping_action(context, i);
+        if (action != NONE)
+            opentype_layout_unsafe_to_break(context, i, i + 1);
+        context->glyph_infos[i].mask |= masks[action];
+    }
 }
 
 const struct shaper arabic_shaper =




More information about the wine-cvs mailing list