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