Commit b8db7f6a authored by Nikolay Sivov's avatar Nikolay Sivov Committed by Alexandre Julliard

dwrite: Update to IDWriteBitmapRenderTarget1.

parent 7ae3426e
/* /*
* GDI Interop * GDI Interop
* *
* Copyright 2012 Nikolay Sivov for CodeWeavers * Copyright 2012, 2014 Nikolay Sivov for CodeWeavers
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
...@@ -44,9 +44,10 @@ struct gdiinterop { ...@@ -44,9 +44,10 @@ struct gdiinterop {
}; };
struct rendertarget { struct rendertarget {
IDWriteBitmapRenderTarget IDWriteBitmapRenderTarget_iface; IDWriteBitmapRenderTarget1 IDWriteBitmapRenderTarget1_iface;
LONG ref; LONG ref;
DWRITE_TEXT_ANTIALIAS_MODE antialiasmode;
FLOAT pixels_per_dip; FLOAT pixels_per_dip;
DWRITE_MATRIX m; DWRITE_MATRIX m;
SIZE size; SIZE size;
...@@ -75,9 +76,9 @@ static HRESULT create_target_dibsection(HDC hdc, UINT32 width, UINT32 height) ...@@ -75,9 +76,9 @@ static HRESULT create_target_dibsection(HDC hdc, UINT32 width, UINT32 height)
return S_OK; return S_OK;
} }
static inline struct rendertarget *impl_from_IDWriteBitmapRenderTarget(IDWriteBitmapRenderTarget *iface) static inline struct rendertarget *impl_from_IDWriteBitmapRenderTarget1(IDWriteBitmapRenderTarget1 *iface)
{ {
return CONTAINING_RECORD(iface, struct rendertarget, IDWriteBitmapRenderTarget_iface); return CONTAINING_RECORD(iface, struct rendertarget, IDWriteBitmapRenderTarget1_iface);
} }
static inline struct gdiinterop *impl_from_IDWriteGdiInterop(IDWriteGdiInterop *iface) static inline struct gdiinterop *impl_from_IDWriteGdiInterop(IDWriteGdiInterop *iface)
...@@ -85,16 +86,18 @@ static inline struct gdiinterop *impl_from_IDWriteGdiInterop(IDWriteGdiInterop * ...@@ -85,16 +86,18 @@ static inline struct gdiinterop *impl_from_IDWriteGdiInterop(IDWriteGdiInterop *
return CONTAINING_RECORD(iface, struct gdiinterop, IDWriteGdiInterop_iface); return CONTAINING_RECORD(iface, struct gdiinterop, IDWriteGdiInterop_iface);
} }
static HRESULT WINAPI rendertarget_QueryInterface(IDWriteBitmapRenderTarget *iface, REFIID riid, void **obj) static HRESULT WINAPI rendertarget_QueryInterface(IDWriteBitmapRenderTarget1 *iface, REFIID riid, void **obj)
{ {
struct rendertarget *This = impl_from_IDWriteBitmapRenderTarget(iface); struct rendertarget *This = impl_from_IDWriteBitmapRenderTarget1(iface);
TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), obj); TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), obj);
if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IDWriteBitmapRenderTarget)) if (IsEqualIID(riid, &IID_IDWriteBitmapRenderTarget1) ||
IsEqualIID(riid, &IID_IDWriteBitmapRenderTarget) ||
IsEqualIID(riid, &IID_IUnknown))
{ {
*obj = iface; *obj = iface;
IDWriteBitmapRenderTarget_AddRef(iface); IDWriteBitmapRenderTarget1_AddRef(iface);
return S_OK; return S_OK;
} }
...@@ -103,17 +106,17 @@ static HRESULT WINAPI rendertarget_QueryInterface(IDWriteBitmapRenderTarget *ifa ...@@ -103,17 +106,17 @@ static HRESULT WINAPI rendertarget_QueryInterface(IDWriteBitmapRenderTarget *ifa
return E_NOINTERFACE; return E_NOINTERFACE;
} }
static ULONG WINAPI rendertarget_AddRef(IDWriteBitmapRenderTarget *iface) static ULONG WINAPI rendertarget_AddRef(IDWriteBitmapRenderTarget1 *iface)
{ {
struct rendertarget *This = impl_from_IDWriteBitmapRenderTarget(iface); struct rendertarget *This = impl_from_IDWriteBitmapRenderTarget1(iface);
ULONG ref = InterlockedIncrement(&This->ref); ULONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p)->(%d)\n", This, ref); TRACE("(%p)->(%d)\n", This, ref);
return ref; return ref;
} }
static ULONG WINAPI rendertarget_Release(IDWriteBitmapRenderTarget *iface) static ULONG WINAPI rendertarget_Release(IDWriteBitmapRenderTarget1 *iface)
{ {
struct rendertarget *This = impl_from_IDWriteBitmapRenderTarget(iface); struct rendertarget *This = impl_from_IDWriteBitmapRenderTarget1(iface);
ULONG ref = InterlockedDecrement(&This->ref); ULONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p)->(%d)\n", This, ref); TRACE("(%p)->(%d)\n", This, ref);
...@@ -127,34 +130,34 @@ static ULONG WINAPI rendertarget_Release(IDWriteBitmapRenderTarget *iface) ...@@ -127,34 +130,34 @@ static ULONG WINAPI rendertarget_Release(IDWriteBitmapRenderTarget *iface)
return ref; return ref;
} }
static HRESULT WINAPI rendertarget_DrawGlyphRun(IDWriteBitmapRenderTarget *iface, static HRESULT WINAPI rendertarget_DrawGlyphRun(IDWriteBitmapRenderTarget1 *iface,
FLOAT baselineOriginX, FLOAT baselineOriginY, DWRITE_MEASURING_MODE measuring_mode, FLOAT baselineOriginX, FLOAT baselineOriginY, DWRITE_MEASURING_MODE measuring_mode,
DWRITE_GLYPH_RUN const* glyph_run, IDWriteRenderingParams* params, COLORREF textColor, DWRITE_GLYPH_RUN const* glyph_run, IDWriteRenderingParams* params, COLORREF textColor,
RECT *blackbox_rect) RECT *blackbox_rect)
{ {
struct rendertarget *This = impl_from_IDWriteBitmapRenderTarget(iface); struct rendertarget *This = impl_from_IDWriteBitmapRenderTarget1(iface);
FIXME("(%p)->(%f %f %d %p %p 0x%08x %p): stub\n", This, baselineOriginX, baselineOriginY, FIXME("(%p)->(%f %f %d %p %p 0x%08x %p): stub\n", This, baselineOriginX, baselineOriginY,
measuring_mode, glyph_run, params, textColor, blackbox_rect); measuring_mode, glyph_run, params, textColor, blackbox_rect);
return E_NOTIMPL; return E_NOTIMPL;
} }
static HDC WINAPI rendertarget_GetMemoryDC(IDWriteBitmapRenderTarget *iface) static HDC WINAPI rendertarget_GetMemoryDC(IDWriteBitmapRenderTarget1 *iface)
{ {
struct rendertarget *This = impl_from_IDWriteBitmapRenderTarget(iface); struct rendertarget *This = impl_from_IDWriteBitmapRenderTarget1(iface);
TRACE("(%p)\n", This); TRACE("(%p)\n", This);
return This->hdc; return This->hdc;
} }
static FLOAT WINAPI rendertarget_GetPixelsPerDip(IDWriteBitmapRenderTarget *iface) static FLOAT WINAPI rendertarget_GetPixelsPerDip(IDWriteBitmapRenderTarget1 *iface)
{ {
struct rendertarget *This = impl_from_IDWriteBitmapRenderTarget(iface); struct rendertarget *This = impl_from_IDWriteBitmapRenderTarget1(iface);
TRACE("(%p)\n", This); TRACE("(%p)\n", This);
return This->pixels_per_dip; return This->pixels_per_dip;
} }
static HRESULT WINAPI rendertarget_SetPixelsPerDip(IDWriteBitmapRenderTarget *iface, FLOAT pixels_per_dip) static HRESULT WINAPI rendertarget_SetPixelsPerDip(IDWriteBitmapRenderTarget1 *iface, FLOAT pixels_per_dip)
{ {
struct rendertarget *This = impl_from_IDWriteBitmapRenderTarget(iface); struct rendertarget *This = impl_from_IDWriteBitmapRenderTarget1(iface);
TRACE("(%p)->(%.2f)\n", This, pixels_per_dip); TRACE("(%p)->(%.2f)\n", This, pixels_per_dip);
...@@ -165,9 +168,9 @@ static HRESULT WINAPI rendertarget_SetPixelsPerDip(IDWriteBitmapRenderTarget *if ...@@ -165,9 +168,9 @@ static HRESULT WINAPI rendertarget_SetPixelsPerDip(IDWriteBitmapRenderTarget *if
return S_OK; return S_OK;
} }
static HRESULT WINAPI rendertarget_GetCurrentTransform(IDWriteBitmapRenderTarget *iface, DWRITE_MATRIX *transform) static HRESULT WINAPI rendertarget_GetCurrentTransform(IDWriteBitmapRenderTarget1 *iface, DWRITE_MATRIX *transform)
{ {
struct rendertarget *This = impl_from_IDWriteBitmapRenderTarget(iface); struct rendertarget *This = impl_from_IDWriteBitmapRenderTarget1(iface);
TRACE("(%p)->(%p)\n", This, transform); TRACE("(%p)->(%p)\n", This, transform);
...@@ -175,9 +178,9 @@ static HRESULT WINAPI rendertarget_GetCurrentTransform(IDWriteBitmapRenderTarget ...@@ -175,9 +178,9 @@ static HRESULT WINAPI rendertarget_GetCurrentTransform(IDWriteBitmapRenderTarget
return S_OK; return S_OK;
} }
static HRESULT WINAPI rendertarget_SetCurrentTransform(IDWriteBitmapRenderTarget *iface, DWRITE_MATRIX const *transform) static HRESULT WINAPI rendertarget_SetCurrentTransform(IDWriteBitmapRenderTarget1 *iface, DWRITE_MATRIX const *transform)
{ {
struct rendertarget *This = impl_from_IDWriteBitmapRenderTarget(iface); struct rendertarget *This = impl_from_IDWriteBitmapRenderTarget1(iface);
TRACE("(%p)->(%p)\n", This, transform); TRACE("(%p)->(%p)\n", This, transform);
...@@ -185,18 +188,18 @@ static HRESULT WINAPI rendertarget_SetCurrentTransform(IDWriteBitmapRenderTarget ...@@ -185,18 +188,18 @@ static HRESULT WINAPI rendertarget_SetCurrentTransform(IDWriteBitmapRenderTarget
return S_OK; return S_OK;
} }
static HRESULT WINAPI rendertarget_GetSize(IDWriteBitmapRenderTarget *iface, SIZE *size) static HRESULT WINAPI rendertarget_GetSize(IDWriteBitmapRenderTarget1 *iface, SIZE *size)
{ {
struct rendertarget *This = impl_from_IDWriteBitmapRenderTarget(iface); struct rendertarget *This = impl_from_IDWriteBitmapRenderTarget1(iface);
TRACE("(%p)->(%p)\n", This, size); TRACE("(%p)->(%p)\n", This, size);
*size = This->size; *size = This->size;
return S_OK; return S_OK;
} }
static HRESULT WINAPI rendertarget_Resize(IDWriteBitmapRenderTarget *iface, UINT32 width, UINT32 height) static HRESULT WINAPI rendertarget_Resize(IDWriteBitmapRenderTarget1 *iface, UINT32 width, UINT32 height)
{ {
struct rendertarget *This = impl_from_IDWriteBitmapRenderTarget(iface); struct rendertarget *This = impl_from_IDWriteBitmapRenderTarget1(iface);
TRACE("(%p)->(%u %u)\n", This, width, height); TRACE("(%p)->(%u %u)\n", This, width, height);
...@@ -206,7 +209,27 @@ static HRESULT WINAPI rendertarget_Resize(IDWriteBitmapRenderTarget *iface, UINT ...@@ -206,7 +209,27 @@ static HRESULT WINAPI rendertarget_Resize(IDWriteBitmapRenderTarget *iface, UINT
return create_target_dibsection(This->hdc, width, height); return create_target_dibsection(This->hdc, width, height);
} }
static const IDWriteBitmapRenderTargetVtbl rendertargetvtbl = { static DWRITE_TEXT_ANTIALIAS_MODE WINAPI rendertarget_GetTextAntialiasMode(IDWriteBitmapRenderTarget1 *iface)
{
struct rendertarget *This = impl_from_IDWriteBitmapRenderTarget1(iface);
TRACE("(%p)\n", This);
return This->antialiasmode;
}
static HRESULT WINAPI rendertarget_SetTextAntialiasMode(IDWriteBitmapRenderTarget1 *iface, DWRITE_TEXT_ANTIALIAS_MODE mode)
{
struct rendertarget *This = impl_from_IDWriteBitmapRenderTarget1(iface);
TRACE("(%p)->(%d)\n", This, mode);
if ((DWORD)mode > DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE)
return E_INVALIDARG;
This->antialiasmode = mode;
return S_OK;
}
static const IDWriteBitmapRenderTarget1Vtbl rendertargetvtbl = {
rendertarget_QueryInterface, rendertarget_QueryInterface,
rendertarget_AddRef, rendertarget_AddRef,
rendertarget_Release, rendertarget_Release,
...@@ -217,7 +240,9 @@ static const IDWriteBitmapRenderTargetVtbl rendertargetvtbl = { ...@@ -217,7 +240,9 @@ static const IDWriteBitmapRenderTargetVtbl rendertargetvtbl = {
rendertarget_GetCurrentTransform, rendertarget_GetCurrentTransform,
rendertarget_SetCurrentTransform, rendertarget_SetCurrentTransform,
rendertarget_GetSize, rendertarget_GetSize,
rendertarget_Resize rendertarget_Resize,
rendertarget_GetTextAntialiasMode,
rendertarget_SetTextAntialiasMode
}; };
static HRESULT create_rendertarget(HDC hdc, UINT32 width, UINT32 height, IDWriteBitmapRenderTarget **ret) static HRESULT create_rendertarget(HDC hdc, UINT32 width, UINT32 height, IDWriteBitmapRenderTarget **ret)
...@@ -230,7 +255,7 @@ static HRESULT create_rendertarget(HDC hdc, UINT32 width, UINT32 height, IDWrite ...@@ -230,7 +255,7 @@ static HRESULT create_rendertarget(HDC hdc, UINT32 width, UINT32 height, IDWrite
target = heap_alloc(sizeof(struct rendertarget)); target = heap_alloc(sizeof(struct rendertarget));
if (!target) return E_OUTOFMEMORY; if (!target) return E_OUTOFMEMORY;
target->IDWriteBitmapRenderTarget_iface.lpVtbl = &rendertargetvtbl; target->IDWriteBitmapRenderTarget1_iface.lpVtbl = &rendertargetvtbl;
target->ref = 1; target->ref = 1;
target->size.cx = width; target->size.cx = width;
...@@ -239,14 +264,15 @@ static HRESULT create_rendertarget(HDC hdc, UINT32 width, UINT32 height, IDWrite ...@@ -239,14 +264,15 @@ static HRESULT create_rendertarget(HDC hdc, UINT32 width, UINT32 height, IDWrite
target->hdc = CreateCompatibleDC(hdc); target->hdc = CreateCompatibleDC(hdc);
hr = create_target_dibsection(target->hdc, width, height); hr = create_target_dibsection(target->hdc, width, height);
if (FAILED(hr)) { if (FAILED(hr)) {
IDWriteBitmapRenderTarget_Release(&target->IDWriteBitmapRenderTarget_iface); IDWriteBitmapRenderTarget1_Release(&target->IDWriteBitmapRenderTarget1_iface);
return hr; return hr;
} }
target->m = identity; target->m = identity;
target->pixels_per_dip = 1.0; target->pixels_per_dip = 1.0;
target->antialiasmode = DWRITE_TEXT_ANTIALIAS_MODE_CLEARTYPE;
*ret = &target->IDWriteBitmapRenderTarget_iface; *ret = (IDWriteBitmapRenderTarget*)&target->IDWriteBitmapRenderTarget1_iface;
return S_OK; return S_OK;
} }
......
...@@ -527,6 +527,7 @@ todo_wine { ...@@ -527,6 +527,7 @@ todo_wine {
static void test_CreateBitmapRenderTarget(void) static void test_CreateBitmapRenderTarget(void)
{ {
IDWriteBitmapRenderTarget *target, *target2; IDWriteBitmapRenderTarget *target, *target2;
IDWriteBitmapRenderTarget1 *target1;
IDWriteGdiInterop *interop; IDWriteGdiInterop *interop;
IDWriteFactory *factory; IDWriteFactory *factory;
HBITMAP hbm, hbm2; HBITMAP hbm, hbm2;
...@@ -701,6 +702,30 @@ if (0) /* crashes on native */ ...@@ -701,6 +702,30 @@ if (0) /* crashes on native */
pdip = IDWriteBitmapRenderTarget_GetPixelsPerDip(target); pdip = IDWriteBitmapRenderTarget_GetPixelsPerDip(target);
ok(pdip == 2.0, "got %.2f\n", pdip); ok(pdip == 2.0, "got %.2f\n", pdip);
hr = IDWriteBitmapRenderTarget_QueryInterface(target, &IID_IDWriteBitmapRenderTarget1, (void**)&target1);
if (hr == S_OK) {
DWRITE_TEXT_ANTIALIAS_MODE mode;
mode = IDWriteBitmapRenderTarget1_GetTextAntialiasMode(target1);
ok(mode == DWRITE_TEXT_ANTIALIAS_MODE_CLEARTYPE, "got %d\n", mode);
hr = IDWriteBitmapRenderTarget1_SetTextAntialiasMode(target1, DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE+1);
ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
mode = IDWriteBitmapRenderTarget1_GetTextAntialiasMode(target1);
ok(mode == DWRITE_TEXT_ANTIALIAS_MODE_CLEARTYPE, "got %d\n", mode);
hr = IDWriteBitmapRenderTarget1_SetTextAntialiasMode(target1, DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE);
ok(hr == S_OK, "got 0x%08x\n", hr);
mode = IDWriteBitmapRenderTarget1_GetTextAntialiasMode(target1);
ok(mode == DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE, "got %d\n", mode);
IDWriteBitmapRenderTarget1_Release(target1);
}
else
win_skip("IDWriteBitmapRenderTarget1 is not supported.\n");
IDWriteBitmapRenderTarget_Release(target); IDWriteBitmapRenderTarget_Release(target);
IDWriteGdiInterop_Release(interop); IDWriteGdiInterop_Release(interop);
IDWriteFactory_Release(factory); IDWriteFactory_Release(factory);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment