Dmitry Timoshkov : windowscodecs/tests: Add a test for 8bpp indexed TIFF format.
Alexandre Julliard
julliard at winehq.org
Wed Feb 20 16:37:00 CST 2019
Module: wine
Branch: master
Commit: 7e9c1784546d0ca0398050a4180e59f4de7cee32
URL: https://source.winehq.org/git/wine.git/?a=commit;h=7e9c1784546d0ca0398050a4180e59f4de7cee32
Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date: Tue Feb 19 12:06:55 2019 +0800
windowscodecs/tests: Add a test for 8bpp indexed TIFF format.
Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
Signed-off-by: Vincent Povirk <vincent at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/windowscodecs/tests/tiffformat.c | 187 +++++++++++++++++++++++++++++-----
1 file changed, 161 insertions(+), 26 deletions(-)
diff --git a/dlls/windowscodecs/tests/tiffformat.c b/dlls/windowscodecs/tests/tiffformat.c
index 7651ea1..2f9a0ca 100644
--- a/dlls/windowscodecs/tests/tiffformat.c
+++ b/dlls/windowscodecs/tests/tiffformat.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2012 Dmitry Timoshkov
+ * Copyright 2012,2016 Dmitry Timoshkov
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -145,6 +145,49 @@ static const struct tiff_8bpp_alpha
{ 0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88 }
};
+static const struct tiff_8bpp_data
+{
+ USHORT byte_order;
+ USHORT version;
+ ULONG dir_offset;
+ USHORT number_of_entries;
+ struct IFD_entry entry[14];
+ ULONG next_IFD;
+ struct IFD_rational res;
+ short palette_data[3][256];
+ BYTE pixel_data[4];
+} tiff_8bpp_data =
+{
+#ifdef WORDS_BIGENDIAN
+ 'M' | 'M' << 8,
+#else
+ 'I' | 'I' << 8,
+#endif
+ 42,
+ FIELD_OFFSET(struct tiff_8bpp_data, number_of_entries),
+ 14,
+ {
+ { 0xff, IFD_SHORT, 1, 0 }, /* SUBFILETYPE */
+ { 0x100, IFD_LONG, 1, 4 }, /* IMAGEWIDTH */
+ { 0x101, IFD_LONG, 1, 1 }, /* IMAGELENGTH */
+ { 0x102, IFD_SHORT, 1, 8 }, /* BITSPERSAMPLE: XP doesn't accept IFD_LONG here */
+ { 0x103, IFD_SHORT, 1, 1 }, /* COMPRESSION: XP doesn't accept IFD_LONG here */
+ { 0x106, IFD_SHORT, 1, 3 }, /* PHOTOMETRIC */
+ { 0x111, IFD_LONG, 1, FIELD_OFFSET(struct tiff_8bpp_data, pixel_data) }, /* STRIPOFFSETS */
+ { 0x115, IFD_SHORT, 1, 1 }, /* SAMPLESPERPIXEL */
+ { 0x116, IFD_LONG, 1, 1 }, /* ROWSPERSTRIP */
+ { 0x117, IFD_LONG, 1, 1 }, /* STRIPBYTECOUNT */
+ { 0x11a, IFD_RATIONAL, 1, FIELD_OFFSET(struct tiff_8bpp_data, res) },
+ { 0x11b, IFD_RATIONAL, 1, FIELD_OFFSET(struct tiff_8bpp_data, res) },
+ { 0x128, IFD_SHORT, 1, 2 }, /* RESOLUTIONUNIT */
+ { 0x140, IFD_SHORT, 256*3, FIELD_OFFSET(struct tiff_8bpp_data, palette_data) } /* COLORMAP */
+ },
+ 0,
+ { 96, 1 },
+ { { 0 } },
+ { 0,1,2,3 }
+};
+
static const struct tiff_resolution_test_data
{
struct IFD_rational resx;
@@ -284,29 +327,41 @@ static IStream *create_stream(const void *data, int data_size)
return stream;
}
-static IWICBitmapDecoder *create_decoder(const void *image_data, UINT image_size)
+static HRESULT create_decoder(const void *image_data, UINT image_size, IWICBitmapDecoder **decoder)
{
+ HGLOBAL hmem;
+ BYTE *data;
HRESULT hr;
IStream *stream;
- IWICBitmapDecoder *decoder = NULL;
- GUID guid;
+ GUID format;
+ LONG refcount;
- stream = create_stream(image_data, image_size);
+ *decoder = NULL;
- hr = IWICImagingFactory_CreateDecoderFromStream(factory, stream, NULL, 0, &decoder);
- ok(hr == S_OK, "CreateDecoderFromStream error %#x\n", hr);
- if (FAILED(hr)) return NULL;
+ hmem = GlobalAlloc(0, image_size);
+ data = GlobalLock(hmem);
+ memcpy(data, image_data, image_size);
+ GlobalUnlock(hmem);
- hr = IWICBitmapDecoder_GetContainerFormat(decoder, &guid);
- ok(hr == S_OK, "GetContainerFormat error %#x\n", hr);
- ok(IsEqualGUID(&guid, &GUID_ContainerFormatTiff), "container format is not TIFF\n");
+ hr = CreateStreamOnHGlobal(hmem, TRUE, &stream);
+ ok(hr == S_OK, "CreateStreamOnHGlobal error %#x\n", hr);
- IStream_Release(stream);
+ hr = IWICImagingFactory_CreateDecoderFromStream(factory, stream, NULL, 0, decoder);
+ if (hr == S_OK)
+ {
+ hr = IWICBitmapDecoder_GetContainerFormat(*decoder, &format);
+ ok(hr == S_OK, "GetContainerFormat error %#x\n", hr);
+ ok(IsEqualGUID(&format, &GUID_ContainerFormatTiff),
+ "wrong container format %s\n", wine_dbgstr_guid(&format));
- return decoder;
+ refcount = IStream_Release(stream);
+ ok(refcount > 0, "expected stream refcount > 0\n");
+ }
+
+ return hr;
}
-static void test_tiff_palette(void)
+static void test_tiff_1bpp_palette(void)
{
HRESULT hr;
IWICBitmapDecoder *decoder;
@@ -314,9 +369,9 @@ static void test_tiff_palette(void)
IWICPalette *palette;
GUID format;
- decoder = create_decoder(&tiff_1bpp_data, sizeof(tiff_1bpp_data));
- ok(decoder != 0, "Failed to load TIFF image data\n");
- if (!decoder) return;
+ hr = create_decoder(&tiff_1bpp_data, sizeof(tiff_1bpp_data), &decoder);
+ ok(hr == S_OK, "Failed to load TIFF image data %#x\n", hr);
+ if (hr != S_OK) return;
hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame);
ok(hr == S_OK, "GetFrame error %#x\n", hr);
@@ -448,9 +503,9 @@ static void test_tiff_8bpp_alpha(void)
static const BYTE expected_data[16] = { 0x11,0x11,0x11,0x22,0x33,0x33,0x33,0x44,
0x55,0x55,0x55,0x66,0x77,0x77,0x77,0x88 };
- decoder = create_decoder(&tiff_8bpp_alpha, sizeof(tiff_8bpp_alpha));
- ok(decoder != 0, "Failed to load TIFF image data\n");
- if (!decoder) return;
+ hr = create_decoder(&tiff_8bpp_alpha, sizeof(tiff_8bpp_alpha), &decoder);
+ ok(hr == S_OK, "Failed to load TIFF image data %#x\n", hr);
+ if (hr != S_OK) return;
hr = IWICBitmapDecoder_GetFrameCount(decoder, &frame_count);
ok(hr == S_OK, "GetFrameCount error %#x\n", hr);
@@ -497,6 +552,84 @@ static void test_tiff_8bpp_alpha(void)
IWICBitmapFrameDecode_Release(frame);
}
+static void generate_tiff_palette(void *buf, unsigned count)
+{
+ unsigned short *r, *g, *b;
+ unsigned i;
+
+ r = buf;
+ g = r + count;
+ b = g + count;
+
+ r[0] = 0x11 * 257;
+ g[0] = 0x22 * 257;
+ b[0] = 0x33 * 257;
+ r[1] = 0x44 * 257;
+ g[1] = 0x55 * 257;
+ b[1] = 0x66 * 257;
+ r[2] = 0x77 * 257;
+ g[2] = 0x88 * 257;
+ b[2] = 0x99 * 257;
+ r[3] = 0xa1 * 257;
+ g[3] = 0xb5 * 257;
+ b[3] = 0xff * 257;
+
+ for (i = 4; i < count; i++)
+ {
+ r[i] = i * 257;
+ g[i] = (i | 0x40) * 257;
+ b[i] = (i | 0x80) * 257;
+ }
+}
+
+static void test_tiff_8bpp_palette(void)
+{
+ char buf[sizeof(tiff_8bpp_data)];
+ HRESULT hr;
+ IWICBitmapDecoder *decoder;
+ IWICBitmapFrameDecode *frame;
+ IWICPalette *palette;
+ GUID format;
+ UINT count, ret;
+ WICColor color[256];
+
+ memcpy(buf, &tiff_8bpp_data, sizeof(tiff_8bpp_data));
+ generate_tiff_palette(buf + FIELD_OFFSET(struct tiff_8bpp_data, palette_data), 256);
+
+ hr = create_decoder(buf, sizeof(buf), &decoder);
+ ok(hr == S_OK, "Failed to load TIFF image data %#x\n", hr);
+ if (hr != S_OK) return;
+
+ hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame);
+ ok(hr == S_OK, "GetFrame error %#x\n", hr);
+
+ hr = IWICBitmapFrameDecode_GetPixelFormat(frame, &format);
+ ok(hr == S_OK, "GetPixelFormat error %#x\n", hr);
+ ok(IsEqualGUID(&format, &GUID_WICPixelFormat8bppIndexed),
+ "expected GUID_WICPixelFormat8bppIndexed, got %s\n", wine_dbgstr_guid(&format));
+
+ hr = IWICImagingFactory_CreatePalette(factory, &palette);
+ ok(hr == S_OK, "CreatePalette error %#x\n", hr);
+ hr = IWICBitmapFrameDecode_CopyPalette(frame, palette);
+ ok(hr == S_OK, "CopyPalette error %#x\n", hr);
+
+ hr = IWICPalette_GetColorCount(palette, &count);
+ ok(hr == S_OK, "GetColorCount error %#x\n", hr);
+ ok(count == 256, "expected 256, got %u\n", count);
+
+ hr = IWICPalette_GetColors(palette, 256, color, &ret);
+ ok(hr == S_OK, "GetColors error %#x\n", hr);
+ ok(ret == count, "expected %u, got %u\n", count, ret);
+ ok(color[0] == 0xff112233, "got %#x\n", color[0]);
+ ok(color[1] == 0xff445566, "got %#x\n", color[1]);
+ ok(color[2] == 0xff778899, "got %#x\n", color[2]);
+ ok(color[3] == 0xffa1b5ff, "got %#x\n", color[3]);
+
+ IWICPalette_Release(palette);
+ IWICBitmapFrameDecode_Release(frame);
+ IWICBitmapDecoder_Release(decoder);
+}
+
static void test_tiff_resolution(void)
{
HRESULT hr;
@@ -512,9 +645,9 @@ static void test_tiff_resolution(void)
tiff_resolution_image_data.resy = test_data->resy;
tiff_resolution_image_data.entry[12].value = test_data->resolution_unit;
- decoder = create_decoder(&tiff_resolution_image_data, sizeof(tiff_resolution_image_data));
- ok(decoder != 0, "%d: Failed to load TIFF image data\n", i);
- if (!decoder) continue;
+ hr = create_decoder(&tiff_resolution_image_data, sizeof(tiff_resolution_image_data), &decoder);
+ ok(hr == S_OK, "Failed to load TIFF image data %#x\n", hr);
+ if (hr != S_OK) return;
hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame);
ok(hr == S_OK, "%d: GetFrame error %#x\n", i, hr);
@@ -561,8 +694,9 @@ static void test_tiff_24bpp(void)
BYTE data[3];
static const BYTE expected_data[] = { 0x33,0x22,0x11 };
- decoder = create_decoder(&tiff_24bpp_data, sizeof(tiff_24bpp_data));
- ok(decoder != NULL, "Failed to load TIFF image data\n");
+ hr = create_decoder(&tiff_24bpp_data, sizeof(tiff_24bpp_data), &decoder);
+ ok(hr == S_OK, "Failed to load TIFF image data %#x\n", hr);
+ if (hr != S_OK) return;
hr = IWICBitmapDecoder_GetFrameCount(decoder, &count);
ok(hr == S_OK, "GetFrameCount error %#x\n", hr);
@@ -620,7 +754,8 @@ START_TEST(tiffformat)
ok(hr == S_OK, "CoCreateInstance error %#x\n", hr);
if (FAILED(hr)) return;
- test_tiff_palette();
+ test_tiff_1bpp_palette();
+ test_tiff_8bpp_palette();
test_QueryCapability();
test_tiff_8bpp_alpha();
test_tiff_resolution();
More information about the wine-cvs
mailing list