[PATCH 2/9] d2d1: Also infer the alpha mode in d2d_d3d_render_target_CreateBitmapFromWicBitmap().
Henri Verbeet
hverbeet at codeweavers.com
Thu Jul 23 12:32:05 CDT 2015
---
dlls/d2d1/render_target.c | 48 ++++++++++++++++++++++++++++++++---------------
1 file changed, 33 insertions(+), 15 deletions(-)
diff --git a/dlls/d2d1/render_target.c b/dlls/d2d1/render_target.c
index e939fef..1c641e7 100644
--- a/dlls/d2d1/render_target.c
+++ b/dlls/d2d1/render_target.c
@@ -300,14 +300,28 @@ static HRESULT STDMETHODCALLTYPE d2d_d3d_render_target_CreateBitmap(ID2D1RenderT
static HRESULT STDMETHODCALLTYPE d2d_d3d_render_target_CreateBitmapFromWicBitmap(ID2D1RenderTarget *iface,
IWICBitmapSource *bitmap_source, const D2D1_BITMAP_PROPERTIES *desc, ID2D1Bitmap **bitmap)
{
+ const D2D1_PIXEL_FORMAT *d2d_format;
D2D1_BITMAP_PROPERTIES bitmap_desc;
+ WICPixelFormatGUID wic_format;
unsigned int bpp, data_size;
D2D1_SIZE_U size;
+ unsigned int i;
WICRect rect;
UINT32 pitch;
HRESULT hr;
void *data;
+ static const struct
+ {
+ const WICPixelFormatGUID *wic;
+ D2D1_PIXEL_FORMAT d2d;
+ }
+ format_lookup[] =
+ {
+ {&GUID_WICPixelFormat32bppPBGRA, {DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED}},
+ {&GUID_WICPixelFormat32bppBGR, {DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_IGNORE}},
+ };
+
TRACE("iface %p, bitmap_source %p, desc %p, bitmap %p.\n",
iface, bitmap_source, desc, bitmap);
@@ -329,28 +343,32 @@ static HRESULT STDMETHODCALLTYPE d2d_d3d_render_target_CreateBitmapFromWicBitmap
bitmap_desc = *desc;
}
- if (bitmap_desc.pixelFormat.format == DXGI_FORMAT_UNKNOWN)
+ if (FAILED(hr = IWICBitmapSource_GetPixelFormat(bitmap_source, &wic_format)))
{
- WICPixelFormatGUID wic_format;
+ WARN("Failed to get bitmap format, hr %#x.\n", hr);
+ return hr;
+ }
- if (FAILED(hr = IWICBitmapSource_GetPixelFormat(bitmap_source, &wic_format)))
+ for (i = 0, d2d_format = NULL; i < sizeof(format_lookup) / sizeof(*format_lookup); ++i)
+ {
+ if (IsEqualGUID(&wic_format, format_lookup[i].wic))
{
- WARN("Failed to get bitmap format, hr %#x.\n", hr);
- return hr;
+ d2d_format = &format_lookup[i].d2d;
+ break;
}
+ }
- if (IsEqualGUID(&wic_format, &GUID_WICPixelFormat32bppPBGRA)
- || IsEqualGUID(&wic_format, &GUID_WICPixelFormat32bppBGR))
- {
- bitmap_desc.pixelFormat.format = DXGI_FORMAT_B8G8R8A8_UNORM;
- }
- else
- {
- WARN("Unsupported WIC bitmap format %s.\n", debugstr_guid(&wic_format));
- return D2DERR_UNSUPPORTED_PIXEL_FORMAT;
- }
+ if (!d2d_format)
+ {
+ WARN("Unsupported WIC bitmap format %s.\n", debugstr_guid(&wic_format));
+ return D2DERR_UNSUPPORTED_PIXEL_FORMAT;
}
+ if (bitmap_desc.pixelFormat.format == DXGI_FORMAT_UNKNOWN)
+ bitmap_desc.pixelFormat.format = d2d_format->format;
+ if (bitmap_desc.pixelFormat.alphaMode == D2D1_ALPHA_MODE_UNKNOWN)
+ bitmap_desc.pixelFormat.alphaMode = d2d_format->alphaMode;
+
switch (bitmap_desc.pixelFormat.format)
{
case DXGI_FORMAT_B8G8R8A8_UNORM:
--
2.1.4
More information about the wine-patches
mailing list