[v2 PATCH 1/3] d2d1: Update to ID2D1BitmapBrush1.
Nikolay Sivov
nsivov at codeweavers.com
Tue Sep 18 05:17:47 CDT 2018
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/d2d1/brush.c | 134 ++++++++++++++++++++++++++++-----------
dlls/d2d1/d2d1_private.h | 2 +-
dlls/d2d1/tests/d2d1.c | 44 +++++++++++++
3 files changed, 142 insertions(+), 38 deletions(-)
diff --git a/dlls/d2d1/brush.c b/dlls/d2d1/brush.c
index 450507cef6..fa4488ef18 100644
--- a/dlls/d2d1/brush.c
+++ b/dlls/d2d1/brush.c
@@ -816,22 +816,23 @@ HRESULT d2d_radial_gradient_brush_create(ID2D1Factory *factory,
return S_OK;
}
-static inline struct d2d_brush *impl_from_ID2D1BitmapBrush(ID2D1BitmapBrush *iface)
+static inline struct d2d_brush *impl_from_ID2D1BitmapBrush1(ID2D1BitmapBrush1 *iface)
{
return CONTAINING_RECORD(iface, struct d2d_brush, ID2D1Brush_iface);
}
-static HRESULT STDMETHODCALLTYPE d2d_bitmap_brush_QueryInterface(ID2D1BitmapBrush *iface,
+static HRESULT STDMETHODCALLTYPE d2d_bitmap_brush_QueryInterface(ID2D1BitmapBrush1 *iface,
REFIID iid, void **out)
{
TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
- if (IsEqualGUID(iid, &IID_ID2D1BitmapBrush)
+ if (IsEqualGUID(iid, &IID_ID2D1BitmapBrush1)
+ || IsEqualGUID(iid, &IID_ID2D1BitmapBrush)
|| IsEqualGUID(iid, &IID_ID2D1Brush)
|| IsEqualGUID(iid, &IID_ID2D1Resource)
|| IsEqualGUID(iid, &IID_IUnknown))
{
- ID2D1BitmapBrush_AddRef(iface);
+ ID2D1BitmapBrush1_AddRef(iface);
*out = iface;
return S_OK;
}
@@ -842,9 +843,9 @@ static HRESULT STDMETHODCALLTYPE d2d_bitmap_brush_QueryInterface(ID2D1BitmapBrus
return E_NOINTERFACE;
}
-static ULONG STDMETHODCALLTYPE d2d_bitmap_brush_AddRef(ID2D1BitmapBrush *iface)
+static ULONG STDMETHODCALLTYPE d2d_bitmap_brush_AddRef(ID2D1BitmapBrush1 *iface)
{
- struct d2d_brush *brush = impl_from_ID2D1BitmapBrush(iface);
+ struct d2d_brush *brush = impl_from_ID2D1BitmapBrush1(iface);
ULONG refcount = InterlockedIncrement(&brush->refcount);
TRACE("%p increasing refcount to %u.\n", iface, refcount);
@@ -852,9 +853,9 @@ static ULONG STDMETHODCALLTYPE d2d_bitmap_brush_AddRef(ID2D1BitmapBrush *iface)
return refcount;
}
-static ULONG STDMETHODCALLTYPE d2d_bitmap_brush_Release(ID2D1BitmapBrush *iface)
+static ULONG STDMETHODCALLTYPE d2d_bitmap_brush_Release(ID2D1BitmapBrush1 *iface)
{
- struct d2d_brush *brush = impl_from_ID2D1BitmapBrush(iface);
+ struct d2d_brush *brush = impl_from_ID2D1BitmapBrush1(iface);
ULONG refcount = InterlockedDecrement(&brush->refcount);
TRACE("%p decreasing refcount to %u.\n", iface, refcount);
@@ -871,57 +872,57 @@ static ULONG STDMETHODCALLTYPE d2d_bitmap_brush_Release(ID2D1BitmapBrush *iface)
return refcount;
}
-static void STDMETHODCALLTYPE d2d_bitmap_brush_GetFactory(ID2D1BitmapBrush *iface,
+static void STDMETHODCALLTYPE d2d_bitmap_brush_GetFactory(ID2D1BitmapBrush1 *iface,
ID2D1Factory **factory)
{
- struct d2d_brush *brush = impl_from_ID2D1BitmapBrush(iface);
+ struct d2d_brush *brush = impl_from_ID2D1BitmapBrush1(iface);
TRACE("iface %p, factory %p.\n", iface, factory);
ID2D1Factory_AddRef(*factory = brush->factory);
}
-static void STDMETHODCALLTYPE d2d_bitmap_brush_SetOpacity(ID2D1BitmapBrush *iface, float opacity)
+static void STDMETHODCALLTYPE d2d_bitmap_brush_SetOpacity(ID2D1BitmapBrush1 *iface, float opacity)
{
- struct d2d_brush *brush = impl_from_ID2D1BitmapBrush(iface);
+ struct d2d_brush *brush = impl_from_ID2D1BitmapBrush1(iface);
TRACE("iface %p, opacity %.8e.\n", iface, opacity);
brush->opacity = opacity;
}
-static void STDMETHODCALLTYPE d2d_bitmap_brush_SetTransform(ID2D1BitmapBrush *iface,
+static void STDMETHODCALLTYPE d2d_bitmap_brush_SetTransform(ID2D1BitmapBrush1 *iface,
const D2D1_MATRIX_3X2_F *transform)
{
- struct d2d_brush *brush = impl_from_ID2D1BitmapBrush(iface);
+ struct d2d_brush *brush = impl_from_ID2D1BitmapBrush1(iface);
TRACE("iface %p, transform %p.\n", iface, transform);
brush->transform = *transform;
}
-static float STDMETHODCALLTYPE d2d_bitmap_brush_GetOpacity(ID2D1BitmapBrush *iface)
+static float STDMETHODCALLTYPE d2d_bitmap_brush_GetOpacity(ID2D1BitmapBrush1 *iface)
{
- struct d2d_brush *brush = impl_from_ID2D1BitmapBrush(iface);
+ struct d2d_brush *brush = impl_from_ID2D1BitmapBrush1(iface);
TRACE("iface %p.\n", iface);
return brush->opacity;
}
-static void STDMETHODCALLTYPE d2d_bitmap_brush_GetTransform(ID2D1BitmapBrush *iface,
+static void STDMETHODCALLTYPE d2d_bitmap_brush_GetTransform(ID2D1BitmapBrush1 *iface,
D2D1_MATRIX_3X2_F *transform)
{
- struct d2d_brush *brush = impl_from_ID2D1BitmapBrush(iface);
+ struct d2d_brush *brush = impl_from_ID2D1BitmapBrush1(iface);
TRACE("iface %p, transform %p.\n", iface, transform);
*transform = brush->transform;
}
-static void STDMETHODCALLTYPE d2d_bitmap_brush_SetExtendModeX(ID2D1BitmapBrush *iface, D2D1_EXTEND_MODE mode)
+static void STDMETHODCALLTYPE d2d_bitmap_brush_SetExtendModeX(ID2D1BitmapBrush1 *iface, D2D1_EXTEND_MODE mode)
{
- struct d2d_brush *brush = impl_from_ID2D1BitmapBrush(iface);
+ struct d2d_brush *brush = impl_from_ID2D1BitmapBrush1(iface);
TRACE("iface %p, mode %#x.\n", iface, mode);
@@ -933,9 +934,9 @@ static void STDMETHODCALLTYPE d2d_bitmap_brush_SetExtendModeX(ID2D1BitmapBrush *
}
}
-static void STDMETHODCALLTYPE d2d_bitmap_brush_SetExtendModeY(ID2D1BitmapBrush *iface, D2D1_EXTEND_MODE mode)
+static void STDMETHODCALLTYPE d2d_bitmap_brush_SetExtendModeY(ID2D1BitmapBrush1 *iface, D2D1_EXTEND_MODE mode)
{
- struct d2d_brush *brush = impl_from_ID2D1BitmapBrush(iface);
+ struct d2d_brush *brush = impl_from_ID2D1BitmapBrush1(iface);
TRACE("iface %p, mode %#x.\n", iface, mode);
@@ -947,13 +948,23 @@ static void STDMETHODCALLTYPE d2d_bitmap_brush_SetExtendModeY(ID2D1BitmapBrush *
}
}
-static void STDMETHODCALLTYPE d2d_bitmap_brush_SetInterpolationMode(ID2D1BitmapBrush *iface,
+static void STDMETHODCALLTYPE d2d_bitmap_brush_SetInterpolationMode(ID2D1BitmapBrush1 *iface,
D2D1_BITMAP_INTERPOLATION_MODE mode)
{
- struct d2d_brush *brush = impl_from_ID2D1BitmapBrush(iface);
+ struct d2d_brush *brush = impl_from_ID2D1BitmapBrush1(iface);
TRACE("iface %p, mode %#x.\n", iface, mode);
+ switch (mode)
+ {
+ case D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR:
+ case D2D1_BITMAP_INTERPOLATION_MODE_LINEAR:
+ break;
+ default:
+ WARN("Unknown interpolation mode %#x.\n", mode);
+ return;
+ }
+
brush->u.bitmap.interpolation_mode = mode;
if (brush->u.bitmap.sampler_state)
{
@@ -962,9 +973,9 @@ static void STDMETHODCALLTYPE d2d_bitmap_brush_SetInterpolationMode(ID2D1BitmapB
}
}
-static void STDMETHODCALLTYPE d2d_bitmap_brush_SetBitmap(ID2D1BitmapBrush *iface, ID2D1Bitmap *bitmap)
+static void STDMETHODCALLTYPE d2d_bitmap_brush_SetBitmap(ID2D1BitmapBrush1 *iface, ID2D1Bitmap *bitmap)
{
- struct d2d_brush *brush = impl_from_ID2D1BitmapBrush(iface);
+ struct d2d_brush *brush = impl_from_ID2D1BitmapBrush1(iface);
TRACE("iface %p, bitmap %p.\n", iface, bitmap);
@@ -975,36 +986,43 @@ static void STDMETHODCALLTYPE d2d_bitmap_brush_SetBitmap(ID2D1BitmapBrush *iface
brush->u.bitmap.bitmap = unsafe_impl_from_ID2D1Bitmap(bitmap);
}
-static D2D1_EXTEND_MODE STDMETHODCALLTYPE d2d_bitmap_brush_GetExtendModeX(ID2D1BitmapBrush *iface)
+static D2D1_EXTEND_MODE STDMETHODCALLTYPE d2d_bitmap_brush_GetExtendModeX(ID2D1BitmapBrush1 *iface)
{
- struct d2d_brush *brush = impl_from_ID2D1BitmapBrush(iface);
+ struct d2d_brush *brush = impl_from_ID2D1BitmapBrush1(iface);
TRACE("iface %p.\n", iface);
return brush->u.bitmap.extend_mode_x;
}
-static D2D1_EXTEND_MODE STDMETHODCALLTYPE d2d_bitmap_brush_GetExtendModeY(ID2D1BitmapBrush *iface)
+static D2D1_EXTEND_MODE STDMETHODCALLTYPE d2d_bitmap_brush_GetExtendModeY(ID2D1BitmapBrush1 *iface)
{
- struct d2d_brush *brush = impl_from_ID2D1BitmapBrush(iface);
+ struct d2d_brush *brush = impl_from_ID2D1BitmapBrush1(iface);
TRACE("iface %p.\n", iface);
return brush->u.bitmap.extend_mode_y;
}
-static D2D1_BITMAP_INTERPOLATION_MODE STDMETHODCALLTYPE d2d_bitmap_brush_GetInterpolationMode(ID2D1BitmapBrush *iface)
+static D2D1_BITMAP_INTERPOLATION_MODE STDMETHODCALLTYPE d2d_bitmap_brush_GetInterpolationMode(ID2D1BitmapBrush1 *iface)
{
- struct d2d_brush *brush = impl_from_ID2D1BitmapBrush(iface);
+ struct d2d_brush *brush = impl_from_ID2D1BitmapBrush1(iface);
TRACE("iface %p.\n", iface);
- return brush->u.bitmap.interpolation_mode;
+ switch (brush->u.bitmap.interpolation_mode)
+ {
+ case D2D1_INTERPOLATION_MODE_NEAREST_NEIGHBOR:
+ case D2D1_INTERPOLATION_MODE_LINEAR:
+ return brush->u.bitmap.interpolation_mode;
+ default:
+ return D2D1_BITMAP_INTERPOLATION_MODE_LINEAR;
+ }
}
-static void STDMETHODCALLTYPE d2d_bitmap_brush_GetBitmap(ID2D1BitmapBrush *iface, ID2D1Bitmap **bitmap)
+static void STDMETHODCALLTYPE d2d_bitmap_brush_GetBitmap(ID2D1BitmapBrush1 *iface, ID2D1Bitmap **bitmap)
{
- struct d2d_brush *brush = impl_from_ID2D1BitmapBrush(iface);
+ struct d2d_brush *brush = impl_from_ID2D1BitmapBrush1(iface);
TRACE("iface %p, bitmap %p.\n", iface, bitmap);
@@ -1012,7 +1030,47 @@ static void STDMETHODCALLTYPE d2d_bitmap_brush_GetBitmap(ID2D1BitmapBrush *iface
ID2D1Bitmap_AddRef(*bitmap);
}
-static const struct ID2D1BitmapBrushVtbl d2d_bitmap_brush_vtbl =
+static void STDMETHODCALLTYPE d2d_bitmap_brush_SetInterpolationMode1(ID2D1BitmapBrush1 *iface,
+ D2D1_INTERPOLATION_MODE mode)
+{
+ struct d2d_brush *brush = impl_from_ID2D1BitmapBrush1(iface);
+
+ TRACE("iface %p, mode %#x.\n", iface, mode);
+
+ switch (mode)
+ {
+ case D2D1_INTERPOLATION_MODE_NEAREST_NEIGHBOR:
+ case D2D1_INTERPOLATION_MODE_LINEAR:
+ break;
+ case D2D1_INTERPOLATION_MODE_CUBIC:
+ case D2D1_INTERPOLATION_MODE_MULTI_SAMPLE_LINEAR:
+ case D2D1_INTERPOLATION_MODE_ANISOTROPIC:
+ case D2D1_INTERPOLATION_MODE_HIGH_QUALITY_CUBIC:
+ FIXME("Unhandled interpolation mode %#x.\n", mode);
+ break;
+ default:
+ WARN("Unknown interpolation mode %#x.\n", mode);
+ return;
+ }
+
+ brush->u.bitmap.interpolation_mode = mode;
+ if (brush->u.bitmap.sampler_state)
+ {
+ ID3D10SamplerState_Release(brush->u.bitmap.sampler_state);
+ brush->u.bitmap.sampler_state = NULL;
+ }
+}
+
+static D2D1_INTERPOLATION_MODE STDMETHODCALLTYPE d2d_bitmap_brush_GetInterpolationMode1(ID2D1BitmapBrush1 *iface)
+{
+ struct d2d_brush *brush = impl_from_ID2D1BitmapBrush1(iface);
+
+ TRACE("iface %p.\n", iface);
+
+ return brush->u.bitmap.interpolation_mode;
+}
+
+static const struct ID2D1BitmapBrush1Vtbl d2d_bitmap_brush_vtbl =
{
d2d_bitmap_brush_QueryInterface,
d2d_bitmap_brush_AddRef,
@@ -1030,6 +1088,8 @@ static const struct ID2D1BitmapBrushVtbl d2d_bitmap_brush_vtbl =
d2d_bitmap_brush_GetExtendModeY,
d2d_bitmap_brush_GetInterpolationMode,
d2d_bitmap_brush_GetBitmap,
+ d2d_bitmap_brush_SetInterpolationMode1,
+ d2d_bitmap_brush_GetInterpolationMode1,
};
HRESULT d2d_bitmap_brush_create(ID2D1Factory *factory, ID2D1Bitmap *bitmap, const D2D1_BITMAP_BRUSH_PROPERTIES *bitmap_brush_desc,
@@ -1242,7 +1302,7 @@ static void d2d_brush_bind_bitmap(struct d2d_brush *brush, ID3D10Device *device,
{
D3D10_SAMPLER_DESC sampler_desc;
- if (brush->u.bitmap.interpolation_mode == D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR)
+ if (brush->u.bitmap.interpolation_mode == D2D1_INTERPOLATION_MODE_NEAREST_NEIGHBOR)
sampler_desc.Filter = D3D10_FILTER_MIN_MAG_MIP_POINT;
else
sampler_desc.Filter = D3D10_FILTER_MIN_MAG_MIP_LINEAR;
diff --git a/dlls/d2d1/d2d1_private.h b/dlls/d2d1/d2d1_private.h
index 3fed59fa72..c8515eaa12 100644
--- a/dlls/d2d1/d2d1_private.h
+++ b/dlls/d2d1/d2d1_private.h
@@ -280,7 +280,7 @@ struct d2d_brush
struct d2d_bitmap *bitmap;
D2D1_EXTEND_MODE extend_mode_x;
D2D1_EXTEND_MODE extend_mode_y;
- D2D1_BITMAP_INTERPOLATION_MODE interpolation_mode;
+ D2D1_INTERPOLATION_MODE interpolation_mode;
ID3D10SamplerState *sampler_state;
} bitmap;
} u;
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c
index 6419df23d8..4136b69885 100644
--- a/dlls/d2d1/tests/d2d1.c
+++ b/dlls/d2d1/tests/d2d1.c
@@ -1656,6 +1656,7 @@ static void test_bitmap_brush(void)
D2D1_RECT_F src_rect, dst_rect;
D2D1_EXTEND_MODE extend_mode;
IDXGISwapChain *swapchain;
+ ID2D1BitmapBrush1 *brush1;
ID2D1BitmapBrush *brush;
ID2D1RenderTarget *rt;
ID3D10Device1 *device;
@@ -1877,6 +1878,49 @@ static void test_bitmap_brush(void)
match = compare_surface(surface, "cf7b90ba7b139fdfbe9347e1907d635cfb4ed197");
ok(match, "Surface does not match.\n");
+ if (SUCCEEDED(ID2D1BitmapBrush_QueryInterface(brush, &IID_ID2D1BitmapBrush1, (void **)&brush1)))
+ {
+ D2D1_INTERPOLATION_MODE interpolation_mode1;
+
+ interpolation_mode = ID2D1BitmapBrush1_GetInterpolationMode(brush1);
+ ok(interpolation_mode == D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR,
+ "Unexpected interpolation mode %#x.\n", interpolation_mode);
+
+ interpolation_mode1 = ID2D1BitmapBrush1_GetInterpolationMode1(brush1);
+ ok(interpolation_mode1 == D2D1_INTERPOLATION_MODE_NEAREST_NEIGHBOR,
+ "Unexpected interpolation mode %#x.\n", interpolation_mode1);
+
+ ID2D1BitmapBrush1_SetInterpolationMode1(brush1, D2D1_INTERPOLATION_MODE_CUBIC);
+ interpolation_mode = ID2D1BitmapBrush1_GetInterpolationMode(brush1);
+ ok(interpolation_mode == D2D1_BITMAP_INTERPOLATION_MODE_LINEAR,
+ "Unexpected interpolation mode %#x.\n", interpolation_mode);
+
+ interpolation_mode1 = ID2D1BitmapBrush1_GetInterpolationMode1(brush1);
+ ok(interpolation_mode1 == D2D1_INTERPOLATION_MODE_CUBIC,
+ "Unexpected interpolation mode %#x.\n", interpolation_mode1);
+
+ ID2D1BitmapBrush1_SetInterpolationMode1(brush1, 100);
+ interpolation_mode1 = ID2D1BitmapBrush1_GetInterpolationMode1(brush1);
+ ok(interpolation_mode1 == D2D1_INTERPOLATION_MODE_CUBIC,
+ "Unexpected interpolation mode %#x.\n", interpolation_mode1);
+
+ ID2D1BitmapBrush1_SetInterpolationMode(brush1, 100);
+ interpolation_mode1 = ID2D1BitmapBrush1_GetInterpolationMode1(brush1);
+ ok(interpolation_mode1 == D2D1_INTERPOLATION_MODE_CUBIC,
+ "Unexpected interpolation mode %#x.\n", interpolation_mode1);
+
+ ID2D1BitmapBrush1_SetInterpolationMode(brush1, D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR);
+ interpolation_mode = ID2D1BitmapBrush1_GetInterpolationMode(brush1);
+ ok(interpolation_mode == D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR,
+ "Unexpected interpolation mode %#x.\n", interpolation_mode);
+
+ interpolation_mode1 = ID2D1BitmapBrush1_GetInterpolationMode1(brush1);
+ ok(interpolation_mode1 == D2D1_INTERPOLATION_MODE_NEAREST_NEIGHBOR,
+ "Unexpected interpolation mode %#x.\n", interpolation_mode1);
+
+ ID2D1BitmapBrush1_Release(brush1);
+ }
+
ID2D1BitmapBrush_Release(brush);
refcount = ID2D1Bitmap_Release(bitmap);
ok(!refcount, "Bitmap has %u references left.\n", refcount);
--
2.18.0
More information about the wine-devel
mailing list