Henri Verbeet : d2d1: Implement d2d_d3d_render_target_CreateGradientStopCollection().
Alexandre Julliard
julliard at winehq.org
Tue Jun 17 14:40:50 CDT 2014
Module: wine
Branch: master
Commit: 22a20e4016794784a65f9878d3bad064b5ac60cd
URL: http://source.winehq.org/git/wine.git/?a=commit;h=22a20e4016794784a65f9878d3bad064b5ac60cd
Author: Henri Verbeet <hverbeet at codeweavers.com>
Date: Mon Jun 16 13:13:21 2014 +0200
d2d1: Implement d2d_d3d_render_target_CreateGradientStopCollection().
---
dlls/d2d1/brush.c | 103 +++++++++++++++++++++++++++++++++++++++++++++
dlls/d2d1/d2d1_private.h | 10 +++++
dlls/d2d1/render_target.c | 14 +++++-
3 files changed, 125 insertions(+), 2 deletions(-)
diff --git a/dlls/d2d1/brush.c b/dlls/d2d1/brush.c
index 21fac12..a7e6118 100644
--- a/dlls/d2d1/brush.c
+++ b/dlls/d2d1/brush.c
@@ -23,6 +23,109 @@
WINE_DEFAULT_DEBUG_CHANNEL(d2d);
+static inline struct d2d_gradient *impl_from_ID2D1GradientStopCollection(ID2D1GradientStopCollection *iface)
+{
+ return CONTAINING_RECORD(iface, struct d2d_gradient, ID2D1GradientStopCollection_iface);
+}
+
+static HRESULT STDMETHODCALLTYPE d2d_gradient_QueryInterface(ID2D1GradientStopCollection *iface,
+ REFIID iid, void **out)
+{
+ TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
+
+ if (IsEqualGUID(iid, &IID_ID2D1GradientStopCollection)
+ || IsEqualGUID(iid, &IID_ID2D1Resource)
+ || IsEqualGUID(iid, &IID_IUnknown))
+ {
+ ID2D1GradientStopCollection_AddRef(iface);
+ *out = iface;
+ return S_OK;
+ }
+
+ WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
+
+ *out = NULL;
+ return E_NOINTERFACE;
+}
+
+static ULONG STDMETHODCALLTYPE d2d_gradient_AddRef(ID2D1GradientStopCollection *iface)
+{
+ struct d2d_gradient *gradient = impl_from_ID2D1GradientStopCollection(iface);
+ ULONG refcount = InterlockedIncrement(&gradient->refcount);
+
+ TRACE("%p increasing refcount to %u.\n", iface, refcount);
+
+ return refcount;
+}
+
+static ULONG STDMETHODCALLTYPE d2d_gradient_Release(ID2D1GradientStopCollection *iface)
+{
+ struct d2d_gradient *gradient = impl_from_ID2D1GradientStopCollection(iface);
+ ULONG refcount = InterlockedDecrement(&gradient->refcount);
+
+ TRACE("%p decreasing refcount to %u.\n", iface, refcount);
+
+ if (!refcount)
+ HeapFree(GetProcessHeap(), 0, gradient);
+
+ return refcount;
+}
+
+static void STDMETHODCALLTYPE d2d_gradient_GetFactory(ID2D1GradientStopCollection *iface, ID2D1Factory **factory)
+{
+ FIXME("iface %p, factory %p stub!\n", iface, factory);
+
+ *factory = NULL;
+}
+
+static UINT32 STDMETHODCALLTYPE d2d_gradient_GetGradientStopCount(ID2D1GradientStopCollection *iface)
+{
+ FIXME("iface %p stub!\n", iface);
+
+ return 0;
+}
+
+static void STDMETHODCALLTYPE d2d_gradient_GetGradientStops(ID2D1GradientStopCollection *iface,
+ D2D1_GRADIENT_STOP *stops, UINT32 stop_count)
+{
+ FIXME("iface %p, stops %p, stop_count %u stub!\n", iface, stops, stop_count);
+}
+
+static D2D1_GAMMA STDMETHODCALLTYPE d2d_gradient_GetColorInterpolationGamma(ID2D1GradientStopCollection *iface)
+{
+ FIXME("iface %p stub!\n", iface);
+
+ return D2D1_GAMMA_1_0;
+}
+
+static D2D1_EXTEND_MODE STDMETHODCALLTYPE d2d_gradient_GetExtendMode(ID2D1GradientStopCollection *iface)
+{
+ FIXME("iface %p stub!\n", iface);
+
+ return D2D1_EXTEND_MODE_CLAMP;
+}
+
+static const struct ID2D1GradientStopCollectionVtbl d2d_gradient_vtbl =
+{
+ d2d_gradient_QueryInterface,
+ d2d_gradient_AddRef,
+ d2d_gradient_Release,
+ d2d_gradient_GetFactory,
+ d2d_gradient_GetGradientStopCount,
+ d2d_gradient_GetGradientStops,
+ d2d_gradient_GetColorInterpolationGamma,
+ d2d_gradient_GetExtendMode,
+};
+
+void d2d_gradient_init(struct d2d_gradient *gradient, ID2D1RenderTarget *render_target,
+ const D2D1_GRADIENT_STOP *stops, UINT32 stop_count, D2D1_GAMMA gamma, D2D1_EXTEND_MODE extend_mode)
+{
+ FIXME("Ignoring gradient properties.\n");
+
+ gradient->ID2D1GradientStopCollection_iface.lpVtbl = &d2d_gradient_vtbl;
+ gradient->refcount = 1;
+}
+
static inline struct d2d_brush *impl_from_ID2D1SolidColorBrush(ID2D1SolidColorBrush *iface)
{
return CONTAINING_RECORD(iface, struct d2d_brush, ID2D1Brush_iface);
diff --git a/dlls/d2d1/d2d1_private.h b/dlls/d2d1/d2d1_private.h
index 9e91728..4d32856 100644
--- a/dlls/d2d1/d2d1_private.h
+++ b/dlls/d2d1/d2d1_private.h
@@ -33,6 +33,16 @@ struct d2d_d3d_render_target
void d2d_d3d_render_target_init(struct d2d_d3d_render_target *render_target, ID2D1Factory *factory,
IDXGISurface *surface, const D2D1_RENDER_TARGET_PROPERTIES *desc) DECLSPEC_HIDDEN;
+struct d2d_gradient
+{
+ ID2D1GradientStopCollection ID2D1GradientStopCollection_iface;
+ LONG refcount;
+};
+
+void d2d_gradient_init(struct d2d_gradient *gradient, ID2D1RenderTarget *render_target,
+ const D2D1_GRADIENT_STOP *stops, UINT32 stop_count, D2D1_GAMMA gamma,
+ D2D1_EXTEND_MODE extend_mode) DECLSPEC_HIDDEN;
+
struct d2d_brush
{
ID2D1Brush ID2D1Brush_iface;
diff --git a/dlls/d2d1/render_target.c b/dlls/d2d1/render_target.c
index e8c56a0..abf2fd8 100644
--- a/dlls/d2d1/render_target.c
+++ b/dlls/d2d1/render_target.c
@@ -136,10 +136,20 @@ static HRESULT STDMETHODCALLTYPE d2d_d3d_render_target_CreateGradientStopCollect
const D2D1_GRADIENT_STOP *stops, UINT32 stop_count, D2D1_GAMMA gamma, D2D1_EXTEND_MODE extend_mode,
ID2D1GradientStopCollection **gradient)
{
- FIXME("iface %p, stops %p, stop_count %u, gamma %#x, extend_mode %#x, gradient %p stub!\n",
+ struct d2d_gradient *object;
+
+ TRACE("iface %p, stops %p, stop_count %u, gamma %#x, extend_mode %#x, gradient %p.\n",
iface, stops, stop_count, gamma, extend_mode, gradient);
- return E_NOTIMPL;
+ if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object))))
+ return E_OUTOFMEMORY;
+
+ d2d_gradient_init(object, iface, stops, stop_count, gamma, extend_mode);
+
+ TRACE("Created gradient %p.\n", object);
+ *gradient = &object->ID2D1GradientStopCollection_iface;
+
+ return S_OK;
}
static HRESULT STDMETHODCALLTYPE d2d_d3d_render_target_CreateLinearGradientBrush(ID2D1RenderTarget *iface,
More information about the wine-cvs
mailing list