Module: wine Branch: master Commit: 65014bcab536a7618069c7c157656ff3a510df1d URL: http://source.winehq.org/git/wine.git/?a=commit;h=65014bcab536a7618069c7c157...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Thu Aug 24 14:25:04 2017 +0300
dwrite/tests: A test to draw trimming sign with drawing effect.
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/dwrite/tests/layout.c | 66 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 55 insertions(+), 11 deletions(-)
diff --git a/dlls/dwrite/tests/layout.c b/dlls/dwrite/tests/layout.c index 1d9d38a..c4034a1 100644 --- a/dlls/dwrite/tests/layout.c +++ b/dlls/dwrite/tests/layout.c @@ -782,6 +782,17 @@ static IDWriteInlineObject testinlineobj = { &testinlineobjvtbl }; static IDWriteInlineObject testinlineobj2 = { &testinlineobjvtbl }; static IDWriteInlineObject testinlineobj3 = { &testinlineobjvtbl2 };
+struct test_effect +{ + IUnknown IUnknown_iface; + LONG ref; +}; + +static inline struct test_effect *test_effect_from_IUnknown(IUnknown *iface) +{ + return CONTAINING_RECORD(iface, struct test_effect, IUnknown_iface); +} + static HRESULT WINAPI testeffect_QI(IUnknown *iface, REFIID riid, void **obj) { if (IsEqualIID(riid, &IID_IUnknown)) { @@ -790,18 +801,26 @@ static HRESULT WINAPI testeffect_QI(IUnknown *iface, REFIID riid, void **obj) return S_OK; }
+ ok(0, "Unexpected riid %s.\n", wine_dbgstr_guid(riid)); *obj = NULL; return E_NOINTERFACE; }
static ULONG WINAPI testeffect_AddRef(IUnknown *iface) { - return 2; + struct test_effect *effect = test_effect_from_IUnknown(iface); + return InterlockedIncrement(&effect->ref); }
static ULONG WINAPI testeffect_Release(IUnknown *iface) { - return 1; + struct test_effect *effect = test_effect_from_IUnknown(iface); + LONG ref = InterlockedDecrement(&effect->ref); + + if (!ref) + HeapFree(GetProcessHeap(), 0, effect); + + return ref; }
static const IUnknownVtbl testeffectvtbl = { @@ -810,7 +829,16 @@ static const IUnknownVtbl testeffectvtbl = { testeffect_Release };
-static IUnknown testeffect = { &testeffectvtbl }; +static IUnknown *create_test_effect(void) +{ + struct test_effect *effect; + + effect = HeapAlloc(GetProcessHeap(), 0, sizeof(*effect)); + effect->IUnknown_iface.lpVtbl = &testeffectvtbl; + effect->ref = 1; + + return &effect->IUnknown_iface; +}
static void test_CreateTextLayout(void) { @@ -1211,7 +1239,7 @@ static void test_CreateEllipsisTrimmingSign(void) IDWriteTextFormat *format; IDWriteInlineObject *sign; IDWriteFactory *factory; - IUnknown *unk; + IUnknown *unk, *effect; HRESULT hr;
factory = create_factory(); @@ -1254,6 +1282,16 @@ if (0) {/* crashes on native */ hr = IDWriteInlineObject_Draw(sign, NULL, &testrenderer, 0.0, 0.0, FALSE, FALSE, NULL); ok(hr == S_OK, "got 0x%08x\n", hr); ok_sequence(sequences, RENDERER_ID, drawellipsis_seq, "ellipsis sign draw test", FALSE); + + effect = create_test_effect(); + + EXPECT_REF(effect, 1); + hr = IDWriteInlineObject_Draw(sign, NULL, &testrenderer, 0.0f, 0.0f, FALSE, FALSE, effect); + ok(hr == S_OK, "Failed to draw trimming sign, hr %#x.\n", hr); + EXPECT_REF(effect, 1); + + IUnknown_Release(effect); + IDWriteInlineObject_Release(sign);
/* non-orthogonal flow/reading combination */ @@ -3265,12 +3303,15 @@ static void test_SetDrawingEffect(void) IDWriteTextFormat *format; IDWriteTextLayout *layout; IDWriteFactory *factory; + IUnknown *unk, *effect; DWRITE_TEXT_RANGE r; - IUnknown *unk; HRESULT hr; + LONG ref;
factory = create_factory();
+ effect = create_test_effect(); + hr = IDWriteFactory_CreateTextFormat(factory, tahomaW, NULL, DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, 10.0, enusW, &format); ok(hr == S_OK, "got 0x%08x\n", hr); @@ -3282,13 +3323,14 @@ static void test_SetDrawingEffect(void) /* set effect past the end of text */ r.startPosition = 100; r.length = 10; - hr = IDWriteTextLayout_SetDrawingEffect(layout, &testeffect, r); + hr = IDWriteTextLayout_SetDrawingEffect(layout, effect, r); ok(hr == S_OK, "got 0x%08x\n", hr);
r.startPosition = r.length = 0; hr = IDWriteTextLayout_GetDrawingEffect(layout, 101, &unk, &r); ok(hr == S_OK, "got 0x%08x\n", hr); ok(r.startPosition == 100 && r.length == 10, "got %u, %u\n", r.startPosition, r.length); + IUnknown_Release(unk);
r.startPosition = r.length = 0; unk = (void*)0xdeadbeef; @@ -3300,7 +3342,7 @@ static void test_SetDrawingEffect(void) /* effect is applied to clusters, not individual text positions */ r.startPosition = 0; r.length = 2; - hr = IDWriteTextLayout_SetDrawingEffect(layout, &testeffect, r); + hr = IDWriteTextLayout_SetDrawingEffect(layout, effect, r); ok(hr == S_OK, "got 0x%08x\n", hr);
flush_sequence(sequences, RENDERER_ID); @@ -3315,7 +3357,7 @@ static void test_SetDrawingEffect(void)
r.startPosition = 0; r.length = 2; - hr = IDWriteTextLayout_SetDrawingEffect(layout, &testeffect, r); + hr = IDWriteTextLayout_SetDrawingEffect(layout, effect, r); ok(hr == S_OK, "got 0x%08x\n", hr);
flush_sequence(sequences, RENDERER_ID); @@ -3336,7 +3378,7 @@ static void test_SetDrawingEffect(void) hr = IDWriteTextLayout_SetInlineObject(layout, sign, r); ok(hr == S_OK, "got 0x%08x\n", hr);
- hr = IDWriteTextLayout_SetDrawingEffect(layout, &testeffect, r); + hr = IDWriteTextLayout_SetDrawingEffect(layout, effect, r); ok(hr == S_OK, "got 0x%08x\n", hr);
flush_sequence(sequences, RENDERER_ID); @@ -3350,7 +3392,7 @@ static void test_SetDrawingEffect(void)
r.startPosition = 1; r.length = 1; - hr = IDWriteTextLayout_SetDrawingEffect(layout, &testeffect, r); + hr = IDWriteTextLayout_SetDrawingEffect(layout, effect, r); ok(hr == S_OK, "got 0x%08x\n", hr);
/* no effect is reported in this case */ @@ -3366,7 +3408,7 @@ static void test_SetDrawingEffect(void)
r.startPosition = 0; r.length = 1; - hr = IDWriteTextLayout_SetDrawingEffect(layout, &testeffect, r); + hr = IDWriteTextLayout_SetDrawingEffect(layout, effect, r); ok(hr == S_OK, "got 0x%08x\n", hr);
/* first range position is all that matters for inline ranges */ @@ -3377,6 +3419,8 @@ static void test_SetDrawingEffect(void)
IDWriteTextLayout_Release(layout);
+ ref = IUnknown_Release(effect); + ok(ref == 0, "Unexpected effect refcount %u\n", ref); IDWriteInlineObject_Release(sign); IDWriteTextFormat_Release(format); IDWriteFactory_Release(factory);