From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/windowscodecs/tests/info.c | 185 ++++++++++++++++++++++++++++++++ 1 file changed, 185 insertions(+)
diff --git a/dlls/windowscodecs/tests/info.c b/dlls/windowscodecs/tests/info.c index 031e83c9d7d..3e3be9b7bf0 100644 --- a/dlls/windowscodecs/tests/info.c +++ b/dlls/windowscodecs/tests/info.c @@ -324,6 +324,190 @@ static void test_decoder_info(void) } }
+static void test_encoder_info(void) +{ + static const struct encoder_info_test + { + const CLSID *clsid; + const WCHAR *mimetype; + const WCHAR *extensions; + } encoder_info_tests[] = + { + { + &CLSID_WICBmpEncoder, + L"image/bmp", + L".bmp,.dib,.rle" + }, + { + &CLSID_WICGifEncoder, + L"image/gif", + L".gif" + }, + { + &CLSID_WICPngEncoder, + L"image/png", + L".png" + }, + }; + IWICBitmapEncoderInfo *encoder_info, *encoder_info2; + IWICComponentInfo *info; + UINT num_formats, count; + GUID pixelformats[32]; + WCHAR value[256]; + HRESULT hr; + CLSID clsid; + UINT len; + int i, j; + + for (i = 0; i < ARRAY_SIZE(encoder_info_tests); i++) + { + const struct encoder_info_test *test = &encoder_info_tests[i]; + IWICBitmapEncoder *encoder, *encoder2; + + hr = CoCreateInstance(test->clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IWICBitmapEncoder, (void **)&encoder); + if (IsEqualGUID(&test->clsid, &CLSID_WICDdsDecoder) && hr != S_OK) + { + win_skip("DDS encoder is not supported\n"); + continue; + } + ok(hr == S_OK, "Failed to create an encoder, hr %#lx.\n", hr); + + winetest_push_context("%s", wine_dbgstr_guid(test->clsid)); + + encoder_info = NULL; + hr = IWICBitmapEncoder_GetEncoderInfo(encoder, &encoder_info); + ok(hr == S_OK || broken(IsEqualCLSID(&CLSID_WICBmpEncoder, test->clsid) && FAILED(hr)) /* Fails on Windows */, + "Failed to get encoder info, hr %#lx.\n", hr); + + if (hr == S_OK) + { + encoder_info2 = NULL; + hr = IWICBitmapEncoder_GetEncoderInfo(encoder, &encoder_info2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(encoder_info == encoder_info2, "Unexpected info instance.\n"); + + hr = IWICBitmapEncoderInfo_QueryInterface(encoder_info, &IID_IWICBitmapEncoder, (void **)&encoder2); + ok(hr == E_NOINTERFACE, "Unexpected hr %#lx.\n", hr); + + IWICBitmapEncoderInfo_Release(encoder_info); + IWICBitmapEncoderInfo_Release(encoder_info2); + } + IWICBitmapEncoder_Release(encoder); + + hr = get_component_info(test->clsid, &info); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IWICComponentInfo_QueryInterface(info, &IID_IWICBitmapEncoderInfo, (void **)&encoder_info); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IWICBitmapEncoderInfo_GetCLSID(encoder_info, NULL); + ok(hr == E_INVALIDARG, "GetCLSID failed, hr=%lx\n", hr); + + hr = IWICBitmapEncoderInfo_GetCLSID(encoder_info, &clsid); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(IsEqualGUID(test->clsid, &clsid), "GetCLSID returned wrong result\n"); + + hr = IWICBitmapEncoderInfo_GetMimeTypes(encoder_info, 0, NULL, NULL); + ok(hr == E_INVALIDARG, "GetMimeType failed, hr=%lx\n", hr); + + len = 0; + hr = IWICBitmapEncoderInfo_GetMimeTypes(encoder_info, 1, NULL, &len); + ok(hr == E_INVALIDARG, "GetMimeType failed, hr=%lx\n", hr); + ok(len == lstrlenW(test->mimetype) + 1, "GetMimeType returned wrong len %i\n", len); + + hr = IWICBitmapEncoderInfo_GetMimeTypes(encoder_info, len, value, NULL); + ok(hr == E_INVALIDARG, "GetMimeType failed, hr=%lx\n", hr); + + len = 0; + hr = IWICBitmapEncoderInfo_GetMimeTypes(encoder_info, 0, NULL, &len); + ok(hr == S_OK, "GetMimeType failed, hr=%lx\n", hr); + ok(len == lstrlenW(test->mimetype) + 1, "GetMimeType returned wrong len %i\n", len); + + value[0] = 0; + hr = IWICBitmapEncoderInfo_GetMimeTypes(encoder_info, len, value, &len); + ok(hr == S_OK, "GetMimeType failed, hr=%lx\n", hr); + ok(!lstrcmpW(value, test->mimetype), "GetMimeType returned wrong value %s\n", wine_dbgstr_w(value)); + ok(len == lstrlenW(test->mimetype) + 1, "GetMimeType returned wrong len %i\n", len); + + hr = IWICBitmapEncoderInfo_GetMimeTypes(encoder_info, 1, value, &len); + ok(hr == WINCODEC_ERR_INSUFFICIENTBUFFER, "GetMimeType failed, hr=%lx\n", hr); + ok(len == lstrlenW(test->mimetype) + 1, "GetMimeType returned wrong len %i\n", len); + + hr = IWICBitmapEncoderInfo_GetMimeTypes(encoder_info, 256, value, &len); + ok(hr == S_OK, "GetMimeType failed, hr=%lx\n", hr); + ok(lstrcmpW(value, test->mimetype) == 0, "GetMimeType returned wrong value %s\n", wine_dbgstr_w(value)); + ok(len == lstrlenW(test->mimetype) + 1, "GetMimeType returned wrong len %i\n", len); + + num_formats = 0; + hr = IWICBitmapEncoderInfo_GetPixelFormats(encoder_info, 0, NULL, &num_formats); + ok(hr == S_OK, "GetPixelFormats failed, hr=%lx\n", hr); + ok(num_formats, "Unexpected number of formats %u.\n", num_formats); + + hr = IWICBitmapEncoderInfo_GetPixelFormats(encoder_info, 0, NULL, NULL); + ok(hr == E_INVALIDARG, "GetPixelFormats failed, hr=%lx\n", hr); + + count = 0xdeadbeef; + hr = IWICBitmapEncoderInfo_GetPixelFormats(encoder_info, 0, pixelformats, &count); + ok(hr == S_OK, "GetPixelFormats failed, hr=%lx\n", hr); + ok(count == 0, "got %d formats\n", count); + + count = 0; + hr = IWICBitmapEncoderInfo_GetPixelFormats(encoder_info, 1, pixelformats, &count); + ok(hr == S_OK, "GetPixelFormats failed, hr=%lx\n", hr); + ok(count == 1, "%u: got %d formats\n", i, num_formats); + ok(is_pixelformat(&pixelformats[0]), "got invalid pixel format\n"); + + count = 0xdeadbeef; + hr = IWICBitmapEncoderInfo_GetPixelFormats(encoder_info, num_formats, pixelformats, &count); + ok(hr == S_OK, "GetPixelFormats failed, hr=%lx\n", hr); + ok(count == num_formats, "got %d formats, expected %d\n", count, num_formats); + for (j = 0; j < num_formats; j++) + ok(is_pixelformat(&pixelformats[j]), "got invalid pixel format\n"); + + hr = IWICBitmapEncoderInfo_GetPixelFormats(encoder_info, num_formats, pixelformats, NULL); + ok(hr == E_INVALIDARG, "GetPixelFormats failed, hr=%lx\n", hr); + + count = 0xdeadbeef; + hr = IWICBitmapEncoderInfo_GetPixelFormats(encoder_info, ARRAY_SIZE(pixelformats), pixelformats, &count); + ok(hr == S_OK, "GetPixelFormats failed, hr=%lx\n", hr); + ok(count == num_formats, "got %d formats, expected %d\n", count, num_formats); + + hr = IWICBitmapEncoderInfo_GetFileExtensions(encoder_info, 0, NULL, NULL); + ok(hr == E_INVALIDARG, "GetFileExtensions failed, hr=%lx\n", hr); + + hr = IWICBitmapEncoderInfo_GetFileExtensions(encoder_info, 1, NULL, &len); + ok(hr == E_INVALIDARG, "GetFileExtensions failed, hr=%lx\n", hr); + ok(len == lstrlenW(test->extensions) + 1, "Unexpected length %i.\n", len); + + hr = IWICBitmapEncoderInfo_GetFileExtensions(encoder_info, len, value, NULL); + ok(hr == E_INVALIDARG, "GetFileExtensions failed, hr=%lx\n", hr); + + hr = IWICBitmapEncoderInfo_GetFileExtensions(encoder_info, 0, NULL, &len); + ok(hr == S_OK, "GetFileExtensions failed, hr=%lx\n", hr); + ok(len == lstrlenW(test->extensions) + 1, "GetFileExtensions returned wrong len %i\n", len); + + value[0] = 0; + hr = IWICBitmapEncoderInfo_GetFileExtensions(encoder_info, len, value, &len); + ok(hr == S_OK, "GetFileExtensions failed, hr=%lx\n", hr); + ok(lstrcmpW(value, test->extensions) == 0, "GetFileExtensions returned wrong value %s\n", wine_dbgstr_w(value)); + ok(len == lstrlenW(test->extensions) + 1, "GetFileExtensions returned wrong len %i\n", len); + + hr = IWICBitmapEncoderInfo_GetFileExtensions(encoder_info, 1, value, &len); + ok(hr == WINCODEC_ERR_INSUFFICIENTBUFFER, "GetFileExtensions failed, hr=%lx\n", hr); + ok(len == lstrlenW(test->extensions) + 1, "GetFileExtensions returned wrong len %i\n", len); + + hr = IWICBitmapEncoderInfo_GetFileExtensions(encoder_info, 256, value, &len); + ok(hr == S_OK, "GetFileExtensions failed, hr=%lx\n", hr); + ok(lstrcmpW(value, test->extensions) == 0, "GetFileExtensions returned wrong value %s\n", wine_dbgstr_w(value)); + ok(len == lstrlenW(test->extensions) + 1, "GetFileExtensions returned wrong len %i\n", len); + + IWICBitmapEncoderInfo_Release(encoder_info); + IWICComponentInfo_Release(info); + + winetest_pop_context(); + } +} + static void test_pixelformat_info(void) { IWICComponentInfo *info; @@ -811,6 +995,7 @@ START_TEST(info)
run_child_test("get_handler_info_cold_cache"); test_decoder_info(); + test_encoder_info(); test_reader_info(); test_pixelformat_info(); test_imagingfactory_interfaces();