From 4e73cd517aa7da918962811c3a6dd891b7119c45 Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Tue, 16 Sep 2014 10:44:14 +0200 Subject: [PATCH] d2d1: Implement d2d_d3d_render_target_CreateBitmapFromWicBitmap(). --- dlls/d2d1/render_target.c | 84 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 82 insertions(+), 2 deletions(-) diff --git a/dlls/d2d1/render_target.c b/dlls/d2d1/render_target.c index 2c501efe5ad..4a69fcee62b 100644 --- a/dlls/d2d1/render_target.c +++ b/dlls/d2d1/render_target.c @@ -20,6 +20,7 @@ #include "wine/port.h" #include "d2d1_private.h" +#include "wincodec.h" WINE_DEFAULT_DEBUG_CHANNEL(d2d); @@ -201,10 +202,89 @@ 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) { - FIXME("iface %p, bitmap_source %p, desc %p, bitmap %p stub!\n", + D2D1_BITMAP_PROPERTIES bitmap_desc; + unsigned int bpp, data_size; + D2D1_SIZE_U size; + WICRect rect; + UINT32 pitch; + HRESULT hr; + void *data; + + TRACE("iface %p, bitmap_source %p, desc %p, bitmap %p.\n", iface, bitmap_source, desc, bitmap); - return E_NOTIMPL; + if (FAILED(hr = IWICBitmapSource_GetSize(bitmap_source, &size.width, &size.height))) + { + WARN("Failed to get bitmap size, hr %#x.\n", hr); + return hr; + } + + if (!desc) + { + bitmap_desc.pixelFormat.format = DXGI_FORMAT_UNKNOWN; + bitmap_desc.pixelFormat.alphaMode = D2D1_ALPHA_MODE_UNKNOWN; + bitmap_desc.dpiX = 0.0f; + bitmap_desc.dpiY = 0.0f; + } + else + { + bitmap_desc = *desc; + } + + if (bitmap_desc.pixelFormat.format == DXGI_FORMAT_UNKNOWN) + { + WICPixelFormatGUID wic_format; + + if (FAILED(hr = IWICBitmapSource_GetPixelFormat(bitmap_source, &wic_format))) + { + WARN("Failed to get bitmap format, hr %#x.\n", hr); + return hr; + } + + 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; + } + } + + switch (bitmap_desc.pixelFormat.format) + { + case DXGI_FORMAT_B8G8R8A8_UNORM: + bpp = 4; + break; + + default: + FIXME("Unhandled format %#x.\n", bitmap_desc.pixelFormat.format); + return D2DERR_UNSUPPORTED_PIXEL_FORMAT; + } + + pitch = ((bpp * size.width) + 15) & ~15; + data_size = pitch * size.height; + if (!(data = HeapAlloc(GetProcessHeap(), 0, data_size))) + return E_OUTOFMEMORY; + + rect.X = 0; + rect.Y = 0; + rect.Width = size.width; + rect.Height = size.height; + if (FAILED(hr = IWICBitmapSource_CopyPixels(bitmap_source, &rect, pitch, data_size, data))) + { + WARN("Failed to copy bitmap pixels, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, data); + return hr; + } + + hr = d2d_d3d_render_target_CreateBitmap(iface, size, data, pitch, &bitmap_desc, bitmap); + + HeapFree(GetProcessHeap(), 0, data); + + return hr; } static HRESULT STDMETHODCALLTYPE d2d_d3d_render_target_CreateSharedBitmap(ID2D1RenderTarget *iface, -- 2.11.4.GIT