Module: wine Branch: master Commit: 69d5e351f97d448a7fd7cc52982d8c5a97fb24bc URL: http://source.winehq.org/git/wine.git/?a=commit;h=69d5e351f97d448a7fd7cc5298...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Mon Jun 22 17:58:40 2015 +0300
dwrite: Call SetFillMode() once per run.
---
dlls/dwrite/font.c | 3 ++ dlls/dwrite/tests/font.c | 102 ++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 103 insertions(+), 2 deletions(-)
diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c index 8ffad31..2091867 100644 --- a/dlls/dwrite/font.c +++ b/dlls/dwrite/font.c @@ -523,6 +523,9 @@ static HRESULT WINAPI dwritefontface_GetGlyphRunOutline(IDWriteFontFace2 *iface, if (is_sideways) FIXME("sideways mode is not supported.\n");
+ if (count) + ID2D1SimplifiedGeometrySink_SetFillMode(sink, D2D1_FILL_MODE_WINDING); + for (g = 0; g < count; g++) { FLOAT xoffset = 0.0, yoffset = 0.0; struct glyph_outline *outline; diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c index 846b4da..111762c 100644 --- a/dlls/dwrite/tests/font.c +++ b/dlls/dwrite/tests/font.c @@ -37,6 +37,35 @@ #define EXPECT_HR(hr,hr_exp) \ ok(hr == hr_exp, "got 0x%08x, expected 0x%08x\n", hr, hr_exp)
+#define DEFINE_EXPECT(func) \ + static BOOL expect_ ## func = FALSE, called_ ## func = FALSE + +#define SET_EXPECT(func) \ + do { called_ ## func = FALSE; expect_ ## func = TRUE; } while(0) + +#define CHECK_EXPECT2(func) \ + do { \ + ok(expect_ ##func, "unexpected call " #func "\n"); \ + called_ ## func = TRUE; \ + }while(0) + +#define CHECK_EXPECT(func) \ + do { \ + CHECK_EXPECT2(func); \ + expect_ ## func = FALSE; \ + }while(0) + +#define CHECK_CALLED(func) \ + do { \ + ok(called_ ## func, "expected " #func "\n"); \ + expect_ ## func = called_ ## func = FALSE; \ + }while(0) + +#define CLEAR_CALLED(func) \ + expect_ ## func = called_ ## func = FALSE + +DEFINE_EXPECT(setfillmode); + #define EXPECT_REF(obj,ref) _expect_ref((IUnknown*)obj, ref, __LINE__) static void _expect_ref(IUnknown* obj, ULONG ref, int line) { @@ -457,6 +486,7 @@ static ULONG WINAPI test_geometrysink_Release(ID2D1SimplifiedGeometrySink *iface
static void WINAPI test_geometrysink_SetFillMode(ID2D1SimplifiedGeometrySink *iface, D2D1_FILL_MODE mode) { + CHECK_EXPECT(setfillmode); ok(mode == D2D1_FILL_MODE_WINDING, "fill mode %d\n", mode); }
@@ -508,7 +538,44 @@ static const ID2D1SimplifiedGeometrySinkVtbl test_geometrysink_vtbl = { test_geometrysink_Close };
+static void WINAPI test_geometrysink2_BeginFigure(ID2D1SimplifiedGeometrySink *iface, + D2D1_POINT_2F startPoint, D2D1_FIGURE_BEGIN figureBegin) +{ + ok(0, "unexpected call\n"); +} + +static void WINAPI test_geometrysink2_AddLines(ID2D1SimplifiedGeometrySink *iface, + const D2D1_POINT_2F *points, UINT32 count) +{ + ok(0, "unexpected call\n"); +} + +static void WINAPI test_geometrysink2_AddBeziers(ID2D1SimplifiedGeometrySink *iface, + const D2D1_BEZIER_SEGMENT *beziers, UINT32 count) +{ + ok(0, "unexpected call\n"); +} + +static void WINAPI test_geometrysink2_EndFigure(ID2D1SimplifiedGeometrySink *iface, D2D1_FIGURE_END figureEnd) +{ + ok(0, "unexpected call\n"); +} + +static const ID2D1SimplifiedGeometrySinkVtbl test_geometrysink2_vtbl = { + test_geometrysink_QueryInterface, + test_geometrysink_AddRef, + test_geometrysink_Release, + test_geometrysink_SetFillMode, + test_geometrysink_SetSegmentFlags, + test_geometrysink2_BeginFigure, + test_geometrysink2_AddLines, + test_geometrysink2_AddBeziers, + test_geometrysink2_EndFigure, + test_geometrysink_Close +}; + static ID2D1SimplifiedGeometrySink test_geomsink = { &test_geometrysink_vtbl }; +static ID2D1SimplifiedGeometrySink test_geomsink2 = { &test_geometrysink2_vtbl };
static void test_CreateFontFromLOGFONT(void) { @@ -2991,6 +3058,7 @@ static void test_GetGlyphRunOutline(void) /* default advances, no offsets */ memset(g_startpoints, 0, sizeof(g_startpoints)); g_startpoint_count = 0; + SET_EXPECT(setfillmode); hr = IDWriteFontFace_GetGlyphRunOutline(face, 1024.0, glyphs, NULL, NULL, 2, FALSE, FALSE, &test_geomsink); ok(hr == S_OK, "got 0x%08x\n", hr); ok(g_startpoint_count == 2, "got %d\n", g_startpoint_count); @@ -2999,10 +3067,12 @@ static void test_GetGlyphRunOutline(void) ok(g_startpoints[0].x == 229.5 && g_startpoints[0].y == -629.0, "0: got (%.2f,%.2f)\n", g_startpoints[0].x, g_startpoints[0].y); ok(g_startpoints[1].x == 729.5 && g_startpoints[1].y == -629.0, "1: got (%.2f,%.2f)\n", g_startpoints[1].x, g_startpoints[1].y); } + CHECK_CALLED(setfillmode);
/* default advances, no offsets, RTL */ memset(g_startpoints, 0, sizeof(g_startpoints)); g_startpoint_count = 0; + SET_EXPECT(setfillmode); hr = IDWriteFontFace_GetGlyphRunOutline(face, 1024.0, glyphs, NULL, NULL, 2, FALSE, TRUE, &test_geomsink); ok(hr == S_OK, "got 0x%08x\n", hr); ok(g_startpoint_count == 2, "got %d\n", g_startpoint_count); @@ -3011,10 +3081,12 @@ static void test_GetGlyphRunOutline(void) ok(g_startpoints[0].x == -270.5 && g_startpoints[0].y == -629.0, "0: got (%.2f,%.2f)\n", g_startpoints[0].x, g_startpoints[0].y); ok(g_startpoints[1].x == -770.5 && g_startpoints[1].y == -629.0, "1: got (%.2f,%.2f)\n", g_startpoints[1].x, g_startpoints[1].y); } + CHECK_CALLED(setfillmode);
/* default advances, additional offsets */ memset(g_startpoints, 0, sizeof(g_startpoints)); g_startpoint_count = 0; + SET_EXPECT(setfillmode); hr = IDWriteFontFace_GetGlyphRunOutline(face, 1024.0, glyphs, NULL, offsets, 2, FALSE, FALSE, &test_geomsink); ok(hr == S_OK, "got 0x%08x\n", hr); ok(g_startpoint_count == 2, "got %d\n", g_startpoint_count); @@ -3023,10 +3095,12 @@ static void test_GetGlyphRunOutline(void) ok(g_startpoints[0].x == 230.5 && g_startpoints[0].y == -630.0, "0: got (%.2f,%.2f)\n", g_startpoints[0].x, g_startpoints[0].y); ok(g_startpoints[1].x == 729.5 && g_startpoints[1].y == -629.0, "1: got (%.2f,%.2f)\n", g_startpoints[1].x, g_startpoints[1].y); } + CHECK_CALLED(setfillmode);
/* default advances, additional offsets, RTL */ memset(g_startpoints, 0, sizeof(g_startpoints)); g_startpoint_count = 0; + SET_EXPECT(setfillmode); hr = IDWriteFontFace_GetGlyphRunOutline(face, 1024.0, glyphs, NULL, offsets, 2, FALSE, TRUE, &test_geomsink); ok(hr == S_OK, "got 0x%08x\n", hr); ok(g_startpoint_count == 2, "got %d\n", g_startpoint_count); @@ -3034,10 +3108,12 @@ static void test_GetGlyphRunOutline(void) ok(g_startpoints[0].x == -271.5 && g_startpoints[0].y == -630.0, "0: got (%.2f,%.2f)\n", g_startpoints[0].x, g_startpoints[0].y); ok(g_startpoints[1].x == -770.5 && g_startpoints[1].y == -629.0, "1: got (%.2f,%.2f)\n", g_startpoints[1].x, g_startpoints[1].y); } + CHECK_CALLED(setfillmode);
/* custom advances and offsets, offset turns total advance value to zero */ memset(g_startpoints, 0, sizeof(g_startpoints)); g_startpoint_count = 0; + SET_EXPECT(setfillmode); hr = IDWriteFontFace_GetGlyphRunOutline(face, 1024.0, glyphs, advances, offsets, 2, FALSE, FALSE, &test_geomsink); ok(hr == S_OK, "got 0x%08x\n", hr); ok(g_startpoint_count == 2, "got %d\n", g_startpoint_count); @@ -3045,11 +3121,33 @@ static void test_GetGlyphRunOutline(void) ok(g_startpoints[0].x == 230.5 && g_startpoints[0].y == -630.0, "0: got (%.2f,%.2f)\n", g_startpoints[0].x, g_startpoints[0].y); ok(g_startpoints[1].x == 230.5 && g_startpoints[1].y == -629.0, "1: got (%.2f,%.2f)\n", g_startpoints[1].x, g_startpoints[1].y); } + CHECK_CALLED(setfillmode);
- IDWriteFontFace_Release(face); - IDWriteFactory_Release(factory); + /* 0 glyph count */ + hr = IDWriteFontFace_GetGlyphRunOutline(face, 1024.0, glyphs, NULL, NULL, 0, FALSE, FALSE, &test_geomsink2); + ok(hr == S_OK, "got 0x%08x\n", hr);
+ IDWriteFactory_Release(factory); + IDWriteFontFace_Release(face); DELETE_FONTFILE(path); + + /* space glyph */ + factory = create_factory(); + face = create_fontface(factory); + + codepoint = ' '; + glyphs[0] = 0; + hr = IDWriteFontFace_GetGlyphIndices(face, &codepoint, 1, glyphs); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(glyphs[0] > 0, "got %u\n", glyphs[0]); + + SET_EXPECT(setfillmode); + hr = IDWriteFontFace_GetGlyphRunOutline(face, 1024.0, glyphs, NULL, NULL, 1, FALSE, FALSE, &test_geomsink2); + ok(hr == S_OK, "got 0x%08x\n", hr); + CHECK_CALLED(setfillmode); + + IDWriteFactory_Release(factory); + IDWriteFontFace_Release(face); }
static void test_GetEudcFontCollection(void)