Module: wine Branch: master Commit: 88eed3c0dedbc9c69d99f9c56d00533b458260d1 URL: http://source.winehq.org/git/wine.git/?a=commit;h=88eed3c0dedbc9c69d99f9c56d...
Author: Vincent Povirk vincent@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);