Alexandre Julliard : gdi32: Determine the virtual resolution dynamically if it hasn't been set.

Alexandre Julliard julliard at winehq.org
Thu Oct 17 13:51:50 CDT 2013


Module: wine
Branch: master
Commit: 3e88582a78427f33c55ac0d3b2e6c917c6fef916
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=3e88582a78427f33c55ac0d3b2e6c917c6fef916

Author: Alexandre Julliard <julliard at 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;




More information about the wine-cvs mailing list