d3d8: Get rid of the format switching code in d3d8_device_CopyRects().
[wine.git] / dlls / d2d1 / brush.c
blobed92d6060a3c418eb7cde26d98fb4e7db47f81ed
1 /*
2 * Copyright 2014 Henri Verbeet for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 #include "config.h"
20 #include "wine/port.h"
22 #include "d2d1_private.h"
24 WINE_DEFAULT_DEBUG_CHANNEL(d2d);
26 static inline struct d2d_gradient *impl_from_ID2D1GradientStopCollection(ID2D1GradientStopCollection *iface)
28 return CONTAINING_RECORD(iface, struct d2d_gradient, ID2D1GradientStopCollection_iface);
31 static HRESULT STDMETHODCALLTYPE d2d_gradient_QueryInterface(ID2D1GradientStopCollection *iface,
32 REFIID iid, void **out)
34 TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
36 if (IsEqualGUID(iid, &IID_ID2D1GradientStopCollection)
37 || IsEqualGUID(iid, &IID_ID2D1Resource)
38 || IsEqualGUID(iid, &IID_IUnknown))
40 ID2D1GradientStopCollection_AddRef(iface);
41 *out = iface;
42 return S_OK;
45 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
47 *out = NULL;
48 return E_NOINTERFACE;
51 static ULONG STDMETHODCALLTYPE d2d_gradient_AddRef(ID2D1GradientStopCollection *iface)
53 struct d2d_gradient *gradient = impl_from_ID2D1GradientStopCollection(iface);
54 ULONG refcount = InterlockedIncrement(&gradient->refcount);
56 TRACE("%p increasing refcount to %u.\n", iface, refcount);
58 return refcount;
61 static ULONG STDMETHODCALLTYPE d2d_gradient_Release(ID2D1GradientStopCollection *iface)
63 struct d2d_gradient *gradient = impl_from_ID2D1GradientStopCollection(iface);
64 ULONG refcount = InterlockedDecrement(&gradient->refcount);
66 TRACE("%p decreasing refcount to %u.\n", iface, refcount);
68 if (!refcount)
69 HeapFree(GetProcessHeap(), 0, gradient);
71 return refcount;
74 static void STDMETHODCALLTYPE d2d_gradient_GetFactory(ID2D1GradientStopCollection *iface, ID2D1Factory **factory)
76 FIXME("iface %p, factory %p stub!\n", iface, factory);
78 *factory = NULL;
81 static UINT32 STDMETHODCALLTYPE d2d_gradient_GetGradientStopCount(ID2D1GradientStopCollection *iface)
83 FIXME("iface %p stub!\n", iface);
85 return 0;
88 static void STDMETHODCALLTYPE d2d_gradient_GetGradientStops(ID2D1GradientStopCollection *iface,
89 D2D1_GRADIENT_STOP *stops, UINT32 stop_count)
91 FIXME("iface %p, stops %p, stop_count %u stub!\n", iface, stops, stop_count);
94 static D2D1_GAMMA STDMETHODCALLTYPE d2d_gradient_GetColorInterpolationGamma(ID2D1GradientStopCollection *iface)
96 FIXME("iface %p stub!\n", iface);
98 return D2D1_GAMMA_1_0;
101 static D2D1_EXTEND_MODE STDMETHODCALLTYPE d2d_gradient_GetExtendMode(ID2D1GradientStopCollection *iface)
103 FIXME("iface %p stub!\n", iface);
105 return D2D1_EXTEND_MODE_CLAMP;
108 static const struct ID2D1GradientStopCollectionVtbl d2d_gradient_vtbl =
110 d2d_gradient_QueryInterface,
111 d2d_gradient_AddRef,
112 d2d_gradient_Release,
113 d2d_gradient_GetFactory,
114 d2d_gradient_GetGradientStopCount,
115 d2d_gradient_GetGradientStops,
116 d2d_gradient_GetColorInterpolationGamma,
117 d2d_gradient_GetExtendMode,
120 void d2d_gradient_init(struct d2d_gradient *gradient, ID2D1RenderTarget *render_target,
121 const D2D1_GRADIENT_STOP *stops, UINT32 stop_count, D2D1_GAMMA gamma, D2D1_EXTEND_MODE extend_mode)
123 FIXME("Ignoring gradient properties.\n");
125 gradient->ID2D1GradientStopCollection_iface.lpVtbl = &d2d_gradient_vtbl;
126 gradient->refcount = 1;
129 static void d2d_brush_init(struct d2d_brush *brush, ID2D1RenderTarget *render_target,
130 const D2D1_BRUSH_PROPERTIES *desc, const struct ID2D1BrushVtbl *vtbl)
132 brush->ID2D1Brush_iface.lpVtbl = vtbl;
133 brush->refcount = 1;
136 static inline struct d2d_brush *impl_from_ID2D1SolidColorBrush(ID2D1SolidColorBrush *iface)
138 return CONTAINING_RECORD(iface, struct d2d_brush, ID2D1Brush_iface);
141 static HRESULT STDMETHODCALLTYPE d2d_solid_color_brush_QueryInterface(ID2D1SolidColorBrush *iface,
142 REFIID iid, void **out)
144 TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
146 if (IsEqualGUID(iid, &IID_ID2D1SolidColorBrush)
147 || IsEqualGUID(iid, &IID_ID2D1Brush)
148 || IsEqualGUID(iid, &IID_ID2D1Resource)
149 || IsEqualGUID(iid, &IID_IUnknown))
151 ID2D1SolidColorBrush_AddRef(iface);
152 *out = iface;
153 return S_OK;
156 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
158 *out = NULL;
159 return E_NOINTERFACE;
162 static ULONG STDMETHODCALLTYPE d2d_solid_color_brush_AddRef(ID2D1SolidColorBrush *iface)
164 struct d2d_brush *brush = impl_from_ID2D1SolidColorBrush(iface);
165 ULONG refcount = InterlockedIncrement(&brush->refcount);
167 TRACE("%p increasing refcount to %u.\n", iface, refcount);
169 return refcount;
172 static ULONG STDMETHODCALLTYPE d2d_solid_color_brush_Release(ID2D1SolidColorBrush *iface)
174 struct d2d_brush *brush = impl_from_ID2D1SolidColorBrush(iface);
175 ULONG refcount = InterlockedDecrement(&brush->refcount);
177 TRACE("%p decreasing refcount to %u.\n", iface, refcount);
179 if (!refcount)
180 HeapFree(GetProcessHeap(), 0, brush);
182 return refcount;
185 static void STDMETHODCALLTYPE d2d_solid_color_brush_GetFactory(ID2D1SolidColorBrush *iface, ID2D1Factory **factory)
187 FIXME("iface %p, factory %p stub!\n", iface, factory);
189 *factory = NULL;
192 static void STDMETHODCALLTYPE d2d_solid_color_brush_SetOpacity(ID2D1SolidColorBrush *iface, float opacity)
194 FIXME("iface %p, opacity %.8e stub!\n", iface, opacity);
197 static void STDMETHODCALLTYPE d2d_solid_color_brush_SetTransform(ID2D1SolidColorBrush *iface,
198 const D2D1_MATRIX_3X2_F *transform)
200 FIXME("iface %p, transform %p stub!\n", iface, transform);
203 static float STDMETHODCALLTYPE d2d_solid_color_brush_GetOpacity(ID2D1SolidColorBrush *iface)
205 FIXME("iface %p stub!\n", iface);
207 return 0.0f;
210 static void STDMETHODCALLTYPE d2d_solid_color_brush_GetTransform(ID2D1SolidColorBrush *iface,
211 D2D1_MATRIX_3X2_F *transform)
213 static const D2D1_MATRIX_3X2_F identity =
215 1.0f, 0.0f,
216 0.0f, 1.0f,
217 0.0f, 0.0f,
220 FIXME("iface %p, transform %p stub!\n", iface, transform);
222 *transform = identity;
225 static void STDMETHODCALLTYPE d2d_solid_color_brush_SetColor(ID2D1SolidColorBrush *iface, const D2D1_COLOR_F *color)
227 FIXME("iface %p, color %p stub!\n", iface, color);
230 static D2D1_COLOR_F * STDMETHODCALLTYPE d2d_solid_color_brush_GetColor(ID2D1SolidColorBrush *iface, D2D1_COLOR_F *color)
232 static const D2D1_COLOR_F black = {0.0f, 0.0f, 0.0f, 1.0f};
234 FIXME("iface %p, color %p stub!\n", iface, color);
236 *color = black;
237 return color;
240 static const struct ID2D1SolidColorBrushVtbl d2d_solid_color_brush_vtbl =
242 d2d_solid_color_brush_QueryInterface,
243 d2d_solid_color_brush_AddRef,
244 d2d_solid_color_brush_Release,
245 d2d_solid_color_brush_GetFactory,
246 d2d_solid_color_brush_SetOpacity,
247 d2d_solid_color_brush_SetTransform,
248 d2d_solid_color_brush_GetOpacity,
249 d2d_solid_color_brush_GetTransform,
250 d2d_solid_color_brush_SetColor,
251 d2d_solid_color_brush_GetColor,
254 void d2d_solid_color_brush_init(struct d2d_brush *brush, ID2D1RenderTarget *render_target,
255 const D2D1_COLOR_F *color, const D2D1_BRUSH_PROPERTIES *desc)
257 FIXME("Ignoring brush properties.\n");
259 d2d_brush_init(brush, render_target, desc, (ID2D1BrushVtbl *)&d2d_solid_color_brush_vtbl);
262 static inline struct d2d_brush *impl_from_ID2D1LinearGradientBrush(ID2D1LinearGradientBrush *iface)
264 return CONTAINING_RECORD(iface, struct d2d_brush, ID2D1Brush_iface);
267 static HRESULT STDMETHODCALLTYPE d2d_linear_gradient_brush_QueryInterface(ID2D1LinearGradientBrush *iface,
268 REFIID iid, void **out)
270 TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
272 if (IsEqualGUID(iid, &IID_ID2D1LinearGradientBrush)
273 || IsEqualGUID(iid, &IID_ID2D1Brush)
274 || IsEqualGUID(iid, &IID_ID2D1Resource)
275 || IsEqualGUID(iid, &IID_IUnknown))
277 ID2D1LinearGradientBrush_AddRef(iface);
278 *out = iface;
279 return S_OK;
282 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
284 *out = NULL;
285 return E_NOINTERFACE;
288 static ULONG STDMETHODCALLTYPE d2d_linear_gradient_brush_AddRef(ID2D1LinearGradientBrush *iface)
290 struct d2d_brush *brush = impl_from_ID2D1LinearGradientBrush(iface);
291 ULONG refcount = InterlockedIncrement(&brush->refcount);
293 TRACE("%p increasing refcount to %u.\n", iface, refcount);
295 return refcount;
298 static ULONG STDMETHODCALLTYPE d2d_linear_gradient_brush_Release(ID2D1LinearGradientBrush *iface)
300 struct d2d_brush *brush = impl_from_ID2D1LinearGradientBrush(iface);
301 ULONG refcount = InterlockedDecrement(&brush->refcount);
303 TRACE("%p decreasing refcount to %u.\n", iface, refcount);
305 if (!refcount)
306 HeapFree(GetProcessHeap(), 0, brush);
308 return refcount;
311 static void STDMETHODCALLTYPE d2d_linear_gradient_brush_GetFactory(ID2D1LinearGradientBrush *iface,
312 ID2D1Factory **factory)
314 FIXME("iface %p, factory %p stub!\n", iface, factory);
316 *factory = NULL;
319 static void STDMETHODCALLTYPE d2d_linear_gradient_brush_SetOpacity(ID2D1LinearGradientBrush *iface, float opacity)
321 FIXME("iface %p, opacity %.8e stub!\n", iface, opacity);
324 static void STDMETHODCALLTYPE d2d_linear_gradient_brush_SetTransform(ID2D1LinearGradientBrush *iface,
325 const D2D1_MATRIX_3X2_F *transform)
327 FIXME("iface %p, transform %p stub!\n", iface, transform);
330 static float STDMETHODCALLTYPE d2d_linear_gradient_brush_GetOpacity(ID2D1LinearGradientBrush *iface)
332 FIXME("iface %p stub!\n", iface);
334 return 0.0f;
337 static void STDMETHODCALLTYPE d2d_linear_gradient_brush_GetTransform(ID2D1LinearGradientBrush *iface,
338 D2D1_MATRIX_3X2_F *transform)
340 static const D2D1_MATRIX_3X2_F identity =
342 1.0f, 0.0f,
343 0.0f, 1.0f,
344 0.0f, 0.0f,
347 FIXME("iface %p, transform %p stub!\n", iface, transform);
349 *transform = identity;
352 static void STDMETHODCALLTYPE d2d_linear_gradient_brush_SetStartPoint(ID2D1LinearGradientBrush *iface,
353 D2D1_POINT_2F start_point)
355 FIXME("iface %p, start_point {%.8e, %.8e} stub!\n", iface, start_point.x, start_point.y);
358 static void STDMETHODCALLTYPE d2d_linear_gradient_brush_SetEndPoint(ID2D1LinearGradientBrush *iface,
359 D2D1_POINT_2F end_point)
361 FIXME("iface %p, end_point {%.8e, %.8e} stub!\n", iface, end_point.x, end_point.y);
364 static D2D1_POINT_2F * STDMETHODCALLTYPE d2d_linear_gradient_brush_GetStartPoint(ID2D1LinearGradientBrush *iface,
365 D2D1_POINT_2F *point)
367 FIXME("iface %p, point %p stub!\n", iface, point);
369 point->x = 0.0f;
370 point->y = 0.0f;
371 return point;
374 static D2D1_POINT_2F * STDMETHODCALLTYPE d2d_linear_gradient_brush_GetEndPoint(ID2D1LinearGradientBrush *iface,
375 D2D1_POINT_2F *point)
377 FIXME("iface %p, point %p stub!\n", iface, point);
379 point->x = 0.0f;
380 point->y = 0.0f;
381 return point;
384 static void STDMETHODCALLTYPE d2d_linear_gradient_brush_GetGradientStopCollection(ID2D1LinearGradientBrush *iface,
385 ID2D1GradientStopCollection **gradient)
387 FIXME("iface %p, gradient %p stub!\n", iface, gradient);
389 *gradient = NULL;
392 static const struct ID2D1LinearGradientBrushVtbl d2d_linear_gradient_brush_vtbl =
394 d2d_linear_gradient_brush_QueryInterface,
395 d2d_linear_gradient_brush_AddRef,
396 d2d_linear_gradient_brush_Release,
397 d2d_linear_gradient_brush_GetFactory,
398 d2d_linear_gradient_brush_SetOpacity,
399 d2d_linear_gradient_brush_SetTransform,
400 d2d_linear_gradient_brush_GetOpacity,
401 d2d_linear_gradient_brush_GetTransform,
402 d2d_linear_gradient_brush_SetStartPoint,
403 d2d_linear_gradient_brush_SetEndPoint,
404 d2d_linear_gradient_brush_GetStartPoint,
405 d2d_linear_gradient_brush_GetEndPoint,
406 d2d_linear_gradient_brush_GetGradientStopCollection,
409 void d2d_linear_gradient_brush_init(struct d2d_brush *brush, ID2D1RenderTarget *render_target,
410 const D2D1_LINEAR_GRADIENT_BRUSH_PROPERTIES *gradient_brush_desc, const D2D1_BRUSH_PROPERTIES *brush_desc,
411 ID2D1GradientStopCollection *gradient)
413 FIXME("Ignoring brush properties.\n");
415 d2d_brush_init(brush, render_target, brush_desc, (ID2D1BrushVtbl *)&d2d_solid_color_brush_vtbl);