[PATCH] d2d1: Move bitmap creation helpers to common location
Nikolay Sivov
nsivov at codeweavers.com
Tue Mar 29 10:58:23 CDT 2016
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/d2d1/bitmap.c | 145 +++++++++++++++++++++++++++++++++++++++++++---
dlls/d2d1/d2d1_private.h | 10 ++--
dlls/d2d1/render_target.c | 135 ++----------------------------------------
3 files changed, 148 insertions(+), 142 deletions(-)
diff --git a/dlls/d2d1/bitmap.c b/dlls/d2d1/bitmap.c
index 8f430e2..e7f80c9 100644
--- a/dlls/d2d1/bitmap.c
+++ b/dlls/d2d1/bitmap.c
@@ -20,6 +20,7 @@
#include "wine/port.h"
#include "d2d1_private.h"
+#include "wincodec.h"
WINE_DEFAULT_DEBUG_CHANNEL(d2d);
@@ -238,15 +239,18 @@ static void d2d_bitmap_init(struct d2d_bitmap *bitmap, ID2D1Factory *factory,
}
}
-HRESULT d2d_bitmap_init_memory(struct d2d_bitmap *bitmap, ID2D1Factory *factory, ID3D10Device *device,
- D2D1_SIZE_U size, const void *src_data, UINT32 pitch, const D2D1_BITMAP_PROPERTIES *desc)
+HRESULT d2d_bitmap_create(ID2D1Factory *factory, ID3D10Device *device, D2D1_SIZE_U size, const void *src_data,
+ UINT32 pitch, const D2D1_BITMAP_PROPERTIES *desc, ID2D1Bitmap **bitmap)
{
D3D10_SUBRESOURCE_DATA resource_data;
D3D10_TEXTURE2D_DESC texture_desc;
ID3D10ShaderResourceView *view;
+ struct d2d_bitmap *object;
ID3D10Texture2D *texture;
HRESULT hr;
+ *bitmap = NULL;
+
if (!format_supported(&desc->pixelFormat))
{
WARN("Tried to create bitmap with unsupported format {%#x / %#x}.\n",
@@ -284,18 +288,32 @@ HRESULT d2d_bitmap_init_memory(struct d2d_bitmap *bitmap, ID2D1Factory *factory,
return hr;
}
- d2d_bitmap_init(bitmap, factory, view, size, desc);
+ if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object))))
+ return E_OUTOFMEMORY;
+
+ if (object)
+ {
+ d2d_bitmap_init(object, factory, view, size, desc);
+ *bitmap = &object->ID2D1Bitmap_iface;
+ TRACE("Created bitmap %p.\n", object);
+ }
+ else
+ hr = E_OUTOFMEMORY;
+
ID3D10ShaderResourceView_Release(view);
- return S_OK;
+ return hr;
}
-HRESULT d2d_bitmap_init_shared(struct d2d_bitmap *bitmap, ID2D1Factory *factory, ID3D10Device *target_device,
- REFIID iid, void *data, const D2D1_BITMAP_PROPERTIES *desc)
+HRESULT d2d_bitmap_create_shared(ID2D1Factory *factory, ID3D10Device *target_device,
+ REFIID iid, void *data, const D2D1_BITMAP_PROPERTIES *desc, ID2D1Bitmap **bitmap)
{
+ *bitmap = NULL;
+
if (IsEqualGUID(iid, &IID_ID2D1Bitmap))
{
struct d2d_bitmap *src_impl = unsafe_impl_from_ID2D1Bitmap(data);
+ struct d2d_bitmap *object;
D2D1_BITMAP_PROPERTIES d;
ID3D10Device *device;
@@ -322,9 +340,15 @@ HRESULT d2d_bitmap_init_shared(struct d2d_bitmap *bitmap, ID2D1Factory *factory,
return D2DERR_UNSUPPORTED_PIXEL_FORMAT;
}
- d2d_bitmap_init(bitmap, factory, src_impl->view, src_impl->pixel_size, desc);
+ object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
+ if (object)
+ {
+ d2d_bitmap_init(object, factory, src_impl->view, src_impl->pixel_size, desc);
+ *bitmap = &object->ID2D1Bitmap_iface;
+ TRACE("Created bitmap %p.\n", object);
+ }
- return S_OK;
+ return object ? S_OK : E_OUTOFMEMORY;
}
WARN("Unhandled interface %s.\n", debugstr_guid(iid));
@@ -332,6 +356,111 @@ HRESULT d2d_bitmap_init_shared(struct d2d_bitmap *bitmap, ID2D1Factory *factory,
return E_INVALIDARG;
}
+HRESULT d2d_bitmap_create_from_wic_bitmap(ID2D1Factory *factory, ID3D10Device *device, 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}},
+ };
+
+ *bitmap = NULL;
+
+ 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 (FAILED(hr = IWICBitmapSource_GetPixelFormat(bitmap_source, &wic_format)))
+ {
+ WARN("Failed to get bitmap format, hr %#x.\n", hr);
+ return hr;
+ }
+
+ for (i = 0, d2d_format = NULL; i < sizeof(format_lookup) / sizeof(*format_lookup); ++i)
+ {
+ if (IsEqualGUID(&wic_format, format_lookup[i].wic))
+ {
+ d2d_format = &format_lookup[i].d2d;
+ break;
+ }
+ }
+
+ 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:
+ 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_bitmap_create(factory, device, size, data, pitch, &bitmap_desc, bitmap);
+
+ HeapFree(GetProcessHeap(), 0, data);
+
+ return hr;
+}
+
struct d2d_bitmap *unsafe_impl_from_ID2D1Bitmap(ID2D1Bitmap *iface)
{
if (!iface)
diff --git a/dlls/d2d1/d2d1_private.h b/dlls/d2d1/d2d1_private.h
index e55c220..3de562d 100644
--- a/dlls/d2d1/d2d1_private.h
+++ b/dlls/d2d1/d2d1_private.h
@@ -204,10 +204,12 @@ struct d2d_bitmap
float dpi_y;
};
-HRESULT d2d_bitmap_init_memory(struct d2d_bitmap *bitmap, ID2D1Factory *factory, ID3D10Device *device,
- D2D1_SIZE_U size, const void *src_data, UINT32 pitch, const D2D1_BITMAP_PROPERTIES *desc) DECLSPEC_HIDDEN;
-HRESULT d2d_bitmap_init_shared(struct d2d_bitmap *bitmap, ID2D1Factory *factory, ID3D10Device *device,
- REFIID iid, void *data, const D2D1_BITMAP_PROPERTIES *desc) DECLSPEC_HIDDEN;
+HRESULT d2d_bitmap_create(ID2D1Factory *factory, ID3D10Device *device, D2D1_SIZE_U size, const void *src_data,
+ UINT32 pitch, const D2D1_BITMAP_PROPERTIES *desc, ID2D1Bitmap **bitmap) DECLSPEC_HIDDEN;
+HRESULT d2d_bitmap_create_shared(ID2D1Factory *factory, ID3D10Device *device, REFIID iid, void *data,
+ const D2D1_BITMAP_PROPERTIES *desc, ID2D1Bitmap **bitmap) DECLSPEC_HIDDEN;
+HRESULT d2d_bitmap_create_from_wic_bitmap(ID2D1Factory *factory, ID3D10Device *device, IWICBitmapSource *bitmap_source,
+ const D2D1_BITMAP_PROPERTIES *desc, ID2D1Bitmap **bitmap) DECLSPEC_HIDDEN;
struct d2d_bitmap *unsafe_impl_from_ID2D1Bitmap(ID2D1Bitmap *iface) DECLSPEC_HIDDEN;
struct d2d_state_block
diff --git a/dlls/d2d1/render_target.c b/dlls/d2d1/render_target.c
index 90e064f..68fb734 100644
--- a/dlls/d2d1/render_target.c
+++ b/dlls/d2d1/render_target.c
@@ -20,7 +20,6 @@
#include "wine/port.h"
#include "d2d1_private.h"
-#include "wincodec.h"
WINE_DEFAULT_DEBUG_CHANNEL(d2d);
@@ -303,158 +302,34 @@ static HRESULT STDMETHODCALLTYPE d2d_d3d_render_target_CreateBitmap(ID2D1RenderT
D2D1_SIZE_U size, const void *src_data, UINT32 pitch, const D2D1_BITMAP_PROPERTIES *desc, ID2D1Bitmap **bitmap)
{
struct d2d_d3d_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
- struct d2d_bitmap *object;
- HRESULT hr;
TRACE("iface %p, size {%u, %u}, src_data %p, pitch %u, desc %p, bitmap %p.\n",
iface, size.width, size.height, src_data, pitch, desc, bitmap);
- if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object))))
- return E_OUTOFMEMORY;
-
- if (FAILED(hr = d2d_bitmap_init_memory(object, render_target->factory, render_target->device, size, src_data, pitch, desc)))
- {
- WARN("Failed to initialize bitmap, hr %#x.\n", hr);
- HeapFree(GetProcessHeap(), 0, object);
- return hr;
- }
-
- TRACE("Created bitmap %p.\n", object);
- *bitmap = &object->ID2D1Bitmap_iface;
-
- return S_OK;
+ return d2d_bitmap_create(render_target->factory, render_target->device, size, src_data, pitch, desc, bitmap);
}
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}},
- };
+ struct d2d_d3d_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
TRACE("iface %p, bitmap_source %p, desc %p, bitmap %p.\n",
iface, bitmap_source, desc, bitmap);
- 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 (FAILED(hr = IWICBitmapSource_GetPixelFormat(bitmap_source, &wic_format)))
- {
- WARN("Failed to get bitmap format, hr %#x.\n", hr);
- return hr;
- }
-
- for (i = 0, d2d_format = NULL; i < sizeof(format_lookup) / sizeof(*format_lookup); ++i)
- {
- if (IsEqualGUID(&wic_format, format_lookup[i].wic))
- {
- d2d_format = &format_lookup[i].d2d;
- break;
- }
- }
-
- 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:
- 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;
+ return d2d_bitmap_create_from_wic_bitmap(render_target->factory, render_target->device, bitmap_source,
+ desc, bitmap);
}
static HRESULT STDMETHODCALLTYPE d2d_d3d_render_target_CreateSharedBitmap(ID2D1RenderTarget *iface,
REFIID iid, void *data, const D2D1_BITMAP_PROPERTIES *desc, ID2D1Bitmap **bitmap)
{
struct d2d_d3d_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
- struct d2d_bitmap *object;
- HRESULT hr;
TRACE("iface %p, iid %s, data %p, desc %p, bitmap %p.\n",
iface, debugstr_guid(iid), data, desc, bitmap);
- if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object))))
- return E_OUTOFMEMORY;
-
- if (FAILED(hr = d2d_bitmap_init_shared(object, render_target->factory, render_target->device, iid, data, desc)))
- {
- WARN("Failed to initialize bitmap, hr %#x.\n", hr);
- HeapFree(GetProcessHeap(), 0, object);
- return hr;
- }
-
- TRACE("Created bitmap %p.\n", object);
- *bitmap = &object->ID2D1Bitmap_iface;
-
- return S_OK;
+ return d2d_bitmap_create_shared(render_target->factory, render_target->device, iid, data, desc, bitmap);
}
static HRESULT STDMETHODCALLTYPE d2d_d3d_render_target_CreateBitmapBrush(ID2D1RenderTarget *iface,
--
2.8.0.rc3
More information about the wine-patches
mailing list