dwrite: Partially implement GetGdiCompatibleGlyphAdvances()
Nikolay Sivov
nsivov at codeweavers.com
Wed Jul 15 06:40:32 CDT 2015
---
-------------- next part --------------
From 690eaf22f485d2be194a4e9b7eefe2e389e942c8 Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <nsivov at codeweavers.com>
Date: Wed, 15 Jul 2015 13:36:15 +0300
Subject: [PATCH] dwrite: Partially implement GetGdiCompatibleGlyphAdvances()
---
dlls/dwrite/dwrite_private.h | 7 +++++++
dlls/dwrite/font.c | 32 ++++++++++++++++++++++++++------
2 files changed, 33 insertions(+), 6 deletions(-)
diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h
index a102e14..0111e46 100644
--- a/dlls/dwrite/dwrite_private.h
+++ b/dlls/dwrite/dwrite_private.h
@@ -92,6 +92,13 @@ static inline const char *debugstr_range(const DWRITE_TEXT_RANGE *range)
return wine_dbg_sprintf("%u:%u", range->startPosition, range->length);
}
+static inline const char *debugstr_matrix(const DWRITE_MATRIX *m)
+{
+ if (!m) return "(null)";
+ return wine_dbg_sprintf("{%.2f,%.2f,%.2f,%.2f,%.2f,%.2f}", m->m11, m->m12, m->m21, m->m22,
+ m->dx, m->dy);
+}
+
static inline unsigned short get_table_entry(const unsigned short *table, WCHAR ch)
{
return table[table[table[ch >> 8] + ((ch >> 4) & 0x0f)] + (ch & 0xf)];
diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index 41b0250..9b7a50f 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -619,7 +619,7 @@ static void WINAPI dwritefontface1_GetMetrics(IDWriteFontFace2 *iface, DWRITE_FO
static inline int round_metric(FLOAT metric)
{
- return (int)floor(metric + 0.5);
+ return (int)floorf(metric + 0.5f);
}
static HRESULT WINAPI dwritefontface1_GetGdiCompatibleMetrics(IDWriteFontFace2 *iface, FLOAT em_size, FLOAT pixels_per_dip,
@@ -729,13 +729,33 @@ static HRESULT WINAPI dwritefontface1_GetDesignGlyphAdvances(IDWriteFontFace2 *i
}
static HRESULT WINAPI dwritefontface1_GetGdiCompatibleGlyphAdvances(IDWriteFontFace2 *iface,
- FLOAT em_size, FLOAT pixels_per_dip, const DWRITE_MATRIX *transform, BOOL use_gdi_natural,
- BOOL is_sideways, UINT32 glyph_count, UINT16 const *indices, INT32 *advances)
+ FLOAT em_size, FLOAT ppdip, const DWRITE_MATRIX *m, BOOL use_gdi_natural,
+ BOOL is_sideways, UINT32 glyph_count, UINT16 const *glyphs, INT32 *advances)
{
struct dwrite_fontface *This = impl_from_IDWriteFontFace2(iface);
- FIXME("(%p)->(%f %f %p %d %d %u %p %p): stub\n", This, em_size, pixels_per_dip, transform,
- use_gdi_natural, is_sideways, glyph_count, indices, advances);
- return E_NOTIMPL;
+ HRESULT hr;
+ UINT32 i;
+
+ TRACE("(%p)->(%.2f %.2f %p %d %d %u %p %p)\n", This, em_size, ppdip, m,
+ use_gdi_natural, is_sideways, glyph_count, glyphs, advances);
+
+ 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;
+
+ 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
+ }
+
+ return S_OK;
}
static HRESULT WINAPI dwritefontface1_GetKerningPairAdjustments(IDWriteFontFace2 *iface, UINT32 count,
--
2.1.4
More information about the wine-patches
mailing list