Nikolay Sivov : dwrite: Forward GetGdiCompatibleGlyphPlacements() to corresponding font methods.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Jun 1 07:36:59 CDT 2015


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Fri May 29 00:15:35 2015 +0300

dwrite: Forward GetGdiCompatibleGlyphPlacements() to corresponding font methods.

---

 dlls/dwrite/analyzer.c     | 48 +++++++++++++++++++++++++++++++++++++++-------
 dlls/dwrite/tests/layout.c |  1 -
 2 files changed, 41 insertions(+), 8 deletions(-)

diff --git a/dlls/dwrite/analyzer.c b/dlls/dwrite/analyzer.c
index a1beeb3..8c2a801 100644
--- a/dlls/dwrite/analyzer.c
+++ b/dlls/dwrite/analyzer.c
@@ -1058,22 +1058,56 @@ static HRESULT WINAPI dwritetextanalyzer_GetGlyphPlacements(IDWriteTextAnalyzer2
     }
 
     /* FIXME: actually apply features */
+
+    IDWriteFontFace1_Release(fontface1);
     return S_OK;
 }
 
 static HRESULT WINAPI dwritetextanalyzer_GetGdiCompatibleGlyphPlacements(IDWriteTextAnalyzer2 *iface,
     WCHAR const* text, UINT16 const* clustermap, DWRITE_SHAPING_TEXT_PROPERTIES* props,
-    UINT32 text_len, UINT16 const* glyph_indices, DWRITE_SHAPING_GLYPH_PROPERTIES const* glyph_props,
-    UINT32 glyph_count, IDWriteFontFace * font_face, FLOAT fontEmSize, FLOAT pixels_per_dip,
+    UINT32 text_len, UINT16 const* glyphs, DWRITE_SHAPING_GLYPH_PROPERTIES const* glyph_props,
+    UINT32 glyph_count, IDWriteFontFace *fontface, FLOAT emSize, FLOAT pixels_per_dip,
     DWRITE_MATRIX const* transform, BOOL use_gdi_natural, BOOL is_sideways, BOOL is_rtl,
     DWRITE_SCRIPT_ANALYSIS const* analysis, WCHAR const* locale, DWRITE_TYPOGRAPHIC_FEATURES const** features,
-    UINT32 const* feature_range_lengths, UINT32 feature_ranges, FLOAT* glyph_advances, DWRITE_GLYPH_OFFSET* glyph_offsets)
+    UINT32 const* feature_range_lengths, UINT32 feature_ranges, FLOAT *advances, DWRITE_GLYPH_OFFSET *offsets)
 {
-    FIXME("(%s %p %p %u %p %p %u %p %f %f %p %d %d %d %p %s %p %p %u %p %p): stub\n", debugstr_wn(text, text_len),
-        clustermap, props, text_len, glyph_indices, glyph_props, glyph_count, font_face, fontEmSize, pixels_per_dip,
+    DWRITE_FONT_METRICS metrics;
+    IDWriteFontFace1 *fontface1;
+    HRESULT hr;
+    UINT32 i;
+
+    TRACE("(%s %p %p %u %p %p %u %p %.2f %.2f %p %d %d %d %p %s %p %p %u %p %p)\n", debugstr_wn(text, text_len),
+        clustermap, props, text_len, glyphs, glyph_props, glyph_count, fontface, emSize, pixels_per_dip,
         transform, use_gdi_natural, is_sideways, is_rtl, analysis, debugstr_w(locale), features, feature_range_lengths,
-        feature_ranges, glyph_advances, glyph_offsets);
-    return E_NOTIMPL;
+        feature_ranges, advances, offsets);
+
+    if (glyph_count == 0)
+        return S_OK;
+
+    hr = IDWriteFontFace_QueryInterface(fontface, &IID_IDWriteFontFace1, (void**)&fontface1);
+    if (FAILED(hr)) {
+        WARN("failed to get IDWriteFontFace1.\n");
+        return hr;
+    }
+
+    IDWriteFontFace_GetGdiCompatibleMetrics(fontface, emSize, pixels_per_dip, transform, &metrics);
+    for (i = 0; i < glyph_count; i++) {
+        INT32 a;
+
+        hr = IDWriteFontFace1_GetGdiCompatibleGlyphAdvances(fontface1, emSize, pixels_per_dip,
+            transform, use_gdi_natural, is_sideways, 1, &glyphs[i], &a);
+        if (FAILED(hr))
+            a = 0;
+
+        advances[i] = get_scaled_advance_width(a, emSize, &metrics);
+        offsets[i].advanceOffset = 0.0;
+        offsets[i].ascenderOffset = 0.0;
+    }
+
+    /* FIXME: actually apply features */
+
+    IDWriteFontFace1_Release(fontface1);
+    return S_OK;
 }
 
 static inline FLOAT get_cluster_advance(const FLOAT *advances, UINT32 start, UINT32 end)
diff --git a/dlls/dwrite/tests/layout.c b/dlls/dwrite/tests/layout.c
index 5711cb3..b0812fd 100644
--- a/dlls/dwrite/tests/layout.c
+++ b/dlls/dwrite/tests/layout.c
@@ -921,7 +921,6 @@ static void test_Draw(void)
 
     flush_sequence(sequences, RENDERER_ID);
     hr = IDWriteTextLayout_Draw(layout, NULL, &testrenderer, 0.0, 0.0);
-todo_wine
     ok(hr == S_OK, "got 0x%08x\n", hr);
     ok_sequence(sequences, RENDERER_ID, draw_seq, "draw test", TRUE);
     IDWriteTextLayout_Release(layout);




More information about the wine-cvs mailing list