Module: wine Branch: master Commit: ca9d128ecaaa07ce057af709039e25fcf92ab4bf URL: http://source.winehq.org/git/wine.git/?a=commit;h=ca9d128ecaaa07ce057af70903...
Author: Dmitry Timoshkov dmitry@baikal.ru Date: Thu Jul 12 16:06:29 2012 +0900
windowscodecs: Add support for generating WICBitmapPaletteTypeFixedBW palette. Resend.
---
dlls/windowscodecs/palette.c | 33 ++++++++++++++- dlls/windowscodecs/tests/palette.c | 74 ++++++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+), 3 deletions(-)
diff --git a/dlls/windowscodecs/palette.c b/dlls/windowscodecs/palette.c index ec74d13..8941fb5 100644 --- a/dlls/windowscodecs/palette.c +++ b/dlls/windowscodecs/palette.c @@ -99,10 +99,37 @@ static ULONG WINAPI PaletteImpl_Release(IWICPalette *iface) }
static HRESULT WINAPI PaletteImpl_InitializePredefined(IWICPalette *iface, - WICBitmapPaletteType ePaletteType, BOOL fAddTransparentColor) + WICBitmapPaletteType type, BOOL add_transparent) { - FIXME("(%p,%u,%i): stub\n", iface, ePaletteType, fAddTransparentColor); - return E_NOTIMPL; + PaletteImpl *This = impl_from_IWICPalette(iface); + WICColor *colors; + UINT count; + + TRACE("(%p,%u,%d)\n", iface, type, add_transparent); + + switch (type) + { + case WICBitmapPaletteTypeFixedBW: + count = 2; + colors = HeapAlloc(GetProcessHeap(), 0, count * sizeof(WICColor)); + if (!colors) return E_OUTOFMEMORY; + colors[0] = 0xff000000; + colors[1] = 0xffffffff; + break; + + default: + FIXME("(%p,%u,%d): stub\n", iface, type, add_transparent); + return E_NOTIMPL; + } + + 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_InitializeCustom(IWICPalette *iface, diff --git a/dlls/windowscodecs/tests/palette.c b/dlls/windowscodecs/tests/palette.c index ee9dfbc..7a34be7 100644 --- a/dlls/windowscodecs/tests/palette.c +++ b/dlls/windowscodecs/tests/palette.c @@ -148,11 +148,85 @@ static void test_custom_palette(void) IWICImagingFactory_Release(factory); }
+static void test_predefined_palette(void) +{ + static struct test_data + { + WICBitmapPaletteType type; + BOOL is_bw, is_gray; + UINT count; + WICColor color[256]; + } td[] = + { + { WICBitmapPaletteTypeFixedBW, 1, 1, 2, { 0xff000000, 0xffffffff } }, + }; + IWICImagingFactory *factory; + IWICPalette *palette; + HRESULT hr; + WICBitmapPaletteType type; + UINT count, i, ret; + BOOL bret; + WICColor color[256]; + + hr = CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, + &IID_IWICImagingFactory, (void **)&factory); + ok(hr == S_OK, "CoCreateInstance error %#x\n", hr); + + for (i = 0; i < sizeof(td)/sizeof(td[0]); i++) + { + hr = IWICImagingFactory_CreatePalette(factory, &palette); + ok(hr == S_OK, "%u: CreatePalette error %#x\n", i, hr); + + hr = IWICPalette_InitializePredefined(palette, td[i].type, FALSE); + ok(hr == S_OK, "%u: InitializePredefined error %#x\n", i, hr); + + bret = -1; + hr = IWICPalette_IsBlackWhite(palette, &bret); + ok(hr == S_OK, "%u: IsBlackWhite error %#x\n", i, hr); + ok(bret == td[i].is_bw || + broken(td[i].type == WICBitmapPaletteTypeFixedBW && bret != td[i].is_bw), /* XP */ + "%u: expected %d, got %d\n",i, td[i].is_bw, bret); + + bret = -1; + hr = IWICPalette_IsGrayscale(palette, &bret); + ok(hr == S_OK, "%u: IsGrayscale error %#x\n", i, hr); + ok(bret == td[i].is_gray, "%u: expected %d, got %d\n", i, td[i].is_gray, bret); + + type = -1; + hr = IWICPalette_GetType(palette, &type); + ok(hr == S_OK, "%u: GetType error %#x\n", i, hr); + ok(type == td[i].type, "%u: expected %#x, got %#x\n", i, td[i].type, type); + + count = 0xdeadbeef; + hr = IWICPalette_GetColorCount(palette, &count); + ok(hr == S_OK, "%u: GetColorCount error %#x\n", i, hr); + ok(count == td[i].count, "%u: expected %u, got %u\n", i, td[i].count, count); + + hr = IWICPalette_GetColors(palette, count, color, &ret); + ok(hr == S_OK, "%u: GetColors error %#x\n", i, hr); + ok(ret == count, "%u: expected %u, got %u\n", i, count, ret); + if (ret == td[i].count) + { + UINT j; + for (j = 0; j < count; j++) + { + ok(color[j] == td[i].color[j], "%u:[%u]: expected %#x, got %#x\n", + i, j, td[i].color[j], color[j]); + } + } + + IWICPalette_Release(palette); + } + + IWICImagingFactory_Release(factory); +} + START_TEST(palette) { CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
test_custom_palette(); + test_predefined_palette();
CoUninitialize(); }