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