Dmitry Timoshkov : windowscodecs: Implement IWICPalette_InitializeFromPalette.

Alexandre Julliard julliard at winehq.org
Mon Jul 30 14:18:52 CDT 2012


Module: wine
Branch: master
Commit: 0316a1b4c1def76d6c9bfdd006891c4ac895925c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=0316a1b4c1def76d6c9bfdd006891c4ac895925c

Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date:   Mon Jul 30 13:12:28 2012 +0900

windowscodecs: Implement IWICPalette_InitializeFromPalette.

---

 dlls/windowscodecs/palette.c       |   34 +++++++++++++++++--
 dlls/windowscodecs/tests/palette.c |   63 +++++++++++++++++++++++++++++++++++-
 2 files changed, 93 insertions(+), 4 deletions(-)

diff --git a/dlls/windowscodecs/palette.c b/dlls/windowscodecs/palette.c
index f989c97..7d50d83 100644
--- a/dlls/windowscodecs/palette.c
+++ b/dlls/windowscodecs/palette.c
@@ -455,10 +455,38 @@ static HRESULT WINAPI PaletteImpl_InitializeFromBitmap(IWICPalette *iface,
 }
 
 static HRESULT WINAPI PaletteImpl_InitializeFromPalette(IWICPalette *iface,
-    IWICPalette *pIPalette)
+    IWICPalette *source)
 {
-    FIXME("(%p,%p): stub\n", iface, pIPalette);
-    return E_NOTIMPL;
+    PaletteImpl *This = impl_from_IWICPalette(iface);
+    UINT count;
+    WICColor *colors = NULL;
+    WICBitmapPaletteType type;
+    HRESULT hr;
+
+    TRACE("(%p,%p)\n", iface, source);
+
+    if (!source) return E_INVALIDARG;
+
+    hr = IWICPalette_GetType(source, &type);
+    if (hr != S_OK) return hr;
+    hr = IWICPalette_GetColorCount(source, &count);
+    if (hr != S_OK) return hr;
+    if (count)
+    {
+        colors = HeapAlloc(GetProcessHeap(), 0, sizeof(WICColor) * count);
+        if (!colors) return E_OUTOFMEMORY;
+        hr = IWICPalette_GetColors(source, count, colors, &count);
+        if (hr != S_OK) return hr;
+    }
+
+    EnterCriticalSection(&This->lock);
+    HeapFree(GetProcessHeap(), 0, This->colors);
+    This->colors = colors;
+    This->count = count;
+    This->type = type;
+    LeaveCriticalSection(&This->lock);
+
+    return S_OK;
 }
 
 static HRESULT WINAPI PaletteImpl_GetType(IWICPalette *iface,
diff --git a/dlls/windowscodecs/tests/palette.c b/dlls/windowscodecs/tests/palette.c
index 499d59d..e3b9a31 100644
--- a/dlls/windowscodecs/tests/palette.c
+++ b/dlls/windowscodecs/tests/palette.c
@@ -30,7 +30,7 @@
 static void test_custom_palette(void)
 {
     IWICImagingFactory *factory;
-    IWICPalette *palette;
+    IWICPalette *palette, *palette2;
     HRESULT hr;
     WICBitmapPaletteType type=0xffffffff;
     UINT count=1;
@@ -106,6 +106,29 @@ static void test_custom_palette(void)
         ok(SUCCEEDED(hr), "IsGrayscale failed, hr=%x\n", hr);
         ok(!boolresult, "expected FALSE, got TRUE\n");
 
+        hr = IWICImagingFactory_CreatePalette(factory, &palette2);
+        ok(SUCCEEDED(hr), "CreatePalette failed, hr=%x\n", hr);
+
+        hr = IWICPalette_InitializeFromPalette(palette2, palette);
+        ok(SUCCEEDED(hr), "InitializeFromPalette failed, hr=%x\n", hr);
+
+        type = 0xdeadbeef;
+        hr = IWICPalette_GetType(palette2, &type);
+        ok(SUCCEEDED(hr), "GetType failed, hr=%x\n", hr);
+        ok(type == WICBitmapPaletteTypeCustom, "expected WICBitmapPaletteTypeCustom, got %x\n", type);
+
+        count = 0xdeadbeef;
+        hr = IWICPalette_GetColorCount(palette2, &count);
+        ok(SUCCEEDED(hr), "GetColorCount failed, hr=%x\n", hr);
+        ok(count == 4, "expected 4, got %u\n", count);
+
+        memset(colors, 0, sizeof(colors));
+        count = 0xdeadbeef;
+        hr = IWICPalette_GetColors(palette2, 4, colors, &count);
+        ok(SUCCEEDED(hr), "GetColors failed, hr=%x\n", hr);
+        ok(count == 4, "expected 4, got %u\n", count);
+        ok(!memcmp(colors, initcolors, sizeof(colors)), "got unexpected palette data\n");
+
         /* try a palette with some alpha in it */
         colors[2] = 0x80ffffff;
         hr = IWICPalette_InitializeCustom(palette, colors, 4);
@@ -119,6 +142,40 @@ static void test_custom_palette(void)
         hr = IWICPalette_InitializeCustom(palette, NULL, 0);
         ok(SUCCEEDED(hr), "InitializeCustom failed, hr=%x\n", hr);
 
+        type = 0xdeadbeef;
+        hr = IWICPalette_GetType(palette, &type);
+        ok(SUCCEEDED(hr), "GetType failed, hr=%x\n", hr);
+        ok(type == WICBitmapPaletteTypeCustom, "expected WICBitmapPaletteTypeCustom, got %x\n", type);
+
+        count = 0xdeadbeef;
+        hr = IWICPalette_GetColorCount(palette, &count);
+        ok(SUCCEEDED(hr), "GetColorCount failed, hr=%x\n", hr);
+        ok(count == 0, "expected 0, got %u\n", count);
+
+        count = 0xdeadbeef;
+        hr = IWICPalette_GetColors(palette, 4, colors, &count);
+        ok(SUCCEEDED(hr), "GetColors failed, hr=%x\n", hr);
+        ok(count == 0, "expected 0, got %u\n", count);
+
+        hr = IWICPalette_InitializeFromPalette(palette2, palette);
+        ok(SUCCEEDED(hr), "InitializeFromPalette failed, hr=%x\n", hr);
+
+        type = 0xdeadbeef;
+        hr = IWICPalette_GetType(palette2, &type);
+        ok(SUCCEEDED(hr), "GetType failed, hr=%x\n", hr);
+        ok(type == WICBitmapPaletteTypeCustom, "expected WICBitmapPaletteTypeCustom, got %x\n", type);
+
+        count = 0xdeadbeef;
+        hr = IWICPalette_GetColorCount(palette2, &count);
+        ok(SUCCEEDED(hr), "GetColorCount failed, hr=%x\n", hr);
+        ok(count == 0, "expected 0, got %u\n", count);
+
+        memset(colors, 0, sizeof(colors));
+        count = 0xdeadbeef;
+        hr = IWICPalette_GetColors(palette2, 4, colors, &count);
+        ok(SUCCEEDED(hr), "GetColors failed, hr=%x\n", hr);
+        ok(count == 0, "expected 0, got %u\n", count);
+
         /* IWICPalette is paranoid about NULL pointers */
         hr = IWICPalette_GetType(palette, NULL);
         ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got %x\n", hr);
@@ -144,6 +201,10 @@ static void test_custom_palette(void)
         hr = IWICPalette_IsGrayscale(palette, NULL);
         ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got %x\n", hr);
 
+        hr = IWICPalette_InitializeFromPalette(palette, NULL);
+        ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got %x\n", hr);
+
+        IWICPalette_Release(palette2);
         IWICPalette_Release(palette);
     }
 




More information about the wine-cvs mailing list