Nikolay Sivov : dwrite: Store OpenType language tag in shaping cache.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Oct 7 14:49:56 CDT 2014


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Mon Oct  6 05:01:22 2014 +0400

dwrite: Store OpenType language tag in shaping cache.

---

 dlls/dwrite/analyzer.c       |  2 +-
 dlls/dwrite/dwrite_private.h |  6 +++++-
 dlls/dwrite/opentype.c       |  4 ----
 dlls/dwrite/shape.c          | 10 +++++++++-
 4 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/dlls/dwrite/analyzer.c b/dlls/dwrite/analyzer.c
index e2fac55..5851e90 100644
--- a/dlls/dwrite/analyzer.c
+++ b/dlls/dwrite/analyzer.c
@@ -926,7 +926,7 @@ static HRESULT WINAPI dwritetextanalyzer_GetGlyphs(IDWriteTextAnalyzer2 *iface,
     }
     *actual_glyph_count = g;
 
-    hr = create_scriptshaping_cache(fontface, &cache);
+    hr = create_scriptshaping_cache(fontface, locale, &cache);
     if (FAILED(hr))
         goto done;
 
diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h
index 3eb7957..5a2b5a3 100644
--- a/dlls/dwrite/dwrite_private.h
+++ b/dlls/dwrite/dwrite_private.h
@@ -19,6 +19,10 @@
 #include "wine/debug.h"
 #include "wine/unicode.h"
 
+#define DWRITE_MAKE_OPENTYPE_TAG(ch0, ch1, ch2, ch3) \
+                    ((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) | \
+                    ((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24))
+
 static inline void *heap_alloc(size_t len)
 {
     return HeapAlloc(GetProcessHeap(), 0, len);
@@ -136,7 +140,7 @@ enum SCRIPT_JUSTIFY
 };
 
 struct scriptshaping_cache;
-extern HRESULT create_scriptshaping_cache(IDWriteFontFace*,struct scriptshaping_cache**) DECLSPEC_HIDDEN;
+extern HRESULT create_scriptshaping_cache(IDWriteFontFace*,const WCHAR*,struct scriptshaping_cache**) DECLSPEC_HIDDEN;
 extern void release_scriptshaping_cache(struct scriptshaping_cache*) DECLSPEC_HIDDEN;
 
 struct scriptshaping_ops
diff --git a/dlls/dwrite/opentype.c b/dlls/dwrite/opentype.c
index 532c126..318adcf 100644
--- a/dlls/dwrite/opentype.c
+++ b/dlls/dwrite/opentype.c
@@ -25,10 +25,6 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(dwrite);
 
-#define DWRITE_MAKE_OPENTYPE_TAG(ch0, ch1, ch2, ch3) \
-                    ((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) | \
-                    ((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24))
-
 #define MS_TTCF_TAG DWRITE_MAKE_OPENTYPE_TAG('t','t','c','f')
 #define MS_OTTO_TAG DWRITE_MAKE_OPENTYPE_TAG('O','T','T','O')
 
diff --git a/dlls/dwrite/shape.c b/dlls/dwrite/shape.c
index bf09861..dbf5c67 100644
--- a/dlls/dwrite/shape.c
+++ b/dlls/dwrite/shape.c
@@ -29,9 +29,10 @@ WINE_DEFAULT_DEBUG_CHANNEL(dwrite);
 struct scriptshaping_cache
 {
     IDWriteFontFace *fontface;
+    UINT32 language_tag;
 };
 
-HRESULT create_scriptshaping_cache(IDWriteFontFace *fontface, struct scriptshaping_cache **cache)
+HRESULT create_scriptshaping_cache(IDWriteFontFace *fontface, const WCHAR *locale, struct scriptshaping_cache **cache)
 {
     struct scriptshaping_cache *ret;
 
@@ -42,6 +43,13 @@ HRESULT create_scriptshaping_cache(IDWriteFontFace *fontface, struct scriptshapi
     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;




More information about the wine-cvs mailing list