windowscodecs/tests: Add tests for DdsDecoder_GetFrame() and DdsFrameDecode_GetSize().
Signed-off-by: Ziqing Hui <zhui@codeweavers.com> Signed-off-by: Vincent Povirk <vincent@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
234fa052e8
commit
ff9b2936ed
|
@ -120,6 +120,21 @@ static BYTE test_dds_array[] = {
|
|||
0xCC, 0x55, 0xCC, 0x55, 0x0E, 0x84, 0x0E, 0x84, 0x00, 0x00, 0x00, 0x00
|
||||
};
|
||||
|
||||
static struct test_data {
|
||||
void *data;
|
||||
UINT size;
|
||||
UINT expected_frame_count;
|
||||
WICDdsParameters expected_parameters;
|
||||
} test_data[] = {
|
||||
{ test_dds_image, sizeof(test_dds_image), 1,
|
||||
{ 4, 4, 1, 1, 1, DXGI_FORMAT_BC1_UNORM, WICDdsTexture2D, WICDdsAlphaModePremultiplied } },
|
||||
{ test_dds_mipmaps, sizeof(test_dds_mipmaps), 3,
|
||||
{ 4, 4, 1, 3, 1, DXGI_FORMAT_BC1_UNORM, WICDdsTexture2D, WICDdsAlphaModePremultiplied } },
|
||||
{ test_dds_volume, sizeof(test_dds_volume), 7,
|
||||
{ 4, 4, 4, 3, 1, DXGI_FORMAT_BC1_UNORM, WICDdsTexture3D, WICDdsAlphaModePremultiplied } },
|
||||
{ test_dds_array, sizeof(test_dds_array), 9,
|
||||
{ 4, 4, 1, 3, 3, DXGI_FORMAT_BC1_UNORM, WICDdsTexture2D, WICDdsAlphaModeUnknown } },
|
||||
};
|
||||
|
||||
static IWICImagingFactory *factory = NULL;
|
||||
|
||||
|
@ -278,22 +293,6 @@ static void test_dds_decoder_global_properties(IWICBitmapDecoder *decoder)
|
|||
|
||||
static void test_dds_decoder_image_parameters(void)
|
||||
{
|
||||
static struct test_data {
|
||||
void *data;
|
||||
UINT size;
|
||||
UINT expected_frame_count;
|
||||
WICDdsParameters expected_parameters;
|
||||
} test_data[] = {
|
||||
{ test_dds_image, sizeof(test_dds_image), 1,
|
||||
{ 4, 4, 1, 1, 1, DXGI_FORMAT_BC1_UNORM, WICDdsTexture2D, WICDdsAlphaModePremultiplied } },
|
||||
{ test_dds_mipmaps, sizeof(test_dds_mipmaps), 3,
|
||||
{ 4, 4, 1, 3, 1, DXGI_FORMAT_BC1_UNORM, WICDdsTexture2D, WICDdsAlphaModePremultiplied } },
|
||||
{ test_dds_volume, sizeof(test_dds_volume), 7,
|
||||
{ 4, 4, 4, 3, 1, DXGI_FORMAT_BC1_UNORM, WICDdsTexture3D, WICDdsAlphaModePremultiplied } },
|
||||
{ test_dds_array, sizeof(test_dds_array), 9,
|
||||
{ 4, 4, 1, 3, 3, DXGI_FORMAT_BC1_UNORM, WICDdsTexture2D, WICDdsAlphaModeUnknown } },
|
||||
};
|
||||
|
||||
int i;
|
||||
HRESULT hr;
|
||||
WICDdsParameters parameters;
|
||||
|
@ -368,28 +367,94 @@ static void test_dds_decoder_image_parameters(void)
|
|||
}
|
||||
}
|
||||
|
||||
static void test_dds_decoder(void)
|
||||
static void test_dds_decoder_frame_size(IWICBitmapDecoder *decoder, IWICBitmapFrameDecode *frame_decode,
|
||||
UINT frame_count, int i, int frame_index)
|
||||
{
|
||||
HRESULT hr;
|
||||
IWICStream *stream = NULL;
|
||||
IWICBitmapDecoder *decoder = NULL;
|
||||
WICDdsParameters params;
|
||||
IWICDdsDecoder *dds_decoder;
|
||||
UINT width, height ,expected_width, expected_height, slice_index, depth;
|
||||
|
||||
stream = create_stream(test_dds_image, sizeof(test_dds_image));
|
||||
if (!stream) goto end;
|
||||
|
||||
decoder = create_decoder();
|
||||
if (!decoder) goto end;
|
||||
|
||||
hr = init_decoder(decoder, stream, S_OK, -1);
|
||||
hr = IWICBitmapDecoder_QueryInterface(decoder, &IID_IWICDdsDecoder, (void **)&dds_decoder);
|
||||
ok(hr == S_OK, "%d: QueryInterface failed, hr=%x\n", i, hr);
|
||||
if (hr != S_OK) goto end;
|
||||
hr = IWICDdsDecoder_GetParameters(dds_decoder, ¶ms);
|
||||
ok (hr == S_OK, "%d: GetParameters failed, hr=%x\n", i, hr);
|
||||
if (hr != S_OK) goto end;
|
||||
|
||||
test_dds_decoder_initialize();
|
||||
test_dds_decoder_global_properties(decoder);
|
||||
test_dds_decoder_image_parameters();
|
||||
hr = IWICBitmapFrameDecode_GetSize(frame_decode, &width, &height);
|
||||
todo_wine ok (hr == S_OK, "%d: GetSize failed for frame %d, hr=%x\n", i, frame_index, hr);
|
||||
if (hr != S_OK) goto end;
|
||||
|
||||
depth = params.Depth;
|
||||
expected_width = params.Width;
|
||||
expected_height = params.Height;
|
||||
slice_index = frame_index % (frame_count / params.ArraySize);
|
||||
while (slice_index >= depth)
|
||||
{
|
||||
if (expected_width > 1) expected_width /= 2;
|
||||
if (expected_height > 1) expected_height /= 2;
|
||||
slice_index -= depth;
|
||||
if (depth > 1) depth /= 2;
|
||||
}
|
||||
ok (width == expected_width, "%d: Expected width %d for frame %d, got %d\n", i, expected_width, frame_index, width);
|
||||
ok (height == expected_height, "%d: Expected height %d for frame %d, got %d\n", i, expected_height, frame_index, height);
|
||||
|
||||
end:
|
||||
if (decoder) IWICBitmapDecoder_Release(decoder);
|
||||
if (stream) IWICStream_Release(stream);
|
||||
if (dds_decoder) IWICDdsDecoder_Release(dds_decoder);
|
||||
}
|
||||
|
||||
static void test_dds_decoder_frame(IWICBitmapDecoder *decoder, int i)
|
||||
{
|
||||
HRESULT hr;
|
||||
UINT frame_count, j;
|
||||
|
||||
hr = IWICBitmapDecoder_GetFrameCount(decoder, &frame_count);
|
||||
ok (hr == S_OK, "%d: GetFrameCount failed, hr=%x\n", i, hr);
|
||||
if (hr != S_OK) return;
|
||||
|
||||
for (j = 0; j < frame_count; j++)
|
||||
{
|
||||
IWICBitmapFrameDecode *frame_decode = NULL;
|
||||
|
||||
hr = IWICBitmapDecoder_GetFrame(decoder, j, &frame_decode);
|
||||
ok (hr == S_OK, "%d: GetFrame failed for frame %d, hr=%x\n", i, j, hr);
|
||||
if (hr != S_OK) {
|
||||
IWICBitmapFrameDecode_Release(frame_decode);
|
||||
continue;
|
||||
}
|
||||
|
||||
test_dds_decoder_frame_size(decoder, frame_decode, frame_count, i, j);
|
||||
}
|
||||
}
|
||||
|
||||
static void test_dds_decoder(void)
|
||||
{
|
||||
int i;
|
||||
HRESULT hr;
|
||||
|
||||
test_dds_decoder_initialize();
|
||||
test_dds_decoder_image_parameters();
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(test_data); i++)
|
||||
{
|
||||
IWICStream *stream = NULL;
|
||||
IWICBitmapDecoder *decoder = NULL;
|
||||
|
||||
stream = create_stream(test_data[i].data, test_data[i].size);
|
||||
if (!stream) goto next;
|
||||
decoder = create_decoder();
|
||||
if (!decoder) goto next;
|
||||
hr = init_decoder(decoder, stream, S_OK, -1);
|
||||
if (hr != S_OK) goto next;
|
||||
|
||||
test_dds_decoder_global_properties(decoder);
|
||||
test_dds_decoder_frame(decoder, i);
|
||||
|
||||
next:
|
||||
if (decoder) IWICBitmapDecoder_Release(decoder);
|
||||
if (stream) IWICStream_Release(stream);
|
||||
}
|
||||
}
|
||||
|
||||
START_TEST(ddsformat)
|
||||
|
|
Loading…
Reference in New Issue