Module: wine Branch: master Commit: 27e86cfc36f37e0f53c2224cf995e6a975119801 URL: http://source.winehq.org/git/wine.git/?a=commit;h=27e86cfc36f37e0f53c2224cf9...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Tue Apr 8 07:42:24 2014 +0400
dwrite: Added partial implementation for CreateEllipsisTrimmingSign().
---
dlls/dwrite/dwrite_private.h | 1 + dlls/dwrite/layout.c | 108 ++++++++++++++++++++++++++++++++++++++++++ dlls/dwrite/main.c | 4 +- dlls/dwrite/tests/layout.c | 30 ++++++++++++ 4 files changed, 141 insertions(+), 2 deletions(-)
diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h index 5450732..0f71544 100644 --- a/dlls/dwrite/dwrite_private.h +++ b/dlls/dwrite/dwrite_private.h @@ -76,6 +76,7 @@ extern HRESULT convert_fontface_to_logfont(IDWriteFontFace*, LOGFONTW*) DECLSPEC extern HRESULT create_textformat(const WCHAR*,IDWriteFontCollection*,DWRITE_FONT_WEIGHT,DWRITE_FONT_STYLE,DWRITE_FONT_STRETCH, FLOAT,const WCHAR*,IDWriteTextFormat**) DECLSPEC_HIDDEN; extern HRESULT create_textlayout(const WCHAR*,UINT32,IDWriteTextFormat*,IDWriteTextLayout**) DECLSPEC_HIDDEN; +extern HRESULT create_trimmingsign(IDWriteInlineObject**) DECLSPEC_HIDDEN; extern HRESULT get_gdiinterop(IDWriteGdiInterop**) DECLSPEC_HIDDEN; extern HRESULT create_localizedstrings(IDWriteLocalizedStrings**) DECLSPEC_HIDDEN; extern HRESULT add_localizedstring(IDWriteLocalizedStrings*,const WCHAR*,const WCHAR*) DECLSPEC_HIDDEN; diff --git a/dlls/dwrite/layout.c b/dlls/dwrite/layout.c index ff246ff..0cc31a9 100644 --- a/dlls/dwrite/layout.c +++ b/dlls/dwrite/layout.c @@ -74,6 +74,11 @@ struct dwrite_textformat { struct dwrite_textformat_data format; };
+struct dwrite_trimmingsign { + IDWriteInlineObject IDWriteInlineObject_iface; + LONG ref; +}; + static const IDWriteTextFormatVtbl dwritetextformatvtbl;
static void release_format_data(struct dwrite_textformat_data *data) @@ -99,6 +104,11 @@ static inline struct dwrite_textformat *unsafe_impl_from_IDWriteTextFormat(IDWri return iface->lpVtbl == &dwritetextformatvtbl ? impl_from_IDWriteTextFormat(iface) : NULL; }
+static inline struct dwrite_trimmingsign *impl_from_IDWriteInlineObject(IDWriteInlineObject *iface) +{ + return CONTAINING_RECORD(iface, struct dwrite_trimmingsign, IDWriteInlineObject_iface); +} + static HRESULT WINAPI dwritetextlayout_QueryInterface(IDWriteTextLayout *iface, REFIID riid, void **obj) { struct dwrite_textlayout *This = impl_from_IDWriteTextLayout(iface); @@ -762,6 +772,104 @@ HRESULT create_textlayout(const WCHAR *str, UINT32 len, IDWriteTextFormat *forma return S_OK; }
+static HRESULT WINAPI dwritetrimmingsign_QueryInterface(IDWriteInlineObject *iface, REFIID riid, void **obj) +{ + struct dwrite_trimmingsign *This = impl_from_IDWriteInlineObject(iface); + + TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), obj); + + if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IDWriteInlineObject)) { + *obj = iface; + IDWriteInlineObject_AddRef(iface); + return S_OK; + } + + *obj = NULL; + return E_NOINTERFACE; + +} + +static ULONG WINAPI dwritetrimmingsign_AddRef(IDWriteInlineObject *iface) +{ + struct dwrite_trimmingsign *This = impl_from_IDWriteInlineObject(iface); + ULONG ref = InterlockedIncrement(&This->ref); + TRACE("(%p)->(%d)\n", This, ref); + return ref; +} + +static ULONG WINAPI dwritetrimmingsign_Release(IDWriteInlineObject *iface) +{ + struct dwrite_trimmingsign *This = impl_from_IDWriteInlineObject(iface); + ULONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p)->(%d)\n", This, ref); + + if (!ref) + heap_free(This); + + return ref; +} + +static HRESULT WINAPI dwritetrimmingsign_Draw(IDWriteInlineObject *iface, void *context, IDWriteTextRenderer *renderer, + FLOAT originX, FLOAT originY, BOOL is_sideways, BOOL is_rtl, IUnknown *drawing_effect) +{ + struct dwrite_trimmingsign *This = impl_from_IDWriteInlineObject(iface); + FIXME("(%p)->(%p %p %f %f %d %d %p): stub\n", This, context, renderer, originX, originY, is_sideways, is_rtl, drawing_effect); + return E_NOTIMPL; +} + +static HRESULT WINAPI dwritetrimmingsign_GetMetrics(IDWriteInlineObject *iface, DWRITE_INLINE_OBJECT_METRICS *metrics) +{ + struct dwrite_trimmingsign *This = impl_from_IDWriteInlineObject(iface); + FIXME("(%p)->(%p): stub\n", This, metrics); + return E_NOTIMPL; +} + +static HRESULT WINAPI dwritetrimmingsign_GetOverhangMetrics(IDWriteInlineObject *iface, DWRITE_OVERHANG_METRICS *overhangs) +{ + struct dwrite_trimmingsign *This = impl_from_IDWriteInlineObject(iface); + FIXME("(%p)->(%p): stub\n", This, overhangs); + return E_NOTIMPL; +} + +static HRESULT WINAPI dwritetrimmingsign_GetBreakConditions(IDWriteInlineObject *iface, DWRITE_BREAK_CONDITION *before, + DWRITE_BREAK_CONDITION *after) +{ + struct dwrite_trimmingsign *This = impl_from_IDWriteInlineObject(iface); + + TRACE("(%p)->(%p %p)\n", This, before, after); + + *before = *after = DWRITE_BREAK_CONDITION_NEUTRAL; + return S_OK; +} + +static const IDWriteInlineObjectVtbl dwritetrimmingsignvtbl = { + dwritetrimmingsign_QueryInterface, + dwritetrimmingsign_AddRef, + dwritetrimmingsign_Release, + dwritetrimmingsign_Draw, + dwritetrimmingsign_GetMetrics, + dwritetrimmingsign_GetOverhangMetrics, + dwritetrimmingsign_GetBreakConditions +}; + +HRESULT create_trimmingsign(IDWriteInlineObject **sign) +{ + struct dwrite_trimmingsign *This; + + *sign = NULL; + + This = heap_alloc(sizeof(struct dwrite_trimmingsign)); + if (!This) return E_OUTOFMEMORY; + + This->IDWriteInlineObject_iface.lpVtbl = &dwritetrimmingsignvtbl; + This->ref = 1; + + *sign = &This->IDWriteInlineObject_iface; + + return S_OK; +} + static HRESULT WINAPI dwritetextformat_QueryInterface(IDWriteTextFormat *iface, REFIID riid, void **obj) { struct dwrite_textformat *This = impl_from_IDWriteTextFormat(iface); diff --git a/dlls/dwrite/main.c b/dlls/dwrite/main.c index d253c42..cf3b530 100644 --- a/dlls/dwrite/main.c +++ b/dlls/dwrite/main.c @@ -527,8 +527,8 @@ static HRESULT WINAPI dwritefactory_CreateGdiCompatibleTextLayout(IDWriteFactory static HRESULT WINAPI dwritefactory_CreateEllipsisTrimmingSign(IDWriteFactory *iface, IDWriteTextFormat *format, IDWriteInlineObject **trimming_sign) { - FIXME("(%p %p): stub\n", format, trimming_sign); - return E_NOTIMPL; + FIXME("(%p %p): semi-stub\n", format, trimming_sign); + return create_trimmingsign(trimming_sign); }
static HRESULT WINAPI dwritefactory_CreateTextAnalyzer(IDWriteFactory *iface, IDWriteTextAnalyzer **analyzer) diff --git a/dlls/dwrite/tests/layout.c b/dlls/dwrite/tests/layout.c index a340741..43a8f3b 100644 --- a/dlls/dwrite/tests/layout.c +++ b/dlls/dwrite/tests/layout.c @@ -233,6 +233,35 @@ static void test_GetLocaleName(void) IDWriteTextFormat_Release(format); }
+static void test_CreateEllipsisTrimmingSign(void) +{ + DWRITE_BREAK_CONDITION before, after; + IDWriteTextFormat *format; + IDWriteInlineObject *sign; + HRESULT hr; + + 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); + + EXPECT_REF(format, 1); + hr = IDWriteFactory_CreateEllipsisTrimmingSign(factory, format, &sign); + ok(hr == S_OK, "got 0x%08x\n", hr); + EXPECT_REF(format, 1); + +if (0) /* crashes on native */ + hr = IDWriteInlineObject_GetBreakConditions(sign, NULL, NULL); + + before = after = DWRITE_BREAK_CONDITION_CAN_BREAK; + hr = IDWriteInlineObject_GetBreakConditions(sign, &before, &after); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(before == DWRITE_BREAK_CONDITION_NEUTRAL, "got %d\n", before); + ok(after == DWRITE_BREAK_CONDITION_NEUTRAL, "got %d\n", after); + + IDWriteInlineObject_Release(sign); + IDWriteTextFormat_Release(format); +} + START_TEST(layout) { HRESULT hr; @@ -249,6 +278,7 @@ START_TEST(layout) test_CreateGdiCompatibleTextLayout(); test_CreateTextFormat(); test_GetLocaleName(); + test_CreateEllipsisTrimmingSign();
IDWriteFactory_Release(factory); }