dwrite: Aliased texture could only be requested for aliased rendering mode
Nikolay Sivov
nsivov at codeweavers.com
Fri Jul 17 03:56:17 CDT 2015
---
-------------- next part --------------
From ce87d7072726d1b4a18cc3f1eda8c9bfb7de4b45 Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <nsivov at codeweavers.com>
Date: Fri, 17 Jul 2015 09:33:45 +0300
Subject: [PATCH] dwrite: Aliased texture could only be requested for aliased
rendering mode
---
dlls/dwrite/font.c | 16 +++++++++++
dlls/dwrite/tests/font.c | 75 ++++++++++++++++++++++++++++++++++++++++++++----
2 files changed, 86 insertions(+), 5 deletions(-)
diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index 74023c3..11ff9d0 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -104,6 +104,8 @@ struct dwrite_fonttable {
struct dwrite_glyphrunanalysis {
IDWriteGlyphRunAnalysis IDWriteGlyphRunAnalysis_iface;
LONG ref;
+
+ DWRITE_RENDERING_MODE rendering_mode;
};
#define GLYPH_BLOCK_SHIFT 8
@@ -2774,7 +2776,20 @@ static ULONG WINAPI glyphrunanalysis_Release(IDWriteGlyphRunAnalysis *iface)
static HRESULT WINAPI glyphrunanalysis_GetAlphaTextureBounds(IDWriteGlyphRunAnalysis *iface, DWRITE_TEXTURE_TYPE type, RECT* bounds)
{
struct dwrite_glyphrunanalysis *This = impl_from_IDWriteGlyphRunAnalysis(iface);
+
FIXME("(%p)->(%d %p): stub\n", This, type, bounds);
+
+ if ((UINT32)type > DWRITE_TEXTURE_CLEARTYPE_3x1) {
+ memset(bounds, 0, sizeof(*bounds));
+ return E_INVALIDARG;
+ }
+
+ if ((type == DWRITE_TEXTURE_ALIASED_1x1 && This->rendering_mode != DWRITE_RENDERING_MODE_ALIASED) ||
+ (type == DWRITE_TEXTURE_CLEARTYPE_3x1 && This->rendering_mode == DWRITE_RENDERING_MODE_ALIASED)) {
+ memset(bounds, 0, sizeof(*bounds));
+ return S_OK;
+ }
+
return E_NOTIMPL;
}
@@ -2819,6 +2834,7 @@ HRESULT create_glyphrunanalysis(DWRITE_RENDERING_MODE rendering_mode, IDWriteGly
analysis->IDWriteGlyphRunAnalysis_iface.lpVtbl = &glyphrunanalysisvtbl;
analysis->ref = 1;
+ analysis->rendering_mode = rendering_mode;
*ret = &analysis->IDWriteGlyphRunAnalysis_iface;
return S_OK;
diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c
index 9524d6a..7dc6077 100644
--- a/dlls/dwrite/tests/font.c
+++ b/dlls/dwrite/tests/font.c
@@ -3384,28 +3384,49 @@ static void test_CreateRenderingParams(void)
static void test_CreateGlyphRunAnalysis(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;
IDWriteFactory *factory;
DWRITE_GLYPH_RUN run;
IDWriteFontFace *face;
- UINT16 index;
+ UINT16 glyph;
FLOAT advance;
HRESULT hr;
UINT32 ch;
+ RECT rect;
+ DWRITE_GLYPH_OFFSET offset;
+ DWRITE_GLYPH_METRICS metrics;
+ int i;
factory = create_factory();
face = create_fontface(factory);
ch = 'A';
- hr = IDWriteFontFace_GetGlyphIndices(face, &ch, 1, &index);
+ glyph = 0;
+ hr = IDWriteFontFace_GetGlyphIndices(face, &ch, 1, &glyph);
ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(glyph > 0, "got %u\n", glyph);
+
+ hr = IDWriteFontFace_GetDesignGlyphMetrics(face, &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 = face;
run.fontEmSize = 24.0;
run.glyphCount = 1;
- run.glyphIndices = &index;
+ run.glyphIndices = &glyph;
run.glyphAdvances = &advance;
- run.glyphOffsets = NULL;
+ run.glyphOffsets = &offset;
run.isSideways = FALSE;
run.bidiLevel = 0;
@@ -3422,11 +3443,55 @@ static void test_CreateGlyphRunAnalysis(void)
ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
hr = IDWriteFactory_CreateGlyphRunAnalysis(factory, &run, 1.0, NULL,
- DWRITE_RENDERING_MODE_GDI_CLASSIC, DWRITE_MEASURING_MODE_NATURAL,
+ DWRITE_RENDERING_MODE_ALIASED, DWRITE_MEASURING_MODE_NATURAL,
0.0, 0.0, &analysis);
ok(hr == S_OK, "got 0x%08x\n", hr);
+
+ /* invalid texture type */
+ memset(&rect, 0xcc, sizeof(rect));
+ hr = IDWriteGlyphRunAnalysis_GetAlphaTextureBounds(analysis, DWRITE_TEXTURE_CLEARTYPE_3x1+1, &rect);
+ ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
+ ok(rect.left == 0 && rect.right == 0 &&
+ rect.top == 0 && rect.bottom == 0, "unexpected rect\n");
IDWriteGlyphRunAnalysis_Release(analysis);
+ 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);
+
+ if (rendermodes[i] == DWRITE_RENDERING_MODE_ALIASED) {
+ memset(&rect, 0, sizeof(rect));
+ hr = IDWriteGlyphRunAnalysis_GetAlphaTextureBounds(analysis, DWRITE_TEXTURE_ALIASED_1x1, &rect);
+ todo_wine {
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(!IsRectEmpty(&rect), "got empty rect\n");
+ }
+ rect.left = rect.top = 0;
+ rect.bottom = rect.right = 1;
+ hr = IDWriteGlyphRunAnalysis_GetAlphaTextureBounds(analysis, DWRITE_TEXTURE_CLEARTYPE_3x1, &rect);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(IsRectEmpty(&rect), "unexpected empty rect\n");
+ }
+ else {
+ rect.left = rect.top = 0;
+ rect.bottom = rect.right = 1;
+ hr = IDWriteGlyphRunAnalysis_GetAlphaTextureBounds(analysis, DWRITE_TEXTURE_ALIASED_1x1, &rect);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(IsRectEmpty(&rect), "got empty rect\n");
+
+ memset(&rect, 0, sizeof(rect));
+ hr = IDWriteGlyphRunAnalysis_GetAlphaTextureBounds(analysis, DWRITE_TEXTURE_CLEARTYPE_3x1, &rect);
+ todo_wine {
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(!IsRectEmpty(&rect), "got empty rect\n");
+ }
+ }
+
+ IDWriteGlyphRunAnalysis_Release(analysis);
+ }
+
IDWriteFontFace_Release(face);
IDWriteFactory_Release(factory);
}
--
2.1.4
More information about the wine-patches
mailing list