From: Ziqing Hui Subject: [PATCH 8/8] windowscodecs: Support uncompressed format in DdsFrameDecode_CopyPixels(). Message-Id: Date: Tue, 25 Aug 2020 22:02:05 +0800 Signed-off-by: Ziqing Hui --- dlls/windowscodecs/ddsformat.c | 20 ++++++++++++-------- dlls/windowscodecs/tests/ddsformat.c | 11 ++++++----- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/dlls/windowscodecs/ddsformat.c b/dlls/windowscodecs/ddsformat.c index 72c884b0ed..757c312977 100644 --- a/dlls/windowscodecs/ddsformat.c +++ b/dlls/windowscodecs/ddsformat.c @@ -687,7 +687,7 @@ static ULONG WINAPI DdsFrameDecode_Release(IWICBitmapFrameDecode *iface) TRACE("(%p) refcount=%u\n", iface, ref); if (ref == 0) { - HeapFree(GetProcessHeap(), 0, This->pixel_data); + if (This->pixel_data != This->block_data) HeapFree(GetProcessHeap(), 0, This->pixel_data); HeapFree(GetProcessHeap(), 0, This->block_data); HeapFree(GetProcessHeap(), 0, This); } @@ -746,7 +746,7 @@ static HRESULT WINAPI DdsFrameDecode_CopyPixels(IWICBitmapFrameDecode *iface, DdsFrameDecode *This = impl_from_IWICBitmapFrameDecode(iface); UINT bpp, frame_stride, frame_size; INT x, y, width, height; - HRESULT hr = S_OK; + HRESULT hr; TRACE("(%p,%s,%u,%u,%p)\n", iface, debug_wic_rect(prc), cbStride, cbBufferSize, pbBuffer); @@ -777,13 +777,17 @@ static HRESULT WINAPI DdsFrameDecode_CopyPixels(IWICBitmapFrameDecode *iface, EnterCriticalSection(&This->lock); if (!This->pixel_data) { - This->pixel_data = HeapAlloc(GetProcessHeap(), 0, frame_size); - if (!This->pixel_data) { - hr = E_OUTOFMEMORY; - goto end; + if (is_compressed(This->info.format)) { + This->pixel_data = HeapAlloc(GetProcessHeap(), 0, frame_size); + if (!This->pixel_data) { + hr = E_OUTOFMEMORY; + goto end; + } + decode_block(This->block_data, This->info.width_in_blocks * This->info.height_in_blocks, This->info.format, + This->info.width, This->info.height, (DWORD *)This->pixel_data); + } else { + This->pixel_data = This->block_data; } - decode_block(This->block_data, This->info.width_in_blocks * This->info.height_in_blocks, This->info.format, - This->info.width, This->info.height, (DWORD *)This->pixel_data); } hr = copy_pixels(bpp, This->pixel_data, This->info.width, This->info.height, frame_stride, diff --git a/dlls/windowscodecs/tests/ddsformat.c b/dlls/windowscodecs/tests/ddsformat.c index 1a7ef95ada..6ba3035dce 100644 --- a/dlls/windowscodecs/tests/ddsformat.c +++ b/dlls/windowscodecs/tests/ddsformat.c @@ -1051,11 +1051,6 @@ static void test_dds_decoder_frame_data(IWICBitmapFrameDecode* frame, IWICDdsFra /* CopyPixels tests */ - if (!is_compressed(format_info.DxgiFormat)) { - skip("Skip CopyPixels tests for uncompressed image\n"); - return; - } - bpp = test_data[i].pixel_format_bpp; stride = rect.Width * bpp / 8; frame_stride = frame_width * bpp / 8; @@ -1064,6 +1059,8 @@ static void test_dds_decoder_frame_data(IWICBitmapFrameDecode* frame, IWICDdsFra hr = IWICBitmapFrameDecode_CopyPixels(frame, NULL, 0, 0, NULL); ok(hr == E_INVALIDARG, "Test %u, frame %u: CopyPixels got unexpected hr %#x\n", i, frame_index, hr); + todo_wine_if(IsEqualGUID(test_data[i].expected_pixel_format, &GUID_WICPixelFormat24bppBGR) || + IsEqualGUID(test_data[i].expected_pixel_format, &GUID_WICPixelFormat96bppRGBFloat)) { hr = IWICBitmapFrameDecode_CopyPixels(frame, &rect_test_a, stride, sizeof(buffer), buffer); ok(hr == E_INVALIDARG, "Test %u, frame %u: CopyPixels got unexpected hr %#x\n", i, frame_index, hr); hr = IWICBitmapFrameDecode_CopyPixels(frame, &rect_test_b, stride, sizeof(buffer), buffer); @@ -1100,6 +1097,7 @@ static void test_dds_decoder_frame_data(IWICBitmapFrameDecode* frame, IWICDdsFra ok(hr == WINCODEC_ERR_INSUFFICIENTBUFFER, "Test %u, frame %u: CopyPixels got unexpected hr %#x\n", i, frame_index, hr); hr = IWICBitmapFrameDecode_CopyPixels(frame, &rect, stride, stride * rect.Height, buffer); ok(hr == S_OK, "Test %u, frame %u: CopyPixels got unexpected hr %#x\n", i, frame_index, hr); + } hr = IWICBitmapFrameDecode_CopyPixels(frame, &rect, stride, sizeof(buffer), NULL); ok(hr == E_INVALIDARG, "Test %u, frame %u: CopyBlocks got unexpected hr %#x\n", i, frame_index, hr); @@ -1111,6 +1109,8 @@ static void test_dds_decoder_frame_data(IWICBitmapFrameDecode* frame, IWICDdsFra memcpy(pixels, test_data[i].data + block_offset, frame_size); } + todo_wine_if(IsEqualGUID(test_data[i].expected_pixel_format, &GUID_WICPixelFormat24bppBGR) || + IsEqualGUID(test_data[i].expected_pixel_format, &GUID_WICPixelFormat96bppRGBFloat)) { hr = IWICBitmapFrameDecode_CopyPixels(frame, &rect, stride, sizeof(buffer), buffer); ok(hr == S_OK, "Test %u, frame %u: CopyPixels failed, hr %#x\n", i, frame_index, hr); if (hr == S_OK) { @@ -1134,6 +1134,7 @@ static void test_dds_decoder_frame_data(IWICBitmapFrameDecode* frame, IWICDdsFra "Test %u, frame %u: Pixels mismatch\n", i, frame_index); }; } + } } static void test_dds_decoder_frame(IWICBitmapDecoder *decoder, int i)