[2/2] windowscodecs: Implement IWICImagingFactory::CreateBitmapFromSource.
Vincent Povirk
madewokherd at gmail.com
Mon Aug 20 10:52:22 CDT 2012
-------------- next part --------------
From 1f9027c4d82a3c916f450229b35b7898b51fb48b Mon Sep 17 00:00:00 2001
From: Vincent Povirk <vincent at codeweavers.com>
Date: Tue, 14 Aug 2012 16:41:50 -0500
Subject: [PATCH 2/2] windowscodecs: Implement
IWICImagingFactory::CreateBitmapFromSource.
---
dlls/windowscodecs/imgfactory.c | 79 ++++++++++++++++++++++++++++++++++++-
dlls/windowscodecs/tests/bitmap.c | 5 ++-
2 files changed, 80 insertions(+), 4 deletions(-)
diff --git a/dlls/windowscodecs/imgfactory.c b/dlls/windowscodecs/imgfactory.c
index a739662..01ce034 100644
--- a/dlls/windowscodecs/imgfactory.c
+++ b/dlls/windowscodecs/imgfactory.c
@@ -466,8 +466,83 @@ static HRESULT WINAPI ComponentFactory_CreateBitmapFromSource(IWICComponentFacto
IWICBitmapSource *piBitmapSource, WICBitmapCreateCacheOption option,
IWICBitmap **ppIBitmap)
{
- FIXME("(%p,%p,%u,%p): stub\n", iface, piBitmapSource, option, ppIBitmap);
- return E_NOTIMPL;
+ IWICBitmap *result;
+ IWICBitmapLock *lock;
+ IWICPalette *palette;
+ UINT width, height;
+ WICPixelFormatGUID pixelformat = {0};
+ HRESULT hr;
+ WICRect rc;
+ double dpix, dpiy;
+
+ TRACE("(%p,%p,%u,%p)\n", iface, piBitmapSource, option, ppIBitmap);
+
+ if (!piBitmapSource || !ppIBitmap)
+ return E_INVALIDARG;
+
+ hr = IWICBitmapSource_GetSize(piBitmapSource, &width, &height);
+
+ if (SUCCEEDED(hr))
+ hr = IWICBitmapSource_GetPixelFormat(piBitmapSource, &pixelformat);
+
+ if (SUCCEEDED(hr))
+ hr = BitmapImpl_Create(width, height, &pixelformat, option, &result);
+
+ if (SUCCEEDED(hr))
+ {
+ hr = IWICBitmap_Lock(result, NULL, WICBitmapLockWrite, &lock);
+ if (SUCCEEDED(hr))
+ {
+ UINT stride, buffersize;
+ BYTE *buffer;
+ rc.X = rc.Y = 0;
+ rc.Width = width;
+ rc.Height = height;
+
+ hr = IWICBitmapLock_GetStride(lock, &stride);
+
+ if (SUCCEEDED(hr))
+ hr = IWICBitmapLock_GetDataPointer(lock, &buffersize, &buffer);
+
+ if (SUCCEEDED(hr))
+ hr = IWICBitmapSource_CopyPixels(piBitmapSource, &rc, stride,
+ buffersize, buffer);
+
+ IWICBitmapLock_Release(lock);
+ }
+
+ if (SUCCEEDED(hr))
+ hr = PaletteImpl_Create(&palette);
+
+ if (SUCCEEDED(hr))
+ {
+ hr = IWICBitmapSource_CopyPalette(piBitmapSource, palette);
+
+ if (SUCCEEDED(hr))
+ hr = IWICBitmap_SetPalette(result, palette);
+ else
+ hr = S_OK;
+
+ IWICPalette_Release(palette);
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ hr = IWICBitmapSource_GetResolution(piBitmapSource, &dpix, &dpiy);
+
+ if (SUCCEEDED(hr))
+ hr = IWICBitmap_SetResolution(result, dpix, dpiy);
+ else
+ hr = S_OK;
+ }
+
+ if (SUCCEEDED(hr))
+ *ppIBitmap = result;
+ else
+ IWICBitmap_Release(result);
+ }
+
+ return hr;
}
static HRESULT WINAPI ComponentFactory_CreateBitmapFromSourceRect(IWICComponentFactory *iface,
diff --git a/dlls/windowscodecs/tests/bitmap.c b/dlls/windowscodecs/tests/bitmap.c
index 56b4cfd..91376ac 100644
--- a/dlls/windowscodecs/tests/bitmap.c
+++ b/dlls/windowscodecs/tests/bitmap.c
@@ -329,7 +329,7 @@ static void test_createbitmapfromsource(void)
hr = IWICImagingFactory_CreateBitmapFromSource(factory, (IWICBitmapSource*)bitmap,
WICBitmapCacheOnLoad, &bitmap2);
- todo_wine ok(hr == S_OK, "IWICImagingFactory_CreateBitmapFromSource failed hr=%x\n", hr);
+ ok(hr == S_OK, "IWICImagingFactory_CreateBitmapFromSource failed hr=%x\n", hr);
IWICBitmap_Release(bitmap);
@@ -338,8 +338,9 @@ static void test_createbitmapfromsource(void)
hr = IWICImagingFactory_CreatePalette(factory, &palette);
ok(hr == S_OK, "IWICImagingFactory_CreatePalette failed hr=%x\n", hr);
+ /* palette isn't copied for non-indexed formats? */
hr = IWICBitmap_CopyPalette(bitmap2, palette);
- ok(hr == WINCODEC_ERR_PALETTEUNAVAILABLE, "IWICBitmap_CopyPalette failed hr=%x\n", hr);
+ todo_wine ok(hr == WINCODEC_ERR_PALETTEUNAVAILABLE, "IWICBitmap_CopyPalette failed hr=%x\n", hr);
IWICPalette_Release(palette);
--
1.7.9.5
More information about the wine-patches
mailing list