[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