From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/windowscodecs/converter.c | 49 ++++++++++++++++++++++++++++ dlls/windowscodecs/tests/converter.c | 15 +++++---- 2 files changed, 57 insertions(+), 7 deletions(-)
diff --git a/dlls/windowscodecs/converter.c b/dlls/windowscodecs/converter.c index c66329168ca..6083cdc3eb4 100644 --- a/dlls/windowscodecs/converter.c +++ b/dlls/windowscodecs/converter.c @@ -878,6 +878,55 @@ static HRESULT copypixels_to_32bppBGRA(struct FormatConverter *This, const WICRe } } return S_OK; + case format_128bppRGBAFloat: + if (prc) + { + HRESULT res; + INT x, y; + BYTE *srcdata; + UINT srcstride, srcdatasize; + const BYTE *srcrow; + const float *srcpixel; + BYTE *dstrow; + DWORD *dstpixel; + + srcstride = 16 * prc->Width; + srcdatasize = srcstride * prc->Height; + + srcdata = malloc(srcdatasize); + if (!srcdata) return E_OUTOFMEMORY; + + res = IWICBitmapSource_CopyPixels(This->source, prc, srcstride, srcdatasize, srcdata); + + if (SUCCEEDED(res)) + { + srcrow = srcdata; + dstrow = pbBuffer; + for (y = 0; y < prc->Height; y++) + { + srcpixel = (const float *)srcrow; + dstpixel = (DWORD *)dstrow; + for (x = 0; x < prc->Width; x++) + { + BYTE red, green, blue, alpha; + + red = (BYTE)floorf(to_sRGB_component(*srcpixel++) * 255.0f + 0.51f); + green = (BYTE)floorf(to_sRGB_component(*srcpixel++) * 255.0f + 0.51f); + blue = (BYTE)floorf(to_sRGB_component(*srcpixel++) * 255.0f + 0.51f); + alpha = (BYTE)floorf(*srcpixel++ * 255.0f + 0.51f); + + *dstpixel++ = alpha << 24 | red << 16 | green << 8 | blue; + } + srcrow += srcstride; + dstrow += cbStride; + } + } + + free(srcdata); + + return res; + } + return S_OK; default: FIXME("Unimplemented conversion path!\n"); return WINCODEC_ERR_UNSUPPORTEDOPERATION; diff --git a/dlls/windowscodecs/tests/converter.c b/dlls/windowscodecs/tests/converter.c index 527d6938a50..6ebe659f154 100644 --- a/dlls/windowscodecs/tests/converter.c +++ b/dlls/windowscodecs/tests/converter.c @@ -799,13 +799,13 @@ static void test_can_convert(void) {WIC_PIXEL_FORMAT(16bppBGRA5551), TRUE, TRUE, 33, TRUE}, {WIC_PIXEL_FORMAT(24bppBGR), TRUE, TRUE, 27}, {WIC_PIXEL_FORMAT(24bppRGB), TRUE, TRUE, 30}, - {WIC_PIXEL_FORMAT(32bppBGR), TRUE, TRUE, 15}, - {WIC_PIXEL_FORMAT(32bppBGRA), TRUE, TRUE, 15}, - {WIC_PIXEL_FORMAT(32bppPBGRA), TRUE, TRUE, 15}, - {WIC_PIXEL_FORMAT(32bppRGB), TRUE, TRUE, 13, TRUE}, - {WIC_PIXEL_FORMAT(32bppRGBA), TRUE, TRUE, 13, TRUE}, - {WIC_PIXEL_FORMAT(32bppPRGBA), TRUE, TRUE, 13, TRUE}, - {WIC_PIXEL_FORMAT(32bppGrayFloat), TRUE, TRUE, 14}, + {WIC_PIXEL_FORMAT(32bppBGR), TRUE, TRUE, 14}, + {WIC_PIXEL_FORMAT(32bppBGRA), TRUE, TRUE, 14}, + {WIC_PIXEL_FORMAT(32bppPBGRA), TRUE, TRUE, 14}, + {WIC_PIXEL_FORMAT(32bppRGB), TRUE, TRUE, 12, TRUE}, + {WIC_PIXEL_FORMAT(32bppRGBA), TRUE, TRUE, 12, TRUE}, + {WIC_PIXEL_FORMAT(32bppPRGBA), TRUE, TRUE, 12, TRUE}, + {WIC_PIXEL_FORMAT(32bppGrayFloat), TRUE, TRUE, 13},
{WIC_PIXEL_FORMAT(48bppRGB), TRUE, TRUE, 35}, {WIC_PIXEL_FORMAT(48bppBGR), TRUE, TRUE, 35, TRUE}, @@ -2333,6 +2333,7 @@ START_TEST(converter) test_conversion(&testdata_48bppRGB, &testdata_128bppRGBFloat, "48bppRGB -> 128bppRGBFloat", FALSE); test_conversion(&testdata_24bppBGR_2, &testdata_128bppRGBAFloat, "24bppBGR -> 128bppRGBAFloat", FALSE); test_conversion(&testdata_32bppBGRA_2, &testdata_128bppRGBAFloat_2, "32bppBGRA -> 128bppRGBAFloat", FALSE); + test_conversion(&testdata_128bppRGBAFloat_2, &testdata_32bppBGRA_2, "128bppRGBAFloat -> 32bppBGRA", FALSE);
test_invalid_conversion(); test_default_converter();