Ziqing Hui : windowscodecs: Introduce is_compressed(). And fix some format checks.
Alexandre Julliard
julliard at winehq.org
Mon Jul 20 15:30:08 CDT 2020
Module: wine
Branch: master
Commit: e74d39c32d4f49d9b983811772f3324bcbe3ce55
URL: https://source.winehq.org/git/wine.git/?a=commit;h=e74d39c32d4f49d9b983811772f3324bcbe3ce55
Author: Ziqing Hui <zhui at codeweavers.com>
Date: Sat Jul 18 11:15:38 2020 +0800
windowscodecs: Introduce is_compressed(). And fix some format checks.
Signed-off-by: Ziqing Hui <zhui at codeweavers.com>
Signed-off-by: Esme Povirk <esme at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/windowscodecs/ddsformat.c | 37 ++++++++++++++++++++++++++++--------
dlls/windowscodecs/tests/ddsformat.c | 5 ++---
2 files changed, 31 insertions(+), 11 deletions(-)
diff --git a/dlls/windowscodecs/ddsformat.c b/dlls/windowscodecs/ddsformat.c
index 41e92a2b48..5de3759527 100644
--- a/dlls/windowscodecs/ddsformat.c
+++ b/dlls/windowscodecs/ddsformat.c
@@ -105,7 +105,6 @@ typedef struct dds_info {
UINT frame_count;
UINT data_offset;
UINT bytes_per_block;
- BOOL compressed;
DXGI_FORMAT format;
WICDdsDimension dimension;
WICDdsAlphaMode alpha_mode;
@@ -187,6 +186,16 @@ static struct dds_format {
{ { sizeof(DDS_PIXELFORMAT), DDPF_LUMINANCE, 0, 8, 0xFF,0,0,0 }, DXGI_FORMAT_R8_UNORM }
};
+static DXGI_FORMAT compressed_formats[] = {
+ DXGI_FORMAT_BC1_TYPELESS, DXGI_FORMAT_BC1_UNORM, DXGI_FORMAT_BC1_UNORM_SRGB,
+ DXGI_FORMAT_BC2_TYPELESS, DXGI_FORMAT_BC2_UNORM, DXGI_FORMAT_BC2_UNORM_SRGB,
+ DXGI_FORMAT_BC3_TYPELESS, DXGI_FORMAT_BC3_UNORM, DXGI_FORMAT_BC3_UNORM_SRGB,
+ DXGI_FORMAT_BC4_TYPELESS, DXGI_FORMAT_BC4_UNORM, DXGI_FORMAT_BC4_SNORM,
+ DXGI_FORMAT_BC5_TYPELESS, DXGI_FORMAT_BC5_UNORM, DXGI_FORMAT_BC5_SNORM,
+ DXGI_FORMAT_BC6H_TYPELESS, DXGI_FORMAT_BC6H_UF16, DXGI_FORMAT_BC6H_SF16,
+ DXGI_FORMAT_BC7_TYPELESS, DXGI_FORMAT_BC7_UNORM, DXGI_FORMAT_BC7_UNORM_SRGB
+};
+
static HRESULT WINAPI DdsDecoder_Dds_GetFrame(IWICDdsDecoder *, UINT, UINT, UINT, IWICBitmapFrameDecode **);
static inline BOOL has_extended_header(DDS_HEADER *header)
@@ -273,13 +282,22 @@ static UINT get_bytes_per_block_from_format(DXGI_FORMAT format)
}
}
+static BOOL is_compressed(DXGI_FORMAT format)
+{
+ UINT i;
+
+ for (i = 0; i < ARRAY_SIZE(compressed_formats); i++)
+ {
+ if (format == compressed_formats[i]) return TRUE;
+ }
+ return FALSE;
+}
+
static void get_dds_info(dds_info* info, DDS_HEADER *header, DDS_HEADER_DXT10 *header_dxt10)
{
int i;
UINT depth;
- info->compressed = !(header->ddspf.flags & (DDPF_RGB | DDPF_LUMINANCE));
-
info->width = header->width;
info->height = header->height;
info->depth = 1;
@@ -303,10 +321,10 @@ static void get_dds_info(dds_info* info, DDS_HEADER *header, DDS_HEADER_DXT10 *h
info->pixel_format = (info->alpha_mode == WICDdsAlphaModePremultiplied) ?
&GUID_WICPixelFormat32bppPBGRA : &GUID_WICPixelFormat32bppBGRA;
- if (info->compressed) {
- info->bytes_per_block = get_bytes_per_block_from_format(info->format);
- } else {
+ if (header->ddspf.flags & (DDPF_RGB | DDPF_ALPHA | DDPF_LUMINANCE)) {
info->bytes_per_block = header->ddspf.rgbBitCount / 8;
+ } else {
+ info->bytes_per_block = get_bytes_per_block_from_format(info->format);
}
/* get frame count */
@@ -685,7 +703,10 @@ static HRESULT WINAPI DdsDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p
hr = IWICWineDecoder_Initialize(&This->IWICWineDecoder_iface, pIStream, cacheOptions);
if (FAILED(hr)) goto end;
- if (!This->info.compressed || This->info.dimension == WICDdsTextureCube) {
+ if (This->info.dimension == WICDdsTextureCube ||
+ (This->info.format != DXGI_FORMAT_BC1_UNORM &&
+ This->info.format != DXGI_FORMAT_BC2_UNORM &&
+ This->info.format != DXGI_FORMAT_BC3_UNORM)) {
IStream_Release(pIStream);
This->stream = NULL;
This->initialized = FALSE;
@@ -911,7 +932,7 @@ static HRESULT WINAPI DdsDecoder_Dds_GetFrame(IWICDdsDecoder *iface,
}
bytes_per_block = This->info.bytes_per_block;
- if (This->info.compressed) {
+ if (is_compressed(This->info.format)) {
block_width = DDS_BLOCK_WIDTH;
block_height = DDS_BLOCK_HEIGHT;
} else {
diff --git a/dlls/windowscodecs/tests/ddsformat.c b/dlls/windowscodecs/tests/ddsformat.c
index f1141c15a0..c5147c3327 100644
--- a/dlls/windowscodecs/tests/ddsformat.c
+++ b/dlls/windowscodecs/tests/ddsformat.c
@@ -331,7 +331,6 @@ static HRESULT init_decoder(IWICBitmapDecoder *decoder, IWICStream *stream, HRES
if (index == -1) {
ok(hr == S_OK || wine_init, "Decoder initialize failed, hr %#x\n", hr);
} else {
- todo_wine_if(index == 9 || index == 10 || index == 11)
ok(hr == expected, "Test %u: Expected hr %#x, got %#x\n", index, expected, hr);
}
@@ -608,7 +607,7 @@ static void test_dds_decoder_frame_properties(IWICBitmapFrameDecode *frame_decod
ok(format_info.DxgiFormat == test_data[i].expected_parameters.DxgiFormat,
"Test %u, frame %u: Expected DXGI format %#x, got %#x\n",
i, frame_index, test_data[i].expected_parameters.DxgiFormat, format_info.DxgiFormat);
- todo_wine_if(i == 4 || i == 5 || i == 6) {
+ todo_wine_if(i == 4 || i == 5 || i == 6)
ok(format_info.BytesPerBlock == test_data[i].expected_bytes_per_block,
"Test %u, frame %u: Expected bytes per block %u, got %u\n",
i, frame_index, test_data[i].expected_bytes_per_block, format_info.BytesPerBlock);
@@ -618,7 +617,7 @@ static void test_dds_decoder_frame_properties(IWICBitmapFrameDecode *frame_decod
ok(format_info.BlockHeight == expected_block_height,
"Test %u, frame %u: Expected block height %u, got %u\n",
i, frame_index, expected_block_height, format_info.BlockHeight);
- }
+
/* size in blocks tests */
More information about the wine-cvs
mailing list