Module: wine Branch: master Commit: 3549097c9e393bca3d2b2c86dd04a0d971a1c138 URL: https://source.winehq.org/git/wine.git/?a=commit;h=3549097c9e393bca3d2b2c86d...
Author: Ziqing Hui zhui@codeweavers.com Date: Wed Jan 20 10:26:46 2021 +0800
gdiplus: Record logical DPI in metafile.
Signed-off-by: Ziqing Hui zhui@codeweavers.com Signed-off-by: Esme Povirk esme@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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);