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