Module: wine Branch: master Commit: b12078d928cfe6767fd52c7419c45d71136f8194 URL: https://gitlab.winehq.org/wine/wine/-/commit/b12078d928cfe6767fd52c7419c45d7...
Author: Bartosz Kosiorek gang65@poczta.onet.pl Date: Thu Dec 7 00:19:38 2023 +0100
gdiplus: Partially implement GdipDrawImageFX.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=55945
---
dlls/gdiplus/graphics.c | 44 +++++++++++++++++++++++++++++++++++++++---- dlls/gdiplus/tests/graphics.c | 5 ----- 2 files changed, 40 insertions(+), 9 deletions(-)
diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c index 5101378d0e1..9fd399e3cde 100644 --- a/dlls/gdiplus/graphics.c +++ b/dlls/gdiplus/graphics.c @@ -2947,13 +2947,49 @@ GpStatus WINGDIPAPI GdipDrawImage(GpGraphics *graphics, GpImage *image, REAL x, 0.0, 0.0, (REAL)width, (REAL)height, UnitPixel); }
-GpStatus WINGDIPAPI GdipDrawImageFX(GpGraphics *graphics, GpImage *image, GpRectF *src, +GpStatus WINGDIPAPI GdipDrawImageFX(GpGraphics *graphics, GpImage *image, GpRectF *src_rect, GpMatrix *transform, CGpEffect *effect, GpImageAttributes *imageattr, - GpUnit srcUnit) + GpUnit src_unit) { - FIXME("(%p, %p, %p, %p, %p, %p, %d): stub\n", graphics, image, src, transform, effect, imageattr, srcUnit); + GpRectF src_rect_buf; + GpPointF points[3]; + GpStatus status;
- return NotImplemented; + TRACE("(%p, %p, %p, %p, %p, %p, %d)\n", graphics, image, src_rect, transform, effect, imageattr, src_unit); + + if (!graphics || !image) + return InvalidParameter; + + if (effect) + FIXME("effect not implemented\n"); + + if (!src_rect) + { + if ((status = GdipGetImageBounds(image, &src_rect_buf, &src_unit)) != Ok) + return status; + + /* Metafiles may have different left-top coordinates */ + if (src_rect_buf.X != 0.0 || src_rect_buf.Y != 0.0) + { + FIXME("image bounds %s left-top not at origin", debugstr_rectf(&src_rect_buf)); + /* TODO: only use width and height (force origin)? */ + } + + src_rect = &src_rect_buf; + } + + points[0].X = points[2].X = src_rect->X; + points[0].Y = points[1].Y = src_rect->Y; + points[1].X = src_rect->X + src_rect->Width; + points[2].Y = src_rect->Y + src_rect->Height; + + if (transform) + GdipTransformMatrixPoints(transform, points, 3); + + return GdipDrawImagePointsRect(graphics, image, points, 3, + src_rect->X, src_rect->Y, + src_rect->Width, src_rect->Height, + src_unit, imageattr, NULL, NULL); }
GpStatus WINGDIPAPI GdipDrawImageI(GpGraphics *graphics, GpImage *image, INT x, diff --git a/dlls/gdiplus/tests/graphics.c b/dlls/gdiplus/tests/graphics.c index 96bc5df7c6f..54960beabb3 100644 --- a/dlls/gdiplus/tests/graphics.c +++ b/dlls/gdiplus/tests/graphics.c @@ -1332,17 +1332,14 @@ static void test_GdipDrawImageFX(void)
/* DrawImageFX with source rectangle */ status = GdipDrawImageFX(graphics, NULL, &source, NULL, NULL, NULL, UnitPixel); - todo_wine expect(InvalidParameter, status);
/* DrawImageFX with source bitmap */ status = GdipDrawImageFX(graphics, (GpImage*)bm, NULL, NULL, NULL, NULL, UnitPixel); - todo_wine expect(Ok, status);
/* DrawImageFX with source bitmap and transform */ status = GdipDrawImageFX(graphics, (GpImage*)bm, NULL, transform, NULL, NULL, UnitPixel); - todo_wine expect(Ok, status);
/* DrawImageFX with source bitmap and source rectangle */ @@ -1350,12 +1347,10 @@ static void test_GdipDrawImageFX(void) source.Height = source.Width = 10.0;
status = GdipDrawImageFX(graphics, (GpImage*)bm, &source, NULL, NULL, NULL, UnitPixel); - todo_wine expect(Ok, status);
/* DrawImageFX with source bitmap, source rectangle, and transform */ status = GdipDrawImageFX(graphics, (GpImage*)bm, &source, transform, NULL, NULL, UnitPixel); - todo_wine expect(Ok, status);
GdipDeleteMatrix(transform);