d2d1: Implement d2d_linear_gradient_brush_GetTransform().
[wine.git] / dlls / d2d1 / brush.c
blobc1e2289c5b2ec7e2e21c3b380bfcb84789ff1656
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)
70 HeapFree(GetProcessHeap(), 0, gradient->stops);
71 HeapFree(GetProcessHeap(), 0, gradient);
74 return refcount;
77 static void STDMETHODCALLTYPE d2d_gradient_GetFactory(ID2D1GradientStopCollection *iface, ID2D1Factory **factory)
79 FIXME("iface %p, factory %p stub!\n", iface, factory);
81 *factory = NULL;
84 static UINT32 STDMETHODCALLTYPE d2d_gradient_GetGradientStopCount(ID2D1GradientStopCollection *iface)
86 struct d2d_gradient *gradient = impl_from_ID2D1GradientStopCollection(iface);
88 TRACE("iface %p.\n", iface);
90 return gradient->stop_count;
93 static void STDMETHODCALLTYPE d2d_gradient_GetGradientStops(ID2D1GradientStopCollection *iface,
94 D2D1_GRADIENT_STOP *stops, UINT32 stop_count)
96 struct d2d_gradient *gradient = impl_from_ID2D1GradientStopCollection(iface);
98 TRACE("iface %p, stops %p, stop_count %u.\n", iface, stops, stop_count);
100 memcpy(stops, gradient->stops, min(gradient->stop_count, stop_count) * sizeof(*stops));
101 if (stop_count > gradient->stop_count)
102 memset(stops, 0, (stop_count - gradient->stop_count) * sizeof(*stops));
105 static D2D1_GAMMA STDMETHODCALLTYPE d2d_gradient_GetColorInterpolationGamma(ID2D1GradientStopCollection *iface)
107 FIXME("iface %p stub!\n", iface);
109 return D2D1_GAMMA_1_0;
112 static D2D1_EXTEND_MODE STDMETHODCALLTYPE d2d_gradient_GetExtendMode(ID2D1GradientStopCollection *iface)
114 FIXME("iface %p stub!\n", iface);
116 return D2D1_EXTEND_MODE_CLAMP;
119 static const struct ID2D1GradientStopCollectionVtbl d2d_gradient_vtbl =
121 d2d_gradient_QueryInterface,
122 d2d_gradient_AddRef,
123 d2d_gradient_Release,
124 d2d_gradient_GetFactory,
125 d2d_gradient_GetGradientStopCount,
126 d2d_gradient_GetGradientStops,
127 d2d_gradient_GetColorInterpolationGamma,
128 d2d_gradient_GetExtendMode,
131 HRESULT d2d_gradient_init(struct d2d_gradient *gradient, ID2D1RenderTarget *render_target,
132 const D2D1_GRADIENT_STOP *stops, UINT32 stop_count, D2D1_GAMMA gamma, D2D1_EXTEND_MODE extend_mode)
134 FIXME("Ignoring gradient properties.\n");
136 gradient->ID2D1GradientStopCollection_iface.lpVtbl = &d2d_gradient_vtbl;
137 gradient->refcount = 1;
139 gradient->stop_count = stop_count;
140 if (!(gradient->stops = HeapAlloc(GetProcessHeap(), 0, stop_count * sizeof(*stops))))
141 return E_OUTOFMEMORY;
142 memcpy(gradient->stops, stops, stop_count * sizeof(*stops));
144 return S_OK;
147 static void d2d_brush_init(struct d2d_brush *brush, ID2D1RenderTarget *render_target,
148 enum d2d_brush_type type, const D2D1_BRUSH_PROPERTIES *desc, const struct ID2D1BrushVtbl *vtbl)
150 static const D2D1_MATRIX_3X2_F identity =
152 1.0f, 0.0f,
153 0.0f, 1.0f,
154 0.0f, 0.0f,
157 brush->ID2D1Brush_iface.lpVtbl = vtbl;
158 brush->refcount = 1;
159 brush->opacity = desc ? desc->opacity : 1.0f;
160 brush->transform = desc ? desc->transform : identity;
161 brush->type = type;
164 static inline struct d2d_brush *impl_from_ID2D1SolidColorBrush(ID2D1SolidColorBrush *iface)
166 return CONTAINING_RECORD(iface, struct d2d_brush, ID2D1Brush_iface);
169 static HRESULT STDMETHODCALLTYPE d2d_solid_color_brush_QueryInterface(ID2D1SolidColorBrush *iface,
170 REFIID iid, void **out)
172 TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
174 if (IsEqualGUID(iid, &IID_ID2D1SolidColorBrush)
175 || IsEqualGUID(iid, &IID_ID2D1Brush)
176 || IsEqualGUID(iid, &IID_ID2D1Resource)
177 || IsEqualGUID(iid, &IID_IUnknown))
179 ID2D1SolidColorBrush_AddRef(iface);
180 *out = iface;
181 return S_OK;
184 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
186 *out = NULL;
187 return E_NOINTERFACE;
190 static ULONG STDMETHODCALLTYPE d2d_solid_color_brush_AddRef(ID2D1SolidColorBrush *iface)
192 struct d2d_brush *brush = impl_from_ID2D1SolidColorBrush(iface);
193 ULONG refcount = InterlockedIncrement(&brush->refcount);
195 TRACE("%p increasing refcount to %u.\n", iface, refcount);
197 return refcount;
200 static ULONG STDMETHODCALLTYPE d2d_solid_color_brush_Release(ID2D1SolidColorBrush *iface)
202 struct d2d_brush *brush = impl_from_ID2D1SolidColorBrush(iface);
203 ULONG refcount = InterlockedDecrement(&brush->refcount);
205 TRACE("%p decreasing refcount to %u.\n", iface, refcount);
207 if (!refcount)
208 HeapFree(GetProcessHeap(), 0, brush);
210 return refcount;
213 static void STDMETHODCALLTYPE d2d_solid_color_brush_GetFactory(ID2D1SolidColorBrush *iface, ID2D1Factory **factory)
215 FIXME("iface %p, factory %p stub!\n", iface, factory);
217 *factory = NULL;
220 static void STDMETHODCALLTYPE d2d_solid_color_brush_SetOpacity(ID2D1SolidColorBrush *iface, float opacity)
222 struct d2d_brush *brush = impl_from_ID2D1SolidColorBrush(iface);
224 TRACE("iface %p, opacity %.8e.\n", iface, opacity);
226 brush->opacity = opacity;
229 static void STDMETHODCALLTYPE d2d_solid_color_brush_SetTransform(ID2D1SolidColorBrush *iface,
230 const D2D1_MATRIX_3X2_F *transform)
232 FIXME("iface %p, transform %p stub!\n", iface, transform);
235 static float STDMETHODCALLTYPE d2d_solid_color_brush_GetOpacity(ID2D1SolidColorBrush *iface)
237 struct d2d_brush *brush = impl_from_ID2D1SolidColorBrush(iface);
239 TRACE("iface %p.\n", iface);
241 return brush->opacity;
244 static void STDMETHODCALLTYPE d2d_solid_color_brush_GetTransform(ID2D1SolidColorBrush *iface,
245 D2D1_MATRIX_3X2_F *transform)
247 static const D2D1_MATRIX_3X2_F identity =
249 1.0f, 0.0f,
250 0.0f, 1.0f,
251 0.0f, 0.0f,
254 FIXME("iface %p, transform %p stub!\n", iface, transform);
256 *transform = identity;
259 static void STDMETHODCALLTYPE d2d_solid_color_brush_SetColor(ID2D1SolidColorBrush *iface, const D2D1_COLOR_F *color)
261 struct d2d_brush *brush = impl_from_ID2D1SolidColorBrush(iface);
263 TRACE("iface %p, color %p.\n", iface, color);
265 brush->u.solid.color = *color;
268 static D2D1_COLOR_F * STDMETHODCALLTYPE d2d_solid_color_brush_GetColor(ID2D1SolidColorBrush *iface, D2D1_COLOR_F *color)
270 struct d2d_brush *brush = impl_from_ID2D1SolidColorBrush(iface);
272 TRACE("iface %p, color %p.\n", iface, color);
274 *color = brush->u.solid.color;
275 return color;
278 static const struct ID2D1SolidColorBrushVtbl d2d_solid_color_brush_vtbl =
280 d2d_solid_color_brush_QueryInterface,
281 d2d_solid_color_brush_AddRef,
282 d2d_solid_color_brush_Release,
283 d2d_solid_color_brush_GetFactory,
284 d2d_solid_color_brush_SetOpacity,
285 d2d_solid_color_brush_SetTransform,
286 d2d_solid_color_brush_GetOpacity,
287 d2d_solid_color_brush_GetTransform,
288 d2d_solid_color_brush_SetColor,
289 d2d_solid_color_brush_GetColor,
292 void d2d_solid_color_brush_init(struct d2d_brush *brush, ID2D1RenderTarget *render_target,
293 const D2D1_COLOR_F *color, const D2D1_BRUSH_PROPERTIES *desc)
295 FIXME("Ignoring brush properties.\n");
297 d2d_brush_init(brush, render_target, D2D_BRUSH_TYPE_SOLID, desc,
298 (ID2D1BrushVtbl *)&d2d_solid_color_brush_vtbl);
299 brush->u.solid.color = *color;
302 static inline struct d2d_brush *impl_from_ID2D1LinearGradientBrush(ID2D1LinearGradientBrush *iface)
304 return CONTAINING_RECORD(iface, struct d2d_brush, ID2D1Brush_iface);
307 static HRESULT STDMETHODCALLTYPE d2d_linear_gradient_brush_QueryInterface(ID2D1LinearGradientBrush *iface,
308 REFIID iid, void **out)
310 TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
312 if (IsEqualGUID(iid, &IID_ID2D1LinearGradientBrush)
313 || IsEqualGUID(iid, &IID_ID2D1Brush)
314 || IsEqualGUID(iid, &IID_ID2D1Resource)
315 || IsEqualGUID(iid, &IID_IUnknown))
317 ID2D1LinearGradientBrush_AddRef(iface);
318 *out = iface;
319 return S_OK;
322 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
324 *out = NULL;
325 return E_NOINTERFACE;
328 static ULONG STDMETHODCALLTYPE d2d_linear_gradient_brush_AddRef(ID2D1LinearGradientBrush *iface)
330 struct d2d_brush *brush = impl_from_ID2D1LinearGradientBrush(iface);
331 ULONG refcount = InterlockedIncrement(&brush->refcount);
333 TRACE("%p increasing refcount to %u.\n", iface, refcount);
335 return refcount;
338 static ULONG STDMETHODCALLTYPE d2d_linear_gradient_brush_Release(ID2D1LinearGradientBrush *iface)
340 struct d2d_brush *brush = impl_from_ID2D1LinearGradientBrush(iface);
341 ULONG refcount = InterlockedDecrement(&brush->refcount);
343 TRACE("%p decreasing refcount to %u.\n", iface, refcount);
345 if (!refcount)
346 HeapFree(GetProcessHeap(), 0, brush);
348 return refcount;
351 static void STDMETHODCALLTYPE d2d_linear_gradient_brush_GetFactory(ID2D1LinearGradientBrush *iface,
352 ID2D1Factory **factory)
354 FIXME("iface %p, factory %p stub!\n", iface, factory);
356 *factory = NULL;
359 static void STDMETHODCALLTYPE d2d_linear_gradient_brush_SetOpacity(ID2D1LinearGradientBrush *iface, float opacity)
361 FIXME("iface %p, opacity %.8e stub!\n", iface, opacity);
364 static void STDMETHODCALLTYPE d2d_linear_gradient_brush_SetTransform(ID2D1LinearGradientBrush *iface,
365 const D2D1_MATRIX_3X2_F *transform)
367 FIXME("iface %p, transform %p stub!\n", iface, transform);
370 static float STDMETHODCALLTYPE d2d_linear_gradient_brush_GetOpacity(ID2D1LinearGradientBrush *iface)
372 FIXME("iface %p stub!\n", iface);
374 return 0.0f;
377 static void STDMETHODCALLTYPE d2d_linear_gradient_brush_GetTransform(ID2D1LinearGradientBrush *iface,
378 D2D1_MATRIX_3X2_F *transform)
380 struct d2d_brush *brush = impl_from_ID2D1LinearGradientBrush(iface);
382 TRACE("iface %p, transform %p.\n", iface, transform);
384 *transform = brush->transform;
387 static void STDMETHODCALLTYPE d2d_linear_gradient_brush_SetStartPoint(ID2D1LinearGradientBrush *iface,
388 D2D1_POINT_2F start_point)
390 FIXME("iface %p, start_point {%.8e, %.8e} stub!\n", iface, start_point.x, start_point.y);
393 static void STDMETHODCALLTYPE d2d_linear_gradient_brush_SetEndPoint(ID2D1LinearGradientBrush *iface,
394 D2D1_POINT_2F end_point)
396 FIXME("iface %p, end_point {%.8e, %.8e} stub!\n", iface, end_point.x, end_point.y);
399 static D2D1_POINT_2F * STDMETHODCALLTYPE d2d_linear_gradient_brush_GetStartPoint(ID2D1LinearGradientBrush *iface,
400 D2D1_POINT_2F *point)
402 FIXME("iface %p, point %p stub!\n", iface, point);
404 point->x = 0.0f;
405 point->y = 0.0f;
406 return point;
409 static D2D1_POINT_2F * STDMETHODCALLTYPE d2d_linear_gradient_brush_GetEndPoint(ID2D1LinearGradientBrush *iface,
410 D2D1_POINT_2F *point)
412 FIXME("iface %p, point %p stub!\n", iface, point);
414 point->x = 0.0f;
415 point->y = 0.0f;
416 return point;
419 static void STDMETHODCALLTYPE d2d_linear_gradient_brush_GetGradientStopCollection(ID2D1LinearGradientBrush *iface,
420 ID2D1GradientStopCollection **gradient)
422 FIXME("iface %p, gradient %p stub!\n", iface, gradient);
424 *gradient = NULL;
427 static const struct ID2D1LinearGradientBrushVtbl d2d_linear_gradient_brush_vtbl =
429 d2d_linear_gradient_brush_QueryInterface,
430 d2d_linear_gradient_brush_AddRef,
431 d2d_linear_gradient_brush_Release,
432 d2d_linear_gradient_brush_GetFactory,
433 d2d_linear_gradient_brush_SetOpacity,
434 d2d_linear_gradient_brush_SetTransform,
435 d2d_linear_gradient_brush_GetOpacity,
436 d2d_linear_gradient_brush_GetTransform,
437 d2d_linear_gradient_brush_SetStartPoint,
438 d2d_linear_gradient_brush_SetEndPoint,
439 d2d_linear_gradient_brush_GetStartPoint,
440 d2d_linear_gradient_brush_GetEndPoint,
441 d2d_linear_gradient_brush_GetGradientStopCollection,
444 void d2d_linear_gradient_brush_init(struct d2d_brush *brush, ID2D1RenderTarget *render_target,
445 const D2D1_LINEAR_GRADIENT_BRUSH_PROPERTIES *gradient_brush_desc, const D2D1_BRUSH_PROPERTIES *brush_desc,
446 ID2D1GradientStopCollection *gradient)
448 FIXME("Ignoring brush properties.\n");
450 d2d_brush_init(brush, render_target, D2D_BRUSH_TYPE_LINEAR, brush_desc,
451 (ID2D1BrushVtbl *)&d2d_linear_gradient_brush_vtbl);
454 static inline struct d2d_brush *impl_from_ID2D1BitmapBrush(ID2D1BitmapBrush *iface)
456 return CONTAINING_RECORD(iface, struct d2d_brush, ID2D1Brush_iface);
459 static HRESULT STDMETHODCALLTYPE d2d_bitmap_brush_QueryInterface(ID2D1BitmapBrush *iface,
460 REFIID iid, void **out)
462 TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
464 if (IsEqualGUID(iid, &IID_ID2D1BitmapBrush)
465 || IsEqualGUID(iid, &IID_ID2D1Brush)
466 || IsEqualGUID(iid, &IID_ID2D1Resource)
467 || IsEqualGUID(iid, &IID_IUnknown))
469 ID2D1BitmapBrush_AddRef(iface);
470 *out = iface;
471 return S_OK;
474 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
476 *out = NULL;
477 return E_NOINTERFACE;
480 static ULONG STDMETHODCALLTYPE d2d_bitmap_brush_AddRef(ID2D1BitmapBrush *iface)
482 struct d2d_brush *brush = impl_from_ID2D1BitmapBrush(iface);
483 ULONG refcount = InterlockedIncrement(&brush->refcount);
485 TRACE("%p increasing refcount to %u.\n", iface, refcount);
487 return refcount;
490 static ULONG STDMETHODCALLTYPE d2d_bitmap_brush_Release(ID2D1BitmapBrush *iface)
492 struct d2d_brush *brush = impl_from_ID2D1BitmapBrush(iface);
493 ULONG refcount = InterlockedDecrement(&brush->refcount);
495 TRACE("%p decreasing refcount to %u.\n", iface, refcount);
497 if (!refcount)
498 HeapFree(GetProcessHeap(), 0, brush);
500 return refcount;
503 static void STDMETHODCALLTYPE d2d_bitmap_brush_GetFactory(ID2D1BitmapBrush *iface,
504 ID2D1Factory **factory)
506 FIXME("iface %p, factory %p stub!\n", iface, factory);
508 *factory = NULL;
511 static void STDMETHODCALLTYPE d2d_bitmap_brush_SetOpacity(ID2D1BitmapBrush *iface, float opacity)
513 struct d2d_brush *brush = impl_from_ID2D1BitmapBrush(iface);
515 TRACE("iface %p, opacity %.8e.\n", iface, opacity);
517 brush->opacity = opacity;
520 static void STDMETHODCALLTYPE d2d_bitmap_brush_SetTransform(ID2D1BitmapBrush *iface,
521 const D2D1_MATRIX_3X2_F *transform)
523 FIXME("iface %p, transform %p stub!\n", iface, transform);
526 static float STDMETHODCALLTYPE d2d_bitmap_brush_GetOpacity(ID2D1BitmapBrush *iface)
528 struct d2d_brush *brush = impl_from_ID2D1BitmapBrush(iface);
530 TRACE("iface %p.\n", iface);
532 return brush->opacity;
535 static void STDMETHODCALLTYPE d2d_bitmap_brush_GetTransform(ID2D1BitmapBrush *iface,
536 D2D1_MATRIX_3X2_F *transform)
538 struct d2d_brush *brush = impl_from_ID2D1BitmapBrush(iface);
540 TRACE("iface %p, transform %p.\n", iface, transform);
542 *transform = brush->transform;
545 static void STDMETHODCALLTYPE d2d_bitmap_brush_SetExtendModeX(ID2D1BitmapBrush *iface, D2D1_EXTEND_MODE mode)
547 FIXME("iface %p, mode %#x stub!\n", iface, mode);
550 static void STDMETHODCALLTYPE d2d_bitmap_brush_SetExtendModeY(ID2D1BitmapBrush *iface, D2D1_EXTEND_MODE mode)
552 FIXME("iface %p, mode %#x stub!\n", iface, mode);
555 static void STDMETHODCALLTYPE d2d_bitmap_brush_SetInterpolationMode(ID2D1BitmapBrush *iface,
556 D2D1_BITMAP_INTERPOLATION_MODE mode)
558 FIXME("iface %p, mode %#x stub!\n", iface, mode);
561 static void STDMETHODCALLTYPE d2d_bitmap_brush_SetBitmap(ID2D1BitmapBrush *iface, ID2D1Bitmap *bitmap)
563 FIXME("iface %p, bitmap %p stub!\n", iface, bitmap);
566 static D2D1_EXTEND_MODE STDMETHODCALLTYPE d2d_bitmap_brush_GetExtendModeX(ID2D1BitmapBrush *iface)
568 FIXME("iface %p stub!\n", iface);
570 return D2D1_EXTEND_MODE_CLAMP;
573 static D2D1_EXTEND_MODE STDMETHODCALLTYPE d2d_bitmap_brush_GetExtendModeY(ID2D1BitmapBrush *iface)
575 FIXME("iface %p stub!\n", iface);
577 return D2D1_EXTEND_MODE_CLAMP;
580 static D2D1_BITMAP_INTERPOLATION_MODE STDMETHODCALLTYPE d2d_bitmap_brush_GetInterpolationMode(ID2D1BitmapBrush *iface)
582 FIXME("iface %p stub!\n", iface);
584 return D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR;
587 static void STDMETHODCALLTYPE d2d_bitmap_brush_GetBitmap(ID2D1BitmapBrush *iface, ID2D1Bitmap **bitmap)
589 FIXME("iface %p, bitmap %p stub!\n", iface, bitmap);
592 static const struct ID2D1BitmapBrushVtbl d2d_bitmap_brush_vtbl =
594 d2d_bitmap_brush_QueryInterface,
595 d2d_bitmap_brush_AddRef,
596 d2d_bitmap_brush_Release,
597 d2d_bitmap_brush_GetFactory,
598 d2d_bitmap_brush_SetOpacity,
599 d2d_bitmap_brush_SetTransform,
600 d2d_bitmap_brush_GetOpacity,
601 d2d_bitmap_brush_GetTransform,
602 d2d_bitmap_brush_SetExtendModeX,
603 d2d_bitmap_brush_SetExtendModeY,
604 d2d_bitmap_brush_SetInterpolationMode,
605 d2d_bitmap_brush_SetBitmap,
606 d2d_bitmap_brush_GetExtendModeX,
607 d2d_bitmap_brush_GetExtendModeY,
608 d2d_bitmap_brush_GetInterpolationMode,
609 d2d_bitmap_brush_GetBitmap,
612 void d2d_bitmap_brush_init(struct d2d_brush *brush, ID2D1RenderTarget *render_target, const ID2D1Bitmap *bitmap,
613 const D2D1_BITMAP_BRUSH_PROPERTIES *bitmap_brush_desc, const D2D1_BRUSH_PROPERTIES *brush_desc)
615 FIXME("Ignoring brush properties.\n");
617 d2d_brush_init(brush, render_target, D2D_BRUSH_TYPE_BITMAP, brush_desc,
618 (ID2D1BrushVtbl *)&d2d_bitmap_brush_vtbl);
621 struct d2d_brush *unsafe_impl_from_ID2D1Brush(ID2D1Brush *iface)
623 if (!iface)
624 return NULL;
625 assert(iface->lpVtbl == (const ID2D1BrushVtbl *)&d2d_solid_color_brush_vtbl
626 || iface->lpVtbl == (const ID2D1BrushVtbl *)&d2d_linear_gradient_brush_vtbl
627 || iface->lpVtbl == (const ID2D1BrushVtbl *)&d2d_bitmap_brush_vtbl);
628 return CONTAINING_RECORD(iface, struct d2d_brush, ID2D1Brush_iface);