[v2 PATCH 4/5] dwrite: Set script id in shaping context.

Nikolay Sivov nsivov at codeweavers.com
Thu Jan 21 07:36:53 CST 2021


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/dwrite/analyzer.c       | 19 ++++++++-----------
 dlls/dwrite/dwrite_private.h |  1 +
 2 files changed, 9 insertions(+), 11 deletions(-)

diff --git a/dlls/dwrite/analyzer.c b/dlls/dwrite/analyzer.c
index 7ee8e18eff7..7446665674a 100644
--- a/dlls/dwrite/analyzer.c
+++ b/dlls/dwrite/analyzer.c
@@ -1154,7 +1154,6 @@ static HRESULT WINAPI dwritetextanalyzer_GetGlyphs(IDWriteTextAnalyzer2 *iface,
     struct scriptshaping_context context = { 0 };
     struct dwrite_fontface *font_obj;
     WCHAR digits[NATIVE_DIGITS_LEN];
-    unsigned int script;
     HRESULT hr;
 
     TRACE("(%s:%u %p %d %d %s %s %p %p %p %u %u %p %p %p %p %p)\n", debugstr_wn(text, length),
@@ -1172,6 +1171,7 @@ static HRESULT WINAPI dwritetextanalyzer_GetGlyphs(IDWriteTextAnalyzer2 *iface,
     font_obj = unsafe_impl_from_IDWriteFontFace(fontface);
 
     context.cache = fontface_get_shaping_cache(font_obj);
+    context.script = analysis->script > Script_LastId ? Script_Unknown : analysis->script;
     context.text = text;
     context.length = length;
     context.is_rtl = is_rtl;
@@ -1190,8 +1190,7 @@ static HRESULT WINAPI dwritetextanalyzer_GetGlyphs(IDWriteTextAnalyzer2 *iface,
     context.glyph_infos = heap_alloc_zero(sizeof(*context.glyph_infos) * max_glyph_count);
     context.table = &context.cache->gsub;
 
-    script = analysis->script > Script_LastId ? Script_Unknown : analysis->script;
-    scriptprops = &dwritescripts_properties[script];
+    scriptprops = &dwritescripts_properties[context.script];
     hr = shape_get_glyphs(&context, scriptprops->scripttags);
     if (SUCCEEDED(hr))
     {
@@ -1217,7 +1216,7 @@ static HRESULT WINAPI dwritetextanalyzer_GetGlyphPlacements(IDWriteTextAnalyzer2
     const struct dwritescript_properties *scriptprops;
     struct scriptshaping_context context;
     struct dwrite_fontface *font_obj;
-    unsigned int i, script;
+    unsigned int i;
     HRESULT hr;
 
     TRACE("%s, %p, %p, %u, %p, %p, %u, %p, %.2f, %d, %d, %s, %s, %p, %p, %u, %p, %p.\n", debugstr_wn(text, text_len),
@@ -1243,10 +1242,8 @@ static HRESULT WINAPI dwritetextanalyzer_GetGlyphPlacements(IDWriteTextAnalyzer2
         offsets[i].ascenderOffset = 0.0f;
     }
 
-    script = analysis->script > Script_LastId ? Script_Unknown : analysis->script;
-    scriptprops = &dwritescripts_properties[script];
-
     context.cache = fontface_get_shaping_cache(font_obj);
+    context.script = analysis->script > Script_LastId ? Script_Unknown : analysis->script;
     context.text = text;
     context.length = text_len;
     context.is_rtl = is_rtl;
@@ -1267,6 +1264,7 @@ static HRESULT WINAPI dwritetextanalyzer_GetGlyphPlacements(IDWriteTextAnalyzer2
     context.glyph_infos = heap_alloc_zero(sizeof(*context.glyph_infos) * glyph_count);
     context.table = &context.cache->gpos;
 
+    scriptprops = &dwritescripts_properties[context.script];
     hr = shape_get_positions(&context, scriptprops->scripttags);
 
     heap_free(context.glyph_infos);
@@ -1286,7 +1284,7 @@ static HRESULT WINAPI dwritetextanalyzer_GetGdiCompatibleGlyphPlacements(IDWrite
     struct scriptshaping_context context;
     DWRITE_MEASURING_MODE measuring_mode;
     struct dwrite_fontface *font_obj;
-    unsigned int i, script;
+    unsigned int i;
     HRESULT hr;
 
     TRACE("%s, %p, %p, %u, %p, %p, %u, %p, %.2f, %.2f, %p, %d, %d, %d, %s, %s, %p, %p, %u, %p, %p.\n",
@@ -1314,10 +1312,8 @@ static HRESULT WINAPI dwritetextanalyzer_GetGdiCompatibleGlyphPlacements(IDWrite
         offsets[i].ascenderOffset = 0.0f;
     }
 
-    script = analysis->script > Script_LastId ? Script_Unknown : analysis->script;
-    scriptprops = &dwritescripts_properties[script];
-
     context.cache = fontface_get_shaping_cache(font_obj);
+    context.script = analysis->script > Script_LastId ? Script_Unknown : analysis->script;
     context.text = text;
     context.length = text_len;
     context.is_rtl = is_rtl;
@@ -1338,6 +1334,7 @@ static HRESULT WINAPI dwritetextanalyzer_GetGdiCompatibleGlyphPlacements(IDWrite
     context.glyph_infos = heap_alloc_zero(sizeof(*context.glyph_infos) * glyph_count);
     context.table = &context.cache->gpos;
 
+    scriptprops = &dwritescripts_properties[context.script];
     hr = shape_get_positions(&context, scriptprops->scripttags);
 
     heap_free(context.glyph_infos);
diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h
index 9fd9e0bc68f..485fcdb1f16 100644
--- a/dlls/dwrite/dwrite_private.h
+++ b/dlls/dwrite/dwrite_private.h
@@ -539,6 +539,7 @@ typedef void (*p_apply_context_lookup)(struct scriptshaping_context *context, un
 struct scriptshaping_context
 {
     struct scriptshaping_cache *cache;
+    unsigned int script;
     UINT32 language_tag;
 
     const WCHAR *text;
-- 
2.29.2




More information about the wine-devel mailing list