https://git.reactos.org/?p=reactos.git;a=commitdiff;h=eea81f5274c93e8d65f02…
commit eea81f5274c93e8d65f02bd294d8122d25cc9544
Author: Amine Khaldi <amine.khaldi(a)reactos.org>
AuthorDate: Mon Feb 4 13:12:58 2019 +0100
Commit: Amine Khaldi <amine.khaldi(a)reactos.org>
CommitDate: Mon Feb 4 13:12:58 2019 +0100
[WINDOWSCODECS_WINETEST] Sync with Wine Staging 4.0. CORE-15682
---
.../winetests/windowscodecs/CMakeLists.txt | 4 +-
modules/rostests/winetests/windowscodecs/bitmap.c | 216 ++++++++++++
.../rostests/winetests/windowscodecs/converter.c | 88 ++---
.../rostests/winetests/windowscodecs/icoformat.c | 207 +++++++----
modules/rostests/winetests/windowscodecs/info.c | 43 ++-
.../rostests/winetests/windowscodecs/metadata.c | 57 ++--
modules/rostests/winetests/windowscodecs/palette.c | 2 +-
.../rostests/winetests/windowscodecs/pngformat.c | 146 ++++++--
modules/rostests/winetests/windowscodecs/stream.c | 378 ++++++++++++++++++---
.../rostests/winetests/windowscodecs/tiffformat.c | 117 ++++++-
10 files changed, 1040 insertions(+), 218 deletions(-)
diff --git a/modules/rostests/winetests/windowscodecs/CMakeLists.txt
b/modules/rostests/winetests/windowscodecs/CMakeLists.txt
index 0cffe520e8..6bae33b891 100644
--- a/modules/rostests/winetests/windowscodecs/CMakeLists.txt
+++ b/modules/rostests/winetests/windowscodecs/CMakeLists.txt
@@ -1,5 +1,7 @@
-add_definitions(-DUSE_WINE_TODOS)
+add_definitions(
+ -DUSE_WINE_TODOS
+ -DWINETEST_USE_DBGSTR_LONGLONG)
list(APPEND SOURCE
bitmap.c
diff --git a/modules/rostests/winetests/windowscodecs/bitmap.c
b/modules/rostests/winetests/windowscodecs/bitmap.c
index 6e01f0b1d1..d4b597900d 100644
--- a/modules/rostests/winetests/windowscodecs/bitmap.c
+++ b/modules/rostests/winetests/windowscodecs/bitmap.c
@@ -452,6 +452,19 @@ static void test_createbitmapfromsource(void)
hr = IWICBitmap_SetResolution(bitmap, 12.0, 34.0);
ok(hr == S_OK, "IWICBitmap_SetResolution failed hr=%x\n", hr);
+ /* WICBitmapNoCache */
+ hr = IWICImagingFactory_CreateBitmapFromSource(factory, (IWICBitmapSource *)bitmap,
+ WICBitmapNoCache, &bitmap2);
+ ok(hr == S_OK, "IWICImagingFactory_CreateBitmapFromSource failed hr=%x\n",
hr);
+ ok(bitmap2 == bitmap, "Unexpected bitmap instance.\n");
+
+ IWICBitmap_Release(bitmap2);
+
+ bitmap2 = (void *)0xdeadbeef;
+ hr = IWICImagingFactory_CreateBitmapFromSource(factory, &bitmapsource,
WICBitmapNoCache, &bitmap2);
+ ok(hr == E_NOTIMPL, "Unexpected hr %#x.\n", hr);
+ ok(bitmap2 == (void *)0xdeadbeef, "Unexpected pointer %p.\n", bitmap2);
+
hr = IWICImagingFactory_CreateBitmapFromSource(factory, (IWICBitmapSource*)bitmap,
WICBitmapCacheOnLoad, &bitmap2);
ok(hr == S_OK, "IWICImagingFactory_CreateBitmapFromSource failed hr=%x\n",
hr);
@@ -538,6 +551,43 @@ static void test_createbitmapfromsource(void)
ok(width == 3, "got %d, expected 3\n", width);
ok(height == 3, "got %d, expected 3\n", height);
+ /* CreateBitmapFromSourceRect */
+ hr = IWICImagingFactory_CreateBitmapFromSourceRect(factory, (IWICBitmapSource
*)bitmap2, 0, 0, 16, 32, &bitmap);
+ ok(hr == S_OK, "Failed to create a bitmap, hr %#x.\n", hr);
+ hr = IWICBitmap_GetSize(bitmap, &width, &height);
+ ok(hr == S_OK, "Failed to get bitmap size, hr %#x.\n", hr);
+ ok(width == 3, "Unexpected width %u.\n", width);
+ ok(height == 3, "Unexpected height %u.\n", height);
+ IWICBitmap_Release(bitmap);
+
+ hr = IWICImagingFactory_CreateBitmapFromSourceRect(factory, (IWICBitmapSource
*)bitmap2, 0, 0, 1, 1, &bitmap);
+ ok(hr == S_OK, "Failed to create a bitmap, hr %#x.\n", hr);
+ hr = IWICBitmap_GetSize(bitmap, &width, &height);
+ ok(hr == S_OK, "Failed to get bitmap size, hr %#x.\n", hr);
+ ok(width == 1, "Unexpected width %u.\n", width);
+ ok(height == 1, "Unexpected height %u.\n", height);
+ IWICBitmap_Release(bitmap);
+
+ hr = IWICImagingFactory_CreateBitmapFromSourceRect(factory, (IWICBitmapSource
*)bitmap2, 2, 1, 16, 32, &bitmap);
+ ok(hr == S_OK, "Failed to create a bitmap, hr %#x.\n", hr);
+ hr = IWICBitmap_GetSize(bitmap, &width, &height);
+ ok(hr == S_OK, "Failed to get bitmap size, hr %#x.\n", hr);
+ ok(width == 1, "Unexpected width %u.\n", width);
+ ok(height == 2, "Unexpected height %u.\n", height);
+ IWICBitmap_Release(bitmap);
+
+ hr = IWICImagingFactory_CreateBitmapFromSourceRect(factory, (IWICBitmapSource
*)bitmap2, 0, 0, 0, 2, &bitmap);
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+ hr = IWICImagingFactory_CreateBitmapFromSourceRect(factory, (IWICBitmapSource
*)bitmap2, 0, 0, 2, 0, &bitmap);
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+ hr = IWICImagingFactory_CreateBitmapFromSourceRect(factory, (IWICBitmapSource
*)bitmap2, 1, 3, 16, 32, &bitmap);
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+ hr = IWICImagingFactory_CreateBitmapFromSourceRect(factory, (IWICBitmapSource
*)bitmap2, 3, 1, 16, 32, &bitmap);
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
IWICBitmap_Release(bitmap2);
}
@@ -1030,6 +1080,171 @@ static void test_WICCreateBitmapFromSectionEx(void)
CloseHandle(hsection);
}
+static void test_bitmap_scaler(void)
+{
+ WICPixelFormatGUID pixel_format;
+ IWICBitmapScaler *scaler;
+ IWICPalette *palette;
+ double res_x, res_y;
+ IWICBitmap *bitmap;
+ UINT width, height;
+ HRESULT hr;
+
+ hr = IWICImagingFactory_CreateBitmap(factory, 4, 2, &GUID_WICPixelFormat24bppBGR,
WICBitmapCacheOnLoad, &bitmap);
+ ok(hr == S_OK, "Failed to create a bitmap, hr %#x.\n", hr);
+
+ hr = IWICBitmap_GetSize(bitmap, &width, &height);
+ ok(hr == S_OK, "Failed to get bitmap size, hr %#x.\n", hr);
+ ok(width == 4, "Unexpected width %u.\n", width);
+ ok(height == 2, "Unexpected height %u.\n", height);
+
+ hr = IWICBitmap_GetResolution(bitmap, &res_x, &res_y);
+ ok(hr == S_OK, "Failed to get bitmap resolution, hr %#x.\n", hr);
+ ok(res_x == 0.0 && res_y == 0.0, "Unexpected resolution %f x
%f.\n", res_x, res_y);
+
+ hr = IWICImagingFactory_CreateBitmapScaler(factory, &scaler);
+ ok(hr == S_OK, "Failed to create bitmap scaler, hr %#x.\n", hr);
+
+ hr = IWICBitmapScaler_Initialize(scaler, NULL, 0, 0,
+ WICBitmapInterpolationModeNearestNeighbor);
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+ hr = IWICBitmapScaler_Initialize(scaler, (IWICBitmapSource *)bitmap, 0, 0,
+ WICBitmapInterpolationModeNearestNeighbor);
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+ hr = IWICBitmapScaler_GetSize(scaler, NULL, &height);
+ ok(hr == WINCODEC_ERR_NOTINITIALIZED, "Unexpected hr %#x.\n", hr);
+
+ hr = IWICBitmapScaler_GetSize(scaler, &width, NULL);
+ ok(hr == WINCODEC_ERR_NOTINITIALIZED, "Unexpected hr %#x.\n", hr);
+
+ hr = IWICBitmapScaler_GetResolution(scaler, NULL, NULL);
+ ok(hr == WINCODEC_ERR_NOTINITIALIZED, "Unexpected hr %#x.\n", hr);
+
+ res_x = 0.1;
+ hr = IWICBitmapScaler_GetResolution(scaler, &res_x, NULL);
+ ok(hr == WINCODEC_ERR_NOTINITIALIZED, "Unexpected hr %#x.\n", hr);
+ ok(res_x == 0.1, "Unexpected resolution %f.\n", res_x);
+
+ hr = IWICBitmapScaler_GetResolution(scaler, NULL, &res_y);
+ ok(hr == WINCODEC_ERR_NOTINITIALIZED, "Unexpected hr %#x.\n", hr);
+
+ hr = IWICBitmapScaler_GetResolution(scaler, &res_x, &res_y);
+ ok(hr == WINCODEC_ERR_NOTINITIALIZED, "Unexpected hr %#x.\n", hr);
+
+ hr = IWICBitmapScaler_GetPixelFormat(scaler, NULL);
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+ memset(&pixel_format, 0, sizeof(pixel_format));
+ hr = IWICBitmapScaler_GetPixelFormat(scaler, &pixel_format);
+ ok(hr == S_OK, "Failed to get pixel format, hr %#x.\n", hr);
+ ok(IsEqualGUID(&pixel_format, &GUID_WICPixelFormatDontCare), "Unexpected
pixel format %s.\n",
+ wine_dbgstr_guid(&pixel_format));
+
+ width = 123;
+ height = 321;
+ hr = IWICBitmapScaler_GetSize(scaler, &width, &height);
+ ok(hr == WINCODEC_ERR_NOTINITIALIZED, "Unexpected hr %#x.\n", hr);
+ ok(width == 123, "Unexpected width %u.\n", width);
+ ok(height == 321, "Unexpected height %u.\n", height);
+
+ hr = IWICBitmapScaler_CopyPalette(scaler, NULL);
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+ hr = IWICImagingFactory_CreatePalette(factory, &palette);
+ ok(hr == S_OK, "Failed to create a palette, hr %#x.\n", hr);
+ hr = IWICBitmapScaler_CopyPalette(scaler, palette);
+ ok(hr == WINCODEC_ERR_PALETTEUNAVAILABLE, "Unexpected hr %#x.\n", hr);
+ IWICPalette_Release(palette);
+
+ hr = IWICBitmapScaler_Initialize(scaler, (IWICBitmapSource *)bitmap, 4, 0,
+ WICBitmapInterpolationModeNearestNeighbor);
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+ hr = IWICBitmapScaler_GetSize(scaler, &width, &height);
+ ok(hr == WINCODEC_ERR_NOTINITIALIZED, "Unexpected hr %#x.\n", hr);
+
+ hr = IWICBitmapScaler_Initialize(scaler, (IWICBitmapSource *)bitmap, 0, 2,
+ WICBitmapInterpolationModeNearestNeighbor);
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+ hr = IWICBitmapScaler_GetSize(scaler, &width, &height);
+ ok(hr == WINCODEC_ERR_NOTINITIALIZED, "Unexpected hr %#x.\n", hr);
+
+ hr = IWICBitmapScaler_Initialize(scaler, NULL, 8, 4,
+ WICBitmapInterpolationModeNearestNeighbor);
+ ok(hr == E_INVALIDARG, "Failed to initialize bitmap scaler, hr %#x.\n",
hr);
+
+ hr = IWICBitmapScaler_Initialize(scaler, (IWICBitmapSource *)bitmap, 8, 4,
+ WICBitmapInterpolationModeNearestNeighbor);
+ ok(hr == S_OK, "Failed to initialize bitmap scaler, hr %#x.\n", hr);
+
+ hr = IWICBitmapScaler_Initialize(scaler, (IWICBitmapSource *)bitmap, 0, 4,
+ WICBitmapInterpolationModeNearestNeighbor);
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+ hr = IWICBitmapScaler_Initialize(scaler, (IWICBitmapSource *)bitmap, 8, 0,
+ WICBitmapInterpolationModeNearestNeighbor);
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+ hr = IWICBitmapScaler_Initialize(scaler, NULL, 8, 4,
WICBitmapInterpolationModeNearestNeighbor);
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+ hr = IWICBitmapScaler_Initialize(scaler, (IWICBitmapSource *)bitmap, 8, 4,
+ WICBitmapInterpolationModeNearestNeighbor);
+ ok(hr == WINCODEC_ERR_WRONGSTATE, "Unexpected hr %#x.\n", hr);
+
+ hr = IWICBitmapScaler_GetSize(scaler, &width, &height);
+ ok(hr == S_OK, "Failed to get scaler size, hr %#x.\n", hr);
+ ok(width == 8, "Unexpected width %u.\n", width);
+ ok(height == 4, "Unexpected height %u.\n", height);
+
+ hr = IWICBitmapScaler_GetSize(scaler, NULL, &height);
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+ hr = IWICBitmapScaler_GetSize(scaler, &width, NULL);
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+ hr = IWICBitmapScaler_GetSize(scaler, NULL, NULL);
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+ hr = IWICBitmapScaler_GetPixelFormat(scaler, NULL);
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+ memset(&pixel_format, 0, sizeof(pixel_format));
+ hr = IWICBitmapScaler_GetPixelFormat(scaler, &pixel_format);
+ ok(hr == S_OK, "Failed to get pixel format, hr %#x.\n", hr);
+ ok(IsEqualGUID(&pixel_format, &GUID_WICPixelFormat24bppBGR), "Unexpected
pixel format %s.\n",
+ wine_dbgstr_guid(&pixel_format));
+
+ hr = IWICBitmapScaler_GetResolution(scaler, NULL, NULL);
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+ res_x = 0.1;
+ hr = IWICBitmapScaler_GetResolution(scaler, &res_x, NULL);
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+ ok(res_x == 0.1, "Unexpected resolution %f.\n", res_x);
+
+ hr = IWICBitmapScaler_GetResolution(scaler, NULL, &res_y);
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+ res_x = res_y = 1.0;
+ hr = IWICBitmapScaler_GetResolution(scaler, &res_x, &res_y);
+ ok(hr == S_OK, "Failed to get scaler resolution, hr %#x.\n", hr);
+ ok(res_x == 0.0 && res_y == 0.0, "Unexpected resolution %f x
%f.\n", res_x, res_y);
+
+ hr = IWICImagingFactory_CreatePalette(factory, &palette);
+ ok(hr == S_OK, "Failed to create a palette, hr %#x.\n", hr);
+ hr = IWICBitmapScaler_CopyPalette(scaler, palette);
+ ok(hr == WINCODEC_ERR_PALETTEUNAVAILABLE, "Unexpected hr %#x.\n", hr);
+ IWICPalette_Release(palette);
+
+ IWICBitmapScaler_Release(scaler);
+
+ IWICBitmap_Release(bitmap);
+}
+
START_TEST(bitmap)
{
HRESULT hr;
@@ -1046,6 +1261,7 @@ START_TEST(bitmap)
test_CreateBitmapFromHICON();
test_CreateBitmapFromHBITMAP();
test_clipper();
+ test_bitmap_scaler();
IWICImagingFactory_Release(factory);
diff --git a/modules/rostests/winetests/windowscodecs/converter.c
b/modules/rostests/winetests/windowscodecs/converter.c
index 91deda2010..8682f87061 100644
--- a/modules/rostests/winetests/windowscodecs/converter.c
+++ b/modules/rostests/winetests/windowscodecs/converter.c
@@ -904,16 +904,6 @@ static void check_tiff_format(IStream *stream, const
WICPixelFormatGUID *format)
ok(samples == 1, "wrong samples %d\n", samples);
ok(colormap == 6, "wrong colormap %d\n", colormap);
}
- else if (IsEqualGUID(format, &GUID_WICPixelFormat2bppIndexed))
- {
- ok(width == 32, "wrong width %u\n", width);
- ok(height == 2, "wrong height %u\n", height);
-
- ok(bps == 2, "wrong bps %d\n", bps);
- ok(photo == 3, "wrong photometric %d\n", photo);
- ok(samples == 1, "wrong samples %d\n", samples);
- ok(colormap == 12, "wrong colormap %d\n", colormap);
- }
else if (IsEqualGUID(format, &GUID_WICPixelFormat4bppIndexed))
{
ok(width == 32, "wrong width %u\n", width);
@@ -976,18 +966,6 @@ static void check_bmp_format(IStream *stream, const
WICPixelFormatGUID *format)
ok(bih.bV5ClrUsed == 256, "wrong ClrUsed %d\n", bih.bV5ClrUsed);
ok(bih.bV5ClrImportant == 256, "wrong ClrImportant %d\n",
bih.bV5ClrImportant);
}
- else if (IsEqualGUID(format, &GUID_WICPixelFormat2bppIndexed))
- {
- ok(bfh.bfOffBits == 0x0436, "wrong bfOffBits %08x\n", bfh.bfOffBits);
-
- ok(bih.bV5Width == 32, "wrong width %u\n", bih.bV5Width);
- ok(bih.bV5Height == 2, "wrong height %u\n", bih.bV5Height);
-
- ok(bih.bV5Planes == 1, "wrong Planes %d\n", bih.bV5Planes);
- ok(bih.bV5BitCount == 2, "wrong BitCount %d\n", bih.bV5BitCount);
- ok(bih.bV5ClrUsed == 256, "wrong ClrUsed %d\n", bih.bV5ClrUsed);
- ok(bih.bV5ClrImportant == 256, "wrong ClrImportant %d\n",
bih.bV5ClrImportant);
- }
else if (IsEqualGUID(format, &GUID_WICPixelFormat4bppIndexed))
{
ok(bfh.bfOffBits == 0x0436, "wrong bfOffBits %08x\n", bfh.bfOffBits);
@@ -1243,6 +1221,7 @@ static void test_multi_encoder(const struct bitmap_data **srcs,
const CLSID* cls
const struct bitmap_data **dsts, const CLSID *clsid_decoder, WICRect *rc,
const struct setting *settings, const char *name, IWICPalette *palette)
{
+ const GUID *container_format = NULL;
HRESULT hr;
IWICBitmapEncoder *encoder;
BitmapTestSrc *src_obj;
@@ -1253,6 +1232,7 @@ static void test_multi_encoder(const struct bitmap_data **srcs,
const CLSID* cls
IWICBitmapDecoder *decoder;
IWICBitmapFrameDecode *framedecode;
WICPixelFormatGUID pixelformat;
+ GUID guid;
int i;
hr = CoCreateInstance(clsid_encoder, NULL, CLSCTX_INPROC_SERVER,
@@ -1262,6 +1242,28 @@ static void test_multi_encoder(const struct bitmap_data **srcs,
const CLSID* cls
hr = CreateStreamOnHGlobal(NULL, TRUE, &stream);
ok(SUCCEEDED(hr), "CreateStreamOnHGlobal failed, hr=%x\n", hr);
+ hr = IWICBitmapEncoder_GetContainerFormat(encoder, NULL);
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+ if (IsEqualGUID(clsid_encoder, &CLSID_WICPngEncoder))
+ container_format = &GUID_ContainerFormatPng;
+ else if (IsEqualGUID(clsid_encoder, &CLSID_WICBmpEncoder))
+ container_format = &GUID_ContainerFormatBmp;
+ else if (IsEqualGUID(clsid_encoder, &CLSID_WICTiffEncoder))
+ container_format = &GUID_ContainerFormatTiff;
+ else if (IsEqualGUID(clsid_encoder, &CLSID_WICJpegEncoder))
+ container_format = &GUID_ContainerFormatJpeg;
+ else
+ ok(0, "Unknown encoder %s.\n", wine_dbgstr_guid(clsid_encoder));
+
+ if (container_format)
+ {
+ memset(&guid, 0, sizeof(guid));
+ hr = IWICBitmapEncoder_GetContainerFormat(encoder, &guid);
+ ok(SUCCEEDED(hr), "Failed to get container format, hr %#x.\n", hr);
+ ok(IsEqualGUID(container_format, &guid), "Unexpected container format
%s.\n", wine_dbgstr_guid(&guid));
+ }
+
hr = IWICBitmapEncoder_Initialize(encoder, stream, WICBitmapEncoderNoCache);
ok(SUCCEEDED(hr), "Initialize failed, hr=%x\n", hr);
@@ -1288,6 +1290,8 @@ static void test_multi_encoder(const struct bitmap_data **srcs,
const CLSID* cls
if (hglobal && SUCCEEDED(hr))
{
+ IWICBitmapEncoderInfo *info = NULL;
+
if (palette)
{
hr = IWICBitmapEncoder_SetPalette(encoder, palette);
@@ -1307,6 +1311,20 @@ static void test_multi_encoder(const struct bitmap_data **srcs,
const CLSID* cls
hr = S_OK;
}
+ hr = IWICBitmapEncoder_GetEncoderInfo(encoder, &info);
+ ok(hr == S_OK || hr == WINCODEC_ERR_COMPONENTNOTFOUND, "wrong error
%#x\n", hr);
+ if (SUCCEEDED(hr))
+ {
+ CLSID clsid;
+
+ hr = IWICBitmapEncoderInfo_GetCLSID(info, &clsid);
+ ok(hr == S_OK, "wrong error %#x\n", hr);
+ ok(!IsEqualGUID(&clsid_encoder, &clsid), "wrong CLSID %s
(%s)\n",
+ wine_dbgstr_guid(clsid_encoder), wine_dbgstr_guid(&clsid));
+
+ IWICBitmapEncoderInfo_Release(info);
+ }
+
i=0;
while (SUCCEEDED(hr) && srcs[i])
{
@@ -1353,9 +1371,9 @@ static void test_multi_encoder(const struct bitmap_data **srcs,
const CLSID* cls
hr = IWICBitmapFrameEncode_SetPixelFormat(frameencode,
&pixelformat);
ok(SUCCEEDED(hr), "SetPixelFormat failed, hr=%x\n", hr);
ok(IsEqualGUID(&pixelformat, dsts[i]->format) ||
- broken(IsEqualGUID(clsid_encoder, &CLSID_WICBmpEncoder)
&& srcs[i]->bpp == 2 && IsEqualGUID(&pixelformat,
&GUID_WICPixelFormat4bppIndexed)) ||
- broken(IsEqualGUID(clsid_encoder, &CLSID_WICTiffEncoder)
&& srcs[i]->bpp == 2 && IsEqualGUID(&pixelformat,
&GUID_WICPixelFormat4bppIndexed)),
- "SetPixelFormat changed the format to %s (%s)\n",
wine_dbgstr_guid(&pixelformat), name);
+ (IsEqualGUID(clsid_encoder, &CLSID_WICTiffEncoder) &&
srcs[i]->bpp == 2 && IsEqualGUID(&pixelformat,
&GUID_WICPixelFormat4bppIndexed)) ||
+ (IsEqualGUID(clsid_encoder, &CLSID_WICBmpEncoder) &&
srcs[i]->bpp == 2 && IsEqualGUID(&pixelformat,
&GUID_WICPixelFormat4bppIndexed)),
+ "SetPixelFormat changed the format to %s (%s)\n",
wine_dbgstr_guid(&pixelformat), name);
hr = IWICBitmapFrameEncode_SetSize(frameencode, srcs[i]->width,
srcs[i]->height);
ok(SUCCEEDED(hr), "SetSize failed, hr=%x\n", hr);
@@ -1390,8 +1408,8 @@ static void test_multi_encoder(const struct bitmap_data **srcs,
const CLSID* cls
ok(SUCCEEDED(hr), "WriteSource(%dx%d) failed, hr=%x
(%s)\n", rc->Width, rc->Height, hr, name);
else
ok(hr == S_OK ||
- broken(hr == E_INVALIDARG &&
IsEqualGUID(clsid_encoder, &CLSID_WICBmpEncoder) && srcs[i]->bpp == 2) /*
XP */ ||
- broken(hr == E_INVALIDARG &&
IsEqualGUID(clsid_encoder, &CLSID_WICTiffEncoder) && srcs[i]->bpp == 2) /*
XP */ ||
+ (hr == E_NOTIMPL && IsEqualGUID(clsid_encoder,
&CLSID_WICBmpEncoder) && srcs[i]->bpp == 2) ||
+ (hr == E_NOTIMPL && IsEqualGUID(clsid_encoder,
&CLSID_WICTiffEncoder) && srcs[i]->bpp == 2) ||
broken(hr == E_INVALIDARG &&
IsEqualGUID(clsid_encoder, &CLSID_WICBmpEncoder) &&
IsEqualGUID(srcs[i]->format, &GUID_WICPixelFormatBlackWhite)) /* XP */,
"WriteSource(NULL) failed, hr=%x (%s)\n", hr,
name);
}
@@ -1529,15 +1547,6 @@ static void test_multi_encoder(const struct bitmap_data **srcs,
const CLSID* cls
ok(colors[4] == 0xff555555, "got %08x
(%s)\n", colors[4], name);
ok(colors[5] == 0xff000000, "got %08x
(%s)\n", colors[5], name);
}
- else if (IsEqualGUID(&pixelformat,
&GUID_WICPixelFormat2bppIndexed))
- {
- ok(count == 4, "expected 4, got %u (%s)\n",
count, name);
-
- ok(colors[0] == 0xff111111, "got %08x
(%s)\n", colors[0], name);
- ok(colors[1] == 0xff222222, "got %08x
(%s)\n", colors[1], name);
- ok(colors[2] == 0xff333333, "got %08x
(%s)\n", colors[2], name);
- ok(colors[3] == 0xff444444, "got %08x
(%s)\n", colors[3], name);
- }
else if (IsEqualGUID(&pixelformat,
&GUID_WICPixelFormat4bppIndexed))
{
ok(count == 16, "expected 16, got %u
(%s)\n", count, name);
@@ -1828,8 +1837,6 @@ START_TEST(converter)
&IID_IWICImagingFactory, (void **)&factory);
ok(hr == S_OK, "failed to create factory: %#x\n", hr);
- test_converter_8bppIndexed();
-
test_conversion(&testdata_24bppRGB, &testdata_1bppIndexed, "24bppRGB
-> 1bppIndexed", TRUE);
test_conversion(&testdata_24bppRGB, &testdata_2bppIndexed, "24bppRGB
-> 2bppIndexed", TRUE);
test_conversion(&testdata_24bppRGB, &testdata_4bppIndexed, "24bppRGB
-> 4bppIndexed", TRUE);
@@ -1870,6 +1877,7 @@ START_TEST(converter)
test_invalid_conversion();
test_default_converter();
+ test_converter_8bppIndexed();
test_encoder(&testdata_8bppIndexed, &CLSID_WICGifEncoder,
&testdata_8bppIndexed, &CLSID_WICGifDecoder, "GIF encoder
8bppIndexed");
@@ -1897,7 +1905,7 @@ if (!strcmp(winetest_platform, "windows")) /* FIXME:
enable once implemented in
test_encoder(&testdata_1bppIndexed, &CLSID_WICBmpEncoder,
&testdata_1bppIndexed, &CLSID_WICBmpDecoder, "BMP encoder
1bppIndexed");
test_encoder(&testdata_2bppIndexed, &CLSID_WICBmpEncoder,
- &testdata_2bppIndexed, &CLSID_WICBmpDecoder, "BMP encoder
2bppIndexed");
+ &testdata_4bppIndexed, &CLSID_WICBmpDecoder, "BMP encoder
2bppIndexed");
test_encoder(&testdata_4bppIndexed, &CLSID_WICBmpEncoder,
&testdata_4bppIndexed, &CLSID_WICBmpDecoder, "BMP encoder
4bppIndexed");
test_encoder(&testdata_8bppIndexed, &CLSID_WICBmpEncoder,
@@ -1910,7 +1918,7 @@ if (!strcmp(winetest_platform, "windows")) /* FIXME:
enable once implemented in
test_encoder(&testdata_1bppIndexed, &CLSID_WICTiffEncoder,
&testdata_1bppIndexed, &CLSID_WICTiffDecoder, "TIFF encoder
1bppIndexed");
test_encoder(&testdata_2bppIndexed, &CLSID_WICTiffEncoder,
- &testdata_2bppIndexed, &CLSID_WICTiffDecoder, "TIFF encoder
2bppIndexed");
+ &testdata_4bppIndexed, &CLSID_WICTiffDecoder, "TIFF encoder
2bppIndexed");
test_encoder(&testdata_4bppIndexed, &CLSID_WICTiffEncoder,
&testdata_4bppIndexed, &CLSID_WICTiffDecoder, "TIFF encoder
4bppIndexed");
test_encoder(&testdata_8bppIndexed, &CLSID_WICTiffEncoder,
diff --git a/modules/rostests/winetests/windowscodecs/icoformat.c
b/modules/rostests/winetests/windowscodecs/icoformat.c
index c53739dbd6..38db51c376 100644
--- a/modules/rostests/winetests/windowscodecs/icoformat.c
+++ b/modules/rostests/winetests/windowscodecs/icoformat.c
@@ -26,72 +26,114 @@
#include "wincodec.h"
#include "wine/test.h"
-static unsigned char testico_bad_icondirentry_size[] = {
- /* ICONDIR */
- 0, 0, /* reserved */
- 1, 0, /* type */
- 1, 0, /* count */
+#include "pshpack1.h"
+
+struct ICONHEADER
+{
+ WORD idReserved;
+ WORD idType;
+ WORD idCount;
+};
+
+struct ICONDIRENTRY
+{
+ BYTE bWidth;
+ BYTE bHeight;
+ BYTE bColorCount;
+ BYTE bReserved;
+ WORD wPlanes;
+ WORD wBitCount;
+ DWORD dwDIBSize;
+ DWORD dwDIBOffset;
+};
+
+struct test_ico
+{
+ struct ICONHEADER header;
+ struct ICONDIRENTRY direntry;
+ BITMAPINFOHEADER bmi;
+ unsigned char data[512];
+};
+
+static const struct test_ico ico_1 =
+{
+ /* ICONHEADER */
+ {
+ 0, /* reserved */
+ 1, /* type */
+ 1, /* count */
+ },
/* ICONDIRENTRY */
- 2, /* width */
- 2, /* height */
- 2, /* colorCount */
- 0, /* reserved */
- 1,0, /* planes */
- 8,0, /* bitCount */
- (40+2*4+16*16+16*4) & 0xFF,((40+2*4+16*16+16*4) >> 8) & 0xFF,0,0, /*
bytesInRes */
- 22,0,0,0, /* imageOffset */
+ {
+ 16, /* width */
+ 16, /* height */
+ 2, /* color count */
+ 0, /* reserved */
+ 1, /* planes */
+ 8, /* bitcount*/
+ 40 + 2*4 + 16 * 16 + 16 * 4, /* data size */
+ 22 /* data offset */
+ },
/* BITMAPINFOHEADER */
- 40,0,0,0, /* header size */
- 16,0,0,0, /* width */
- 2*16,0,0,0, /* height (XOR+AND rows) */
- 1,0, /* planes */
- 8,0, /* bit count */
- 0,0,0,0, /* compression */
- 0,0,0,0, /* sizeImage */
- 0,0,0,0, /* x pels per meter */
- 0,0,0,0, /* y pels per meter */
- 2,0,0,0, /* clrUsed */
- 0,0,0,0, /* clrImportant */
- /* palette */
- 0,0,0,0,
- 0xFF,0xFF,0xFF,0,
- /* XOR mask */
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
- 0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
- 0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
- 0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,
- 0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,
- 0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,
- 0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,
- 0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,
- 0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,
- 0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,
- 0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- /* AND mask */
- 0,0,0,0,
- 0,0,0,0,
- 0,0,0,0,
- 0,0,0,0,
- 0,0,0,0,
- 0,0,0,0,
- 0,0,0,0,
- 0,0,0,0,
- 0,0,0,0,
- 0,0,0,0,
- 0,0,0,0,
- 0,0,0,0,
- 0,0,0,0,
- 0,0,0,0,
- 0,0,0,0,
- 0,0,0,0
+ {
+ sizeof(BITMAPINFOHEADER), /* header size */
+ 16, /* width */
+ 2*16, /* height (XOR+AND rows) */
+ 1, /* planes */
+ 8, /* bit count */
+ 0, /* compression */
+ 0, /* sizeImage */
+ 0, /* x pels per meter */
+ 0, /* y pels per meter */
+ 2, /* clrUsed */
+ 0, /* clrImportant */
+ },
+ {
+ /* palette */
+ 0,0,0,0,
+ 0xFF,0xFF,0xFF,0,
+ /* XOR mask */
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
+ 0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
+ 0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
+ 0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,
+ 0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,
+ 0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,
+ 0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,
+ 0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,
+ 0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,
+ 0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,
+ 0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ /* AND mask */
+ 0,0,0,0,
+ 0,0,0,0,
+ 0,0,0,0,
+ 0,0,0,0,
+ 0,0,0,0,
+ 0,0,0,0,
+ 0,0,0,0,
+ 0,0,0,0,
+ 0,0,0,0,
+ 0,0,0,0,
+ 0,0,0,0,
+ 0,0,0,0,
+ 0,0,0,0,
+ 0,0,0,0,
+ 0,0,0,0,
+ 0,0,0,0
+ }
};
-static void test_bad_icondirentry_size(void)
+#include "poppack.h"
+
+#define test_ico_data(a, b, c) test_ico_data_(a, b, c, 0, __LINE__)
+#define test_ico_data_todo(a, b, c) test_ico_data_(a, b, c, 1, __LINE__)
+static void test_ico_data_(void *data, DWORD data_size, HRESULT init_hr, int todo,
unsigned int line)
{
IWICBitmapDecoder *decoder;
IWICImagingFactory *factory;
@@ -108,8 +150,7 @@ static void test_bad_icondirentry_size(void)
ok(hr == S_OK, "CreateStream failed, hr=%x\n", hr);
if (SUCCEEDED(hr))
{
- hr = IWICStream_InitializeFromMemory(icostream, testico_bad_icondirentry_size,
- sizeof(testico_bad_icondirentry_size));
+ hr = IWICStream_InitializeFromMemory(icostream, data, data_size);
ok(hr == S_OK, "InitializeFromMemory failed, hr=%x\n", hr);
if (SUCCEEDED(hr))
@@ -123,7 +164,8 @@ static void test_bad_icondirentry_size(void)
{
hr = IWICBitmapDecoder_Initialize(decoder, (IStream*)icostream,
WICDecodeMetadataCacheOnDemand);
- ok(hr == S_OK, "Initialize failed, hr=%x\n", hr);
+ todo_wine_if(todo)
+ ok_(__FILE__, line)(hr == init_hr, "Initialize failed, hr=%x\n",
hr);
if (SUCCEEDED(hr))
{
@@ -163,11 +205,44 @@ static void test_bad_icondirentry_size(void)
IWICImagingFactory_Release(factory);
}
+static void test_decoder(void)
+{
+ struct test_ico ico;
+
+ /* Icon size specified in ICONDIRENTRY does not match bitmap header. */
+ ico = ico_1;
+ ico.direntry.bWidth = 2;
+ ico.direntry.bHeight = 2;
+ test_ico_data(&ico, sizeof(ico), S_OK);
+
+ /* Invalid DIRENTRY data size/offset. */
+ ico = ico_1;
+ ico.direntry.dwDIBOffset = sizeof(ico);
+ test_ico_data(&ico, sizeof(ico), WINCODEC_ERR_BADIMAGE);
+
+ ico = ico_1;
+ ico.direntry.dwDIBSize = sizeof(ico);
+ test_ico_data(&ico, sizeof(ico), WINCODEC_ERR_BADIMAGE);
+
+ /* Header fields validation. */
+ ico = ico_1;
+ ico.header.idReserved = 1;
+ test_ico_data_todo(&ico, sizeof(ico), S_OK);
+ ico.header.idReserved = 0;
+ ico.header.idType = 100;
+ test_ico_data_todo(&ico, sizeof(ico), S_OK);
+
+ /* Premature end of data. */
+ ico = ico_1;
+ test_ico_data(&ico, sizeof(ico.header) - 1, WINCODEC_ERR_STREAMREAD);
+ test_ico_data(&ico, sizeof(ico.header) + sizeof(ico.direntry) - 1,
WINCODEC_ERR_BADIMAGE);
+}
+
START_TEST(icoformat)
{
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
- test_bad_icondirentry_size();
+ test_decoder();
CoUninitialize();
}
diff --git a/modules/rostests/winetests/windowscodecs/info.c
b/modules/rostests/winetests/windowscodecs/info.c
index d00e9d8338..ee95784166 100644
--- a/modules/rostests/winetests/windowscodecs/info.c
+++ b/modules/rostests/winetests/windowscodecs/info.c
@@ -119,7 +119,7 @@ static void test_decoder_info(void)
UINT num_formats, count;
int i, j;
- for (i = 0; i < sizeof(decoder_info_tests)/sizeof(decoder_info_tests[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(decoder_info_tests); i++)
{
struct decoder_info_test *test = &decoder_info_tests[i];
IWICBitmapDecoder *decoder, *decoder2;
@@ -149,8 +149,8 @@ static void test_decoder_info(void)
}
IWICBitmapDecoder_Release(decoder);
- MultiByteToWideChar(CP_ACP, 0, test->mimetype, -1, mimetypeW,
sizeof(mimetypeW)/sizeof(mimetypeW[0]));
- MultiByteToWideChar(CP_ACP, 0, test->extensions, -1, extensionsW,
sizeof(extensionsW)/sizeof(extensionsW[0]));
+ MultiByteToWideChar(CP_ACP, 0, test->mimetype, -1, mimetypeW,
ARRAY_SIZE(mimetypeW));
+ MultiByteToWideChar(CP_ACP, 0, test->extensions, -1, extensionsW,
ARRAY_SIZE(extensionsW));
hr = get_component_info(test->clsid, &info);
ok(hr == S_OK, "CreateComponentInfo failed, hr=%x\n", hr);
@@ -234,8 +234,8 @@ static void test_decoder_info(void)
ok(hr == E_INVALIDARG, "GetPixelFormats failed, hr=%x\n", hr);
count = 0xdeadbeef;
- hr = IWICBitmapDecoderInfo_GetPixelFormats(decoder_info,
sizeof(pixelformats)/sizeof(pixelformats[0]),
- pixelformats, &count);
+ hr = IWICBitmapDecoderInfo_GetPixelFormats(decoder_info,
ARRAY_SIZE(pixelformats),
+ pixelformats, &count);
ok(hr == S_OK, "GetPixelFormats failed, hr=%x\n", hr);
ok(count == num_formats, "got %d formats, expected %d\n", count,
num_formats);
@@ -637,6 +637,38 @@ todo_wine
IWICImagingFactory_Release(factory);
}
+static void test_imagingfactory_interfaces(void)
+{
+ IWICComponentFactory *component_factory;
+ IWICImagingFactory2 *factory2;
+ IWICImagingFactory *factory;
+ HRESULT hr;
+
+ hr = CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER,
+ &IID_IWICImagingFactory2, (void **)&factory2);
+ if (FAILED(hr))
+ {
+ win_skip("IWICImagingFactory2 is not supported.\n");
+ return;
+ }
+
+ hr = IWICImagingFactory2_QueryInterface(factory2, &IID_IWICComponentFactory,
(void **)&component_factory);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ hr = IWICComponentFactory_QueryInterface(component_factory,
&IID_IWICImagingFactory, (void **)&factory);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ ok(factory == (IWICImagingFactory *)component_factory, "Unexpected factory
pointer.\n");
+ IWICImagingFactory_Release(factory);
+
+ hr = IWICImagingFactory2_QueryInterface(factory2, &IID_IWICImagingFactory, (void
**)&factory);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ ok(factory == (IWICImagingFactory *)component_factory, "Unexpected factory
pointer.\n");
+
+ IWICComponentFactory_Release(component_factory);
+ IWICImagingFactory2_Release(factory2);
+ IWICImagingFactory_Release(factory);
+}
+
START_TEST(info)
{
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
@@ -644,6 +676,7 @@ START_TEST(info)
test_decoder_info();
test_reader_info();
test_pixelformat_info();
+ test_imagingfactory_interfaces();
CoUninitialize();
}
diff --git a/modules/rostests/winetests/windowscodecs/metadata.c
b/modules/rostests/winetests/windowscodecs/metadata.c
index 1d4203d5cf..91a5d20f37 100644
--- a/modules/rostests/winetests/windowscodecs/metadata.c
+++ b/modules/rostests/winetests/windowscodecs/metadata.c
@@ -23,6 +23,9 @@
#include <assert.h>
#define COBJMACROS
+#ifdef __REACTOS__
+#define CONST_VTABLE
+#endif
#include "windef.h"
#include "objbase.h"
@@ -816,7 +819,7 @@ static void test_metadata_IFD(void)
hr = IWICMetadataReader_GetCount(reader, &count);
ok(hr == S_OK, "GetCount error %#x\n", hr);
- ok(count == sizeof(td)/sizeof(td[0]), "unexpected count %u\n", count);
+ ok(count == ARRAY_SIZE(td), "unexpected count %u\n", count);
compare_metadata(reader, td, count);
@@ -832,7 +835,7 @@ static void test_metadata_IFD(void)
load_stream((IUnknown *)reader, IFD_data_swapped, sizeof(IFD_data),
persist_options);
hr = IWICMetadataReader_GetCount(reader, &count);
ok(hr == S_OK, "GetCount error %#x\n", hr);
- ok(count == sizeof(td)/sizeof(td[0]), "unexpected count %u\n", count);
+ ok(count == ARRAY_SIZE(td), "unexpected count %u\n", count);
compare_metadata(reader, td, count);
HeapFree(GetProcessHeap(), 0, IFD_data_swapped);
@@ -1271,7 +1274,7 @@ static void test_metadata_gif(void)
hr = IWICMetadataReader_GetCount(reader, &count);
ok(hr == S_OK, "GetCount error %#x\n", hr);
- ok(count == sizeof(gif_LSD)/sizeof(gif_LSD[0]), "unexpected count
%u\n", count);
+ ok(count == ARRAY_SIZE(gif_LSD), "unexpected count %u\n", count);
compare_metadata(reader, gif_LSD, count);
@@ -1320,7 +1323,7 @@ static void test_metadata_gif(void)
hr = IWICMetadataReader_GetCount(reader, &count);
ok(hr == S_OK, "GetCount error %#x\n", hr);
- ok(count == sizeof(gif_IMD)/sizeof(gif_IMD[0]), "unexpected count
%u\n", count);
+ ok(count == ARRAY_SIZE(gif_IMD), "unexpected count %u\n", count);
compare_metadata(reader, gif_IMD, count);
@@ -1374,7 +1377,7 @@ static void test_metadata_gif(void)
hr = IWICMetadataReader_GetCount(reader, &count);
ok(hr == S_OK, "GetCount error %#x\n", hr);
- ok(count == sizeof(animated_gif_LSD)/sizeof(animated_gif_LSD[0]),
"unexpected count %u\n", count);
+ ok(count == ARRAY_SIZE(animated_gif_LSD), "unexpected count %u\n",
count);
compare_metadata(reader, animated_gif_LSD, count);
@@ -1393,7 +1396,7 @@ static void test_metadata_gif(void)
hr = IWICMetadataReader_GetCount(reader, &count);
ok(hr == S_OK, "GetCount error %#x\n", hr);
- ok(count == sizeof(animated_gif_APE)/sizeof(animated_gif_APE[0]),
"unexpected count %u\n", count);
+ ok(count == ARRAY_SIZE(animated_gif_APE), "unexpected count %u\n",
count);
compare_metadata(reader, animated_gif_APE, count);
@@ -1412,7 +1415,7 @@ static void test_metadata_gif(void)
hr = IWICMetadataReader_GetCount(reader, &count);
ok(hr == S_OK, "GetCount error %#x\n", hr);
- ok(count == sizeof(animated_gif_comment_1)/sizeof(animated_gif_comment_1[0]),
"unexpected count %u\n", count);
+ ok(count == ARRAY_SIZE(animated_gif_comment_1), "unexpected count
%u\n", count);
compare_metadata(reader, animated_gif_comment_1, count);
@@ -1431,7 +1434,7 @@ static void test_metadata_gif(void)
hr = IWICMetadataReader_GetCount(reader, &count);
ok(hr == S_OK, "GetCount error %#x\n", hr);
- ok(count == sizeof(animated_gif_plain_1)/sizeof(animated_gif_plain_1[0]),
"unexpected count %u\n", count);
+ ok(count == ARRAY_SIZE(animated_gif_plain_1), "unexpected count
%u\n", count);
compare_metadata(reader, animated_gif_plain_1, count);
@@ -1480,7 +1483,7 @@ static void test_metadata_gif(void)
hr = IWICMetadataReader_GetCount(reader, &count);
ok(hr == S_OK, "GetCount error %#x\n", hr);
- ok(count == sizeof(animated_gif_IMD)/sizeof(animated_gif_IMD[0]),
"unexpected count %u\n", count);
+ ok(count == ARRAY_SIZE(animated_gif_IMD), "unexpected count %u\n",
count);
compare_metadata(reader, animated_gif_IMD, count);
@@ -1499,7 +1502,7 @@ static void test_metadata_gif(void)
hr = IWICMetadataReader_GetCount(reader, &count);
ok(hr == S_OK, "GetCount error %#x\n", hr);
- ok(count == sizeof(animated_gif_comment_2)/sizeof(animated_gif_comment_2[0]),
"unexpected count %u\n", count);
+ ok(count == ARRAY_SIZE(animated_gif_comment_2), "unexpected count
%u\n", count);
if (count == 1)
compare_metadata(reader, animated_gif_comment_2, count);
@@ -1519,7 +1522,7 @@ static void test_metadata_gif(void)
hr = IWICMetadataReader_GetCount(reader, &count);
ok(hr == S_OK, "GetCount error %#x\n", hr);
- ok(count == sizeof(animated_gif_plain_2)/sizeof(animated_gif_plain_2[0]),
"unexpected count %u\n", count);
+ ok(count == ARRAY_SIZE(animated_gif_plain_2), "unexpected count
%u\n", count);
compare_metadata(reader, animated_gif_plain_2, count);
@@ -1538,7 +1541,7 @@ static void test_metadata_gif(void)
hr = IWICMetadataReader_GetCount(reader, &count);
ok(hr == S_OK, "GetCount error %#x\n", hr);
- ok(count == sizeof(animated_gif_GCE)/sizeof(animated_gif_GCE[0]),
"unexpected count %u\n", count);
+ ok(count == ARRAY_SIZE(animated_gif_GCE), "unexpected count %u\n",
count);
compare_metadata(reader, animated_gif_GCE, count);
@@ -1599,13 +1602,17 @@ static void test_metadata_gif(void)
ok(len == 2, "expected 2, got %u\n", len);
ok(!lstrcmpW(name, rootW), "expected '/', got %s\n",
wine_dbgstr_w(name));
- for (i = 0; i < sizeof(decoder_data)/sizeof(decoder_data[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(decoder_data); i++)
{
WCHAR queryW[256];
if (winetest_debug > 1)
trace("query: %s\n", decoder_data[i].query);
MultiByteToWideChar(CP_ACP, 0, decoder_data[i].query, -1, queryW, 256);
+
+ hr = IWICMetadataQueryReader_GetMetadataByName(queryreader, queryW, NULL);
+ ok(hr == decoder_data[i].hr, "GetMetadataByName(%s) returned %#x,
expected %#x\n", wine_dbgstr_w(queryW), hr, decoder_data[i].hr);
+
PropVariantInit(&value);
hr = IWICMetadataQueryReader_GetMetadataByName(queryreader, queryW,
&value);
ok(hr == decoder_data[i].hr, "GetMetadataByName(%s) returned %#x,
expected %#x\n", wine_dbgstr_w(queryW), hr, decoder_data[i].hr);
@@ -1622,7 +1629,7 @@ static void test_metadata_gif(void)
ok(len == lstrlenW(queryW) + 1, "expected %u, got %u\n",
lstrlenW(queryW) + 1, len);
ok(!lstrcmpW(name, queryW), "expected %s, got %s\n",
wine_dbgstr_w(queryW), wine_dbgstr_w(name));
- for (j = 0; j < sizeof(decoder_data)/sizeof(decoder_data[0]); j++)
+ for (j = 0; j < ARRAY_SIZE(decoder_data); j++)
{
MultiByteToWideChar(CP_ACP, 0, decoder_data[j].query, -1, queryW,
256);
@@ -1698,7 +1705,7 @@ static void test_metadata_gif(void)
ok(len == 2, "expected 2, got %u\n", len);
ok(!lstrcmpW(name, rootW), "expected '/', got %s\n",
wine_dbgstr_w(name));
- for (i = 0; i < sizeof(frame_data)/sizeof(frame_data[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(frame_data); i++)
{
if (winetest_debug > 1)
trace("query: %s\n", frame_data[i].query);
@@ -1812,7 +1819,7 @@ static void test_metadata_LSD(void)
{
hr = IWICMetadataReader_GetCount(reader, &count);
ok(hr == S_OK, "GetCount error %#x\n", hr);
- ok(count == sizeof(td)/sizeof(td[0]), "unexpected count %u\n", count);
+ ok(count == ARRAY_SIZE(td), "unexpected count %u\n", count);
compare_metadata(reader, td, count);
@@ -1890,7 +1897,7 @@ static void test_metadata_IMD(void)
{
hr = IWICMetadataReader_GetCount(reader, &count);
ok(hr == S_OK, "GetCount error %#x\n", hr);
- ok(count == sizeof(td)/sizeof(td[0]), "unexpected count %u\n", count);
+ ok(count == ARRAY_SIZE(td), "unexpected count %u\n", count);
compare_metadata(reader, td, count);
@@ -1965,7 +1972,7 @@ static void test_metadata_GCE(void)
{
hr = IWICMetadataReader_GetCount(reader, &count);
ok(hr == S_OK, "GetCount error %#x\n", hr);
- ok(count == sizeof(td)/sizeof(td[0]), "unexpected count %u\n", count);
+ ok(count == ARRAY_SIZE(td), "unexpected count %u\n", count);
compare_metadata(reader, td, count);
@@ -2038,7 +2045,7 @@ static void test_metadata_APE(void)
{
hr = IWICMetadataReader_GetCount(reader, &count);
ok(hr == S_OK, "GetCount error %#x\n", hr);
- ok(count == sizeof(td)/sizeof(td[0]), "unexpected count %u\n", count);
+ ok(count == ARRAY_SIZE(td), "unexpected count %u\n", count);
compare_metadata(reader, td, count);
@@ -2122,7 +2129,7 @@ static void test_metadata_GIF_comment(void)
{
hr = IWICMetadataReader_GetCount(reader, &count);
ok(hr == S_OK, "GetCount error %#x\n", hr);
- ok(count == sizeof(td)/sizeof(td[0]), "unexpected count %u\n", count);
+ ok(count == ARRAY_SIZE(td), "unexpected count %u\n", count);
compare_metadata(reader, td, count);
@@ -2425,9 +2432,9 @@ static void test_WICMapSchemaToName(void)
return;
}
- for (i = 0; i < sizeof(guid_list)/sizeof(guid_list[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(guid_list); i++)
{
- for (j = 0; j < sizeof(schema_list)/sizeof(schema_list[0]); j++)
+ for (j = 0; j < ARRAY_SIZE(schema_list); j++)
{
hr = WICMapSchemaToName(guid_list[i], schema_list[j], 0, NULL, &len);
if (IsEqualGUID(guid_list[i], &GUID_MetadataFormatXMP) ||
@@ -2685,7 +2692,7 @@ static HRESULT WINAPI mdr_GetEnumerator(IWICMetadataReader *iface,
IWICEnumMetad
return E_NOTIMPL;
}
-static /* const */ IWICMetadataReaderVtbl mdr_vtbl =
+static const IWICMetadataReaderVtbl mdr_vtbl =
{
mdr_QueryInterface,
mdr_AddRef,
@@ -2775,7 +2782,7 @@ static HRESULT WINAPI mdbr_GetEnumerator(IWICMetadataBlockReader
*iface, IEnumUn
return E_NOTIMPL;
}
-static /* const */ IWICMetadataBlockReaderVtbl mdbr_vtbl =
+static const IWICMetadataBlockReaderVtbl mdbr_vtbl =
{
mdbr_QueryInterface,
mdbr_AddRef,
@@ -2959,7 +2966,7 @@ static void test_queryreader(void)
hr = IWICComponentFactory_CreateQueryReaderFromBlockReader(factory, &mdbr,
&reader);
ok(hr == S_OK, "CreateQueryReaderFromBlockReader error %#x\n", hr);
- for (i = 0; i < sizeof(test_data)/sizeof(test_data[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(test_data); i++)
{
current_metadata = test_data[i].data;
diff --git a/modules/rostests/winetests/windowscodecs/palette.c
b/modules/rostests/winetests/windowscodecs/palette.c
index 33fd119f65..5bb25fa427 100644
--- a/modules/rostests/winetests/windowscodecs/palette.c
+++ b/modules/rostests/winetests/windowscodecs/palette.c
@@ -462,7 +462,7 @@ static void test_predefined_palette(void)
ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got %#x\n", hr);
IWICPalette_Release(palette);
- for (i = 0; i < sizeof(td)/sizeof(td[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(td); i++)
{
hr = IWICImagingFactory_CreatePalette(factory, &palette);
ok(hr == S_OK, "%u: CreatePalette error %#x\n", i, hr);
diff --git a/modules/rostests/winetests/windowscodecs/pngformat.c
b/modules/rostests/winetests/windowscodecs/pngformat.c
index 3a0ea28ead..8c33d3b964 100644
--- a/modules/rostests/winetests/windowscodecs/pngformat.c
+++ b/modules/rostests/winetests/windowscodecs/pngformat.c
@@ -306,6 +306,8 @@ static HRESULT create_decoder(const void *image_data, UINT image_size,
IWICBitma
refcount = IStream_Release(stream);
ok(refcount > 0, "expected stream refcount > 0\n");
}
+ else
+ IStream_Release(stream);
return hr;
}
@@ -539,6 +541,15 @@ static const char png_PLTE_tRNS[] = {
0x00,0x00,0x00,0x00,'I','E','N','D',0xae,0x42,0x60,0x82
};
+/* grayscale 16 bpp 1x1 pixel PNG image with tRNS chunk */
+static const char png_gray_tRNS[] = {
+ 0x89,'P','N','G',0x0d,0x0a,0x1a,0x0a,
+
0x00,0x00,0x00,0x0d,'I','H','D','R',0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x6a,0xee,0x47,0x16,
+
0x00,0x00,0x00,0x02,'t','R','N','S',0x00,0x00,0x76,0x93,0xcd,0x38,
+
0x00,0x00,0x00,0x0b,'I','D','A','T',0x78,0x9c,0x63,0x60,0x60,0x00,0x00,0x00,0x03,0x00,0x01,0xb8,0xad,0x3a,0x63,
+
0x00,0x00,0x00,0x00,'I','E','N','D',0xae,0x42,0x60,0x82
+};
+
static void test_png_palette(void)
{
HRESULT hr;
@@ -548,6 +559,7 @@ static void test_png_palette(void)
GUID format;
UINT count, ret;
WICColor color[256];
+ char *buf;
hr = create_decoder(png_PLTE_tRNS, sizeof(png_PLTE_tRNS), &decoder);
ok(hr == S_OK, "Failed to load PNG image data %#x\n", hr);
@@ -579,6 +591,64 @@ static void test_png_palette(void)
IWICPalette_Release(palette);
IWICBitmapFrameDecode_Release(frame);
IWICBitmapDecoder_Release(decoder);
+
+ hr = create_decoder(png_gray_tRNS, sizeof(png_gray_tRNS), &decoder);
+ ok(hr == S_OK, "Failed to load PNG 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_WICPixelFormat64bppRGBA),
+ "got wrong format %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 == WINCODEC_ERR_PALETTEUNAVAILABLE, "CopyPalette error %#x\n", hr);
+
+ IWICPalette_Release(palette);
+ IWICBitmapFrameDecode_Release(frame);
+ IWICBitmapDecoder_Release(decoder);
+
+ /* test 8 bpp grayscale PNG image with tRNS chunk */
+ buf = HeapAlloc(GetProcessHeap(), 0, sizeof(png_gray_tRNS));
+ memcpy(buf, png_gray_tRNS, sizeof(png_gray_tRNS));
+ buf[24] = 8; /* override bit depth */
+
+ hr = create_decoder(buf, sizeof(png_gray_tRNS), &decoder);
+ ok(hr == S_OK, "Failed to load PNG 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),
+ "got wrong format %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] == 0x00000000, "expected 0x00000000, got %#x\n", color[0]);
+ ok(color[1] == 0xff010101, "expected 0xff010101, got %#x\n", color[1]);
+
+ HeapFree(GetProcessHeap(), 0, buf);
+ IWICPalette_Release(palette);
+ IWICBitmapFrameDecode_Release(frame);
+ IWICBitmapDecoder_Release(decoder);
}
/* RGB 24 bpp 1x1 pixel PNG image */
@@ -624,23 +694,29 @@ static const char png_1x1_data[] = {
0x00,0x00,0x00,0x00,'I','E','N','D',0xae,0x42,0x60,0x82
};
+#define PNG_COLOR_TYPE_GRAY 0
+#define PNG_COLOR_TYPE_RGB 2
+#define PNG_COLOR_TYPE_PALETTE 3
+#define PNG_COLOR_TYPE_GRAY_ALPHA 4
+#define PNG_COLOR_TYPE_RGB_ALPHA 6
+
static BOOL is_valid_png_type_depth(int color_type, int bit_depth, BOOL plte)
{
switch (color_type)
{
- case 0: /* Grayscale */
+ case PNG_COLOR_TYPE_GRAY:
return bit_depth == 1 || bit_depth == 2 || bit_depth == 4 || bit_depth == 8 ||
bit_depth == 16;
- case 2: /* True Color */
+ case PNG_COLOR_TYPE_RGB:
return bit_depth == 8 || bit_depth == 16;
- case 3: /* Indexed Color */
+ case PNG_COLOR_TYPE_PALETTE:
return (bit_depth == 1 || bit_depth == 2 || bit_depth == 4 || bit_depth == 8)
&& plte;
- case 4: /* Grayscale with alpha */
+ case PNG_COLOR_TYPE_GRAY_ALPHA:
return bit_depth == 8 || bit_depth == 16;
- case 6: /* True Color with alpha */
+ case PNG_COLOR_TYPE_RGB_ALPHA:
return bit_depth == 8 || bit_depth == 16;
default:
@@ -662,33 +738,44 @@ static void test_color_formats(void)
} td[] =
{
/* 2 - PNG_COLOR_TYPE_RGB */
- { 1, 2, NULL, NULL, NULL },
- { 2, 2, NULL, NULL, NULL },
- { 4, 2, NULL, NULL, NULL },
- { 8, 2, &GUID_WICPixelFormat24bppBGR, &GUID_WICPixelFormat24bppBGR,
&GUID_WICPixelFormat24bppBGR },
+ { 1, PNG_COLOR_TYPE_RGB, NULL, NULL, NULL },
+ { 2, PNG_COLOR_TYPE_RGB, NULL, NULL, NULL },
+ { 4, PNG_COLOR_TYPE_RGB, NULL, NULL, NULL },
+ { 8, PNG_COLOR_TYPE_RGB,
+ &GUID_WICPixelFormat24bppBGR, &GUID_WICPixelFormat24bppBGR,
&GUID_WICPixelFormat24bppBGR },
/* libpng refuses to load our test image complaining about extra compressed
data,
* but libpng is still able to load the image with other combination of
type/depth
* making RGB 16 bpp case special for some reason. Therefore todo = TRUE.
*/
- { 16, 2, &GUID_WICPixelFormat48bppRGB, &GUID_WICPixelFormat48bppRGB,
&GUID_WICPixelFormat48bppRGB, TRUE, TRUE },
- { 24, 2, NULL, NULL, NULL },
- { 32, 2, NULL, NULL, NULL },
+ { 16, PNG_COLOR_TYPE_RGB,
+ &GUID_WICPixelFormat48bppRGB, &GUID_WICPixelFormat48bppRGB,
&GUID_WICPixelFormat48bppRGB, TRUE, TRUE },
+ { 24, PNG_COLOR_TYPE_RGB, NULL, NULL, NULL },
+ { 32, PNG_COLOR_TYPE_RGB, NULL, NULL, NULL },
/* 0 - PNG_COLOR_TYPE_GRAY */
- { 1, 0, &GUID_WICPixelFormatBlackWhite, &GUID_WICPixelFormatBlackWhite,
&GUID_WICPixelFormat1bppIndexed },
- { 2, 0, &GUID_WICPixelFormat2bppGray, &GUID_WICPixelFormat2bppGray,
&GUID_WICPixelFormat2bppIndexed },
- { 4, 0, &GUID_WICPixelFormat4bppGray, &GUID_WICPixelFormat4bppGray,
&GUID_WICPixelFormat4bppIndexed },
- { 8, 0, &GUID_WICPixelFormat8bppGray, &GUID_WICPixelFormat8bppGray,
&GUID_WICPixelFormat8bppIndexed },
- { 16, 0, &GUID_WICPixelFormat16bppGray, &GUID_WICPixelFormat16bppGray,
&GUID_WICPixelFormat64bppRGBA },
- { 24, 0, NULL, NULL, NULL },
- { 32, 0, NULL, NULL, NULL },
+ { 1, PNG_COLOR_TYPE_GRAY,
+ &GUID_WICPixelFormatBlackWhite, &GUID_WICPixelFormatBlackWhite,
&GUID_WICPixelFormat1bppIndexed },
+ { 2, PNG_COLOR_TYPE_GRAY,
+ &GUID_WICPixelFormat2bppGray, &GUID_WICPixelFormat2bppGray,
&GUID_WICPixelFormat2bppIndexed },
+ { 4, PNG_COLOR_TYPE_GRAY,
+ &GUID_WICPixelFormat4bppGray, &GUID_WICPixelFormat4bppGray,
&GUID_WICPixelFormat4bppIndexed },
+ { 8, PNG_COLOR_TYPE_GRAY,
+ &GUID_WICPixelFormat8bppGray, &GUID_WICPixelFormat8bppGray,
&GUID_WICPixelFormat8bppIndexed },
+ { 16, PNG_COLOR_TYPE_GRAY,
+ &GUID_WICPixelFormat16bppGray, &GUID_WICPixelFormat16bppGray,
&GUID_WICPixelFormat64bppRGBA },
+ { 24, PNG_COLOR_TYPE_GRAY, NULL, NULL, NULL },
+ { 32, PNG_COLOR_TYPE_GRAY, NULL, NULL, NULL },
/* 3 - PNG_COLOR_TYPE_PALETTE */
- { 1, 3, &GUID_WICPixelFormat1bppIndexed, &GUID_WICPixelFormat1bppIndexed,
&GUID_WICPixelFormat1bppIndexed },
- { 2, 3, &GUID_WICPixelFormat2bppIndexed, &GUID_WICPixelFormat2bppIndexed,
&GUID_WICPixelFormat2bppIndexed },
- { 4, 3, &GUID_WICPixelFormat4bppIndexed, &GUID_WICPixelFormat4bppIndexed,
&GUID_WICPixelFormat4bppIndexed },
- { 8, 3, &GUID_WICPixelFormat8bppIndexed, &GUID_WICPixelFormat8bppIndexed,
&GUID_WICPixelFormat8bppIndexed },
- { 16, 3, NULL, NULL, NULL },
- { 24, 3, NULL, NULL, NULL },
- { 32, 3, NULL, NULL, NULL },
+ { 1, PNG_COLOR_TYPE_PALETTE,
+ &GUID_WICPixelFormat1bppIndexed, &GUID_WICPixelFormat1bppIndexed,
&GUID_WICPixelFormat1bppIndexed },
+ { 2, PNG_COLOR_TYPE_PALETTE,
+ &GUID_WICPixelFormat2bppIndexed, &GUID_WICPixelFormat2bppIndexed,
&GUID_WICPixelFormat2bppIndexed },
+ { 4, PNG_COLOR_TYPE_PALETTE,
+ &GUID_WICPixelFormat4bppIndexed, &GUID_WICPixelFormat4bppIndexed,
&GUID_WICPixelFormat4bppIndexed },
+ { 8, PNG_COLOR_TYPE_PALETTE,
+ &GUID_WICPixelFormat8bppIndexed, &GUID_WICPixelFormat8bppIndexed,
&GUID_WICPixelFormat8bppIndexed },
+ { 16, PNG_COLOR_TYPE_PALETTE, NULL, NULL, NULL },
+ { 24, PNG_COLOR_TYPE_PALETTE, NULL, NULL, NULL },
+ { 32, PNG_COLOR_TYPE_PALETTE, NULL, NULL, NULL },
};
char buf[sizeof(png_1x1_data)];
HRESULT hr;
@@ -717,7 +804,7 @@ static void test_color_formats(void)
* with tEXt id.
*/
- for (i = 0; i < sizeof(td)/sizeof(td[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(td); i++)
{
/* with the tRNS and PLTE chunks */
memcpy(buf, png_1x1_data, sizeof(png_1x1_data));
@@ -829,6 +916,11 @@ todo_wine_if(td[i].todo)
IWICBitmapDecoder_Release(decoder);
}
}
+#undef PNG_COLOR_TYPE_GRAY
+#undef PNG_COLOR_TYPE_RGB
+#undef PNG_COLOR_TYPE_PALETTE
+#undef PNG_COLOR_TYPE_GRAY_ALPHA
+#undef PNG_COLOR_TYPE_RGB_ALPHA
START_TEST(pngformat)
{
diff --git a/modules/rostests/winetests/windowscodecs/stream.c
b/modules/rostests/winetests/windowscodecs/stream.c
index 5f311b897b..3750c32f3c 100644
--- a/modules/rostests/winetests/windowscodecs/stream.c
+++ b/modules/rostests/winetests/windowscodecs/stream.c
@@ -21,6 +21,22 @@
#define COBJMACROS
#include "wincodec.h"
+#define CHECK_CUR_POS(a, b) _check_cur_pos((IStream *)a, b, FALSE, __LINE__)
+#define CHECK_CUR_POS_TODO(a, b) _check_cur_pos((IStream *)a, b, TRUE, __LINE__)
+static void _check_cur_pos(IStream *stream, ULONGLONG expected_pos, BOOL todo, unsigned
int line)
+{
+ LARGE_INTEGER offset;
+ ULARGE_INTEGER pos;
+ HRESULT hr;
+
+ offset.QuadPart = 0;
+ hr = IStream_Seek(stream, offset, STREAM_SEEK_CUR, &pos);
+ ok_(__FILE__, line)(hr == S_OK, "Failed to get current position, hr
%#x.\n", hr);
+todo_wine_if(todo)
+ ok_(__FILE__, line)(pos.QuadPart == expected_pos, "Unexpected stream position
%s.\n",
+ wine_dbgstr_longlong(pos.QuadPart));
+}
+
static void test_StreamOnMemory(void)
{
IWICImagingFactory *pFactory;
@@ -51,8 +67,6 @@ static void test_StreamOnMemory(void)
memcpy(Memory, CmpMem, sizeof(CmpMem));
- CoInitialize(NULL);
-
hr = CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER,
&IID_IWICImagingFactory, (void**)&pFactory);
if(FAILED(hr)) {
skip("CoCreateInstance returned with %#x, expected %#x\n", hr, S_OK);
@@ -113,9 +127,7 @@ static void test_StreamOnMemory(void)
hr = IWICStream_Seek(pStream, LargeInt, STREAM_SEEK_SET, &uNewPos);
ok(hr == HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW), "Seek returned with %#x,
expected %#x\n", hr, HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW));
ok(uNewPos.u.HighPart == 0xdeadbeef && uNewPos.u.LowPart == 0xdeadbeef,
"Seek cursor initialized to position (%u;%u), expected (%u;%u)\n",
uNewPos.u.HighPart, uNewPos.u.LowPart, 0xdeadbeef, 0xdeadbeef);
- hr = IWICStream_Seek(pStream, LargeNull, STREAM_SEEK_CUR, &uNewPos);
- ok(hr == S_OK, "Seek returned with %#x, expected %#x\n", hr, S_OK);
- ok(uNewPos.u.HighPart == 0 && uNewPos.u.LowPart == 0, "Seek cursor moved
to position (%u;%u), expected (%u;%u)\n", uNewPos.u.HighPart, uNewPos.u.LowPart, 0,
0);
+ CHECK_CUR_POS(pStream, 0);
LargeInt.QuadPart = sizeof(Memory) + 10;
uNewPos.u.HighPart = 0xdeadbeef;
@@ -123,9 +135,7 @@ static void test_StreamOnMemory(void)
hr = IWICStream_Seek(pStream, LargeInt, STREAM_SEEK_SET, &uNewPos);
ok(hr == E_INVALIDARG, "Seek returned with %#x, expected %#x\n", hr,
E_INVALIDARG);
ok(uNewPos.u.HighPart == 0xdeadbeef && uNewPos.u.LowPart == 0xdeadbeef,
"Seek cursor initialized to position (%u;%u), expected (%u;%u)\n",
uNewPos.u.HighPart, uNewPos.u.LowPart, 0xdeadbeef, 0xdeadbeef);
- hr = IWICStream_Seek(pStream, LargeNull, STREAM_SEEK_CUR, &uNewPos);
- ok(hr == S_OK, "Seek returned with %#x, expected %#x\n", hr, S_OK);
- ok(uNewPos.u.HighPart == 0 && uNewPos.u.LowPart == 0, "Seek cursor moved
to position (%u;%u), expected (%u;%u)\n", uNewPos.u.HighPart, uNewPos.u.LowPart, 0,
0);
+ CHECK_CUR_POS(pStream, 0);
LargeInt.QuadPart = 1;
uNewPos.u.HighPart = 0xdeadbeef;
@@ -133,9 +143,7 @@ static void test_StreamOnMemory(void)
hr = IWICStream_Seek(pStream, LargeInt, STREAM_SEEK_END, &uNewPos);
ok(hr == E_INVALIDARG, "Seek returned with %#x, expected %#x\n", hr,
E_INVALIDARG);
ok(uNewPos.u.HighPart == 0xdeadbeef && uNewPos.u.LowPart == 0xdeadbeef,
"Seek cursor initialized to position (%u;%u), expected (%u;%u)\n",
uNewPos.u.HighPart, uNewPos.u.LowPart, 0xdeadbeef, 0xdeadbeef);
- hr = IWICStream_Seek(pStream, LargeNull, STREAM_SEEK_CUR, &uNewPos);
- ok(hr == S_OK, "Seek returned with %#x, expected %#x\n", hr, S_OK);
- ok(uNewPos.u.HighPart == 0 && uNewPos.u.LowPart == 0, "Seek cursor moved
to position (%u;%u), expected (%u;%u)\n", uNewPos.u.HighPart, uNewPos.u.LowPart, 0,
0);
+ CHECK_CUR_POS(pStream, 0);
LargeInt.QuadPart = -1;
hr = IWICStream_Seek(pStream, LargeInt, STREAM_SEEK_END, &uNewPos);
@@ -150,12 +158,9 @@ static void test_StreamOnMemory(void)
ok(hr == HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW),
"Seek returned with %#x, expected %#x\n", hr,
HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW));
ok(uNewPos.u.HighPart == 0xdeadbeef && uNewPos.u.LowPart == 0xdeadbeef,
"Seek cursor initialized to position (%u;%u), expected (%u;%u)\n",
uNewPos.u.HighPart, uNewPos.u.LowPart, 0xdeadbeef, 0xdeadbeef);
- hr = IWICStream_Seek(pStream, LargeNull, STREAM_SEEK_CUR, &uNewPos);
- ok(hr == S_OK, "Seek returned with %#x, expected %#x\n", hr, S_OK);
- ok(uNewPos.u.HighPart == 0 && uNewPos.u.LowPart == 0, "Seek cursor moved
to position (%u;%u), expected (%u;%u)\n", uNewPos.u.HighPart, uNewPos.u.LowPart, 0,
0); /* remains unchanged */
+ CHECK_CUR_POS(pStream, 0);
IWICStream_Seek(pStream, LargeNull, STREAM_SEEK_SET, NULL);
-
/* Read */
hr = IWICStream_Read(pStream, MemBuf, 12, &uBytesRead);
ok(hr == S_OK, "Read returned with %#x, expected %#x\n", hr, S_OK);
@@ -164,8 +169,7 @@ static void test_StreamOnMemory(void)
ok(memcmp(MemBuf, CmpMem, 12) == 0, "Read returned invalid data!\n");
/* check whether the seek pointer has moved correctly */
- IWICStream_Seek(pStream, LargeNull, STREAM_SEEK_CUR, &uNewPos);
- ok(uNewPos.u.HighPart == 0 && uNewPos.u.LowPart == uBytesRead, "Seek
cursor moved to position (%u;%u), expected (%u;%u)\n", uNewPos.u.HighPart,
uNewPos.u.LowPart, 0, uBytesRead);
+ CHECK_CUR_POS(pStream, uBytesRead);
}
IWICStream_Seek(pStream, LargeNull, STREAM_SEEK_SET, NULL);
@@ -234,8 +238,7 @@ static void test_StreamOnMemory(void)
ok(memcmp(MemBuf, Memory, 3) == 0, "Wrote returned invalid data!\n");
/* make sure we're writing directly */
/* check whether the seek pointer has moved correctly */
- IWICStream_Seek(pStream, LargeNull, STREAM_SEEK_CUR, &uNewPos);
- ok(uNewPos.u.HighPart == 0 && uNewPos.u.LowPart == uBytesWritten,
"Seek cursor moved to position (%u;%u), expected (%u;%u)\n", uNewPos.u.HighPart,
uNewPos.u.LowPart, 0, uBytesWritten);
+ CHECK_CUR_POS(pStream, uBytesWritten);
}
IWICStream_Seek(pStream, LargeNull, STREAM_SEEK_SET, NULL);
@@ -262,22 +265,19 @@ static void test_StreamOnMemory(void)
hr = IWICStream_Write(pStream, NULL, 3, &uBytesWritten);
ok(hr == E_INVALIDARG, "Write returned with %#x, expected %#x\n", hr,
E_INVALIDARG);
ok(uBytesWritten == 0xdeadbeef, "Expected uBytesWritten to be unchanged, got
%u\n", uBytesWritten);
- IWICStream_Seek(pStream, LargeNull, STREAM_SEEK_CUR, &uNewPos);
- ok(uNewPos.u.HighPart == 0 && uNewPos.u.LowPart == 0, "Seek cursor moved
to position (%u;%u), expected (%u;%u)\n", uNewPos.u.HighPart, uNewPos.u.LowPart, 0,
0);
+ CHECK_CUR_POS(pStream, 0);
uBytesWritten = 0xdeadbeef;
hr = IWICStream_Write(pStream, NULL, 0, &uBytesWritten);
ok(hr == E_INVALIDARG, "Write returned with %#x, expected %#x\n", hr,
E_INVALIDARG);
ok(uBytesWritten == 0xdeadbeef, "Expected uBytesWritten to be unchanged, got
%u\n", uBytesWritten);
- IWICStream_Seek(pStream, LargeNull, STREAM_SEEK_CUR, &uNewPos);
- ok(uNewPos.u.HighPart == 0 && uNewPos.u.LowPart == 0, "Seek cursor moved
to position (%u;%u), expected (%u;%u)\n", uNewPos.u.HighPart, uNewPos.u.LowPart, 0,
0);
+ CHECK_CUR_POS(pStream, 0);
uBytesWritten = 0xdeadbeef;
hr = IWICStream_Write(pStream, CmpMem, sizeof(Memory) + 10, &uBytesWritten);
ok(hr == STG_E_MEDIUMFULL, "Write returned with %#x, expected %#x\n", hr,
STG_E_MEDIUMFULL);
ok(uBytesWritten == 0xdeadbeef, "Expected uBytesWritten to be unchanged, got
%u\n", uBytesWritten);
- IWICStream_Seek(pStream, LargeNull, STREAM_SEEK_CUR, &uNewPos);
- ok(uNewPos.u.HighPart == 0 && uNewPos.u.LowPart == 0, "Seek cursor moved
to position (%u;%u), expected (%u;%u)\n", uNewPos.u.HighPart, uNewPos.u.LowPart, 0,
0);
+ CHECK_CUR_POS(pStream, 0);
IWICStream_Seek(pStream, LargeNull, STREAM_SEEK_SET, NULL);
@@ -380,7 +380,6 @@ static void test_StreamOnMemory(void)
IWICStream_Release(pStream);
IWICImagingFactory_Release(pFactory);
- CoUninitialize();
}
static void test_StreamOnStreamRange(void)
@@ -441,13 +440,16 @@ static void test_StreamOnStreamRange(void)
}
/* Seek */
+ CHECK_CUR_POS(pStream, 0);
hr = IWICStream_Seek(pSubStream, LargeNull, STREAM_SEEK_END, &uNewPos);
ok(uNewPos.u.HighPart == 0 && uNewPos.u.LowPart == 20, "Seek cursor
moved to position (%u;%u), expected (%u;%u)\n", uNewPos.u.HighPart,
uNewPos.u.LowPart, 0, 20);
ok(hr == S_OK, "Seek returned with %#x, expected %#x\n", hr, S_OK);
+ CHECK_CUR_POS(pStream, 0);
hr = IWICStream_Seek(pSubStream, LargeNull, STREAM_SEEK_SET, &uNewPos);
ok(hr == S_OK, "Seek returned with %#x, expected %#x\n", hr, S_OK);
ok(uNewPos.u.HighPart == 0 && uNewPos.u.LowPart == 0, "Seek cursor moved
to position (%u;%u), expected (%u;%u)\n", uNewPos.u.HighPart, uNewPos.u.LowPart, 0,
0);
+ CHECK_CUR_POS(pStream, 0);
hr = IWICStream_Seek(pSubStream, LargeNull, STREAM_SEEK_SET, NULL);
ok(hr == S_OK, "Seek returned with %#x, expected %#x\n", hr, S_OK);
@@ -459,9 +461,7 @@ static void test_StreamOnStreamRange(void)
hr = IWICStream_Seek(pSubStream, LargeInt, STREAM_SEEK_SET, &uNewPos);
ok(hr == WINCODEC_ERR_VALUEOUTOFRANGE, "Seek returned with %#x, expected
%#x\n", hr, WINCODEC_ERR_VALUEOUTOFRANGE);
ok(uNewPos.u.HighPart == 0xdeadbeef && uNewPos.u.LowPart == 0xdeadbeef,
"Seek cursor initialized to position (%u;%u), expected (%u;%u)\n",
uNewPos.u.HighPart, uNewPos.u.LowPart, 0xdeadbeef, 0xdeadbeef);
- hr = IWICStream_Seek(pStream, LargeNull, STREAM_SEEK_CUR, &uNewPos);
- ok(hr == S_OK, "Seek returned with %#x, expected %#x\n", hr, S_OK);
- ok(uNewPos.u.HighPart == 0 && uNewPos.u.LowPart == 0, "Seek cursor moved
to position (%u;%u), expected (%u;%u)\n", uNewPos.u.HighPart, uNewPos.u.LowPart, 0,
0);
+ CHECK_CUR_POS(pStream, 0);
LargeInt.QuadPart = 30;
uNewPos.u.HighPart = 0xdeadbeef;
@@ -469,9 +469,7 @@ static void test_StreamOnStreamRange(void)
hr = IWICStream_Seek(pSubStream, LargeInt, STREAM_SEEK_SET, &uNewPos);
ok(hr == WINCODEC_ERR_VALUEOUTOFRANGE, "Seek returned with %#x, expected
%#x\n", hr, WINCODEC_ERR_VALUEOUTOFRANGE);
ok(uNewPos.u.HighPart == 0xdeadbeef && uNewPos.u.LowPart == 0xdeadbeef,
"Seek cursor initialized to position (%u;%u), expected (%u;%u)\n",
uNewPos.u.HighPart, uNewPos.u.LowPart, 0xdeadbeef, 0xdeadbeef);
- hr = IWICStream_Seek(pStream, LargeNull, STREAM_SEEK_CUR, &uNewPos);
- ok(hr == S_OK, "Seek returned with %#x, expected %#x\n", hr, S_OK);
- ok(uNewPos.u.HighPart == 0 && uNewPos.u.LowPart == 0, "Seek cursor moved
to position (%u;%u), expected (%u;%u)\n", uNewPos.u.HighPart, uNewPos.u.LowPart, 0,
0);
+ CHECK_CUR_POS(pStream, 0);
LargeInt.QuadPart = 1;
uNewPos.u.HighPart = 0xdeadbeef;
@@ -479,14 +477,13 @@ static void test_StreamOnStreamRange(void)
hr = IWICStream_Seek(pSubStream, LargeInt, STREAM_SEEK_END, &uNewPos);
ok(hr == WINCODEC_ERR_VALUEOUTOFRANGE, "Seek returned with %#x, expected
%#x\n", hr, WINCODEC_ERR_VALUEOUTOFRANGE);
ok(uNewPos.u.HighPart == 0xdeadbeef && uNewPos.u.LowPart == 0xdeadbeef,
"Seek cursor initialized to position (%u;%u), expected (%u;%u)\n",
uNewPos.u.HighPart, uNewPos.u.LowPart, 0xdeadbeef, 0xdeadbeef);
- hr = IWICStream_Seek(pStream, LargeNull, STREAM_SEEK_CUR, &uNewPos);
- ok(hr == S_OK, "Seek returned with %#x, expected %#x\n", hr, S_OK);
- ok(uNewPos.u.HighPart == 0 && uNewPos.u.LowPart == 0, "Seek cursor moved
to position (%u;%u), expected (%u;%u)\n", uNewPos.u.HighPart, uNewPos.u.LowPart, 0,
0);
+ CHECK_CUR_POS(pStream, 0);
LargeInt.QuadPart = -1;
hr = IWICStream_Seek(pSubStream, LargeInt, STREAM_SEEK_END, &uNewPos);
ok(hr == S_OK, "Seek returned with %#x, expected %#x\n", hr, S_OK);
ok(uNewPos.u.HighPart == 0 && uNewPos.u.LowPart == 19, "bSeek cursor
moved to position (%u;%u)\n", uNewPos.u.HighPart, uNewPos.u.LowPart);
+ CHECK_CUR_POS(pStream, 0);
IWICStream_Seek(pSubStream, LargeNull, STREAM_SEEK_SET, &uNewPos); /* reset seek
pointer */
LargeInt.QuadPart = -25;
@@ -496,9 +493,7 @@ static void test_StreamOnStreamRange(void)
ok(hr == WINCODEC_ERR_VALUEOUTOFRANGE,
"Seek returned with %#x, expected %#x\n", hr,
HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW));
ok(uNewPos.u.HighPart == 0xdeadbeef && uNewPos.u.LowPart == 0xdeadbeef,
"Seek cursor initialized to position (%u;%u), expected (%u;%u)\n",
uNewPos.u.HighPart, uNewPos.u.LowPart, 0xdeadbeef, 0xdeadbeef);
- hr = IWICStream_Seek(pStream, LargeNull, STREAM_SEEK_CUR, &uNewPos);
- ok(hr == S_OK, "Seek returned with %#x, expected %#x\n", hr, S_OK);
- ok(uNewPos.u.HighPart == 0 && uNewPos.u.LowPart == 0, "Seek cursor moved
to position (%u;%u), expected (%u;%u)\n", uNewPos.u.HighPart, uNewPos.u.LowPart, 0,
0); /* remains unchanged */
+ CHECK_CUR_POS(pStream, 0);
IWICStream_Seek(pSubStream, LargeNull, STREAM_SEEK_SET, NULL);
@@ -510,8 +505,8 @@ static void test_StreamOnStreamRange(void)
ok(memcmp(MemBuf, CmpMem+20, 12) == 0, "Read returned invalid
data!\n");
/* check whether the seek pointer has moved correctly */
- IWICStream_Seek(pSubStream, LargeNull, STREAM_SEEK_CUR, &uNewPos);
- ok(uNewPos.u.HighPart == 0 && uNewPos.u.LowPart == uBytesRead, "Seek
cursor moved to position (%u;%u), expected (%u;%u)\n", uNewPos.u.HighPart,
uNewPos.u.LowPart, 0, uBytesRead);
+ CHECK_CUR_POS(pSubStream, uBytesRead);
+ CHECK_CUR_POS(pStream, 0);
}
IWICStream_Seek(pSubStream, LargeNull, STREAM_SEEK_SET, NULL);
@@ -522,6 +517,7 @@ static void test_StreamOnStreamRange(void)
ok(uBytesRead == 10, "Read %u bytes, expected %u\n", uBytesRead, 10);
ok(memcmp(Memory, CmpMem+20, uBytesRead) == 0, "Read returned invalid
data!\n");
}
+ CHECK_CUR_POS(pStream, 0);
IWICStream_Seek(pSubStream, LargeNull, STREAM_SEEK_SET, NULL);
@@ -531,6 +527,7 @@ static void test_StreamOnStreamRange(void)
ok(uBytesRead == 20, "Read %u bytes\n", uBytesRead);
ok(memcmp(Memory, CmpMem+20, uBytesRead) == 0, "Read returned invalid
data!\n");
}
+ CHECK_CUR_POS(pStream, 0);
IWICStream_Seek(pSubStream, LargeNull, STREAM_SEEK_SET, NULL);
uBytesRead = 0xdeadbeef;
@@ -574,8 +571,8 @@ static void test_StreamOnStreamRange(void)
ok(memcmp(MemBuf, Memory+20, 3) == 0, "Wrote returned invalid
data!\n"); /* make sure we're writing directly */
/* check whether the seek pointer has moved correctly */
- IWICStream_Seek(pSubStream, LargeNull, STREAM_SEEK_CUR, &uNewPos);
- ok(uNewPos.u.HighPart == 0 && uNewPos.u.LowPart == uBytesWritten,
"Seek cursor moved to position (%u;%u), expected (%u;%u)\n", uNewPos.u.HighPart,
uNewPos.u.LowPart, 0, uBytesWritten);
+ CHECK_CUR_POS(pSubStream, uBytesWritten);
+ CHECK_CUR_POS(pStream, 0);
}
IWICStream_Seek(pSubStream, LargeNull, STREAM_SEEK_SET, NULL);
@@ -586,21 +583,21 @@ static void test_StreamOnStreamRange(void)
hr = IWICStream_Write(pSubStream, NULL, 3, &uBytesWritten);
ok(hr == E_INVALIDARG, "Write returned with %#x, expected %#x\n", hr,
E_INVALIDARG);
ok(uBytesWritten == 0xdeadbeef, "Expected uBytesWritten to be unchanged, got
%u\n", uBytesWritten);
- IWICStream_Seek(pSubStream, LargeNull, STREAM_SEEK_CUR, &uNewPos);
- ok(uNewPos.u.HighPart == 0 && uNewPos.u.LowPart == 0, "Seek cursor moved
to position (%u;%u), expected (%u;%u)\n", uNewPos.u.HighPart, uNewPos.u.LowPart, 0,
0);
+ CHECK_CUR_POS(pSubStream, 0);
+ CHECK_CUR_POS(pStream, 0);
uBytesWritten = 0xdeadbeef;
hr = IWICStream_Write(pSubStream, NULL, 0, &uBytesWritten);
ok(hr == E_INVALIDARG, "Write returned with %#x, expected %#x\n", hr,
E_INVALIDARG);
ok(uBytesWritten == 0xdeadbeef, "Expected uBytesWritten to be unchanged, got
%u\n", uBytesWritten);
- IWICStream_Seek(pSubStream, LargeNull, STREAM_SEEK_CUR, &uNewPos);
- ok(uNewPos.u.HighPart == 0 && uNewPos.u.LowPart == 0, "Seek cursor moved
to position (%u;%u), expected (%u;%u)\n", uNewPos.u.HighPart, uNewPos.u.LowPart, 0,
0);
+ CHECK_CUR_POS(pSubStream, 0);
+ CHECK_CUR_POS(pStream, 0);
hr = IWICStream_Write(pSubStream, CmpMem, 30, &uBytesWritten);
ok(hr == S_OK, "Write returned with %#x, expected %#x\n", hr,
STG_E_MEDIUMFULL);
ok(uBytesWritten == 20, "Wrote %u bytes, expected %u\n", uBytesWritten,
0);
- IWICStream_Seek(pSubStream, LargeNull, STREAM_SEEK_CUR, &uNewPos);
- ok(uNewPos.u.HighPart == 0 && uNewPos.u.LowPart == uBytesWritten, "Seek
cursor moved to position (%u;%u), expected (%u;%u)\n", uNewPos.u.HighPart,
uNewPos.u.LowPart, 0, uBytesWritten);
+ CHECK_CUR_POS(pSubStream, uBytesWritten);
+ CHECK_CUR_POS(pStream, 0);
IWICStream_Seek(pSubStream, LargeNull, STREAM_SEEK_SET, NULL);
@@ -727,9 +724,8 @@ static void test_StreamOnStreamRange(void)
hr = IWICStream_Write(pSubStream, CmpMem, 32, &uBytesWritten);
ok(hr == STG_E_MEDIUMFULL, "Write returned with %#x, expected %#x\n", hr,
STG_E_MEDIUMFULL);
ok(uBytesWritten == 0xdeadbeef, "Expected uBytesWritten to be unchanged, got
%u\n", uBytesWritten);
- IWICStream_Seek(pSubStream, LargeNull, STREAM_SEEK_CUR, &uNewPos);
- ok(uNewPos.u.HighPart == 0 && uNewPos.u.LowPart == 0, "Seek cursor moved
to position (%u;%u), expected (%u;%u)\n", uNewPos.u.HighPart, uNewPos.u.LowPart, 0,
0);
-
+ CHECK_CUR_POS(pSubStream, 0);
+ CHECK_CUR_POS(pStream, 0);
IWICStream_Release(pSubStream);
IWICStream_Release(pStream);
@@ -737,8 +733,288 @@ static void test_StreamOnStreamRange(void)
CoUninitialize();
}
+static void test_StreamOnIStream(void)
+{
+ static const BYTE data[] =
+ {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c,
0x0d, 0x0e, 0x0f,
+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c,
0x1d, 0x1e, 0x1f,
+ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c,
0x2d, 0x2e, 0x2f,
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c,
0x3d, 0x3e, 0x3f,
+ };
+ static const LARGE_INTEGER zero_pos;
+ static const ULARGE_INTEGER uzero;
+ IWICStream *stream, *substream;
+ IWICImagingFactory *factory;
+ BYTE memory[64], buff[64];
+ ULONG read_len, written;
+ ULARGE_INTEGER newpos;
+ IStream *copy_stream;
+ LARGE_INTEGER pos;
+ unsigned int i;
+ STATSTG stats;
+ HRESULT hr;
+
+ memcpy(memory, data, sizeof(data));
+
+ hr = CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER,
+ &IID_IWICImagingFactory, (void **)&factory);
+ ok(hr == S_OK, "Failed to create a factory, hr %#x.\n", hr);
+
+ hr = IWICImagingFactory_CreateStream(factory, &stream);
+ ok(hr == S_OK, "Failed to create a stream, hr %#x.\n", hr);
+
+ hr = IWICStream_InitializeFromMemory(stream, memory, sizeof(memory));
+ ok(hr == S_OK, "Failed to initialize stream, hr %#x.", hr);
+
+ hr = IWICImagingFactory_CreateStream(factory, &substream);
+ ok(hr == S_OK, "Failed to create a stream, hr %#x.\n", hr);
+
+ pos.QuadPart = 1;
+ hr = IWICStream_Seek(stream, pos, STREAM_SEEK_SET, &newpos);
+ ok(hr == S_OK, "Failed to set position, hr %#x.\n", hr);
+ CHECK_CUR_POS(stream, 1);
+
+ hr = IWICStream_InitializeFromIStream(substream, (IStream *)stream);
+ ok(hr == S_OK, "Failed to initialize stream, hr %#x.\n", hr);
+ CHECK_CUR_POS(substream, 1);
+
+ /* Seek */
+ CHECK_CUR_POS(stream, 1);
+ hr = IWICStream_Seek(substream, zero_pos, STREAM_SEEK_END, &newpos);
+ ok(hr == S_OK, "Failed to seek a stream, hr %#x.\n", hr);
+ ok(newpos.QuadPart == sizeof(memory), "Unexpected position %s.\n",
wine_dbgstr_longlong(newpos.QuadPart));
+ CHECK_CUR_POS(substream, sizeof(memory));
+ CHECK_CUR_POS(stream, sizeof(memory));
+
+ hr = IWICStream_Seek(substream, zero_pos, STREAM_SEEK_SET, &newpos);
+ ok(hr == S_OK, "Failed to seek a stream, hr %#x.\n", hr);
+ ok(newpos.QuadPart == 0, "Unexpected position %s.\n",
wine_dbgstr_longlong(newpos.QuadPart));
+ CHECK_CUR_POS(stream, 0);
+ CHECK_CUR_POS(substream, 0);
+
+ hr = IWICStream_Seek(substream, zero_pos, STREAM_SEEK_SET, NULL);
+ ok(hr == S_OK, "Failed to seek a stream, hr %#x.\n", hr);
+
+ pos.u.HighPart = 1;
+ pos.u.LowPart = 0;
+ newpos.u.HighPart = 0xdeadbeef;
+ newpos.u.LowPart = 0xdeadbeef;
+ hr = IWICStream_Seek(substream, pos, STREAM_SEEK_SET, &newpos);
+ ok(hr == HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW), "Unexpected hr
%#x.\n", hr);
+ ok(newpos.u.HighPart == 0xdeadbeef && newpos.u.LowPart == 0xdeadbeef,
"Unexpected position %s.\n",
+ wine_dbgstr_longlong(newpos.QuadPart));
+ CHECK_CUR_POS(stream, 0);
+ CHECK_CUR_POS(substream, 0);
+
+ pos.QuadPart = sizeof(memory) + 1;
+ newpos.u.HighPart = 0xdeadbeef;
+ newpos.u.LowPart = 0xdeadbeef;
+ hr = IWICStream_Seek(substream, pos, STREAM_SEEK_SET, &newpos);
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+ ok(newpos.u.HighPart == 0xdeadbeef && newpos.u.LowPart == 0xdeadbeef,
"Unexpected position %s.\n",
+ wine_dbgstr_longlong(newpos.QuadPart));
+ CHECK_CUR_POS(stream, 0);
+ CHECK_CUR_POS(substream, 0);
+
+ pos.QuadPart = 1;
+ newpos.u.HighPart = 0xdeadbeef;
+ newpos.u.LowPart = 0xdeadbeef;
+ hr = IWICStream_Seek(substream, pos, STREAM_SEEK_END, &newpos);
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+ ok(newpos.u.HighPart == 0xdeadbeef && newpos.u.LowPart == 0xdeadbeef,
"Unexpected position %s.\n",
+ wine_dbgstr_longlong(newpos.QuadPart));
+ CHECK_CUR_POS(stream, 0);
+ CHECK_CUR_POS(substream, 0);
+
+ pos.QuadPart = -1;
+ hr = IWICStream_Seek(substream, pos, STREAM_SEEK_END, &newpos);
+ ok(hr == S_OK, "Failed to seek a stream, hr %#x.\n", hr);
+ ok(newpos.QuadPart == sizeof(memory) - 1, "Unexpected position %s.\n",
wine_dbgstr_longlong(newpos.QuadPart));
+ CHECK_CUR_POS(stream, sizeof(memory) - 1);
+ CHECK_CUR_POS(substream, sizeof(memory) - 1);
+
+ IWICStream_Seek(substream, zero_pos, STREAM_SEEK_SET, NULL);
+
+ /* Read */
+ hr = IWICStream_Read(substream, buff, 12, &read_len);
+ ok(hr == S_OK, "Failed to read from stream, hr %#x.\n", hr);
+ ok(read_len == 12, "Unexpected read length %u.\n", read_len);
+ ok(!memcmp(buff, data, 12), "Unexpected data.\n");
+ CHECK_CUR_POS(substream, read_len);
+ CHECK_CUR_POS(stream, read_len);
+
+ IWICStream_Seek(substream, zero_pos, STREAM_SEEK_SET, NULL);
+ CHECK_CUR_POS(stream, 0);
+
+ hr = IWICStream_Read(substream, memory, 10, &read_len); /* source = dest */
+ ok(hr == S_OK, "Failed to read from stream, hr %#x.\n", hr);
+ ok(read_len == 10, "Unexpected read length %u.\n", read_len);
+ ok(!memcmp(memory, data, read_len), "Unexpected data.\n");
+ CHECK_CUR_POS(stream, 10);
+
+ IWICStream_Seek(substream, zero_pos, STREAM_SEEK_SET, NULL);
+ hr = IWICStream_Read(substream, memory, 2 * sizeof(data), &read_len); /*
request too many bytes */
+ ok(hr == S_OK, "Failed to read from stream, hr %#x.\n", hr);
+ ok(read_len == 64, "Unexpected read length %u.\n", read_len);
+ ok(!memcmp(memory, data, read_len), "Unexpected data.\n");
+ CHECK_CUR_POS(stream, sizeof(data));
+
+ IWICStream_Seek(substream, zero_pos, STREAM_SEEK_SET, NULL);
+ read_len = 0xdeadbeef;
+ hr = IWICStream_Read(substream, NULL, 1, &read_len); /* destination buffer =
NULL */
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+ ok(read_len == 0xdeadbeef, "Unexpected read length %u.\n", read_len);
+
+ read_len = 1;
+ hr = IWICStream_Read(substream, buff, 0, &read_len); /* read 0 bytes */
+ ok(hr == S_OK, "Failed to read from stream, hr %#x.\n", hr);
+ ok(read_len == 0, "Unexpected read length %u.\n", read_len);
+
+ read_len = 0xdeadbeef;
+ hr = IWICStream_Read(substream, NULL, 0, &read_len);
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+ ok(read_len == 0xdeadbeef, "Unexpected read length %u.\n", read_len);
+
+ hr = IWICStream_Read(substream, NULL, 0, NULL);
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+ hr = IWICStream_Read(substream, buff, 1, NULL);
+ ok(hr == S_OK, "Failed to read from stream, hr %#x.\n", hr);
+ CHECK_CUR_POS(substream, 1);
+ CHECK_CUR_POS(stream, 1);
+ IWICStream_Seek(substream, zero_pos, STREAM_SEEK_SET, NULL);
+
+ /* Write */
+ for (i = 0; i < 3; ++i)
+ buff[i] = data[i] + 1;
+
+ hr = IWICStream_Write(substream, buff, 3, &written);
+ ok(hr == S_OK, "Failed to write to stream, hr %#x.\n", hr);
+ ok(written == 3, "Unexpected written length %u.\n", written);
+ ok(!memcmp(buff, memory, 3), "Unexpected stream data.\n");
+ CHECK_CUR_POS(substream, written);
+ CHECK_CUR_POS(stream, written);
+ IWICStream_Seek(substream, zero_pos, STREAM_SEEK_SET, NULL);
+
+ hr = IWICStream_Write(substream, buff, 0, &written);
+ ok(hr == S_OK, "Failed to write to stream, hr %#x.\n", hr);
+
+ written = 0xdeadbeef;
+ hr = IWICStream_Write(substream, NULL, 3, &written);
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+ ok(written == 0xdeadbeef, "Unexpected written length %u.\n", written);
+ CHECK_CUR_POS(substream, 0);
+ CHECK_CUR_POS(stream, 0);
+
+ written = 0xdeadbeef;
+ hr = IWICStream_Write(substream, NULL, 0, &written);
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+ ok(written == 0xdeadbeef, "Unexpected written length %u.\n", written);
+ CHECK_CUR_POS(substream, 0);
+ CHECK_CUR_POS(stream, 0);
+
+ /* SetSize */
+ newpos.u.HighPart = 0;
+ newpos.u.LowPart = sizeof(memory) + 10;
+ hr = IWICStream_SetSize(substream, newpos);
+ ok(hr == E_NOTIMPL, "Unexpected hr %#x.\n", hr);
+
+ newpos.u.HighPart = 0;
+ newpos.u.LowPart = sizeof(memory);
+ hr = IWICStream_SetSize(substream, newpos);
+ ok(hr == E_NOTIMPL, "Unexpected hr %#x.\n", hr);
+
+ newpos.u.HighPart = 0;
+ newpos.u.LowPart = sizeof(memory) - 10;
+ hr = IWICStream_SetSize(substream, newpos);
+ ok(hr == E_NOTIMPL, "Unexpected hr %#x.\n", hr);
+
+ newpos.QuadPart = 0;
+ hr = IWICStream_SetSize(substream, newpos);
+ ok(hr == E_NOTIMPL, "Unexpected hr %#x.\n", hr);
+
+ newpos.QuadPart = -10;
+ hr = IWICStream_SetSize(substream, newpos);
+ ok(hr == E_NOTIMPL, "Unexpected hr %#x.\n", hr);
+
+ /* CopyTo */
+ newpos.u.HighPart = 0;
+ newpos.u.LowPart = 30;
+ hr = IWICStream_CopyTo(substream, NULL, newpos, NULL, NULL);
+ ok(hr == E_NOTIMPL, "Unexpected hr %#x.\n", hr);
+
+ hr = CreateStreamOnHGlobal(NULL, TRUE, ©_stream);
+ ok(hr == S_OK, "Failed to create a stream, hr %#x.\n", hr);
+
+ hr = IWICStream_CopyTo(substream, copy_stream, newpos, NULL, NULL);
+ ok(hr == E_NOTIMPL, "Unexpected hr %#x.\n", hr);
+ IStream_Release(copy_stream);
+
+ /* Commit */
+ hr = IWICStream_Commit(substream, STGC_DEFAULT);
+ ok(hr == E_NOTIMPL, "Unexpected hr %#x.\n", hr);
+
+ hr = IWICStream_Commit(substream, STGC_OVERWRITE);
+ ok(hr == E_NOTIMPL, "Unexpected hr %#x.\n", hr);
+
+ hr = IWICStream_Commit(substream, STGC_ONLYIFCURRENT);
+ ok(hr == E_NOTIMPL, "Unexpected hr %#x.\n", hr);
+
+ hr = IWICStream_Commit(substream, STGC_DANGEROUSLYCOMMITMERELYTODISKCACHE);
+ ok(hr == E_NOTIMPL, "Unexpected hr %#x.\n", hr);
+
+ hr = IWICStream_Commit(substream, STGC_CONSOLIDATE);
+ ok(hr == E_NOTIMPL, "Unexpected hr %#x.\n", hr);
+
+ /* Revert */
+ IWICStream_Write(substream, buff + 5, 6, NULL);
+ hr = IWICStream_Revert(substream);
+ ok(hr == E_NOTIMPL, "Unexpected hr %#x.\n", hr);
+ memcpy(memory, data, sizeof(memory));
+
+ /* LockRegion/UnlockRegion */
+ hr = IWICStream_LockRegion(substream, uzero, uzero, 0);
+ ok(hr == E_NOTIMPL, "Unexpected hr %#x.\n", hr);
+
+ hr = IWICStream_UnlockRegion(substream, uzero, uzero, 0);
+ ok(hr == E_NOTIMPL, "Unexpected hr %#x.\n", hr);
+
+ /* Stat */
+ hr = IWICStream_Stat(substream, NULL, 0);
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+ hr = IWICStream_Stat(substream, &stats, 0);
+ ok(hr == S_OK, "Failed to get stream stats, hr %#x.\n", hr);
+ ok(stats.pwcsName == NULL, "Unexpected name %p.\n", stats.pwcsName);
+ ok(stats.type == STGTY_STREAM, "Unexpected type %d.\n", stats.type);
+ ok(stats.cbSize.QuadPart == sizeof(data), "Unexpected size %s.\n",
wine_dbgstr_longlong(stats.cbSize.QuadPart));
+ ok(stats.mtime.dwHighDateTime == 0 && stats.mtime.dwLowDateTime == 0,
"Unexpected mtime (%u;%u).\n",
+ stats.mtime.dwHighDateTime, stats.mtime.dwLowDateTime);
+ ok(stats.ctime.dwHighDateTime == 0 && stats.ctime.dwLowDateTime == 0,
"Unexpected ctime (%u;%u).\n",
+ stats.ctime.dwHighDateTime, stats.ctime.dwLowDateTime);
+ ok(stats.atime.dwHighDateTime == 0 && stats.atime.dwLowDateTime == 0,
"Unexpected atime (%u;%u).\n",
+ stats.atime.dwHighDateTime, stats.atime.dwLowDateTime);
+ ok(stats.grfMode == 0, "Unexpected mode %d.\n", stats.grfMode);
+ ok(stats.grfLocksSupported == 0, "Unexpected locks support %#x.\n",
stats.grfLocksSupported);
+ ok(stats.grfStateBits == 0, "Unexpected state bits %#x.\n",
stats.grfStateBits);
+
+ /* Clone */
+ hr = IWICStream_Clone(substream, ©_stream);
+ ok(hr == E_NOTIMPL, "Unexpected hr %#x.\n", hr);
+
+ IWICStream_Release(substream);
+ IWICStream_Release(stream);
+ IWICImagingFactory_Release(factory);
+}
+
START_TEST(stream)
{
+ CoInitialize(NULL);
+
test_StreamOnMemory();
test_StreamOnStreamRange();
+ test_StreamOnIStream();
+
+ CoUninitialize();
}
diff --git a/modules/rostests/winetests/windowscodecs/tiffformat.c
b/modules/rostests/winetests/windowscodecs/tiffformat.c
index 5671dfbfbc..289e061145 100644
--- a/modules/rostests/winetests/windowscodecs/tiffformat.c
+++ b/modules/rostests/winetests/windowscodecs/tiffformat.c
@@ -26,6 +26,15 @@
#include "wincodec.h"
#include "wine/test.h"
+#define EXPECT_REF(obj,ref) _expect_ref((IUnknown*)obj, ref, __LINE__)
+static void _expect_ref(IUnknown* obj, ULONG ref, int line)
+{
+ ULONG rc;
+ IUnknown_AddRef(obj);
+ rc = IUnknown_Release(obj);
+ ok_(__FILE__,line)(rc == ref, "expected refcount %d, got %d\n", ref, rc);
+}
+
#define IFD_BYTE 1
#define IFD_ASCII 2
#define IFD_SHORT 3
@@ -253,6 +262,46 @@ static struct tiff_resolution_image_data
{ 72, 1 }, /* value will be filled with test data */
{ 0x11, 0x22, 0x33, 0 }
};
+
+static const struct tiff_24bpp_data
+{
+ USHORT byte_order;
+ USHORT version;
+ ULONG dir_offset;
+ USHORT number_of_entries;
+ struct IFD_entry entry[13];
+ ULONG next_IFD;
+ struct IFD_rational res;
+ BYTE pixel_data[3];
+} tiff_24bpp_data =
+{
+#ifdef WORDS_BIGENDIAN
+ 'M' | 'M' << 8,
+#else
+ 'I' | 'I' << 8,
+#endif
+ 42,
+ FIELD_OFFSET(struct tiff_1bpp_data, number_of_entries),
+ 13,
+ {
+ { 0xff, IFD_SHORT, 1, 0 }, /* SUBFILETYPE */
+ { 0x100, IFD_LONG, 1, 1 }, /* IMAGEWIDTH */
+ { 0x101, IFD_LONG, 1, 1 }, /* IMAGELENGTH */
+ { 0x102, IFD_SHORT, 1, 8 }, /* BITSPERSAMPLE */
+ { 0x103, IFD_SHORT, 1, 1 }, /* COMPRESSION: XP doesn't accept IFD_LONG here
*/
+ { 0x106, IFD_SHORT, 1, 2 }, /* PHOTOMETRIC */
+ { 0x111, IFD_LONG, 1, FIELD_OFFSET(struct tiff_24bpp_data, pixel_data) }, /*
STRIPOFFSETS */
+ { 0x115, IFD_SHORT, 1, 3 }, /* SAMPLESPERPIXEL */
+ { 0x116, IFD_LONG, 1, 1 }, /* ROWSPERSTRIP */
+ { 0x117, IFD_LONG, 1, 3 }, /* STRIPBYTECOUNT */
+ { 0x11a, IFD_RATIONAL, 1, FIELD_OFFSET(struct tiff_24bpp_data, res) }, /*
XRESOLUTION */
+ { 0x11b, IFD_RATIONAL, 1, FIELD_OFFSET(struct tiff_24bpp_data, res) }, /*
YRESOLUTION */
+ { 0x128, IFD_SHORT, 1, 2 }, /* RESOLUTIONUNIT */
+ },
+ 0,
+ { 900, 3 },
+ { 0x11, 0x22, 0x33 }
+};
#include "poppack.h"
static IWICImagingFactory *factory;
@@ -517,8 +566,11 @@ static void test_tiff_8bpp_alpha(void)
ok(hr == S_OK, "GetFrameCount error %#x\n", hr);
ok(frame_count == 1, "expected 1, got %u\n", frame_count);
+ EXPECT_REF(decoder, 1);
hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame);
ok(hr == S_OK, "GetFrame error %#x\n", hr);
+ EXPECT_REF(decoder, 2);
+ IWICBitmapDecoder_Release(decoder);
hr = IWICBitmapFrameDecode_GetSize(frame, &width, &height);
ok(hr == S_OK, "GetSize error %#x\n", hr);
@@ -553,7 +605,6 @@ static void test_tiff_8bpp_alpha(void)
ok(data[i] == expected_data[i], "%u: expected %02x, got %02x\n", i,
expected_data[i], data[i]);
IWICBitmapFrameDecode_Release(frame);
- IWICBitmapDecoder_Release(decoder);
}
static void generate_tiff_palette(void *buf, unsigned count)
@@ -642,7 +693,7 @@ static void test_tiff_resolution(void)
double dpi_x, dpi_y;
int i;
- for (i = 0; i <
sizeof(tiff_resolution_test_data)/sizeof(tiff_resolution_test_data[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(tiff_resolution_test_data); i++)
{
const struct tiff_resolution_test_data *test_data =
&tiff_resolution_test_data[i];
tiff_resolution_image_data.resx = test_data->resx;
@@ -686,6 +737,67 @@ static void test_tiff_resolution(void)
}
}
+static void test_tiff_24bpp(void)
+{
+ HRESULT hr;
+ IWICBitmapDecoder *decoder;
+ IWICBitmapFrameDecode *frame;
+ UINT count, width, height, i, stride;
+ double dpi_x, dpi_y;
+ GUID format;
+ WICRect rc;
+ BYTE data[3];
+ static const BYTE expected_data[] = { 0x33,0x22,0x11 };
+
+ hr = create_decoder(&tiff_24bpp_data, sizeof(tiff_24bpp_data), &decoder);
+ ok(hr == S_OK, "got %#x\n", hr);
+ ok(decoder != NULL, "Failed to load TIFF image data\n");
+
+ hr = IWICBitmapDecoder_GetFrameCount(decoder, &count);
+ ok(hr == S_OK, "GetFrameCount error %#x\n", hr);
+ ok(count == 1, "got %u\n", count);
+
+ hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame);
+ ok(hr == S_OK, "GetFrame error %#x\n", hr);
+
+ hr = IWICBitmapFrameDecode_GetSize(frame, &width, &height);
+ ok(hr == S_OK, "GetSize error %#x\n", hr);
+ ok(width == 1, "got %u\n", width);
+ ok(height == 1, "got %u\n", height);
+
+ hr = IWICBitmapFrameDecode_GetResolution(frame, &dpi_x, &dpi_y);
+ ok(hr == S_OK, "GetResolution error %#x\n", hr);
+ ok(dpi_x == 300.0, "got %f\n", dpi_x);
+ ok(dpi_y == 300.0, "got %f\n", dpi_y);
+
+ hr = IWICBitmapFrameDecode_GetPixelFormat(frame, &format);
+ ok(hr == S_OK, "GetPixelFormat error %#x\n", hr);
+ ok(IsEqualGUID(&format, &GUID_WICPixelFormat24bppBGR),
+ "got wrong format %s\n", wine_dbgstr_guid(&format));
+
+ for (stride = 0; stride <= 32; stride++)
+ {
+ memset(data, 0, sizeof(data));
+ rc.X = 0;
+ rc.Y = 0;
+ rc.Width = 1;
+ rc.Height = 1;
+ hr = IWICBitmapFrameDecode_CopyPixels(frame, &rc, stride, sizeof(data),
data);
+ if (stride < 3)
+ ok(hr == E_INVALIDARG, "CopyPixels(%u) should fail: %#x\n", stride,
hr);
+ else
+ {
+ ok(hr == S_OK, "CopyPixels(%u) error %#x\n", stride, hr);
+
+ for (i = 0; i < sizeof(data); i++)
+ ok(data[i] == expected_data[i], "%u: expected %02x, got
%02x\n", i, expected_data[i], data[i]);
+ }
+ }
+
+ IWICBitmapFrameDecode_Release(frame);
+ IWICBitmapDecoder_Release(decoder);
+}
+
#include "pshpack2.h"
static const struct tiff_1x1_data
{
@@ -1083,6 +1195,7 @@ START_TEST(tiffformat)
test_QueryCapability();
test_tiff_8bpp_alpha();
test_tiff_resolution();
+ test_tiff_24bpp();
IWICImagingFactory_Release(factory);
CoUninitialize();