Signed-off-by: Zhiyi Zhang zzhang@codeweavers.com --- dlls/d2d1/tests/d2d1.c | 50 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-)
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c index 3ade9634069..7c54f365e06 100644 --- a/dlls/d2d1/tests/d2d1.c +++ b/dlls/d2d1/tests/d2d1.c @@ -4341,18 +4341,22 @@ static void test_bitmap_formats(BOOL d3d11) static void test_alpha_mode(BOOL d3d11) { D2D1_RENDER_TARGET_PROPERTIES rt_desc; + D2D1_BITMAP_PROPERTIES1 bitmap_desc1; D2D1_BITMAP_PROPERTIES bitmap_desc; ID2D1SolidColorBrush *color_brush; ID2D1BitmapBrush *bitmap_brush; struct d2d1_test_context ctx; + ID2D1DeviceContext *context; + ID2D1Bitmap1 *bitmap1; ID2D1RenderTarget *rt; + IDXGISurface *surface; ID2D1Bitmap *bitmap; D2D1_COLOR_F color; + BOOL match, match2; D2D1_RECT_F rect; D2D1_SIZE_U size; ULONG refcount; HRESULT hr; - BOOL match;
static const DWORD bitmap_data[] = { @@ -4546,8 +4550,50 @@ static void test_alpha_mode(BOOL d3d11)
refcount = ID2D1Bitmap_Release(bitmap); ok(refcount == 1, "Bitmap has %lu references left.\n", refcount); - ID2D1SolidColorBrush_Release(color_brush); ID2D1BitmapBrush_Release(bitmap_brush); + + hr = ID2D1RenderTarget_QueryInterface(rt, &IID_ID2D1DeviceContext, (void **)&context); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + + set_size_u(&size, 4, 4); + memset(&bitmap_desc1, 0, sizeof(bitmap_desc1)); + bitmap_desc1.dpiX = 96.0f; + bitmap_desc1.dpiY = 96.0f; + bitmap_desc1.pixelFormat.format = DXGI_FORMAT_B8G8R8A8_UNORM; + bitmap_desc1.pixelFormat.alphaMode = D2D1_ALPHA_MODE_IGNORE; + bitmap_desc1.bitmapOptions = D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW; + hr = ID2D1DeviceContext_CreateBitmap(context, size, bitmap_data, 4 * sizeof(*bitmap_data), + &bitmap_desc1, &bitmap1); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + + ID2D1DeviceContext_BeginDraw(context); + ID2D1DeviceContext_SetTarget(context, (ID2D1Image *)bitmap1); + set_rect(&rect, 0.0f, 2.0f, 1.0f, 2.0f); + ID2D1SolidColorBrush_SetOpacity(color_brush, 1.0f); + ID2D1DeviceContext_FillRectangle(context, &rect, (ID2D1Brush *)color_brush); + set_rect(&rect, 1.0f, 2.0f, 3.0f, 3.0f); + ID2D1SolidColorBrush_SetOpacity(color_brush, 0.75f); + ID2D1DeviceContext_FillRectangle(context, &rect, (ID2D1Brush *)color_brush); + set_rect(&rect, 3.0f, 2.0f, 3.0f, 3.0f); + ID2D1SolidColorBrush_SetOpacity(color_brush, 0.25f); + ID2D1DeviceContext_FillRectangle(context, &rect, (ID2D1Brush *)color_brush); + hr = ID2D1DeviceContext_EndDraw(context, NULL, NULL); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + + surface = ctx.surface; + hr = ID2D1Bitmap1_GetSurface(bitmap1, &ctx.surface); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + match = compare_surface(&ctx, "e7ee77e89745fa5d195fd78bd398738330cfcde8"); + match2 = compare_surface(&ctx, "4855c7c082c8ede364cf6e2dcde83f95b88aecbe"); + todo_wine + ok(match || broken(match2) /* Win7 TestBots */, "Surface does not match.\n"); + IDXGISurface_Release(ctx.surface); + ctx.surface = surface; + ID2D1DeviceContext_SetTarget(context, NULL); + + ID2D1Bitmap1_Release(bitmap1); + ID2D1DeviceContext_Release(context); + ID2D1SolidColorBrush_Release(color_brush); ID2D1RenderTarget_Release(rt); release_test_context(&ctx); }