diff --git a/patches/patchinstall.sh b/patches/patchinstall.sh index cd5087e2..1938ab26 100755 --- a/patches/patchinstall.sh +++ b/patches/patchinstall.sh @@ -7919,12 +7919,15 @@ fi # | windowscodecs-IWICPalette_InitializeFromBitmap, windowscodecs-TIFF_Support # | # | Modified files: -# | * dlls/windowscodecs/converter.c, dlls/windowscodecs/info.c, dlls/windowscodecs/regsvr.c +# | * dlls/windowscodecs/converter.c, dlls/windowscodecs/info.c, dlls/windowscodecs/regsvr.c, +# | dlls/windowscodecs/tests/converter.c # | if test "$enable_windowscodecs_32bppPRGBA" -eq 1; then patch_apply windowscodecs-32bppPRGBA/0001-windowscodecs-Add-support-for-32bppRGB-32bppRGBA-and.patch + patch_apply windowscodecs-32bppPRGBA/0002-windowscodecs-Fix-32bppRGB-to-32bppRGBA-conversion.patch ( printf '%s\n' '+ { "Dmitry Timoshkov", "windowscodecs: Add support for 32bppRGB, 32bppRGBA and 32bppPRGBA to format converter.", 1 },'; + printf '%s\n' '+ { "Dmitry Timoshkov", "windowscodecs: Fix 32bppRGB to 32bppRGBA conversion.", 1 },'; ) >> "$patchlist" fi diff --git a/patches/windowscodecs-32bppPRGBA/0002-windowscodecs-Fix-32bppRGB-to-32bppRGBA-conversion.patch b/patches/windowscodecs-32bppPRGBA/0002-windowscodecs-Fix-32bppRGB-to-32bppRGBA-conversion.patch new file mode 100644 index 00000000..d464cfcb --- /dev/null +++ b/patches/windowscodecs-32bppPRGBA/0002-windowscodecs-Fix-32bppRGB-to-32bppRGBA-conversion.patch @@ -0,0 +1,111 @@ +From ff6282f297e67822ee0def394a677a4fdc0fa609 Mon Sep 17 00:00:00 2001 +From: Dmitry Timoshkov +Date: Thu, 26 Jan 2017 19:01:21 +0800 +Subject: windowscodecs: Fix 32bppRGB to 32bppRGBA conversion. + +--- + dlls/windowscodecs/converter.c | 2 ++ + dlls/windowscodecs/tests/converter.c | 45 +++++++++++++++++++++++++++++++++++- + 2 files changed, 46 insertions(+), 1 deletion(-) + +diff --git a/dlls/windowscodecs/converter.c b/dlls/windowscodecs/converter.c +index 519860d9065..1378c85bc2d 100644 +--- a/dlls/windowscodecs/converter.c ++++ b/dlls/windowscodecs/converter.c +@@ -868,7 +868,9 @@ static HRESULT copypixels_to_32bppRGBA(struct FormatConverter *This, const WICRe + + switch (source_format) + { ++ case format_32bppRGB: + case format_32bppRGBA: ++ case format_32bppPRGBA: + if (prc) + return IWICBitmapSource_CopyPixels(This->source, prc, cbStride, cbBufferSize, pbBuffer); + return S_OK; +diff --git a/dlls/windowscodecs/tests/converter.c b/dlls/windowscodecs/tests/converter.c +index 1cafe90c734..17724d9ed01 100644 +--- a/dlls/windowscodecs/tests/converter.c ++++ b/dlls/windowscodecs/tests/converter.c +@@ -291,6 +291,21 @@ static BOOL compare_bits(const struct bitmap_data *expect, UINT buffersize, cons + if (!equal && expect->alt_data) + equal = compare_bits(expect->alt_data, buffersize, converted_bits); + ++ if (!equal && winetest_debug > 1) ++ { ++ UINT i, bps; ++ bps = expect->bpp / 8; ++ if (!bps) bps = buffersize; ++ printf("converted_bits (%u bytes):\n ", buffersize); ++ for (i = 0; i < buffersize; i++) ++ { ++ printf("%u,", converted_bits[i]); ++ if (!((i + 1) % 32)) printf("\n "); ++ else if (!((i+1) % bps)) printf(" "); ++ } ++ printf("\n"); ++ } ++ + return equal; + } + +@@ -438,6 +453,10 @@ static const BYTE bits_32bppBGR[] = { + 0,255,255,80, 255,0,255,80, 255,255,0,80, 255,255,255,80, 0,255,255,80, 255,0,255,80, 255,255,0,80, 255,255,255,80}; + static const struct bitmap_data testdata_32bppBGR = { + &GUID_WICPixelFormat32bppBGR, 32, bits_32bppBGR, 32, 2, 96.0, 96.0}; ++static const struct bitmap_data testdata_32bppBGRA80 = { ++ &GUID_WICPixelFormat32bppBGRA, 32, bits_32bppBGR, 32, 2, 96.0, 96.0}; ++static const struct bitmap_data testdata_32bppRGBA80 = { ++ &GUID_WICPixelFormat32bppRGBA, 32, bits_32bppBGR, 32, 2, 96.0, 96.0}; + + static const BYTE bits_32bppBGRA[] = { + 255,0,0,255, 0,255,0,255, 0,0,255,255, 0,0,0,255, 255,0,0,255, 0,255,0,255, 0,0,255,255, 0,0,0,255, +@@ -450,6 +469,24 @@ static const BYTE bits_32bppBGRA[] = { + 0,255,255,255, 255,0,255,255, 255,255,0,255, 255,255,255,255, 0,255,255,255, 255,0,255,255, 255,255,0,255, 255,255,255,255}; + static const struct bitmap_data testdata_32bppBGRA = { + &GUID_WICPixelFormat32bppBGRA, 32, bits_32bppBGRA, 32, 2, 96.0, 96.0}; ++static const struct bitmap_data testdata_32bppRGBA = { ++ &GUID_WICPixelFormat32bppRGBA, 32, bits_32bppBGRA, 32, 2, 96.0, 96.0}; ++static const struct bitmap_data testdata_32bppRGB = { ++ &GUID_WICPixelFormat32bppRGB, 32, bits_32bppBGRA, 32, 2, 96.0, 96.0}; ++ ++static const BYTE bits_32bppPBGRA[] = { ++ 80,0,0,80, 0,80,0,80, 0,0,80,80, 0,0,0,80, 80,0,0,80, 0,80,0,80, 0,0,80,80, 0,0,0,80, ++ 80,0,0,80, 0,80,0,80, 0,0,80,80, 0,0,0,80, 80,0,0,80, 0,80,0,80, 0,0,80,80, 0,0,0,80, ++ 80,0,0,80, 0,80,0,80, 0,0,80,80, 0,0,0,80, 80,0,0,80, 0,80,0,80, 0,0,80,80, 0,0,0,80, ++ 80,0,0,80, 0,80,0,80, 0,0,80,80, 0,0,0,80, 80,0,0,80, 0,80,0,80, 0,0,80,80, 0,0,0,80, ++ 0,80,80,80, 80,0,80,80, 80,80,0,80, 80,80,80,80, 0,80,80,80, 80,0,80,80, 80,80,0,80, 80,80,80,80, ++ 0,80,80,80, 80,0,80,80, 80,80,0,80, 80,80,80,80, 0,80,80,80, 80,0,80,80, 80,80,0,80, 80,80,80,80, ++ 0,80,80,80, 80,0,80,80, 80,80,0,80, 80,80,80,80, 0,80,80,80, 80,0,80,80, 80,80,0,80, 80,80,80,80, ++ 0,80,80,80, 80,0,80,80, 80,80,0,80, 80,80,80,80, 0,80,80,80, 80,0,80,80, 80,80,0,80, 80,80,80,80}; ++static const struct bitmap_data testdata_32bppPBGRA = { ++ &GUID_WICPixelFormat32bppPBGRA, 32, bits_32bppPBGRA, 32, 2, 96.0, 96.0}; ++static const struct bitmap_data testdata_32bppPRGBA = { ++ &GUID_WICPixelFormat32bppPRGBA, 32, bits_32bppPBGRA, 32, 2, 96.0, 96.0}; + + /* XP and 2003 use linear color conversion, later versions use sRGB gamma */ + static const float bits_32bppGrayFloat_xp[] = { +@@ -515,7 +552,7 @@ static void test_conversion(const struct bitmap_data *src, const struct bitmap_d + hr = WICConvertBitmapSource(dst->format, &src_obj->IWICBitmapSource_iface, &dst_bitmap); + todo_wine_if (todo) + ok(hr == S_OK || +- broken(hr == E_INVALIDARG) /* XP */, "WICConvertBitmapSource(%s) failed, hr=%x\n", name, hr); ++ broken(hr == E_INVALIDARG || hr == WINCODEC_ERR_COMPONENTNOTFOUND) /* XP */, "WICConvertBitmapSource(%s) failed, hr=%x\n", name, hr); + + if (hr == S_OK) + { +@@ -1752,6 +1789,12 @@ START_TEST(converter) + test_conversion(&testdata_32bppBGRA, &testdata_32bppBGR, "BGRA -> BGR", FALSE); + test_conversion(&testdata_32bppBGR, &testdata_32bppBGRA, "BGR -> BGRA", FALSE); + test_conversion(&testdata_32bppBGRA, &testdata_32bppBGRA, "BGRA -> BGRA", FALSE); ++ test_conversion(&testdata_32bppBGRA80, &testdata_32bppPBGRA, "BGRA -> PBGRA", FALSE); ++ ++ test_conversion(&testdata_32bppRGBA, &testdata_32bppRGB, "RGBA -> RGB", FALSE); ++ test_conversion(&testdata_32bppRGB, &testdata_32bppRGBA, "RGB -> RGBA", FALSE); ++ test_conversion(&testdata_32bppRGBA, &testdata_32bppRGBA, "RGBA -> RGBA", FALSE); ++ test_conversion(&testdata_32bppRGBA80, &testdata_32bppPRGBA, "RGBA -> PRGBA", FALSE); + + test_conversion(&testdata_24bppBGR, &testdata_24bppBGR, "24bppBGR -> 24bppBGR", FALSE); + test_conversion(&testdata_24bppBGR, &testdata_24bppRGB, "24bppBGR -> 24bppRGB", FALSE); +-- +2.11.0 +