diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h index 632b2776bfc..f3636876251 100644 --- a/dlls/dwrite/dwrite_private.h +++ b/dlls/dwrite/dwrite_private.h @@ -585,6 +585,8 @@ struct scriptshaping_context } user_features; unsigned int global_mask; unsigned int lookup_mask; /* Currently processed feature mask, set in main loop. */ + unsigned int auto_zwj; + unsigned int auto_zwnj; struct shaping_glyph_info *glyph_infos; unsigned int cur; diff --git a/dlls/dwrite/opentype.c b/dlls/dwrite/opentype.c index 55ef482c42d..aedbfe6dcab 100644 --- a/dlls/dwrite/opentype.c +++ b/dlls/dwrite/opentype.c @@ -3587,6 +3587,8 @@ struct glyph_iterator p_match_func match_func; const UINT16 *glyph_data; const struct match_data *match_data; + unsigned int ignore_zwnj; + unsigned int ignore_zwj; }; static void glyph_iterator_init(struct scriptshaping_context *context, unsigned int flags, unsigned int pos, @@ -3600,6 +3602,9 @@ static void glyph_iterator_init(struct scriptshaping_context *context, unsigned iter->match_func = NULL; iter->match_data = NULL; iter->glyph_data = NULL; + /* Context matching iterators will get these fixed up. */ + iter->ignore_zwnj = context->table == &context->cache->gpos; + iter->ignore_zwj = context->auto_zwj; } struct ot_gdef_mark_glyph_sets @@ -4682,6 +4687,8 @@ void opentype_layout_apply_gpos_features(struct scriptshaping_context *context, context->cur = 0; context->lookup_mask = lookup->mask; + context->auto_zwnj = lookup->auto_zwnj; + context->auto_zwj = lookup->auto_zwj; while (context->cur < context->glyph_count) { @@ -5092,6 +5099,8 @@ static BOOL opentype_layout_context_match_backtrack(const struct match_context * iter.match_func = mc->match_func; iter.match_data = &match_data; iter.glyph_data = backtrack; + iter.ignore_zwnj |= context->auto_zwnj; + iter.ignore_zwj = 1; for (i = 0; i < count; ++i) { @@ -5116,6 +5125,8 @@ static BOOL opentype_layout_context_match_lookahead(const struct match_context * iter.match_func = mc->match_func; iter.match_data = &match_data; iter.glyph_data = lookahead; + iter.ignore_zwnj |= context->auto_zwnj; + iter.ignore_zwj = 1; for (i = 0; i < count; ++i) {