Nikolay Sivov : dwrite: Remove OpenType language id from cache.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Nov 10 07:49:47 CST 2014


Module: wine
Branch: master
Commit: 53209e70170437dddbcad8662ca5b2754d549bbc
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=53209e70170437dddbcad8662ca5b2754d549bbc

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Mon Nov 10 10:03:28 2014 +0300

dwrite: Remove OpenType language id from cache.

---

 dlls/dwrite/analyzer.c       | 21 +++++++++++++++++----
 dlls/dwrite/dwrite_private.h | 20 ++++++++++++++++----
 dlls/dwrite/shape.c          | 26 +++++++++-----------------
 3 files changed, 42 insertions(+), 25 deletions(-)

diff --git a/dlls/dwrite/analyzer.c b/dlls/dwrite/analyzer.c
index 82e9fa5..3670e46 100644
--- a/dlls/dwrite/analyzer.c
+++ b/dlls/dwrite/analyzer.c
@@ -844,6 +844,7 @@ static HRESULT WINAPI dwritetextanalyzer_GetGlyphs(IDWriteTextAnalyzer2 *iface,
     DWRITE_SHAPING_GLYPH_PROPERTIES* glyph_props, UINT32* actual_glyph_count)
 {
     const struct dwritescript_properties *scriptprops;
+    struct scriptshaping_context context;
     struct scriptshaping_cache *cache;
     WCHAR *string;
     BOOL update_cluster;
@@ -924,13 +925,25 @@ static HRESULT WINAPI dwritetextanalyzer_GetGlyphs(IDWriteTextAnalyzer2 *iface,
     }
     *actual_glyph_count = g;
 
-    hr = create_scriptshaping_cache(fontface, locale, &cache);
+    hr = create_scriptshaping_cache(fontface, &cache);
     if (FAILED(hr))
         goto done;
 
+    context.cache = cache;
+    context.text = text;
+    context.length = length;
+    context.is_rtl = is_rtl;
+    context.max_glyph_count = max_glyph_count;
+    context.language_tag = DWRITE_MAKE_OPENTYPE_TAG('d','f','l','t');
+    if (locale) {
+        WCHAR tag[5];
+        if (GetLocaleInfoEx(locale, LOCALE_SOPENTYPELANGUAGETAG, tag, sizeof(tag)/sizeof(WCHAR)))
+            context.language_tag = DWRITE_MAKE_OPENTYPE_TAG(tag[0],tag[1],tag[2],tag[3]);
+    }
+
     scriptprops = &dwritescripts_properties[script];
     if (scriptprops->ops && scriptprops->ops->contextual_shaping) {
-        hr = scriptprops->ops->contextual_shaping(cache, is_rtl, string, length, max_glyph_count, clustermap, glyph_indices, actual_glyph_count);
+        hr = scriptprops->ops->contextual_shaping(&context, clustermap, glyph_indices, actual_glyph_count);
         if (FAILED(hr))
             goto done;
     }
@@ -938,9 +951,9 @@ static HRESULT WINAPI dwritetextanalyzer_GetGlyphs(IDWriteTextAnalyzer2 *iface,
     /* FIXME: apply default features */
 
     if (scriptprops->ops && scriptprops->ops->set_text_glyphs_props)
-        hr = scriptprops->ops->set_text_glyphs_props(cache, string, length, clustermap, glyph_indices, *actual_glyph_count, text_props, glyph_props);
+        hr = scriptprops->ops->set_text_glyphs_props(&context, clustermap, glyph_indices, *actual_glyph_count, text_props, glyph_props);
     else
-        hr = default_shaping_ops.set_text_glyphs_props(cache, string, length, clustermap, glyph_indices, *actual_glyph_count, text_props, glyph_props);
+        hr = default_shaping_ops.set_text_glyphs_props(&context, clustermap, glyph_indices, *actual_glyph_count, text_props, glyph_props);
 
 done:
     release_scriptshaping_cache(cache);
diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h
index 57983ed..d1c42ce 100644
--- a/dlls/dwrite/dwrite_private.h
+++ b/dlls/dwrite/dwrite_private.h
@@ -143,14 +143,26 @@ enum SCRIPT_JUSTIFY
 };
 
 struct scriptshaping_cache;
-extern HRESULT create_scriptshaping_cache(IDWriteFontFace*,const WCHAR*,struct scriptshaping_cache**) DECLSPEC_HIDDEN;
+
+struct scriptshaping_context
+{
+    struct scriptshaping_cache *cache;
+    UINT32 language_tag;
+
+    const WCHAR *text;
+    UINT32 length;
+    BOOL is_rtl;
+
+    UINT32 max_glyph_count;
+};
+
+extern HRESULT create_scriptshaping_cache(IDWriteFontFace*,struct scriptshaping_cache**) DECLSPEC_HIDDEN;
 extern void release_scriptshaping_cache(struct scriptshaping_cache*) DECLSPEC_HIDDEN;
 
 struct scriptshaping_ops
 {
-    HRESULT (*contextual_shaping)(struct scriptshaping_cache *cache, BOOL is_rtl, const WCHAR *text, UINT32 len, UINT32 max_glyph_count,
-                                  UINT16 *clustermap, UINT16 *glyph_indices, UINT32* actual_glyph_count);
-    HRESULT (*set_text_glyphs_props)(struct scriptshaping_cache *cache, const WCHAR *text, UINT32 len, UINT16 *clustermap, UINT16 *glyph_indices,
+    HRESULT (*contextual_shaping)(struct scriptshaping_context *context, UINT16 *clustermap, UINT16 *glyph_indices, UINT32* actual_glyph_count);
+    HRESULT (*set_text_glyphs_props)(struct scriptshaping_context *context, UINT16 *clustermap, UINT16 *glyph_indices,
                                      UINT32 glyphcount, DWRITE_SHAPING_TEXT_PROPERTIES *text_props, DWRITE_SHAPING_GLYPH_PROPERTIES *glyph_props);
 };
 
diff --git a/dlls/dwrite/shape.c b/dlls/dwrite/shape.c
index 00c9548..c1ae452 100644
--- a/dlls/dwrite/shape.c
+++ b/dlls/dwrite/shape.c
@@ -28,10 +28,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(dwrite);
 struct scriptshaping_cache
 {
     IDWriteFontFace *fontface;
-    UINT32 language_tag;
 };
 
-HRESULT create_scriptshaping_cache(IDWriteFontFace *fontface, const WCHAR *locale, struct scriptshaping_cache **cache)
+HRESULT create_scriptshaping_cache(IDWriteFontFace *fontface, struct scriptshaping_cache **cache)
 {
     struct scriptshaping_cache *ret;
 
@@ -42,13 +41,6 @@ HRESULT create_scriptshaping_cache(IDWriteFontFace *fontface, const WCHAR *local
     ret->fontface = fontface;
     IDWriteFontFace_AddRef(fontface);
 
-    ret->language_tag = DWRITE_MAKE_OPENTYPE_TAG('d','f','l','t');
-    if (locale) {
-        WCHAR tag[5];
-        if (GetLocaleInfoEx(locale, LOCALE_SOPENTYPELANGUAGETAG, tag, sizeof(tag)/sizeof(WCHAR)))
-            ret->language_tag = DWRITE_MAKE_OPENTYPE_TAG(tag[0],tag[1],tag[2],tag[3]);
-    }
-
     *cache = ret;
 
     return S_OK;
@@ -122,7 +114,7 @@ static INT32 map_glyph_to_text_pos(const UINT16 *clustermap, UINT32 len, UINT16
     return k;
 }
 
-static HRESULT default_set_text_glyphs_props(struct scriptshaping_cache *cache, const WCHAR *text, UINT32 len, UINT16 *clustermap, UINT16 *glyph_indices,
+static HRESULT default_set_text_glyphs_props(struct scriptshaping_context *context, UINT16 *clustermap, UINT16 *glyph_indices,
                                      UINT32 glyphcount, DWRITE_SHAPING_TEXT_PROPERTIES *text_props, DWRITE_SHAPING_GLYPH_PROPERTIES *glyph_props)
 {
     UINT32 i;
@@ -132,36 +124,36 @@ static HRESULT default_set_text_glyphs_props(struct scriptshaping_cache *cache,
         UINT32 char_count = 0;
         INT32 k;
 
-        k = map_glyph_to_text_pos(clustermap, len, i);
+        k = map_glyph_to_text_pos(clustermap, context->length, i);
         if (k >= 0) {
-            for (; k < len && clustermap[k] == i; k++)
+            for (; k < context->length && clustermap[k] == i; k++)
                 char_index[char_count++] = k;
         }
 
         if (char_count == 0)
             continue;
 
-        if (char_count == 1 && isspaceW(text[char_index[0]])) {
+        if (char_count == 1 && isspaceW(context->text[char_index[0]])) {
             glyph_props[i].justification = SCRIPT_JUSTIFY_BLANK;
-            text_props[char_index[0]].isShapedAlone = text[char_index[0]] == ' ';
+            text_props[char_index[0]].isShapedAlone = context->text[char_index[0]] == ' ';
         }
         else
             glyph_props[i].justification = SCRIPT_JUSTIFY_CHARACTER;
     }
 
     /* FIXME: update properties using GDEF table */
-    shape_update_clusters_from_glyphprop(glyphcount, len, clustermap, glyph_props);
+    shape_update_clusters_from_glyphprop(glyphcount, context->length, clustermap, glyph_props);
 
     return S_OK;
 }
 
-static HRESULT latn_set_text_glyphs_props(struct scriptshaping_cache *cache, const WCHAR *text, UINT32 len, UINT16 *clustermap, UINT16 *glyph_indices,
+static HRESULT latn_set_text_glyphs_props(struct scriptshaping_context *context, UINT16 *clustermap, UINT16 *glyph_indices,
                                      UINT32 glyphcount, DWRITE_SHAPING_TEXT_PROPERTIES *text_props, DWRITE_SHAPING_GLYPH_PROPERTIES *glyph_props)
 {
     HRESULT hr;
     UINT32 i;
 
-    hr = default_set_text_glyphs_props(cache, text, len, clustermap, glyph_indices, glyphcount, text_props, glyph_props);
+    hr = default_set_text_glyphs_props(context, clustermap, glyph_indices, glyphcount, text_props, glyph_props);
 
     for (i = 0; i < glyphcount; i++)
         if (glyph_props[i].isZeroWidthSpace)




More information about the wine-cvs mailing list