Module: wine Branch: master Commit: 3e88582a78427f33c55ac0d3b2e6c917c6fef916 URL: http://source.winehq.org/git/wine.git/?a=commit;h=3e88582a78427f33c55ac0d3b2...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Oct 17 12:12:48 2013 +0200
gdi32: Determine the virtual resolution dynamically if it hasn't been set.
---
dlls/gdi32/mapping.c | 90 ++++++++++++++++++++++++++++++-------------------- 1 files changed, 54 insertions(+), 36 deletions(-)
diff --git a/dlls/gdi32/mapping.c b/dlls/gdi32/mapping.c index 2699ca1..665042a 100644 --- a/dlls/gdi32/mapping.c +++ b/dlls/gdi32/mapping.c @@ -29,6 +29,30 @@ WINE_DEFAULT_DEBUG_CHANNEL(dc);
+static SIZE get_dc_virtual_size( DC *dc ) +{ + SIZE ret = dc->virtual_size; + + if (!ret.cx) + { + ret.cx = GetDeviceCaps( dc->hSelf, HORZSIZE ); + ret.cy = GetDeviceCaps( dc->hSelf, VERTSIZE ); + } + return ret; +} + +static SIZE get_dc_virtual_res( DC *dc ) +{ + SIZE ret = dc->virtual_res; + + if (!ret.cx) + { + ret.cx = GetDeviceCaps( dc->hSelf, HORZRES ); + ret.cy = GetDeviceCaps( dc->hSelf, VERTRES ); + } + return ret; +} + /*********************************************************************** * MAPPING_FixIsotropic * @@ -36,10 +60,10 @@ WINE_DEFAULT_DEBUG_CHANNEL(dc); */ static void MAPPING_FixIsotropic( DC * dc ) { - double xdim = fabs((double)dc->vportExtX * dc->virtual_size.cx / - (dc->virtual_res.cx * dc->wndExtX)); - double ydim = fabs((double)dc->vportExtY * dc->virtual_size.cy / - (dc->virtual_res.cy * dc->wndExtY)); + SIZE virtual_size = get_dc_virtual_size( dc ); + SIZE virtual_res = get_dc_virtual_res( dc ); + double xdim = fabs((double)dc->vportExtX * virtual_size.cx / (virtual_res.cx * dc->wndExtX)); + double ydim = fabs((double)dc->vportExtY * virtual_size.cy / (virtual_res.cy * dc->wndExtY));
if (xdim > ydim) { @@ -136,14 +160,12 @@ INT nulldrv_SetMapMode( PHYSDEV dev, INT mode ) { DC *dc = get_nulldrv_dc( dev ); INT ret = dc->MapMode; - INT horzSize, vertSize, horzRes, vertRes; + SIZE virtual_size, virtual_res;
if (mode == dc->MapMode && (mode == MM_ISOTROPIC || mode == MM_ANISOTROPIC)) return ret;
- horzSize = dc->virtual_size.cx; - vertSize = dc->virtual_size.cy; - horzRes = dc->virtual_res.cx; - vertRes = dc->virtual_res.cy; + virtual_size = get_dc_virtual_size( dc ); + virtual_res = get_dc_virtual_res( dc ); switch (mode) { case MM_TEXT: @@ -154,34 +176,34 @@ INT nulldrv_SetMapMode( PHYSDEV dev, INT mode ) break; case MM_LOMETRIC: case MM_ISOTROPIC: - dc->wndExtX = horzSize * 10; - dc->wndExtY = vertSize * 10; - dc->vportExtX = horzRes; - dc->vportExtY = -vertRes; + dc->wndExtX = virtual_size.cx * 10; + dc->wndExtY = virtual_size.cy * 10; + dc->vportExtX = virtual_res.cx; + dc->vportExtY = -virtual_res.cy; break; case MM_HIMETRIC: - dc->wndExtX = horzSize * 100; - dc->wndExtY = vertSize * 100; - dc->vportExtX = horzRes; - dc->vportExtY = -vertRes; + dc->wndExtX = virtual_size.cx * 100; + dc->wndExtY = virtual_size.cy * 100; + dc->vportExtX = virtual_res.cx; + dc->vportExtY = -virtual_res.cy; break; case MM_LOENGLISH: - dc->wndExtX = MulDiv(1000, horzSize, 254); - dc->wndExtY = MulDiv(1000, vertSize, 254); - dc->vportExtX = horzRes; - dc->vportExtY = -vertRes; + dc->wndExtX = MulDiv(1000, virtual_size.cx, 254); + dc->wndExtY = MulDiv(1000, virtual_size.cy, 254); + dc->vportExtX = virtual_res.cx; + dc->vportExtY = -virtual_res.cy; break; case MM_HIENGLISH: - dc->wndExtX = MulDiv(10000, horzSize, 254); - dc->wndExtY = MulDiv(10000, vertSize, 254); - dc->vportExtX = horzRes; - dc->vportExtY = -vertRes; + dc->wndExtX = MulDiv(10000, virtual_size.cx, 254); + dc->wndExtY = MulDiv(10000, virtual_size.cy, 254); + dc->vportExtX = virtual_res.cx; + dc->vportExtY = -virtual_res.cy; break; case MM_TWIPS: - dc->wndExtX = MulDiv(14400, horzSize, 254); - dc->wndExtY = MulDiv(14400, vertSize, 254); - dc->vportExtX = horzRes; - dc->vportExtY = -vertRes; + dc->wndExtX = MulDiv(14400, virtual_size.cx, 254); + dc->wndExtY = MulDiv(14400, virtual_size.cy, 254); + dc->vportExtX = virtual_res.cx; + dc->vportExtY = -virtual_res.cy; break; case MM_ANISOTROPIC: break; @@ -596,15 +618,11 @@ BOOL WINAPI SetVirtualResolution(HDC hdc, DWORD horz_res, DWORD vert_res, DC * dc; TRACE("(%p %d %d %d %d)\n", hdc, horz_res, vert_res, horz_size, vert_size);
- if(horz_res == 0 && vert_res == 0 && horz_size == 0 && vert_size == 0) + if (!horz_res || !vert_res || !horz_size || !vert_size) { - horz_res = GetDeviceCaps(hdc, HORZRES); - vert_res = GetDeviceCaps(hdc, VERTRES); - horz_size = GetDeviceCaps(hdc, HORZSIZE); - vert_size = GetDeviceCaps(hdc, VERTSIZE); + /* they must be all zero */ + if (horz_res || vert_res || horz_size || vert_size) return FALSE; } - else if(horz_res == 0 || vert_res == 0 || horz_size == 0 || vert_size == 0) - return FALSE;
dc = get_dc_ptr( hdc ); if (!dc) return FALSE;