Nikolay Sivov : dwrite: Use vertical variants in GetGlyphs() when appropriate.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Feb 18 09:57:19 CST 2015


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Wed Feb 18 15:50:41 2015 +0300

dwrite: Use vertical variants in GetGlyphs() when appropriate.

---

 dlls/dwrite/analyzer.c | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/dlls/dwrite/analyzer.c b/dlls/dwrite/analyzer.c
index b9caefd..62a6b15 100644
--- a/dlls/dwrite/analyzer.c
+++ b/dlls/dwrite/analyzer.c
@@ -864,8 +864,9 @@ static HRESULT WINAPI dwritetextanalyzer_GetGlyphs(IDWriteTextAnalyzer2 *iface,
     const struct dwritescript_properties *scriptprops;
     struct scriptshaping_context context;
     struct scriptshaping_cache *cache = NULL;
+    BOOL update_cluster, need_vertical;
+    IDWriteFontFace1 *fontface1;
     WCHAR *string;
-    BOOL update_cluster;
     UINT32 i, g;
     HRESULT hr = S_OK;
     UINT16 script;
@@ -909,6 +910,12 @@ static HRESULT WINAPI dwritetextanalyzer_GetGlyphs(IDWriteTextAnalyzer2 *iface,
     if (!string)
         return E_OUTOFMEMORY;
 
+    hr = IDWriteFontFace_QueryInterface(fontface, &IID_IDWriteFontFace1, (void**)&fontface1);
+    if (FAILED(hr))
+        WARN("failed to get IDWriteFontFace1\n");
+
+    need_vertical = is_sideways && fontface1 && IDWriteFontFace1_HasVerticalGlyphVariants(fontface1);
+
     for (i = 0, g = 0, update_cluster = FALSE; i < length; i++) {
         UINT32 codepoint;
 
@@ -928,6 +935,14 @@ static HRESULT WINAPI dwritetextanalyzer_GetGlyphs(IDWriteTextAnalyzer2 *iface,
             if (FAILED(hr))
                 goto done;
 
+            if (need_vertical) {
+                UINT16 vertical;
+
+                hr = IDWriteFontFace1_GetVerticalGlyphVariants(fontface1, 1, &glyph_indices[g], &vertical);
+                if (hr == S_OK)
+                    glyph_indices[g] = vertical;
+            }
+
             g++;
         }
         else {
@@ -969,6 +984,8 @@ static HRESULT WINAPI dwritetextanalyzer_GetGlyphs(IDWriteTextAnalyzer2 *iface,
         hr = default_shaping_ops.set_text_glyphs_props(&context, clustermap, glyph_indices, *actual_glyph_count, text_props, glyph_props);
 
 done:
+    if (fontface1)
+        IDWriteFontFace1_Release(fontface1);
     release_scriptshaping_cache(cache);
     heap_free(string);
 




More information about the wine-cvs mailing list