From: Dmitry Timoshkov <dmitry@baikal.ru> Wine-Bug: http://bugs.winehq.org/show_bug.cgi?id=59413 Signed-off-by: Dmitry Timoshkov <dmitry@baikal.ru> --- dlls/windowscodecs/converter.c | 39 ++++++++++++++++++++++++++-- dlls/windowscodecs/tests/converter.c | 32 +++++++++++++---------- 2 files changed, 55 insertions(+), 16 deletions(-) diff --git a/dlls/windowscodecs/converter.c b/dlls/windowscodecs/converter.c index 8c55cc1fa93..b805db3f643 100644 --- a/dlls/windowscodecs/converter.c +++ b/dlls/windowscodecs/converter.c @@ -1535,8 +1535,43 @@ static HRESULT copypixels_to_24bppBGR(struct FormatConverter *This, const WICRec return S_OK; default: - FIXME("Unimplemented conversion path! (%d)\n", source_format); - return WINCODEC_ERR_UNSUPPORTEDOPERATION; + { + UINT srcstride, srcdatasize; + const BYTE *srcpixel, *srcrow; + BYTE *dstpixel, *srcdata, *dstrow; + INT x, y; + + if (!prc) return S_OK; + + srcstride = 4 * prc->Width; + srcdatasize = srcstride * prc->Height; + + srcdata = malloc(srcdatasize); + if (!srcdata) return E_OUTOFMEMORY; + + hr = copypixels_to_32bppBGRA(This, prc, srcstride, srcdatasize, srcdata, source_format); + if (SUCCEEDED(hr)) + { + srcrow = srcdata; + dstrow = pbBuffer; + for (y = 0; y < prc->Height; y++) + { + srcpixel = srcrow; + dstpixel = dstrow; + for (x = 0; x < prc->Width; x++) + { + *dstpixel++ = *srcpixel++; + *dstpixel++ = *srcpixel++; + *dstpixel++ = *srcpixel++; + srcpixel++; + } + srcrow += srcstride; + dstrow += cbStride; + } + } + free(srcdata); + return hr; + } } } diff --git a/dlls/windowscodecs/tests/converter.c b/dlls/windowscodecs/tests/converter.c index fa0dd187d2a..02145629c13 100644 --- a/dlls/windowscodecs/tests/converter.c +++ b/dlls/windowscodecs/tests/converter.c @@ -331,7 +331,8 @@ static BOOL compare_bits(const struct bitmap_data *expect, UINT buffersize, cons static BOOL is_indexed_format(const GUID *format) { - if (IsEqualGUID(format, &GUID_WICPixelFormat1bppIndexed) || + if (IsEqualGUID(format, &GUID_WICPixelFormatBlackWhite) || + IsEqualGUID(format, &GUID_WICPixelFormat1bppIndexed) || IsEqualGUID(format, &GUID_WICPixelFormat2bppIndexed) || IsEqualGUID(format, &GUID_WICPixelFormat4bppIndexed) || IsEqualGUID(format, &GUID_WICPixelFormat8bppIndexed)) @@ -365,6 +366,17 @@ static void compare_bitmap_data(const struct bitmap_data *src, const struct bitm ok(SUCCEEDED(hr), "GetPixelFormat(%s) failed, hr=%lx\n", name, hr); ok(IsEqualGUID(&dst_pixelformat, expect->format), "got unexpected pixel format %s (%s)\n", wine_dbgstr_guid(&dst_pixelformat), name); + /* The result of conversion of color to indexed formats depends on + * optimized palette generation implementation. We either need to + * assign our own palette, or just skip the comparison. + */ + if ((is_indexed_format(src->format) != is_indexed_format(expect->format)) || + (is_indexed_format(src->format) && is_indexed_format(expect->format) && src->bpp != expect->bpp)) + { + skip("Skipping bits comparison for %s\n", name); + return; + } + prc.X = 0; prc.Y = 0; prc.Width = expect->width; @@ -377,21 +389,13 @@ static void compare_bitmap_data(const struct bitmap_data *src, const struct bitm memset(converted_bits, 0xaa, buffersize); hr = IWICBitmapSource_CopyPixels(source, &prc, stride, buffersize, converted_bits); ok(SUCCEEDED(hr), "CopyPixels(%s) failed, hr=%lx\n", name, hr); - - /* The result of conversion of color to indexed formats depends on - * optimized palette generation implementation. We either need to - * assign our own palette, or just skip the comparison. - */ - if (is_indexed_format(src->format) == is_indexed_format(expect->format)) - ok(compare_bits(expect, buffersize, converted_bits), "unexpected pixel data (%s)\n", name); + ok(compare_bits(expect, buffersize, converted_bits), "unexpected pixel data (%s)\n", name); /* Test with NULL rectangle - should copy the whole bitmap */ memset(converted_bits, 0xaa, buffersize); hr = IWICBitmapSource_CopyPixels(source, NULL, stride, buffersize, converted_bits); ok(SUCCEEDED(hr), "CopyPixels(%s,rc=NULL) failed, hr=%lx\n", name, hr); - /* see comment above */ - if (is_indexed_format(src->format) == is_indexed_format(expect->format)) - ok(compare_bits(expect, buffersize, converted_bits), "unexpected pixel data (%s)\n", name); + ok(compare_bits(expect, buffersize, converted_bits), "unexpected pixel data (%s)\n", name); HeapFree(GetProcessHeap(), 0, converted_bits); } @@ -2346,9 +2350,9 @@ START_TEST(converter) test_conversion(&testdata_BlackWhite, &testdata_1bppIndexed, "BlackWhite -> 1bppIndexed", FALSE); test_conversion(&testdata_BlackWhite, &testdata_8bppIndexed_BW, "BlackWhite -> 8bppIndexed", FALSE); test_conversion(&testdata_BlackWhite, &testdata_24bppBGR_BW, "BlackWhite -> 24bppBGR", FALSE); - test_conversion(&testdata_1bppIndexed, &testdata_8bppIndexed_BW, "1bppIndexed -> 8bppIndexed", TRUE); - test_conversion(&testdata_2bppIndexed, &testdata_8bppIndexed_4colors, "2bppIndexed -> 8bppIndexed", TRUE); - test_conversion(&testdata_4bppIndexed, &testdata_8bppIndexed, "4bppIndexed -> 8bppIndexed", TRUE); + test_conversion(&testdata_1bppIndexed, &testdata_8bppIndexed_BW, "1bppIndexed -> 8bppIndexed", FALSE); + test_conversion(&testdata_2bppIndexed, &testdata_8bppIndexed_4colors, "2bppIndexed -> 8bppIndexed", FALSE); + test_conversion(&testdata_4bppIndexed, &testdata_8bppIndexed, "4bppIndexed -> 8bppIndexed", FALSE); test_conversion(&testdata_8bppIndexed, &testdata_24bppRGB, "8bppIndexed -> 24bppRGB", FALSE); test_conversion(&testdata_8bppIndexed, &testdata_24bppBGR, "8bppIndexed -> 24bppBGR", FALSE); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10128