These invalid formats are rejected when creating WIC render targets. Otherwise, Wine may create a WIC render target with an unsupported format and in turn, will make testing IsSupported() method difficult.
-- v3: d2d1: Test creating WIC bitmap render targets. d2d1: Reject unsupported formats when creating WIC bitmap render targets.
From: Zhiyi Zhang zzhang@codeweavers.com
--- dlls/d2d1/wic_render_target.c | 98 ++++++++++++++++++++++++++++++++--- 1 file changed, 90 insertions(+), 8 deletions(-)
diff --git a/dlls/d2d1/wic_render_target.c b/dlls/d2d1/wic_render_target.c index f6e7b14ed3f..700334a7c01 100644 --- a/dlls/d2d1/wic_render_target.c +++ b/dlls/d2d1/wic_render_target.c @@ -149,15 +149,105 @@ static const struct d2d_device_context_ops d2d_wic_render_target_ops = d2d_wic_render_target_present, };
+static HRESULT check_invalid_formats(const WICPixelFormatGUID *wic_format, + const D2D1_PIXEL_FORMAT *pixel_format) +{ + D2D1_PIXEL_FORMAT result_format, wic_pixel_format = {DXGI_FORMAT_UNKNOWN, D2D1_ALPHA_MODE_UNKNOWN}; + const WICPixelFormatGUID *result_wic_format = NULL; + unsigned int i; + BOOL found; + + static const struct + { + const WICPixelFormatGUID *wic_format; + D2D1_PIXEL_FORMAT pixel_format; + } + wic_pixel_formats[] = + { + {&GUID_WICPixelFormat8bppAlpha, {DXGI_FORMAT_A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED}}, + {&GUID_WICPixelFormat8bppAlpha, {DXGI_FORMAT_A8_UNORM, D2D1_ALPHA_MODE_STRAIGHT}}, + {&GUID_WICPixelFormat32bppBGR, {DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_IGNORE}}, + {&GUID_WICPixelFormat32bppBGR, {DXGI_FORMAT_B8G8R8A8_UNORM_SRGB, D2D1_ALPHA_MODE_IGNORE}}, + {&GUID_WICPixelFormat32bppPBGRA, {DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED}}, + {&GUID_WICPixelFormat32bppPBGRA, {DXGI_FORMAT_B8G8R8A8_UNORM_SRGB, D2D1_ALPHA_MODE_PREMULTIPLIED}}, + {&GUID_WICPixelFormat32bppRGB, {DXGI_FORMAT_R8G8B8A8_UNORM, D2D1_ALPHA_MODE_IGNORE}}, + {&GUID_WICPixelFormat32bppRGB, {DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, D2D1_ALPHA_MODE_IGNORE}}, + {&GUID_WICPixelFormat32bppPRGBA, {DXGI_FORMAT_R8G8B8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED}}, + {&GUID_WICPixelFormat32bppPRGBA, {DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, D2D1_ALPHA_MODE_PREMULTIPLIED}}, + {&GUID_WICPixelFormat64bppRGB, {DXGI_FORMAT_R16G16B16A16_UNORM, D2D1_ALPHA_MODE_IGNORE}}, + {&GUID_WICPixelFormat64bppPRGBA, {DXGI_FORMAT_R16G16B16A16_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED}}, + {&GUID_WICPixelFormat128bppPRGBAFloat, {DXGI_FORMAT_R32G32B32A32_FLOAT, D2D1_ALPHA_MODE_PREMULTIPLIED}}, + {&GUID_WICPixelFormat128bppRGBFloat, {DXGI_FORMAT_R32G32B32A32_FLOAT, D2D1_ALPHA_MODE_IGNORE}}, + {&GUID_WICPixelFormat64bppPRGBAHalf, {DXGI_FORMAT_R16G16B16A16_FLOAT, D2D1_ALPHA_MODE_PREMULTIPLIED}}, + {&GUID_WICPixelFormat64bppRGBHalf, {DXGI_FORMAT_R16G16B16A16_FLOAT, D2D1_ALPHA_MODE_IGNORE}}, + {&GUID_WICPixelFormat32bppRGBA1010102, {DXGI_FORMAT_R10G10B10A2_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED}}, + {&GUID_WICPixelFormat8bppY, {DXGI_FORMAT_R8_UNORM, D2D1_ALPHA_MODE_IGNORE}}, + {&GUID_WICPixelFormat16bppCbCr, {DXGI_FORMAT_R8G8_UNORM, D2D1_ALPHA_MODE_IGNORE}}, + }; + + found = FALSE; + for (i = 0; i < ARRAY_SIZE(wic_pixel_formats); ++i) + { + if (IsEqualGUID(wic_format, wic_pixel_formats[i].wic_format)) + { + wic_pixel_format = wic_pixel_formats[i].pixel_format; + found = TRUE; + break; + } + } + + if (!found) + return D2DERR_UNSUPPORTED_PIXEL_FORMAT; + + if (pixel_format->format == DXGI_FORMAT_UNKNOWN) + result_format.format = wic_pixel_format.format; + else + result_format.format = pixel_format->format; + + if (pixel_format->alphaMode == D2D1_ALPHA_MODE_UNKNOWN) + result_format.alphaMode = wic_pixel_format.alphaMode; + else + result_format.alphaMode = pixel_format->alphaMode; + + for (i = 0; i < ARRAY_SIZE(wic_pixel_formats); ++i) + { + if (result_format.format == wic_pixel_formats[i].pixel_format.format + && result_format.alphaMode == wic_pixel_formats[i].pixel_format.alphaMode) + { + result_wic_format = wic_pixel_formats[i].wic_format; + break; + } + } + + if (!result_wic_format || !IsEqualGUID(result_wic_format, wic_format)) + return E_INVALIDARG; + + return S_OK; +} + HRESULT d2d_wic_render_target_init(struct d2d_wic_render_target *render_target, ID2D1Factory1 *factory, ID3D10Device1 *d3d_device, IWICBitmap *bitmap, const D2D1_RENDER_TARGET_PROPERTIES *desc) { D3D10_TEXTURE2D_DESC texture_desc; + WICPixelFormatGUID bitmap_format; ID3D10Texture2D *texture; IDXGIDevice *dxgi_device; ID2D1Device *device; HRESULT hr;
+ if (FAILED(hr = IWICBitmap_GetPixelFormat(bitmap, &bitmap_format))) + { + WARN("Failed to get bitmap format, hr %#lx.\n", hr); + return hr; + } + + if (FAILED(hr = check_invalid_formats(&bitmap_format, &desc->pixelFormat))) + { + WARN("Invalid WIC bitmap format %s pixel format %#x alpha %u.\n", + debugstr_guid(&bitmap_format), desc->pixelFormat.format, desc->pixelFormat.alphaMode); + return hr; + } + render_target->IUnknown_iface.lpVtbl = &d2d_wic_render_target_vtbl;
if (FAILED(hr = IWICBitmap_GetSize(bitmap, &render_target->width, &render_target->height))) @@ -174,14 +264,6 @@ HRESULT d2d_wic_render_target_init(struct d2d_wic_render_target *render_target, texture_desc.Format = desc->pixelFormat.format; if (texture_desc.Format == DXGI_FORMAT_UNKNOWN) { - WICPixelFormatGUID bitmap_format; - - if (FAILED(hr = IWICBitmap_GetPixelFormat(bitmap, &bitmap_format))) - { - WARN("Failed to get bitmap format, hr %#lx.\n", hr); - return hr; - } - if (IsEqualGUID(&bitmap_format, &GUID_WICPixelFormat32bppPBGRA) || IsEqualGUID(&bitmap_format, &GUID_WICPixelFormat32bppBGR)) {
From: Zhiyi Zhang zzhang@codeweavers.com
--- dlls/d2d1/tests/d2d1.c | 270 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 260 insertions(+), 10 deletions(-)
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c index bfa28ead732..8973ce1737a 100644 --- a/dlls/d2d1/tests/d2d1.c +++ b/dlls/d2d1/tests/d2d1.c @@ -1043,36 +1043,36 @@ static BOOL compare_figure(struct d2d1_test_context *ctx, unsigned int x, unsign return diff <= max_diff; }
-static ID3D10Device1 *create_d3d10_device(void) +static ID3D10Device1 *create_d3d10_device(D3D10_CREATE_DEVICE_FLAG flag) { ID3D10Device1 *device;
if (SUCCEEDED(D3D10CreateDevice1(NULL, D3D10_DRIVER_TYPE_HARDWARE, NULL, - D3D10_CREATE_DEVICE_BGRA_SUPPORT, D3D10_FEATURE_LEVEL_10_0, D3D10_1_SDK_VERSION, &device))) + flag, D3D10_FEATURE_LEVEL_10_0, D3D10_1_SDK_VERSION, &device))) return device; if (SUCCEEDED(D3D10CreateDevice1(NULL, D3D10_DRIVER_TYPE_WARP, NULL, - D3D10_CREATE_DEVICE_BGRA_SUPPORT, D3D10_FEATURE_LEVEL_10_0, D3D10_1_SDK_VERSION, &device))) + flag, D3D10_FEATURE_LEVEL_10_0, D3D10_1_SDK_VERSION, &device))) return device; if (SUCCEEDED(D3D10CreateDevice1(NULL, D3D10_DRIVER_TYPE_REFERENCE, NULL, - D3D10_CREATE_DEVICE_BGRA_SUPPORT, D3D10_FEATURE_LEVEL_10_0, D3D10_1_SDK_VERSION, &device))) + flag, D3D10_FEATURE_LEVEL_10_0, D3D10_1_SDK_VERSION, &device))) return device;
return NULL; }
-static ID3D11Device *create_d3d11_device(void) +static ID3D11Device *create_d3d11_device(D3D11_CREATE_DEVICE_FLAG flag) { D3D_FEATURE_LEVEL level = D3D_FEATURE_LEVEL_11_0; ID3D11Device *device;
if (SUCCEEDED(D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, - D3D11_CREATE_DEVICE_BGRA_SUPPORT, &level, 1, D3D11_SDK_VERSION, &device, NULL, NULL))) + flag, &level, 1, D3D11_SDK_VERSION, &device, NULL, NULL))) return device; if (SUCCEEDED(D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_WARP, NULL, - D3D11_CREATE_DEVICE_BGRA_SUPPORT, &level, 1, D3D11_SDK_VERSION, &device, NULL, NULL))) + flag, &level, 1, D3D11_SDK_VERSION, &device, NULL, NULL))) return device; if (SUCCEEDED(D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_REFERENCE, NULL, - D3D11_CREATE_DEVICE_BGRA_SUPPORT, &level, 1, D3D11_SDK_VERSION, &device, NULL, NULL))) + flag, &level, 1, D3D11_SDK_VERSION, &device, NULL, NULL))) return device;
return NULL; @@ -1087,14 +1087,14 @@ static IDXGIDevice *create_device(BOOL d3d11)
if (d3d11) { - if (!(d3d11_device = create_d3d11_device())) + if (!(d3d11_device = create_d3d11_device(D3D11_CREATE_DEVICE_BGRA_SUPPORT))) return NULL; hr = ID3D11Device_QueryInterface(d3d11_device, &IID_IDXGIDevice, (void **)&device); ID3D11Device_Release(d3d11_device); } else { - if (!(d3d10_device = create_d3d10_device())) + if (!(d3d10_device = create_d3d10_device(D3D10_CREATE_DEVICE_BGRA_SUPPORT))) return NULL; hr = ID3D10Device1_QueryInterface(d3d10_device, &IID_IDXGIDevice, (void **)&device); ID3D10Device1_Release(d3d10_device); @@ -6533,6 +6533,255 @@ static void test_bitmap_target(BOOL d3d11) ID2D1Factory_Release(factory); }
+static void test_wic_bitmap_target(BOOL d3d11) +{ + D2D1_CREATION_PROPERTIES properties = {0}; + D2D1_RENDER_TARGET_PROPERTIES desc; + IWICImagingFactory *wic_factory; + struct d2d1_test_context ctx; + ID3D10Device1 *d3d10_device; + ID3D11Device *d3d11_device; + IDXGIDevice *dxgi_device; + ID2D1Device *d2d_device; + IWICBitmap *wic_bitmap; + ID2D1Factory *factory; + ID2D1RenderTarget *rt; + unsigned int i, j, k; + HRESULT hr; + + static const WICPixelFormatGUID *wic_formats[] = + { + &GUID_WICPixelFormatDontCare, + &GUID_WICPixelFormat1bppIndexed, + &GUID_WICPixelFormat2bppIndexed, + &GUID_WICPixelFormat4bppIndexed, + &GUID_WICPixelFormat8bppIndexed, + &GUID_WICPixelFormatBlackWhite, + &GUID_WICPixelFormat2bppGray, + &GUID_WICPixelFormat4bppGray, + &GUID_WICPixelFormat8bppGray, + &GUID_WICPixelFormat16bppGray, + &GUID_WICPixelFormat8bppAlpha, + &GUID_WICPixelFormat16bppBGR555, + &GUID_WICPixelFormat16bppBGR565, + &GUID_WICPixelFormat16bppBGRA5551, + &GUID_WICPixelFormat24bppBGR, + &GUID_WICPixelFormat24bppRGB, + &GUID_WICPixelFormat32bppBGR, + &GUID_WICPixelFormat32bppBGRA, + &GUID_WICPixelFormat32bppPBGRA, + &GUID_WICPixelFormat32bppRGB, + &GUID_WICPixelFormat32bppRGBA, + &GUID_WICPixelFormat32bppPRGBA, + &GUID_WICPixelFormat32bppGrayFloat, + &GUID_WICPixelFormat48bppRGB, + &GUID_WICPixelFormat48bppBGR, + &GUID_WICPixelFormat64bppRGB, + &GUID_WICPixelFormat64bppRGBA, + &GUID_WICPixelFormat64bppBGRA, + &GUID_WICPixelFormat64bppPRGBA, + &GUID_WICPixelFormat64bppPBGRA, + &GUID_WICPixelFormat16bppGrayFixedPoint, + &GUID_WICPixelFormat32bppBGR101010, + &GUID_WICPixelFormat48bppRGBFixedPoint, + &GUID_WICPixelFormat48bppBGRFixedPoint, + &GUID_WICPixelFormat96bppRGBFixedPoint, + &GUID_WICPixelFormat96bppRGBFloat, + &GUID_WICPixelFormat128bppRGBAFloat, + &GUID_WICPixelFormat128bppPRGBAFloat, + &GUID_WICPixelFormat128bppRGBFloat, + &GUID_WICPixelFormat32bppCMYK, + &GUID_WICPixelFormat64bppRGBAFixedPoint, + &GUID_WICPixelFormat64bppBGRAFixedPoint, + &GUID_WICPixelFormat64bppRGBFixedPoint, + &GUID_WICPixelFormat128bppRGBAFixedPoint, + &GUID_WICPixelFormat128bppRGBFixedPoint, + &GUID_WICPixelFormat64bppRGBAHalf, + &GUID_WICPixelFormat64bppPRGBAHalf, + &GUID_WICPixelFormat64bppRGBHalf, + &GUID_WICPixelFormat48bppRGBHalf, + &GUID_WICPixelFormat32bppRGBE, + &GUID_WICPixelFormat16bppGrayHalf, + &GUID_WICPixelFormat32bppGrayFixedPoint, + &GUID_WICPixelFormat32bppRGBA1010102, + &GUID_WICPixelFormat32bppRGBA1010102XR, + &GUID_WICPixelFormat32bppR10G10B10A2, + &GUID_WICPixelFormat32bppR10G10B10A2HDR10, + &GUID_WICPixelFormat64bppCMYK, + &GUID_WICPixelFormat24bpp3Channels, + &GUID_WICPixelFormat32bpp4Channels, + &GUID_WICPixelFormat40bpp5Channels, + &GUID_WICPixelFormat48bpp6Channels, + &GUID_WICPixelFormat56bpp7Channels, + &GUID_WICPixelFormat64bpp8Channels, + &GUID_WICPixelFormat48bpp3Channels, + &GUID_WICPixelFormat64bpp4Channels, + &GUID_WICPixelFormat80bpp5Channels, + &GUID_WICPixelFormat96bpp6Channels, + &GUID_WICPixelFormat112bpp7Channels, + &GUID_WICPixelFormat128bpp8Channels, + &GUID_WICPixelFormat40bppCMYKAlpha, + &GUID_WICPixelFormat80bppCMYKAlpha, + &GUID_WICPixelFormat32bpp3ChannelsAlpha, + &GUID_WICPixelFormat40bpp4ChannelsAlpha, + &GUID_WICPixelFormat48bpp5ChannelsAlpha, + &GUID_WICPixelFormat56bpp6ChannelsAlpha, + &GUID_WICPixelFormat64bpp7ChannelsAlpha, + &GUID_WICPixelFormat72bpp8ChannelsAlpha, + &GUID_WICPixelFormat64bpp3ChannelsAlpha, + &GUID_WICPixelFormat80bpp4ChannelsAlpha, + &GUID_WICPixelFormat96bpp5ChannelsAlpha, + &GUID_WICPixelFormat112bpp6ChannelsAlpha, + &GUID_WICPixelFormat128bpp7ChannelsAlpha, + &GUID_WICPixelFormat144bpp8ChannelsAlpha, + &GUID_WICPixelFormat8bppY, + &GUID_WICPixelFormat8bppCb, + &GUID_WICPixelFormat8bppCr, + &GUID_WICPixelFormat16bppCbCr, + &GUID_WICPixelFormat16bppYQuantizedDctCoefficients, + &GUID_WICPixelFormat16bppCbQuantizedDctCoefficients, + &GUID_WICPixelFormat16bppCrQuantizedDctCoefficients, + }; + + if (!init_test_context(&ctx, d3d11)) + return; + release_test_context(&ctx); + + /* Test that d2d devices must be created from a d3d10/11 device with BGA support */ + if (d3d11) + { + d3d11_device = create_d3d11_device(D3D11_CREATE_DEVICE_SINGLETHREADED); + hr = ID3D11Device_QueryInterface(d3d11_device, &IID_IDXGIDevice, (void **)&dxgi_device); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + ID3D11Device_Release(d3d11_device); + } + else + { + d3d10_device = create_d3d10_device(D3D10_CREATE_DEVICE_SINGLETHREADED); + hr = ID3D10Device1_QueryInterface(d3d10_device, &IID_IDXGIDevice, (void **)&dxgi_device); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + ID3D10Device1_Release(d3d10_device); + } + hr = pD2D1CreateDevice(dxgi_device, &properties, &d2d_device); + todo_wine + ok(hr == E_INVALIDARG, "Got unexpected hr %#lx.\n", hr); + if (SUCCEEDED(hr)) + ID2D1Device_Release(d2d_device); + IDXGIDevice_Release(dxgi_device); + + /* Format tests */ + hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &IID_ID2D1Factory, NULL, + (void **)&factory); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); + hr = CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, + &IID_IWICImagingFactory, (void **)&wic_factory); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + + desc.type = D2D1_RENDER_TARGET_TYPE_DEFAULT; + desc.dpiX = 96.0f; + desc.dpiY = 96.0f; + desc.usage = D2D1_RENDER_TARGET_USAGE_NONE; + desc.minLevel = D2D1_FEATURE_LEVEL_DEFAULT; + + for (i = 0; i < ARRAY_SIZE(wic_formats); ++i) + { + winetest_push_context("bitmap %u", i); + + hr = IWICImagingFactory_CreateBitmap(wic_factory, 16, 16, wic_formats[i], + WICBitmapCacheOnDemand, &wic_bitmap); + if (FAILED(hr)) + { + winetest_pop_context(); + continue; + } + + for (j = DXGI_FORMAT_UNKNOWN; j <= DXGI_FORMAT_V408; ++j) + { + if (j > DXGI_FORMAT_B4G4R4A4_UNORM && j < DXGI_FORMAT_P208) + continue; + + for (k = D2D1_ALPHA_MODE_UNKNOWN; k <= D2D1_ALPHA_MODE_IGNORE; ++k) + { + winetest_push_context("format %#x alpha %u", j, k); + + desc.pixelFormat.format = j; + desc.pixelFormat.alphaMode = k; + hr = ID2D1Factory_CreateWicBitmapRenderTarget(factory, wic_bitmap, &desc, &rt); + if (((wic_formats[i] == &GUID_WICPixelFormat8bppAlpha) + && (j == DXGI_FORMAT_UNKNOWN || j == DXGI_FORMAT_A8_UNORM) + && (k == D2D1_ALPHA_MODE_UNKNOWN || k == D2D1_ALPHA_MODE_PREMULTIPLIED || k == D2D1_ALPHA_MODE_STRAIGHT)) + || ((wic_formats[i] == &GUID_WICPixelFormat32bppBGR) + && (j == DXGI_FORMAT_UNKNOWN || j == DXGI_FORMAT_B8G8R8A8_UNORM || j == DXGI_FORMAT_B8G8R8A8_UNORM_SRGB) + && (k == D2D1_ALPHA_MODE_UNKNOWN || k == D2D1_ALPHA_MODE_IGNORE)) + || ((wic_formats[i] == &GUID_WICPixelFormat32bppPBGRA) + && (j == DXGI_FORMAT_UNKNOWN || j == DXGI_FORMAT_B8G8R8A8_UNORM || j == DXGI_FORMAT_B8G8R8A8_UNORM_SRGB) + && (k == D2D1_ALPHA_MODE_UNKNOWN || k == D2D1_ALPHA_MODE_PREMULTIPLIED)) + || ((wic_formats[i] == &GUID_WICPixelFormat32bppRGB) + && (j == DXGI_FORMAT_UNKNOWN || j == DXGI_FORMAT_R8G8B8A8_UNORM || j == DXGI_FORMAT_R8G8B8A8_UNORM_SRGB) + && (k == D2D1_ALPHA_MODE_UNKNOWN || k == D2D1_ALPHA_MODE_IGNORE)) + || ((wic_formats[i] == &GUID_WICPixelFormat32bppPRGBA) + && (j == DXGI_FORMAT_UNKNOWN || j == DXGI_FORMAT_R8G8B8A8_UNORM || j == DXGI_FORMAT_R8G8B8A8_UNORM_SRGB) + && (k == D2D1_ALPHA_MODE_UNKNOWN || k == D2D1_ALPHA_MODE_PREMULTIPLIED)) + || ((wic_formats[i] == &GUID_WICPixelFormat64bppRGB) + && (j == DXGI_FORMAT_UNKNOWN || j == DXGI_FORMAT_R16G16B16A16_UNORM) + && (k == D2D1_ALPHA_MODE_UNKNOWN || k == D2D1_ALPHA_MODE_IGNORE)) + || ((wic_formats[i] == &GUID_WICPixelFormat64bppPRGBA) + && (j == DXGI_FORMAT_UNKNOWN || j == DXGI_FORMAT_R16G16B16A16_UNORM) + && (k == D2D1_ALPHA_MODE_UNKNOWN || k == D2D1_ALPHA_MODE_PREMULTIPLIED)) + || ((wic_formats[i] == &GUID_WICPixelFormat128bppPRGBAFloat) + && (j == DXGI_FORMAT_UNKNOWN || j == DXGI_FORMAT_R32G32B32A32_FLOAT) + && (k == D2D1_ALPHA_MODE_UNKNOWN || k == D2D1_ALPHA_MODE_PREMULTIPLIED)) + || ((wic_formats[i] == &GUID_WICPixelFormat128bppRGBFloat) + && (j == DXGI_FORMAT_UNKNOWN || j == DXGI_FORMAT_R32G32B32A32_FLOAT) + && (k == D2D1_ALPHA_MODE_UNKNOWN || k == D2D1_ALPHA_MODE_IGNORE)) + || ((wic_formats[i] == &GUID_WICPixelFormat64bppPRGBAHalf) + && (j == DXGI_FORMAT_UNKNOWN || j == DXGI_FORMAT_R16G16B16A16_FLOAT) + && (k == D2D1_ALPHA_MODE_UNKNOWN || k == D2D1_ALPHA_MODE_PREMULTIPLIED)) + || ((wic_formats[i] == &GUID_WICPixelFormat64bppRGBHalf) + && (j == DXGI_FORMAT_UNKNOWN || j == DXGI_FORMAT_R16G16B16A16_FLOAT) + && (k == D2D1_ALPHA_MODE_UNKNOWN || k == D2D1_ALPHA_MODE_IGNORE))) + todo_wine_if(hr == D2DERR_UNSUPPORTED_PIXEL_FORMAT) + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + else if (wic_formats[i] == &GUID_WICPixelFormat8bppAlpha + || wic_formats[i] == &GUID_WICPixelFormat32bppBGR + || wic_formats[i] == &GUID_WICPixelFormat32bppPBGRA + || wic_formats[i] == &GUID_WICPixelFormat32bppRGB + || wic_formats[i] == &GUID_WICPixelFormat32bppPRGBA + || wic_formats[i] == &GUID_WICPixelFormat64bppRGB + || wic_formats[i] == &GUID_WICPixelFormat64bppPRGBA + || wic_formats[i] == &GUID_WICPixelFormat128bppPRGBAFloat + || wic_formats[i] == &GUID_WICPixelFormat128bppRGBFloat + || wic_formats[i] == &GUID_WICPixelFormat64bppPRGBAHalf + || wic_formats[i] == &GUID_WICPixelFormat64bppRGBHalf + || ((wic_formats[i] == &GUID_WICPixelFormat32bppRGBA1010102) + && !((j == DXGI_FORMAT_UNKNOWN || j == DXGI_FORMAT_R10G10B10A2_UNORM) + && (k == D2D1_ALPHA_MODE_UNKNOWN || k == D2D1_ALPHA_MODE_PREMULTIPLIED))) + || ((wic_formats[i] == &GUID_WICPixelFormat8bppY) + && !((j == DXGI_FORMAT_UNKNOWN || j == DXGI_FORMAT_R8_UNORM) + && (k == D2D1_ALPHA_MODE_UNKNOWN || k == D2D1_ALPHA_MODE_IGNORE))) + || ((wic_formats[i] == &GUID_WICPixelFormat16bppCbCr) + && !((j == DXGI_FORMAT_UNKNOWN || j == DXGI_FORMAT_R8G8_UNORM) + && (k == D2D1_ALPHA_MODE_UNKNOWN || k == D2D1_ALPHA_MODE_IGNORE)))) + ok(hr == E_INVALIDARG || broken(hr == D2DERR_UNSUPPORTED_PIXEL_FORMAT + && wic_formats[i] == &GUID_WICPixelFormat32bppRGBA1010102), "Got unexpected hr %#lx.\n", hr); + else + ok(hr == D2DERR_UNSUPPORTED_PIXEL_FORMAT, "Got unexpected hr %#lx.\n", hr); + if (SUCCEEDED(hr)) + ID2D1RenderTarget_Release(rt); + + winetest_pop_context(); + } + } + + IWICBitmap_Release(wic_bitmap); + winetest_pop_context(); + } + + IWICImagingFactory_Release(wic_factory); + ID2D1Factory_Release(factory); +} + static void test_desktop_dpi(BOOL d3d11) { ID2D1Factory *factory; @@ -13398,6 +13647,7 @@ START_TEST(d2d1) queue_test(test_dc_target); queue_test(test_hwnd_target); queue_test(test_bitmap_target); + queue_test(test_wic_bitmap_target); queue_d3d10_test(test_desktop_dpi); queue_d3d10_test(test_stroke_style); queue_test(test_gradient);
Nikolay Sivov (@nsivov) commented about dlls/d2d1/wic_render_target.c:
d2d_wic_render_target_present,
};
+static HRESULT check_invalid_formats(const WICPixelFormatGUID *wic_format,
const D2D1_PIXEL_FORMAT *pixel_format)
Could you rename wic_format -> bitmap_format, and pixel_format -> target_format, or something similar. The function itself seems fine otherwise, except it does look now that after doing all this conversion and resolving unknown values we might want to return resulting format from it, to use for texture creation.
Nikolay Sivov (@nsivov) commented about dlls/d2d1/tests/d2d1.c:
|| wic_formats[i] == &GUID_WICPixelFormat128bppPRGBAFloat
|| wic_formats[i] == &GUID_WICPixelFormat128bppRGBFloat
|| wic_formats[i] == &GUID_WICPixelFormat64bppPRGBAHalf
|| wic_formats[i] == &GUID_WICPixelFormat64bppRGBHalf
|| ((wic_formats[i] == &GUID_WICPixelFormat32bppRGBA1010102)
&& !((j == DXGI_FORMAT_UNKNOWN || j == DXGI_FORMAT_R10G10B10A2_UNORM)
&& (k == D2D1_ALPHA_MODE_UNKNOWN || k == D2D1_ALPHA_MODE_PREMULTIPLIED)))
|| ((wic_formats[i] == &GUID_WICPixelFormat8bppY)
&& !((j == DXGI_FORMAT_UNKNOWN || j == DXGI_FORMAT_R8_UNORM)
&& (k == D2D1_ALPHA_MODE_UNKNOWN || k == D2D1_ALPHA_MODE_IGNORE)))
|| ((wic_formats[i] == &GUID_WICPixelFormat16bppCbCr)
&& !((j == DXGI_FORMAT_UNKNOWN || j == DXGI_FORMAT_R8G8_UNORM)
&& (k == D2D1_ALPHA_MODE_UNKNOWN || k == D2D1_ALPHA_MODE_IGNORE))))
ok(hr == E_INVALIDARG || broken(hr == D2DERR_UNSUPPORTED_PIXEL_FORMAT
&& wic_formats[i] == &GUID_WICPixelFormat32bppRGBA1010102), "Got unexpected hr %#lx.\n", hr);
else
To me this looks very hard to follow. I think it's fine to leave only working WIC formats in tests, not every single one.