d2d1: Implement d2d_bitmap_brush_GetFactory().

This commit is contained in:
Henri Verbeet 2015-08-02 18:56:06 +02:00 committed by Alexandre Julliard
parent 47f9f09c73
commit 414d04e27d
3 changed files with 30 additions and 18 deletions

View File

@ -144,7 +144,13 @@ HRESULT d2d_gradient_init(struct d2d_gradient *gradient, ID2D1RenderTarget *rend
return S_OK;
}
static void d2d_brush_init(struct d2d_brush *brush, ID2D1RenderTarget *render_target,
static void d2d_brush_destroy(struct d2d_brush *brush)
{
ID2D1Factory_Release(brush->factory);
HeapFree(GetProcessHeap(), 0, brush);
}
static void d2d_brush_init(struct d2d_brush *brush, ID2D1Factory *factory,
enum d2d_brush_type type, const D2D1_BRUSH_PROPERTIES *desc, const struct ID2D1BrushVtbl *vtbl)
{
static const D2D1_MATRIX_3X2_F identity =
@ -156,6 +162,7 @@ static void d2d_brush_init(struct d2d_brush *brush, ID2D1RenderTarget *render_ta
brush->ID2D1Brush_iface.lpVtbl = vtbl;
brush->refcount = 1;
ID2D1Factory_AddRef(brush->factory = factory);
brush->opacity = desc ? desc->opacity : 1.0f;
brush->transform = desc ? desc->transform : identity;
brush->type = type;
@ -205,7 +212,7 @@ static ULONG STDMETHODCALLTYPE d2d_solid_color_brush_Release(ID2D1SolidColorBrus
TRACE("%p decreasing refcount to %u.\n", iface, refcount);
if (!refcount)
HeapFree(GetProcessHeap(), 0, brush);
d2d_brush_destroy(brush);
return refcount;
}
@ -288,12 +295,12 @@ static const struct ID2D1SolidColorBrushVtbl d2d_solid_color_brush_vtbl =
d2d_solid_color_brush_GetColor,
};
void d2d_solid_color_brush_init(struct d2d_brush *brush, ID2D1RenderTarget *render_target,
void d2d_solid_color_brush_init(struct d2d_brush *brush, ID2D1Factory *factory,
const D2D1_COLOR_F *color, const D2D1_BRUSH_PROPERTIES *desc)
{
FIXME("Ignoring brush properties.\n");
d2d_brush_init(brush, render_target, D2D_BRUSH_TYPE_SOLID, desc,
d2d_brush_init(brush, factory, D2D_BRUSH_TYPE_SOLID, desc,
(ID2D1BrushVtbl *)&d2d_solid_color_brush_vtbl);
brush->u.solid.color = *color;
}
@ -342,7 +349,7 @@ static ULONG STDMETHODCALLTYPE d2d_linear_gradient_brush_Release(ID2D1LinearGrad
TRACE("%p decreasing refcount to %u.\n", iface, refcount);
if (!refcount)
HeapFree(GetProcessHeap(), 0, brush);
d2d_brush_destroy(brush);
return refcount;
}
@ -444,13 +451,13 @@ static const struct ID2D1LinearGradientBrushVtbl d2d_linear_gradient_brush_vtbl
d2d_linear_gradient_brush_GetGradientStopCollection,
};
void d2d_linear_gradient_brush_init(struct d2d_brush *brush, ID2D1RenderTarget *render_target,
void d2d_linear_gradient_brush_init(struct d2d_brush *brush, ID2D1Factory *factory,
const D2D1_LINEAR_GRADIENT_BRUSH_PROPERTIES *gradient_brush_desc, const D2D1_BRUSH_PROPERTIES *brush_desc,
ID2D1GradientStopCollection *gradient)
{
FIXME("Ignoring brush properties.\n");
d2d_brush_init(brush, render_target, D2D_BRUSH_TYPE_LINEAR, brush_desc,
d2d_brush_init(brush, factory, D2D_BRUSH_TYPE_LINEAR, brush_desc,
(ID2D1BrushVtbl *)&d2d_linear_gradient_brush_vtbl);
}
@ -503,7 +510,7 @@ static ULONG STDMETHODCALLTYPE d2d_bitmap_brush_Release(ID2D1BitmapBrush *iface)
ID3D10SamplerState_Release(brush->u.bitmap.sampler_state);
if (brush->u.bitmap.bitmap)
ID2D1Bitmap_Release(&brush->u.bitmap.bitmap->ID2D1Bitmap_iface);
HeapFree(GetProcessHeap(), 0, brush);
d2d_brush_destroy(brush);
}
return refcount;
@ -512,9 +519,11 @@ static ULONG STDMETHODCALLTYPE d2d_bitmap_brush_Release(ID2D1BitmapBrush *iface)
static void STDMETHODCALLTYPE d2d_bitmap_brush_GetFactory(ID2D1BitmapBrush *iface,
ID2D1Factory **factory)
{
FIXME("iface %p, factory %p stub!\n", iface, factory);
struct d2d_brush *brush = impl_from_ID2D1BitmapBrush(iface);
*factory = NULL;
TRACE("iface %p, factory %p.\n", iface, factory);
ID2D1Factory_AddRef(*factory = brush->factory);
}
static void STDMETHODCALLTYPE d2d_bitmap_brush_SetOpacity(ID2D1BitmapBrush *iface, float opacity)
@ -668,13 +677,13 @@ static const struct ID2D1BitmapBrushVtbl d2d_bitmap_brush_vtbl =
d2d_bitmap_brush_GetBitmap,
};
HRESULT d2d_bitmap_brush_init(struct d2d_brush *brush, struct d2d_d3d_render_target *render_target, ID2D1Bitmap *bitmap,
HRESULT d2d_bitmap_brush_init(struct d2d_brush *brush, ID2D1Factory *factory, ID2D1Bitmap *bitmap,
const D2D1_BITMAP_BRUSH_PROPERTIES *bitmap_brush_desc, const D2D1_BRUSH_PROPERTIES *brush_desc)
{
FIXME("Ignoring brush properties.\n");
d2d_brush_init(brush, &render_target->ID2D1RenderTarget_iface, D2D_BRUSH_TYPE_BITMAP,
d2d_brush_init(brush, factory, D2D_BRUSH_TYPE_BITMAP,
brush_desc, (ID2D1BrushVtbl *)&d2d_bitmap_brush_vtbl);
if ((brush->u.bitmap.bitmap = unsafe_impl_from_ID2D1Bitmap(bitmap)))
ID2D1Bitmap_AddRef(&brush->u.bitmap.bitmap->ID2D1Bitmap_iface);

View File

@ -125,6 +125,7 @@ struct d2d_brush
ID2D1Brush ID2D1Brush_iface;
LONG refcount;
ID2D1Factory *factory;
float opacity;
D2D1_MATRIX_3X2_F transform;
@ -146,12 +147,12 @@ struct d2d_brush
} u;
};
void d2d_solid_color_brush_init(struct d2d_brush *brush, ID2D1RenderTarget *render_target,
void d2d_solid_color_brush_init(struct d2d_brush *brush, ID2D1Factory *factory,
const D2D1_COLOR_F *color, const D2D1_BRUSH_PROPERTIES *desc) DECLSPEC_HIDDEN;
void d2d_linear_gradient_brush_init(struct d2d_brush *brush, ID2D1RenderTarget *render_target,
void d2d_linear_gradient_brush_init(struct d2d_brush *brush, ID2D1Factory *factory,
const D2D1_LINEAR_GRADIENT_BRUSH_PROPERTIES *gradient_brush_desc, const D2D1_BRUSH_PROPERTIES *brush_desc,
ID2D1GradientStopCollection *gradient) DECLSPEC_HIDDEN;
HRESULT d2d_bitmap_brush_init(struct d2d_brush *brush, struct d2d_d3d_render_target *render_target,
HRESULT d2d_bitmap_brush_init(struct d2d_brush *brush, ID2D1Factory *factory,
ID2D1Bitmap *bitmap, const D2D1_BITMAP_BRUSH_PROPERTIES *bitmap_brush_desc,
const D2D1_BRUSH_PROPERTIES *brush_desc) DECLSPEC_HIDDEN;
void d2d_brush_bind_resources(struct d2d_brush *brush, struct d2d_d3d_render_target *render_target,

View File

@ -426,7 +426,7 @@ static HRESULT STDMETHODCALLTYPE d2d_d3d_render_target_CreateBitmapBrush(ID2D1Re
if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object))))
return E_OUTOFMEMORY;
if (FAILED(hr = d2d_bitmap_brush_init(object, render_target, bitmap, bitmap_brush_desc, brush_desc)))
if (FAILED(hr = d2d_bitmap_brush_init(object, render_target->factory, bitmap, bitmap_brush_desc, brush_desc)))
{
WARN("Failed to initialize brush, hr %#x.\n", hr);
HeapFree(GetProcessHeap(), 0, object);
@ -442,6 +442,7 @@ static HRESULT STDMETHODCALLTYPE d2d_d3d_render_target_CreateBitmapBrush(ID2D1Re
static HRESULT STDMETHODCALLTYPE d2d_d3d_render_target_CreateSolidColorBrush(ID2D1RenderTarget *iface,
const D2D1_COLOR_F *color, const D2D1_BRUSH_PROPERTIES *desc, ID2D1SolidColorBrush **brush)
{
struct d2d_d3d_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
struct d2d_brush *object;
TRACE("iface %p, color %p, desc %p, brush %p.\n", iface, color, desc, brush);
@ -449,7 +450,7 @@ static HRESULT STDMETHODCALLTYPE d2d_d3d_render_target_CreateSolidColorBrush(ID2
if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object))))
return E_OUTOFMEMORY;
d2d_solid_color_brush_init(object, iface, color, desc);
d2d_solid_color_brush_init(object, render_target->factory, color, desc);
TRACE("Created brush %p.\n", object);
*brush = (ID2D1SolidColorBrush *)&object->ID2D1Brush_iface;
@ -487,6 +488,7 @@ static HRESULT STDMETHODCALLTYPE d2d_d3d_render_target_CreateLinearGradientBrush
const D2D1_LINEAR_GRADIENT_BRUSH_PROPERTIES *gradient_brush_desc, const D2D1_BRUSH_PROPERTIES *brush_desc,
ID2D1GradientStopCollection *gradient, ID2D1LinearGradientBrush **brush)
{
struct d2d_d3d_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
struct d2d_brush *object;
TRACE("iface %p, gradient_brush_desc %p, brush_desc %p, gradient %p, brush %p.\n",
@ -495,7 +497,7 @@ static HRESULT STDMETHODCALLTYPE d2d_d3d_render_target_CreateLinearGradientBrush
if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object))))
return E_OUTOFMEMORY;
d2d_linear_gradient_brush_init(object, iface, gradient_brush_desc, brush_desc, gradient);
d2d_linear_gradient_brush_init(object, render_target->factory, gradient_brush_desc, brush_desc, gradient);
TRACE("Created brush %p.\n", object);
*brush = (ID2D1LinearGradientBrush *)&object->ID2D1Brush_iface;