Nikolay Sivov : dwrite: Partial implementation of GetGdiCompatibleGlyphMetrics().
Alexandre Julliard
julliard at wine.codeweavers.com
Thu Jul 16 08:37:19 CDT 2015
Module: wine
Branch: master
Commit: a3f2b6b8566de7c2c32db621c00d485fff39daa5
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a3f2b6b8566de7c2c32db621c00d485fff39daa5
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Wed Jul 15 19:59:46 2015 +0300
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
More information about the wine-cvs
mailing list