Vincent Povirk : windowscodecs: Implement IWICImagingFactory:: CreateBitmapFromSource.
Alexandre Julliard
julliard at winehq.org
Mon Aug 20 14:16:20 CDT 2012
Module: wine
Branch: master
Commit: 88eed3c0dedbc9c69d99f9c56d00533b458260d1
URL: http://source.winehq.org/git/wine.git/?a=commit;h=88eed3c0dedbc9c69d99f9c56d00533b458260d1
Author: Vincent Povirk <vincent at codeweavers.com>
Date: Tue Aug 14 16:41:50 2012 -0500
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);
More information about the wine-cvs
mailing list