From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/windowscodecs/converter.c | 43 ++++++++++++++++++++++++++++ dlls/windowscodecs/regsvr.c | 1 + dlls/windowscodecs/tests/converter.c | 9 +++++- 3 files changed, 52 insertions(+), 1 deletion(-)
diff --git a/dlls/windowscodecs/converter.c b/dlls/windowscodecs/converter.c index 6083cdc3eb4..c1c445a5bd4 100644 --- a/dlls/windowscodecs/converter.c +++ b/dlls/windowscodecs/converter.c @@ -1890,6 +1890,49 @@ static HRESULT copypixels_to_128bppRGBFloat(struct FormatConverter *This, const free(srcdata); return S_OK; } + case format_96bppRGBFloat: + { + UINT srcstride, srcdatasize; + const float *srcpixel; + const BYTE *srcrow; + float *dstpixel; + BYTE *srcdata; + BYTE *dstrow; + INT x, y; + + if (!prc) + return S_OK; + + srcstride = 12 * prc->Width; + srcdatasize = srcstride * prc->Height; + + srcdata = malloc(srcdatasize); + if (!srcdata) return E_OUTOFMEMORY; + + hr = IWICBitmapSource_CopyPixels(This->source, prc, srcstride, srcdatasize, srcdata); + if (SUCCEEDED(hr)) + { + srcrow = srcdata; + dstrow = pbBuffer; + for (y = 0; y < prc->Height; y++) + { + srcpixel = (const float *)srcrow; + dstpixel = (float *)dstrow; + for (x = 0; x < prc->Width; x++) + { + *dstpixel++ = *srcpixel++; + *dstpixel++ = *srcpixel++; + *dstpixel++ = *srcpixel++; + *dstpixel++ = 1.0f; + } + srcrow += srcstride; + dstrow += cbStride; + } + } + + free(srcdata); + return S_OK; + } default: FIXME("Unimplemented conversion path %d.\n", source_format); return WINCODEC_ERR_UNSUPPORTEDOPERATION; diff --git a/dlls/windowscodecs/regsvr.c b/dlls/windowscodecs/regsvr.c index 1cba56c058d..def5bac26b1 100644 --- a/dlls/windowscodecs/regsvr.c +++ b/dlls/windowscodecs/regsvr.c @@ -1683,6 +1683,7 @@ static GUID const * const converter_formats[] = { &GUID_WICPixelFormat48bppRGB, &GUID_WICPixelFormat64bppRGBA, &GUID_WICPixelFormat32bppCMYK, + &GUID_WICPixelFormat96bppRGBFloat, &GUID_WICPixelFormat128bppRGBFloat, &GUID_WICPixelFormat128bppRGBAFloat, NULL diff --git a/dlls/windowscodecs/tests/converter.c b/dlls/windowscodecs/tests/converter.c index 6ebe659f154..e020c70e160 100644 --- a/dlls/windowscodecs/tests/converter.c +++ b/dlls/windowscodecs/tests/converter.c @@ -666,6 +666,12 @@ static const WORD bits_64bppRGBA_2[] = { static const struct bitmap_data testdata_64bppRGBA_2 = { &GUID_WICPixelFormat64bppRGBA, 64, (BYTE*)bits_64bppRGBA_2, 3, 2, 96.0, 96.0};
+static const float bits_96bppRGBFloat[] = { + 0.0f,0.0f,0.0f, 0.0f,1.0f,0.0f, 0.214039f,0.214053f,0.214039f, + 1.0f,1.0f,1.0f, 0.000012f,0.000012f,0.000012f, 0.0f,0.0f,0.000012f}; +static const struct bitmap_data testdata_96bppRGBFloat = { + &GUID_WICPixelFormat96bppRGBFloat, 96, (const BYTE *)bits_96bppRGBFloat, 3, 2, 96.0, 96.0}; + static const float bits_128bppRGBFloat[] = { 0.0f,0.0f,0.0f,1.0f, 0.0f,1.0f,0.0f,1.0f, 0.214039f,0.214053f,0.214039f,1.0f, 1.0f,1.0f,1.0f,1.0f, 0.000012f,0.000012f,0.000012f,1.0f, 0.0f,0.0f,0.000012f,1.0f,}; @@ -823,7 +829,7 @@ static void test_can_convert(void) {WIC_PIXEL_FORMAT(96bppRGBFloat), TRUE, TRUE, 35, TRUE}, {WIC_PIXEL_FORMAT(128bppRGBAFloat), TRUE, TRUE, 33}, {WIC_PIXEL_FORMAT(128bppPRGBAFloat), TRUE, TRUE, 35}, - {WIC_PIXEL_FORMAT(128bppRGBFloat), TRUE, TRUE, 34}, + {WIC_PIXEL_FORMAT(128bppRGBFloat), TRUE, TRUE, 33},
{WIC_PIXEL_FORMAT(32bppCMYK)},
@@ -2333,6 +2339,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_96bppRGBFloat, &testdata_128bppRGBFloat, "96bppRGBFloat -> 128bppRGBFloat", FALSE); test_conversion(&testdata_128bppRGBAFloat_2, &testdata_32bppBGRA_2, "128bppRGBAFloat -> 32bppBGRA", FALSE);
test_invalid_conversion();