Ziqing Hui : gdiplus: Record logical DPI in metafile.

Alexandre Julliard julliard at winehq.org
Fri Jan 22 15:59:14 CST 2021


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

Author: Ziqing Hui <zhui at codeweavers.com>
Date:   Wed Jan 20 10:26:46 2021 +0800

gdiplus: Record logical DPI in metafile.

Signed-off-by: Ziqing Hui <zhui at codeweavers.com>
Signed-off-by: Esme Povirk <esme at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/gdiplus/gdiplus_private.h |  2 ++
 dlls/gdiplus/metafile.c        | 20 ++++++++++++++------
 dlls/gdiplus/tests/metafile.c  |  2 --
 3 files changed, 16 insertions(+), 8 deletions(-)

diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h
index f0143743caf..4bca5b13be9 100644
--- a/dlls/gdiplus/gdiplus_private.h
+++ b/dlls/gdiplus/gdiplus_private.h
@@ -415,6 +415,8 @@ struct GpMetafile{
     DWORD next_object_id;
     UINT limit_dpi;
     BOOL printer_display;
+    REAL logical_dpix;
+    REAL logical_dpiy;
 
     /* playback */
     GpGraphics *playback_graphics;
diff --git a/dlls/gdiplus/metafile.c b/dlls/gdiplus/metafile.c
index 12b7cba75dc..3c2e8eb3aa2 100644
--- a/dlls/gdiplus/metafile.c
+++ b/dlls/gdiplus/metafile.c
@@ -838,6 +838,8 @@ GpStatus WINGDIPAPI GdipRecordMetafile(HDC hdc, EmfType type, GDIPCONST GpRectF
     (*metafile)->limit_dpi = 96;
     (*metafile)->hemf = NULL;
     (*metafile)->printer_display = (GetDeviceCaps(record_dc, TECHNOLOGY) == DT_RASPRINTER);
+    (*metafile)->logical_dpix = (REAL)GetDeviceCaps(record_dc, LOGPIXELSX);
+    (*metafile)->logical_dpiy = (REAL)GetDeviceCaps(record_dc, LOGPIXELSY);
     list_init(&(*metafile)->containers);
 
     if (!frameRect)
@@ -964,8 +966,8 @@ GpStatus METAFILE_GetGraphicsContext(GpMetafile* metafile, GpGraphics **result)
     if (stat == Ok)
     {
         *result = metafile->record_graphics;
-        metafile->record_graphics->xres = 96.0;
-        metafile->record_graphics->yres = 96.0;
+        metafile->record_graphics->xres = metafile->logical_dpix;
+        metafile->record_graphics->yres = metafile->logical_dpiy;
         metafile->record_graphics->printer_display = metafile->printer_display;
     }
 
@@ -1792,12 +1794,16 @@ static GpStatus METAFILE_PlaybackUpdateWorldTransform(GpMetafile *metafile)
 
     if (stat == Ok)
     {
-        REAL scale = units_to_pixels(1.0, metafile->page_unit, 96.0, metafile->printer_display);
+        REAL scale_x = units_to_pixels(1.0, metafile->page_unit, metafile->logical_dpix, metafile->printer_display);
+        REAL scale_y = units_to_pixels(1.0, metafile->page_unit, metafile->logical_dpiy, metafile->printer_display);
 
         if (metafile->page_unit != UnitDisplay)
-            scale *= metafile->page_scale;
+        {
+            scale_x *= metafile->page_scale;
+            scale_y *= metafile->page_scale;
+        }
 
-        stat = GdipScaleMatrix(real_transform, scale, scale, MatrixOrderPrepend);
+        stat = GdipScaleMatrix(real_transform, scale_x, scale_y, MatrixOrderPrepend);
 
         if (stat == Ok)
             stat = GdipMultiplyMatrix(real_transform, metafile->world_transform, MatrixOrderPrepend);
@@ -4070,7 +4076,9 @@ GpStatus WINGDIPAPI GdipCreateMetafileFromEmf(HENHMETAFILE hemf, BOOL delete,
     (*metafile)->preserve_hemf = !delete;
     /* If the 31th bit of EmfPlusFlags was set, metafile was recorded with a DC for a video display.
      * If clear, metafile was recorded with a DC for a printer */
-    (*metafile)->printer_display = !(header.EmfPlusFlags & (1 << 31));
+    (*metafile)->printer_display = !(header.EmfPlusFlags & (1u << 31));
+    (*metafile)->logical_dpix = header.LogicalDpiX;
+    (*metafile)->logical_dpix = header.LogicalDpiY;
     list_init(&(*metafile)->containers);
 
     TRACE("<-- %p\n", *metafile);
diff --git a/dlls/gdiplus/tests/metafile.c b/dlls/gdiplus/tests/metafile.c
index e919884120f..60659bf3119 100644
--- a/dlls/gdiplus/tests/metafile.c
+++ b/dlls/gdiplus/tests/metafile.c
@@ -3529,10 +3529,8 @@ static void test_printer_dc(void)
 
     GdipGetDpiX(graphics, &dpix);
     GdipGetDpiX(graphics, &dpiy);
-    todo_wine {
     expectf((REAL)(GetDeviceCaps(hdc, LOGPIXELSX)), dpix);
     expectf((REAL)(GetDeviceCaps(hdc, LOGPIXELSY)), dpiy);
-    }
 
     GdipDeleteGraphics(graphics);
     GdipDisposeImage((GpImage *)metafile);




More information about the wine-cvs mailing list