Aric Stewart : dwrite: Make gdiinterop an allocated object.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Aug 25 15:58:17 CDT 2014
Module: wine
Branch: master
Commit: 4c81231e29f5964850f7400b25285e42029b7921
URL: http://source.winehq.org/git/wine.git/?a=commit;h=4c81231e29f5964850f7400b25285e42029b7921
Author: Aric Stewart <aric at codeweavers.com>
Date: Wed Aug 13 13:47:13 2014 -0500
dwrite: Make gdiinterop an allocated object.
---
dlls/dwrite/gdiinterop.c | 61 ++++++++++++++++++++++++++++++++++++++----------
1 file changed, 49 insertions(+), 12 deletions(-)
diff --git a/dlls/dwrite/gdiinterop.c b/dlls/dwrite/gdiinterop.c
index 73da1d2..329bcdb 100644
--- a/dlls/dwrite/gdiinterop.c
+++ b/dlls/dwrite/gdiinterop.c
@@ -32,6 +32,11 @@
WINE_DEFAULT_DEBUG_CHANNEL(dwrite);
+struct gdiinterop {
+ IDWriteGdiInterop IDWriteGdiInterop_iface;
+ LONG ref;
+};
+
struct rendertarget {
IDWriteBitmapRenderTarget IDWriteBitmapRenderTarget_iface;
LONG ref;
@@ -68,6 +73,11 @@ static inline struct rendertarget *impl_from_IDWriteBitmapRenderTarget(IDWriteBi
return CONTAINING_RECORD(iface, struct rendertarget, IDWriteBitmapRenderTarget_iface);
}
+static inline struct gdiinterop *impl_from_IDWriteGdiInterop(IDWriteGdiInterop *iface)
+{
+ return CONTAINING_RECORD(iface, struct gdiinterop, IDWriteGdiInterop_iface);
+}
+
static HRESULT WINAPI rendertarget_QueryInterface(IDWriteBitmapRenderTarget *iface, REFIID riid, void **obj)
{
struct rendertarget *This = impl_from_IDWriteBitmapRenderTarget(iface);
@@ -228,33 +238,48 @@ static HRESULT create_rendertarget(HDC hdc, UINT32 width, UINT32 height, IDWrite
static HRESULT WINAPI gdiinterop_QueryInterface(IDWriteGdiInterop *iface, REFIID riid, void **obj)
{
- TRACE("(%s %p)\n", debugstr_guid(riid), obj);
+ struct gdiinterop *This = impl_from_IDWriteGdiInterop(iface);
+
+ TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), obj);
if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IDWriteGdiInterop))
{
*obj = iface;
+ IDWriteGdiInterop_AddRef(iface);
return S_OK;
}
*obj = NULL;
-
return E_NOINTERFACE;
}
static ULONG WINAPI gdiinterop_AddRef(IDWriteGdiInterop *iface)
{
- return 2;
+ struct gdiinterop *This = impl_from_IDWriteGdiInterop(iface);
+ ULONG ref = InterlockedIncrement(&This->ref);
+ TRACE("(%p)->(%d)\n", This, ref);
+ return ref;
}
static ULONG WINAPI gdiinterop_Release(IDWriteGdiInterop *iface)
{
- return 1;
+ struct gdiinterop *This = impl_from_IDWriteGdiInterop(iface);
+ ULONG ref = InterlockedDecrement(&This->ref);
+
+ TRACE("(%p)->(%d)\n", This, ref);
+
+ if (!ref)
+ {
+ heap_free(This);
+ }
+ return ref;
}
static HRESULT WINAPI gdiinterop_CreateFontFromLOGFONT(IDWriteGdiInterop *iface,
LOGFONTW const *logfont, IDWriteFont **font)
{
- TRACE("(%p %p)\n", logfont, font);
+ struct gdiinterop *This = impl_from_IDWriteGdiInterop(iface);
+ TRACE("(%p)->(%p %p)\n", This, logfont, font);
if (!logfont) return E_INVALIDARG;
@@ -264,28 +289,32 @@ static HRESULT WINAPI gdiinterop_CreateFontFromLOGFONT(IDWriteGdiInterop *iface,
static HRESULT WINAPI gdiinterop_ConvertFontToLOGFONT(IDWriteGdiInterop *iface,
IDWriteFont *font, LOGFONTW *logfont, BOOL *is_systemfont)
{
- FIXME("(%p %p %p): stub\n", font, logfont, is_systemfont);
+ struct gdiinterop *This = impl_from_IDWriteGdiInterop(iface);
+ FIXME("(%p)->(%p %p %p): stub\n", This, font, logfont, is_systemfont);
return E_NOTIMPL;
}
static HRESULT WINAPI gdiinterop_ConvertFontFaceToLOGFONT(IDWriteGdiInterop *iface,
IDWriteFontFace *fontface, LOGFONTW *logfont)
{
- TRACE("(%p %p)\n", fontface, logfont);
+ struct gdiinterop *This = impl_from_IDWriteGdiInterop(iface);
+ TRACE("(%p)->(%p %p)\n", This, fontface, logfont);
return convert_fontface_to_logfont(fontface, logfont);
}
static HRESULT WINAPI gdiinterop_CreateFontFaceFromHdc(IDWriteGdiInterop *iface,
HDC hdc, IDWriteFontFace **fontface)
{
- FIXME("(%p %p): stub\n", hdc, fontface);
+ struct gdiinterop *This = impl_from_IDWriteGdiInterop(iface);
+ FIXME("(%p)->(%p %p): stub\n", This, hdc, fontface);
return E_NOTIMPL;
}
static HRESULT WINAPI gdiinterop_CreateBitmapRenderTarget(IDWriteGdiInterop *iface,
HDC hdc, UINT32 width, UINT32 height, IDWriteBitmapRenderTarget **target)
{
- TRACE("(%p %u %u %p)\n", hdc, width, height, target);
+ struct gdiinterop *This = impl_from_IDWriteGdiInterop(iface);
+ TRACE("(%p)->(%p %u %u %p)\n", This, hdc, width, height, target);
return create_rendertarget(hdc, width, height, target);
}
@@ -300,10 +329,18 @@ static const struct IDWriteGdiInteropVtbl gdiinteropvtbl = {
gdiinterop_CreateBitmapRenderTarget
};
-static IDWriteGdiInterop gdiinterop = { &gdiinteropvtbl };
-
HRESULT get_gdiinterop(IDWriteGdiInterop **ret)
{
- *ret = &gdiinterop;
+ struct gdiinterop *This;
+
+ *ret = NULL;
+
+ This = heap_alloc(sizeof(struct gdiinterop));
+ if (!This) return E_OUTOFMEMORY;
+
+ This->IDWriteGdiInterop_iface.lpVtbl = &gdiinteropvtbl;
+ This->ref = 1;
+
+ *ret= &This->IDWriteGdiInterop_iface;
return S_OK;
}
More information about the wine-cvs
mailing list