From: Nikolay Sivov Subject: dwrite: Added some layout tests, simplify debug output for text ranges Message-Id: <53D90E95.1050004@codeweavers.com> Date: Wed, 30 Jul 2014 19:26:13 +0400 --- From ca92571bc41d482846ec6f2919028538b6cdd197 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Wed, 30 Jul 2014 19:21:36 +0400 Subject: [PATCH] dwrite: Added some layout tests, simplify debug output for text ranges --- dlls/dwrite/analyzer.c | 2 - dlls/dwrite/dwrite_private.h | 6 +++ dlls/dwrite/font.c | 2 - dlls/dwrite/layout.c | 26 +++++------ dlls/dwrite/tests/layout.c | 102 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 120 insertions(+), 18 deletions(-) diff --git a/dlls/dwrite/analyzer.c b/dlls/dwrite/analyzer.c index 2b7056e..4511402 100644 --- a/dlls/dwrite/analyzer.c +++ b/dlls/dwrite/analyzer.c @@ -23,8 +23,6 @@ #include "dwrite.h" #include "dwrite_private.h" -#include "wine/debug.h" - WINE_DEFAULT_DEBUG_CHANNEL(dwrite); enum scriptcode { diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h index 0f71544..99fcca3 100644 --- a/dlls/dwrite/dwrite_private.h +++ b/dlls/dwrite/dwrite_private.h @@ -16,6 +16,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "wine/debug.h" #include "wine/unicode.h" static inline void *heap_alloc(size_t len) @@ -71,6 +72,11 @@ static inline LPWSTR heap_strdupnW(const WCHAR *str, UINT32 len) return ret; } +static inline const char *debugstr_range(const DWRITE_TEXT_RANGE *range) +{ + return wine_dbg_sprintf("%u:%u", range->startPosition, range->length); +} + extern HRESULT create_font_from_logfont(const LOGFONTW*, IDWriteFont**) DECLSPEC_HIDDEN; extern HRESULT convert_fontface_to_logfont(IDWriteFontFace*, LOGFONTW*) DECLSPEC_HIDDEN; extern HRESULT create_textformat(const WCHAR*,IDWriteFontCollection*,DWRITE_FONT_WEIGHT,DWRITE_FONT_STYLE,DWRITE_FONT_STRETCH, diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c index 2564d67..0962784 100644 --- a/dlls/dwrite/font.c +++ b/dlls/dwrite/font.c @@ -23,8 +23,6 @@ #include "dwrite.h" #include "dwrite_private.h" -#include "wine/debug.h" - WINE_DEFAULT_DEBUG_CHANNEL(dwrite); /* PANOSE is 10 bytes in size, need to pack the structure properly */ diff --git a/dlls/dwrite/layout.c b/dlls/dwrite/layout.c index 0cc31a9..2ed328b 100644 --- a/dlls/dwrite/layout.c +++ b/dlls/dwrite/layout.c @@ -28,8 +28,6 @@ #include "dwrite.h" #include "dwrite_private.h" -#include "wine/debug.h" - WINE_DEFAULT_DEBUG_CHANNEL(dwrite); struct dwrite_textformat_data { @@ -354,84 +352,84 @@ static HRESULT WINAPI dwritetextlayout_SetMaxHeight(IDWriteTextLayout *iface, FL static HRESULT WINAPI dwritetextlayout_SetFontCollection(IDWriteTextLayout *iface, IDWriteFontCollection* collection, DWRITE_TEXT_RANGE range) { struct dwrite_textlayout *This = impl_from_IDWriteTextLayout(iface); - FIXME("(%p)->(%p %u:%u): stub\n", This, collection, range.startPosition, range.length); + FIXME("(%p)->(%p %s): stub\n", This, collection, debugstr_range(&range)); return E_NOTIMPL; } static HRESULT WINAPI dwritetextlayout_SetFontFamilyName(IDWriteTextLayout *iface, WCHAR const *name, DWRITE_TEXT_RANGE range) { struct dwrite_textlayout *This = impl_from_IDWriteTextLayout(iface); - FIXME("(%p)->(%s %u:%u): stub\n", This, debugstr_w(name), range.startPosition, range.length); + FIXME("(%p)->(%s %s): stub\n", This, debugstr_w(name), debugstr_range(&range)); return E_NOTIMPL; } static HRESULT WINAPI dwritetextlayout_SetFontWeight(IDWriteTextLayout *iface, DWRITE_FONT_WEIGHT weight, DWRITE_TEXT_RANGE range) { struct dwrite_textlayout *This = impl_from_IDWriteTextLayout(iface); - FIXME("(%p)->(%d %u:%u): stub\n", This, weight, range.startPosition, range.length); + FIXME("(%p)->(%d %s): stub\n", This, weight, debugstr_range(&range)); return E_NOTIMPL; } static HRESULT WINAPI dwritetextlayout_SetFontStyle(IDWriteTextLayout *iface, DWRITE_FONT_STYLE style, DWRITE_TEXT_RANGE range) { struct dwrite_textlayout *This = impl_from_IDWriteTextLayout(iface); - FIXME("(%p)->(%d %u:%u): stub\n", This, style, range.startPosition, range.length); + FIXME("(%p)->(%d %s): stub\n", This, style, debugstr_range(&range)); return E_NOTIMPL; } static HRESULT WINAPI dwritetextlayout_SetFontStretch(IDWriteTextLayout *iface, DWRITE_FONT_STRETCH stretch, DWRITE_TEXT_RANGE range) { struct dwrite_textlayout *This = impl_from_IDWriteTextLayout(iface); - FIXME("(%p)->(%d %u:%u): stub\n", This, stretch, range.startPosition, range.length); + FIXME("(%p)->(%d %s): stub\n", This, stretch, debugstr_range(&range)); return E_NOTIMPL; } static HRESULT WINAPI dwritetextlayout_SetFontSize(IDWriteTextLayout *iface, FLOAT size, DWRITE_TEXT_RANGE range) { struct dwrite_textlayout *This = impl_from_IDWriteTextLayout(iface); - FIXME("(%p)->(%f %u:%u): stub\n", This, size, range.startPosition, range.length); + FIXME("(%p)->(%f %s): stub\n", This, size, debugstr_range(&range)); return E_NOTIMPL; } static HRESULT WINAPI dwritetextlayout_SetUnderline(IDWriteTextLayout *iface, BOOL underline, DWRITE_TEXT_RANGE range) { struct dwrite_textlayout *This = impl_from_IDWriteTextLayout(iface); - FIXME("(%p)->(%d %u:%u): stub\n", This, underline, range.startPosition, range.length); + FIXME("(%p)->(%d %s): stub\n", This, underline, debugstr_range(&range)); return E_NOTIMPL; } static HRESULT WINAPI dwritetextlayout_SetStrikethrough(IDWriteTextLayout *iface, BOOL strikethrough, DWRITE_TEXT_RANGE range) { struct dwrite_textlayout *This = impl_from_IDWriteTextLayout(iface); - FIXME("(%p)->(%d %u:%u): stub\n", This, strikethrough, range.startPosition, range.length); + FIXME("(%p)->(%d %s): stub\n", This, strikethrough, debugstr_range(&range)); return E_NOTIMPL; } static HRESULT WINAPI dwritetextlayout_SetDrawingEffect(IDWriteTextLayout *iface, IUnknown* effect, DWRITE_TEXT_RANGE range) { struct dwrite_textlayout *This = impl_from_IDWriteTextLayout(iface); - FIXME("(%p)->(%p %u:%u): stub\n", This, effect, range.startPosition, range.length); + FIXME("(%p)->(%p %s): stub\n", This, effect, debugstr_range(&range)); return E_NOTIMPL; } static HRESULT WINAPI dwritetextlayout_SetInlineObject(IDWriteTextLayout *iface, IDWriteInlineObject *object, DWRITE_TEXT_RANGE range) { struct dwrite_textlayout *This = impl_from_IDWriteTextLayout(iface); - FIXME("(%p)->(%p %u:%u): stub\n", This, object, range.startPosition, range.length); + FIXME("(%p)->(%p %s): stub\n", This, object, debugstr_range(&range)); return E_NOTIMPL; } static HRESULT WINAPI dwritetextlayout_SetTypography(IDWriteTextLayout *iface, IDWriteTypography* typography, DWRITE_TEXT_RANGE range) { struct dwrite_textlayout *This = impl_from_IDWriteTextLayout(iface); - FIXME("(%p)->(%p %u:%u): stub\n", This, typography, range.startPosition, range.length); + FIXME("(%p)->(%p %s): stub\n", This, typography, debugstr_range(&range)); return E_NOTIMPL; } static HRESULT WINAPI dwritetextlayout_SetLocaleName(IDWriteTextLayout *iface, WCHAR const* locale, DWRITE_TEXT_RANGE range) { struct dwrite_textlayout *This = impl_from_IDWriteTextLayout(iface); - FIXME("(%p)->(%s %u:%u): stub\n", This, debugstr_w(locale), range.startPosition, range.length); + FIXME("(%p)->(%s %s): stub\n", This, debugstr_w(locale), debugstr_range(&range)); return E_NOTIMPL; } diff --git a/dlls/dwrite/tests/layout.c b/dlls/dwrite/tests/layout.c index 43a8f3b..07e5e20 100644 --- a/dlls/dwrite/tests/layout.c +++ b/dlls/dwrite/tests/layout.c @@ -262,6 +262,106 @@ if (0) /* crashes on native */ IDWriteTextFormat_Release(format); } +static void test_fontweight(void) +{ + static const WCHAR strW[] = {'s','t','r','i','n','g',0}; + static const WCHAR ruW[] = {'r','u',0}; + IDWriteTextFormat *format, *fmt2; + IDWriteTextLayout *layout; + DWRITE_FONT_WEIGHT weight; + DWRITE_TEXT_RANGE range; + HRESULT hr; + + hr = IDWriteFactory_CreateTextFormat(factory, tahomaW, NULL, DWRITE_FONT_WEIGHT_BOLD, DWRITE_FONT_STYLE_NORMAL, + DWRITE_FONT_STRETCH_NORMAL, 10.0, ruW, &format); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = IDWriteFactory_CreateGdiCompatibleTextLayout(factory, strW, 0, format, 100.0, 100.0, 1.0, NULL, FALSE, &layout); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = IDWriteTextLayout_QueryInterface(layout, &IID_IDWriteTextFormat, (void**)&fmt2); + ok(hr == S_OK, "got 0x%08x\n", hr); + + weight = IDWriteTextFormat_GetFontWeight(fmt2); +todo_wine + ok(weight == DWRITE_FONT_WEIGHT_BOLD, "got %u\n", weight); + + range.startPosition = 0; + range.length = 6; + hr = IDWriteTextLayout_SetFontWeight(layout, DWRITE_FONT_WEIGHT_NORMAL, range); +todo_wine + ok(hr == S_OK, "got 0x%08x\n", hr); + + /* IDWriteTextFormat methods output doesn't reflect layout changes */ + weight = IDWriteTextFormat_GetFontWeight(fmt2); +todo_wine + ok(weight == DWRITE_FONT_WEIGHT_BOLD, "got %u\n", weight); + + range.length = 0; + weight = DWRITE_FONT_WEIGHT_BOLD; + hr = layout->lpVtbl->IDWriteTextLayout_GetFontWeight(layout, 0, &weight, &range); +todo_wine { + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(weight == DWRITE_FONT_WEIGHT_NORMAL, "got %d\n", weight); + ok(range.length == 6, "got %d\n", range.length); +} + IDWriteTextLayout_Release(layout); + IDWriteTextFormat_Release(fmt2); + IDWriteTextFormat_Release(format); +} + +static void test_SetInlineObject(void) +{ + static const WCHAR strW[] = {'s','t','r','i','n','g',0}; + static const WCHAR ruW[] = {'r','u',0}; + + IDWriteInlineObject *inlineobj, *inlineobj2; + IDWriteTextFormat *format; + IDWriteTextLayout *layout; + DWRITE_TEXT_RANGE range; + HRESULT hr; + + hr = IDWriteFactory_CreateTextFormat(factory, tahomaW, NULL, DWRITE_FONT_WEIGHT_BOLD, DWRITE_FONT_STYLE_NORMAL, + DWRITE_FONT_STRETCH_NORMAL, 10.0, ruW, &format); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = IDWriteFactory_CreateGdiCompatibleTextLayout(factory, strW, 0, format, 100.0, 100.0, 1.0, NULL, FALSE, &layout); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = IDWriteFactory_CreateEllipsisTrimmingSign(factory, format, &inlineobj); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = IDWriteFactory_CreateEllipsisTrimmingSign(factory, format, &inlineobj2); + ok(hr == S_OK, "got 0x%08x\n", hr); + + range.startPosition = 0; + range.length = 2; + hr = IDWriteTextLayout_SetInlineObject(layout, inlineobj, range); +todo_wine + ok(hr == S_OK, "got 0x%08x\n", hr); + + range.startPosition = 1; + range.length = 1; + hr = IDWriteTextLayout_SetInlineObject(layout, inlineobj2, range); +todo_wine + ok(hr == S_OK, "got 0x%08x\n", hr); + + range.startPosition = 1; + range.length = 1; + hr = IDWriteTextLayout_SetInlineObject(layout, inlineobj, range); +todo_wine + ok(hr == S_OK, "got 0x%08x\n", hr); + + range.startPosition = 1; + range.length = 2; + hr = IDWriteTextLayout_SetInlineObject(layout, inlineobj, range); +todo_wine + ok(hr == S_OK, "got 0x%08x\n", hr); + + IDWriteTextLayout_Release(layout); + IDWriteTextFormat_Release(format); +} + START_TEST(layout) { HRESULT hr; @@ -279,6 +379,8 @@ START_TEST(layout) test_CreateTextFormat(); test_GetLocaleName(); test_CreateEllipsisTrimmingSign(); + test_fontweight(); + test_SetInlineObject(); IDWriteFactory_Release(factory); } -- 2.0.1