Shawn M. Chapla : gdiplus: Incorporate GDI frame into metafile auto-frame before scaling.

Alexandre Julliard julliard at winehq.org
Tue Aug 11 16:26:51 CDT 2020


Module: wine
Branch: master
Commit: 03e9de4920173d3fa955cf28a8d2b60bd3b06261
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=03e9de4920173d3fa955cf28a8d2b60bd3b06261

Author: Shawn M. Chapla <schapla at codeweavers.com>
Date:   Mon Aug 10 16:44:37 2020 -0400

gdiplus: Incorporate GDI frame into metafile auto-frame before scaling.

Signed-off-by: Shawn M. Chapla <schapla at codeweavers.com>
Signed-off-by: Esme Povirk <esme at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/gdiplus/metafile.c       | 22 +++++++++++++---------
 dlls/gdiplus/tests/metafile.c |  8 ++++----
 2 files changed, 17 insertions(+), 13 deletions(-)

diff --git a/dlls/gdiplus/metafile.c b/dlls/gdiplus/metafile.c
index e0ff6cae7a..350642e020 100644
--- a/dlls/gdiplus/metafile.c
+++ b/dlls/gdiplus/metafile.c
@@ -1652,20 +1652,24 @@ GpStatus METAFILE_GraphicsDeleted(GpMetafile* metafile)
             BYTE* buffer;
             UINT buffer_size;
 
+            gdi_bounds_rc = header.u.EmfHeader.rclBounds;
+            if (gdi_bounds_rc.right > gdi_bounds_rc.left &&
+                gdi_bounds_rc.bottom > gdi_bounds_rc.top)
+            {
+                GpPointF *af_min = &metafile->auto_frame_min;
+                GpPointF *af_max = &metafile->auto_frame_max;
+
+                af_min->X = fmin(af_min->X, gdi_bounds_rc.left);
+                af_min->Y = fmin(af_min->Y, gdi_bounds_rc.top);
+                af_max->X = fmax(af_max->X, gdi_bounds_rc.right);
+                af_max->Y = fmax(af_max->Y, gdi_bounds_rc.bottom);
+            }
+
             bounds_rc.left = floorf(metafile->auto_frame_min.X * x_scale);
             bounds_rc.top = floorf(metafile->auto_frame_min.Y * y_scale);
             bounds_rc.right = ceilf(metafile->auto_frame_max.X * x_scale);
             bounds_rc.bottom = ceilf(metafile->auto_frame_max.Y * y_scale);
 
-            gdi_bounds_rc = header.u.EmfHeader.rclBounds;
-            if (gdi_bounds_rc.right > gdi_bounds_rc.left && gdi_bounds_rc.bottom > gdi_bounds_rc.top)
-            {
-                bounds_rc.left = min(bounds_rc.left, gdi_bounds_rc.left);
-                bounds_rc.top = min(bounds_rc.top, gdi_bounds_rc.top);
-                bounds_rc.right = max(bounds_rc.right, gdi_bounds_rc.right);
-                bounds_rc.bottom = max(bounds_rc.bottom, gdi_bounds_rc.bottom);
-            }
-
             buffer_size = GetEnhMetaFileBits(metafile->hemf, 0, NULL);
             buffer = heap_alloc(buffer_size);
             if (buffer)
diff --git a/dlls/gdiplus/tests/metafile.c b/dlls/gdiplus/tests/metafile.c
index e047c9a421..33fff3f98c 100644
--- a/dlls/gdiplus/tests/metafile.c
+++ b/dlls/gdiplus/tests/metafile.c
@@ -1424,11 +1424,11 @@ static void test_nullframerect(void) {
     stat = GdipGetImageBounds((GpImage*)metafile, &bounds, &unit);
     expect(Ok, stat);
     expect(UnitPixel, unit);
-    todo_wine expectf_(20.0, bounds.X, 0.05);
-    todo_wine expectf_(25.0, bounds.Y, 0.05);
-    todo_wine expectf_(55.0, bounds.Width, 1.00);
+    expectf_(20.0, bounds.X, 0.05);
+    expectf_(25.0, bounds.Y, 0.05);
+    expectf_(55.0, bounds.Width, 1.00);
     todo_wine expectf_(55.0, bounds.Width, 0.05);
-    todo_wine expectf_(85.0, bounds.Height, 0.05);
+    expectf_(85.0, bounds.Height, 0.05);
 
     stat = GdipDisposeImage((GpImage*)metafile);
     expect(Ok, stat);




More information about the wine-cvs mailing list