From 757ce04917f1f881c42bfad2c7b4b0d3586c174f Mon Sep 17 00:00:00 2001 From: Jactry Zeng Date: Fri, 15 Jan 2021 22:55:37 +0800 Subject: [PATCH] d2d1: Limit source rectangle to the actual size for ID2D1RenderTarget_DrawBitmap(). Signed-off-by: Jactry Zeng Signed-off-by: Henri Verbeet Signed-off-by: Alexandre Julliard --- dlls/d2d1/device.c | 18 ++++++------------ dlls/d2d1/tests/d2d1.c | 30 ++++++++++++++++++++++++++++-- 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/dlls/d2d1/device.c b/dlls/d2d1/device.c index 3c8431ce8f4..b609a2c1e24 100644 --- a/dlls/d2d1/device.c +++ b/dlls/d2d1/device.c @@ -1072,25 +1072,19 @@ static void d2d_device_context_draw_bitmap(struct d2d_device_context *context, I D2D1_BITMAP_BRUSH_PROPERTIES1 bitmap_brush_desc; D2D1_BRUSH_PROPERTIES brush_desc; struct d2d_brush *brush; + D2D1_SIZE_F size; D2D1_RECT_F s, d; HRESULT hr; if (perspective_transform) FIXME("Perspective transform is ignored.\n"); - if (src_rect) + size = ID2D1Bitmap_GetSize(bitmap); + d2d_rect_set(&s, 0.0f, 0.0f, size.width, size.height); + if (src_rect && src_rect->left <= src_rect->right + && src_rect->top <= src_rect->bottom) { - s = *src_rect; - } - else - { - D2D1_SIZE_F size; - - size = ID2D1Bitmap_GetSize(bitmap); - s.left = 0.0f; - s.top = 0.0f; - s.right = size.width; - s.bottom = size.height; + d2d_rect_intersect(&s, src_rect); } if (dst_rect) diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c index d571cfe8d15..6e3bc4a51d2 100644 --- a/dlls/d2d1/tests/d2d1.c +++ b/dlls/d2d1/tests/d2d1.c @@ -1676,6 +1676,7 @@ static void test_bitmap_brush(void) IDXGISwapChain *swapchain; ID2D1BitmapBrush1 *brush1; ID2D1BitmapBrush *brush; + D2D1_SIZE_F image_size; ID2D1RenderTarget *rt; ID3D10Device1 *device; IDXGISurface *surface; @@ -1740,6 +1741,7 @@ static void test_bitmap_brush(void) bitmap_desc.dpiY = 96.0f; hr = ID2D1RenderTarget_CreateBitmap(rt, size, bitmap_data, 4 * sizeof(*bitmap_data), &bitmap_desc, &bitmap); ok(SUCCEEDED(hr), "Failed to create bitmap, hr %#x.\n", hr); + image_size = ID2D1Bitmap_GetSize(bitmap); hr = ID2D1Bitmap_QueryInterface(bitmap, &IID_ID2D1Image, (void **)&image); ok(SUCCEEDED(hr) || broken(hr == E_NOINTERFACE) /* Vista */, "Failed to get ID2D1Image, hr %#x.\n", hr); @@ -1810,12 +1812,24 @@ static void test_bitmap_brush(void) D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR, NULL); set_rect(&dst_rect, 0.0f, 8.0f, 4.0f, 12.0f); set_rect(&src_rect, 2.0f, 1.0f, 4.0f, 3.0f); + ID2D1RenderTarget_DrawBitmap(rt, bitmap, &dst_rect, 1.0f, + D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR, &src_rect); + set_rect(&dst_rect, 4.0f, 12.0f, 12.0f, 20.0f); + set_rect(&src_rect, 0.0f, 0.0f, image_size.width * 2, image_size.height * 2); + ID2D1RenderTarget_DrawBitmap(rt, bitmap, &dst_rect, 1.0f, + D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR, &src_rect); + set_rect(&dst_rect, 4.0f, 8.0f, 12.0f, 12.0f); + set_rect(&src_rect, image_size.width / 2, image_size.height / 2, image_size.width, image_size.height); + ID2D1RenderTarget_DrawBitmap(rt, bitmap, &dst_rect, 1.0f, + D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR, &src_rect); + set_rect(&dst_rect, 0.0f, 4.0f, 4.0f, 8.0f); + set_rect(&src_rect, image_size.width, 0.0f, 0.0f, image_size.height); ID2D1RenderTarget_DrawBitmap(rt, bitmap, &dst_rect, 1.0f, D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR, &src_rect); hr = ID2D1RenderTarget_EndDraw(rt, NULL, NULL); ok(SUCCEEDED(hr), "Failed to end draw, hr %#x.\n", hr); - match = compare_surface(surface, "9437f4447d98feaad41a1c4202ee90aadc718ee6"); + match = compare_surface(surface, "f5d039c280fa33ba05496c9883192a34108efbbe"); ok(match, "Surface does not match.\n"); /* Invalid interpolation mode. */ @@ -1828,7 +1842,19 @@ static void test_bitmap_brush(void) hr = ID2D1RenderTarget_EndDraw(rt, NULL, NULL); ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); - match = compare_surface(surface, "9437f4447d98feaad41a1c4202ee90aadc718ee6"); + match = compare_surface(surface, "f5d039c280fa33ba05496c9883192a34108efbbe"); + ok(match, "Surface does not match.\n"); + + ID2D1RenderTarget_BeginDraw(rt); + ID2D1RenderTarget_Clear(rt, &color); + + set_rect(&src_rect, image_size.width, 0.0f, 0.0f, image_size.height); + ID2D1RenderTarget_DrawBitmap(rt, bitmap, NULL, 1.0f, + D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR, &src_rect); + + hr = ID2D1RenderTarget_EndDraw(rt, NULL, NULL); + ok(SUCCEEDED(hr), "Failed to end draw, hr %#x.\n", hr); + match = compare_surface(surface, "59043096393570ad800dbcbfdd644394b79493bd"); ok(match, "Surface does not match.\n"); ID2D1RenderTarget_BeginDraw(rt);