[PATCH 2/4] dwrite: Implement GetAlphaBlendParams()
Nikolay Sivov
nsivov at codeweavers.com
Wed Jul 29 03:58:24 CDT 2015
---
-------------- next part --------------
>From 0f1dd85bb16f02f46a562df0ff9d971a36bf6522 Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <nsivov at codeweavers.com>
Date: Wed, 29 Jul 2015 11:52:08 +0300
Subject: [PATCH 2/4] dwrite: Implement GetAlphaBlendParams()
---
dlls/dwrite/font.c | 34 +++++++++++++--
dlls/dwrite/tests/font.c | 110 +++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 141 insertions(+), 3 deletions(-)
diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index 9876451..3f016d6 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -2933,11 +2933,39 @@ static HRESULT WINAPI glyphrunanalysis_CreateAlphaTexture(IDWriteGlyphRunAnalysi
}
static HRESULT WINAPI glyphrunanalysis_GetAlphaBlendParams(IDWriteGlyphRunAnalysis *iface, IDWriteRenderingParams *params,
- FLOAT *blendGamma, FLOAT *blendEnhancedContrast, FLOAT *blendClearTypeLevel)
+ FLOAT *gamma, FLOAT *contrast, FLOAT *cleartypelevel)
{
struct dwrite_glyphrunanalysis *This = impl_from_IDWriteGlyphRunAnalysis(iface);
- FIXME("(%p)->(%p %p %p %p): stub\n", This, params, blendGamma, blendEnhancedContrast, blendClearTypeLevel);
- return E_NOTIMPL;
+
+ TRACE("(%p)->(%p %p %p %p)\n", This, params, gamma, contrast, cleartypelevel);
+
+ if (!params)
+ return E_INVALIDARG;
+
+ switch (This->rendering_mode)
+ {
+ case DWRITE_RENDERING_MODE_GDI_CLASSIC:
+ case DWRITE_RENDERING_MODE_GDI_NATURAL:
+ {
+ UINT value = 0;
+ SystemParametersInfoW(SPI_GETFONTSMOOTHINGCONTRAST, 0, &value, 0);
+ *gamma = (FLOAT)value / 1000.0f;
+ *contrast = 0.0f;
+ *cleartypelevel = 1.0f;
+ break;
+ }
+ case DWRITE_RENDERING_MODE_ALIASED:
+ case DWRITE_RENDERING_MODE_NATURAL:
+ case DWRITE_RENDERING_MODE_NATURAL_SYMMETRIC:
+ *gamma = IDWriteRenderingParams_GetGamma(params);
+ *contrast = IDWriteRenderingParams_GetEnhancedContrast(params);
+ *cleartypelevel = IDWriteRenderingParams_GetClearTypeLevel(params);
+ break;
+ default:
+ ;
+ }
+
+ return S_OK;
}
static const struct IDWriteGlyphRunAnalysisVtbl glyphrunanalysisvtbl = {
diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c
index bd001e7..502930f 100644
--- a/dlls/dwrite/tests/font.c
+++ b/dlls/dwrite/tests/font.c
@@ -20,6 +20,7 @@
*/
#include <math.h>
+#include <limits.h>
#define COBJMACROS
@@ -4346,6 +4347,114 @@ if (0) /* crashes on native */
IDWriteFactory_Release(factory);
}
+static inline BOOL float_eq(FLOAT left, FLOAT right)
+{
+ int x = *(int *)&left;
+ int y = *(int *)&right;
+
+ if (x < 0)
+ x = INT_MIN - x;
+ if (y < 0)
+ y = INT_MIN - y;
+
+ return abs(x - y) <= 8;
+}
+
+static void test_GetAlphaBlendParams(void)
+{
+ static const DWRITE_RENDERING_MODE rendermodes[] = {
+ DWRITE_RENDERING_MODE_ALIASED,
+ DWRITE_RENDERING_MODE_GDI_CLASSIC,
+ DWRITE_RENDERING_MODE_GDI_NATURAL,
+ DWRITE_RENDERING_MODE_NATURAL,
+ DWRITE_RENDERING_MODE_NATURAL_SYMMETRIC,
+ };
+
+ IDWriteGlyphRunAnalysis *analysis;
+ FLOAT gamma, contrast, ctlevel;
+ IDWriteRenderingParams *params;
+ DWRITE_GLYPH_METRICS metrics;
+ DWRITE_GLYPH_OFFSET offset;
+ IDWriteFontFace *fontface;
+ IDWriteFactory *factory;
+ DWRITE_GLYPH_RUN run;
+ FLOAT advance, expected_gdi_gamma;
+ UINT value = 0;
+ UINT16 glyph;
+ UINT32 ch, i;
+ HRESULT hr;
+ BOOL ret;
+
+ factory = create_factory();
+ fontface = create_fontface(factory);
+
+ ch = 'A';
+ glyph = 0;
+ hr = IDWriteFontFace_GetGlyphIndices(fontface, &ch, 1, &glyph);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(glyph > 0, "got %u\n", glyph);
+
+ hr = IDWriteFontFace_GetDesignGlyphMetrics(fontface, &glyph, 1, &metrics, FALSE);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ advance = metrics.advanceWidth;
+
+ offset.advanceOffset = 0.0;
+ offset.ascenderOffset = 0.0;
+
+ run.fontFace = fontface;
+ run.fontEmSize = 24.0;
+ run.glyphCount = 1;
+ run.glyphIndices = &glyph;
+ run.glyphAdvances = &advance;
+ run.glyphOffsets = &offset;
+ run.isSideways = FALSE;
+ run.bidiLevel = 0;
+
+ hr = IDWriteFactory_CreateCustomRenderingParams(factory, 0.9, 0.3, 0.1, DWRITE_PIXEL_GEOMETRY_RGB,
+ DWRITE_RENDERING_MODE_DEFAULT, ¶ms);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+
+ value = 0;
+ ret = SystemParametersInfoW(SPI_GETFONTSMOOTHINGCONTRAST, 0, &value, 0);
+ ok(ret, "got %d\n", ret);
+ expected_gdi_gamma = (FLOAT)(value / 1000.0);
+
+ for (i = 0; i < sizeof(rendermodes)/sizeof(rendermodes[0]); i++) {
+ hr = IDWriteFactory_CreateGlyphRunAnalysis(factory, &run, 1.0, NULL,
+ rendermodes[i], DWRITE_MEASURING_MODE_NATURAL,
+ 0.0, 0.0, &analysis);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+
+ gamma = contrast = ctlevel = -1.0;
+ hr = IDWriteGlyphRunAnalysis_GetAlphaBlendParams(analysis, NULL, &gamma, &contrast, &ctlevel);
+ ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
+ ok(gamma == -1.0, "got %.2f\n", gamma);
+ ok(contrast == -1.0, "got %.2f\n", contrast);
+ ok(ctlevel == -1.0, "got %.2f\n", ctlevel);
+
+ gamma = contrast = ctlevel = -1.0;
+ hr = IDWriteGlyphRunAnalysis_GetAlphaBlendParams(analysis, params, &gamma, &contrast, &ctlevel);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+
+ if (rendermodes[i] == DWRITE_RENDERING_MODE_GDI_CLASSIC || rendermodes[i] == DWRITE_RENDERING_MODE_GDI_NATURAL) {
+ ok(float_eq(gamma, expected_gdi_gamma), "got %.2f, expected %.2f\n", gamma, expected_gdi_gamma);
+ ok(contrast == 0.0f, "got %.2f\n", contrast);
+ ok(ctlevel == 1.0f, "got %.2f\n", ctlevel);
+ }
+ else {
+ ok(gamma == 0.9f, "got %.2f\n", gamma);
+ ok(contrast == 0.3f, "got %.2f\n", contrast);
+ ok(ctlevel == 0.1f, "got %.2f\n", ctlevel);
+ }
+
+ IDWriteGlyphRunAnalysis_Release(analysis);
+ }
+
+ IDWriteRenderingParams_Release(params);
+ IDWriteFontFace_Release(fontface);
+ IDWriteFactory_Release(factory);
+}
+
START_TEST(font)
{
IDWriteFactory *factory;
@@ -4393,6 +4502,7 @@ START_TEST(font)
test_GetPanose();
test_GetGdiCompatibleGlyphAdvances();
test_GetRecommendedRenderingMode();
+ test_GetAlphaBlendParams();
IDWriteFactory_Release(factory);
}
--
2.1.4
More information about the wine-patches
mailing list