dwrite: Partial implementation of GetGdiCompatibleGlyphMetrics()

Nikolay Sivov nsivov at codeweavers.com
Wed Jul 15 11:59:46 CDT 2015


---
-------------- next part --------------
From d2bbbcaa571d8ab5a2409c905cd29441629f7269 Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <nsivov at codeweavers.com>
Date: Wed, 15 Jul 2015 16:21:40 +0300
Subject: [PATCH] dwrite: Partial implementation of
 GetGdiCompatibleGlyphMetrics()

---
 dlls/dwrite/font.c | 53 +++++++++++++++++++++++++++++++++++++++++------------
 1 file changed, 41 insertions(+), 12 deletions(-)

diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index 9b7a50f..74023c3 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -600,14 +600,48 @@ static HRESULT WINAPI dwritefontface_GetGdiCompatibleMetrics(IDWriteFontFace2 *i
     return hr;
 }
 
-static HRESULT WINAPI dwritefontface_GetGdiCompatibleGlyphMetrics(IDWriteFontFace2 *iface, FLOAT emSize, FLOAT pixels_per_dip,
-    DWRITE_MATRIX const *transform, BOOL use_gdi_natural, UINT16 const *glyph_indices, UINT32 glyph_count,
+static inline int round_metric(FLOAT metric)
+{
+    return (int)floorf(metric + 0.5f);
+}
+
+static HRESULT WINAPI dwritefontface_GetGdiCompatibleGlyphMetrics(IDWriteFontFace2 *iface, FLOAT emSize, FLOAT ppdip,
+    DWRITE_MATRIX const *m, BOOL use_gdi_natural, UINT16 const *glyphs, UINT32 glyph_count,
     DWRITE_GLYPH_METRICS *metrics, BOOL is_sideways)
 {
     struct dwrite_fontface *This = impl_from_IDWriteFontFace2(iface);
-    FIXME("(%p)->(%f %f %p %d %p %u %p %d): stub\n", This, emSize, pixels_per_dip, transform, use_gdi_natural, glyph_indices,
+    FLOAT scale;
+    HRESULT hr;
+    UINT32 i;
+
+    TRACE("(%p)->(%.2f %.2f %p %d %p %u %p %d)\n", This, emSize, ppdip, m, use_gdi_natural, glyphs,
         glyph_count, metrics, is_sideways);
-    return E_NOTIMPL;
+
+    if (m && memcmp(m, &identity, sizeof(*m)))
+        FIXME("transform is not supported, %s\n", debugstr_matrix(m));
+
+    scale = emSize * ppdip / This->metrics.designUnitsPerEm;
+
+    for (i = 0; i < glyph_count; i++) {
+        DWRITE_GLYPH_METRICS *ret = metrics + i;
+        DWRITE_GLYPH_METRICS design;
+
+        hr = IDWriteFontFace2_GetDesignGlyphMetrics(iface, glyphs + i, 1, &design, is_sideways);
+        if (FAILED(hr))
+            return hr;
+
+#define SCALE_METRIC(x) ret->x = round_metric(round_metric((design.x) * scale) / scale)
+        SCALE_METRIC(leftSideBearing);
+        SCALE_METRIC(advanceWidth);
+        SCALE_METRIC(rightSideBearing);
+        SCALE_METRIC(topSideBearing);
+        SCALE_METRIC(advanceHeight);
+        SCALE_METRIC(bottomSideBearing);
+        SCALE_METRIC(verticalOriginY);
+#undef  SCALE_METRIC
+    }
+
+    return S_OK;
 }
 
 static void WINAPI dwritefontface1_GetMetrics(IDWriteFontFace2 *iface, DWRITE_FONT_METRICS1 *metrics)
@@ -617,11 +651,6 @@ static void WINAPI dwritefontface1_GetMetrics(IDWriteFontFace2 *iface, DWRITE_FO
     *metrics = This->metrics;
 }
 
-static inline int round_metric(FLOAT metric)
-{
-    return (int)floorf(metric + 0.5f);
-}
-
 static HRESULT WINAPI dwritefontface1_GetGdiCompatibleMetrics(IDWriteFontFace2 *iface, FLOAT em_size, FLOAT pixels_per_dip,
     const DWRITE_MATRIX *m, DWRITE_FONT_METRICS1 *metrics)
 {
@@ -733,6 +762,7 @@ static HRESULT WINAPI dwritefontface1_GetGdiCompatibleGlyphAdvances(IDWriteFontF
     BOOL is_sideways, UINT32 glyph_count, UINT16 const *glyphs, INT32 *advances)
 {
     struct dwrite_fontface *This = impl_from_IDWriteFontFace2(iface);
+    FLOAT scale;
     HRESULT hr;
     UINT32 i;
 
@@ -742,14 +772,13 @@ static HRESULT WINAPI dwritefontface1_GetGdiCompatibleGlyphAdvances(IDWriteFontF
     if (m && memcmp(m, &identity, sizeof(*m)))
         FIXME("transform is not supported, %s\n", debugstr_matrix(m));
 
-    for (i = 0; i < glyph_count; i++) {
-        FLOAT scale;
+    scale = em_size * ppdip / This->metrics.designUnitsPerEm;
 
+    for (i = 0; i < glyph_count; i++) {
         hr = IDWriteFontFace2_GetDesignGlyphAdvances(iface, 1, glyphs + i, advances + i, is_sideways);
         if (FAILED(hr))
             return hr;
 
-        scale = em_size * ppdip / This->metrics.designUnitsPerEm;
 #define SCALE_METRIC(x) x = round_metric(round_metric((x) * scale) / scale)
         SCALE_METRIC(advances[i]);
 #undef  SCALE_METRIC
-- 
2.1.4



More information about the wine-patches mailing list