[win32k] Add parameter checks for NtGdiSetVirtualResolution
[reactos.git] / reactos / subsystems / win32 / win32k / objects / coord.c
index 15d5e9b..e2a70c9 100644 (file)
@@ -12,9 +12,9 @@
  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  *  GNU General Public License for more details.
  *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 /*
  *
@@ -127,8 +127,8 @@ IntGdiModifyWorldTransform(
     CONST LPXFORM lpXForm,
     DWORD Mode)
 {
-    ASSERT(pDc);
     XFORM xformWorld2Wnd;
+    ASSERT(pDc);
 
     switch (Mode)
     {
@@ -198,7 +198,21 @@ NtGdiGetTransform(
                 MatrixS2XForm(XForm, &dc->dclevel.mxWorldToPage);
                 break;
 
+            case GdiWorldSpaceToDeviceSpace:
+                MatrixS2XForm(XForm, &dc->dclevel.mxWorldToDevice);
+                break;
+
+            case GdiPageSpaceToDeviceSpace:
+                DPRINT1("Page space -> device space is unsupported!\n");
+                break;
+
+            case GdiDeviceSpaceToWorldSpace:
+                MatrixS2XForm(XForm, &dc->dclevel.mxDeviceToWorld);
+                break;
+
             default:
+                DPRINT1("Unknown transform %lu\n", iXform);
+                Status = STATUS_INVALID_PARAMETER;
                 break;
         }
     }
@@ -674,38 +688,38 @@ IntGdiSetMapMode(
             /* Fall through */
 
         case MM_LOMETRIC:
-            pdcattr->szlWindowExt.cx = dc->ppdev->GDIInfo.ulHorzSize * 10;
-            pdcattr->szlWindowExt.cy = dc->ppdev->GDIInfo.ulVertSize * 10;
-            pdcattr->szlViewportExt.cx = dc->ppdev->GDIInfo.ulHorzRes;
-            pdcattr->szlViewportExt.cy = -dc->ppdev->GDIInfo.ulVertRes;
+            pdcattr->szlWindowExt.cx = dc->ppdev->gdiinfo.ulHorzSize * 10;
+            pdcattr->szlWindowExt.cy = dc->ppdev->gdiinfo.ulVertSize * 10;
+            pdcattr->szlViewportExt.cx = dc->ppdev->gdiinfo.ulHorzRes;
+            pdcattr->szlViewportExt.cy = -dc->ppdev->gdiinfo.ulVertRes;
             break;
 
         case MM_HIMETRIC:
-            pdcattr->szlWindowExt.cx = dc->ppdev->GDIInfo.ulHorzSize * 100;
-            pdcattr->szlWindowExt.cy = dc->ppdev->GDIInfo.ulVertSize * 100;
-            pdcattr->szlViewportExt.cx = dc->ppdev->GDIInfo.ulHorzRes;
-            pdcattr->szlViewportExt.cy = -dc->ppdev->GDIInfo.ulVertRes;
+            pdcattr->szlWindowExt.cx = dc->ppdev->gdiinfo.ulHorzSize * 100;
+            pdcattr->szlWindowExt.cy = dc->ppdev->gdiinfo.ulVertSize * 100;
+            pdcattr->szlViewportExt.cx = dc->ppdev->gdiinfo.ulHorzRes;
+            pdcattr->szlViewportExt.cy = -dc->ppdev->gdiinfo.ulVertRes;
             break;
 
         case MM_LOENGLISH:
-            pdcattr->szlWindowExt.cx = MulDiv(1000, dc->ppdev->GDIInfo.ulHorzSize, 254);
-            pdcattr->szlWindowExt.cy = MulDiv(1000, dc->ppdev->GDIInfo.ulVertSize, 254);
-            pdcattr->szlViewportExt.cx = dc->ppdev->GDIInfo.ulHorzRes;
-            pdcattr->szlViewportExt.cy = -dc->ppdev->GDIInfo.ulVertRes;
+            pdcattr->szlWindowExt.cx = MulDiv(1000, dc->ppdev->gdiinfo.ulHorzSize, 254);
+            pdcattr->szlWindowExt.cy = MulDiv(1000, dc->ppdev->gdiinfo.ulVertSize, 254);
+            pdcattr->szlViewportExt.cx = dc->ppdev->gdiinfo.ulHorzRes;
+            pdcattr->szlViewportExt.cy = -dc->ppdev->gdiinfo.ulVertRes;
             break;
 
         case MM_HIENGLISH:
-            pdcattr->szlWindowExt.cx = MulDiv(10000, dc->ppdev->GDIInfo.ulHorzSize, 254);
-            pdcattr->szlWindowExt.cy = MulDiv(10000, dc->ppdev->GDIInfo.ulVertSize, 254);
-            pdcattr->szlViewportExt.cx = dc->ppdev->GDIInfo.ulHorzRes;
-            pdcattr->szlViewportExt.cy = -dc->ppdev->GDIInfo.ulVertRes;
+            pdcattr->szlWindowExt.cx = MulDiv(10000, dc->ppdev->gdiinfo.ulHorzSize, 254);
+            pdcattr->szlWindowExt.cy = MulDiv(10000, dc->ppdev->gdiinfo.ulVertSize, 254);
+            pdcattr->szlViewportExt.cx = dc->ppdev->gdiinfo.ulHorzRes;
+            pdcattr->szlViewportExt.cy = -dc->ppdev->gdiinfo.ulVertRes;
             break;
 
         case MM_TWIPS:
-            pdcattr->szlWindowExt.cx = MulDiv(14400, dc->ppdev->GDIInfo.ulHorzSize, 254);
-            pdcattr->szlWindowExt.cy = MulDiv(14400, dc->ppdev->GDIInfo.ulVertSize, 254);
-            pdcattr->szlViewportExt.cx = dc->ppdev->GDIInfo.ulHorzRes;
-            pdcattr->szlViewportExt.cy = -dc->ppdev->GDIInfo.ulVertRes;
+            pdcattr->szlWindowExt.cx = MulDiv(14400, dc->ppdev->gdiinfo.ulHorzSize, 254);
+            pdcattr->szlWindowExt.cy = MulDiv(14400, dc->ppdev->gdiinfo.ulVertSize, 254);
+            pdcattr->szlViewportExt.cx = dc->ppdev->gdiinfo.ulHorzRes;
+            pdcattr->szlViewportExt.cy = -dc->ppdev->gdiinfo.ulVertRes;
             break;
 
         case MM_ANISOTROPIC:
@@ -1010,7 +1024,20 @@ NtGdiSetVirtualResolution(
     PDC dc;
     PDC_ATTR pdcattr;
 
-    // Need test types for zeros and non zeros
+    /* Check parameters (all zeroes resets to real resolution) */
+    if (cxVirtualDevicePixel == 0 && cyVirtualDevicePixel == 0 &&
+        cxVirtualDeviceMm == 0 && cyVirtualDeviceMm == 0)
+    {
+        cxVirtualDevicePixel = NtGdiGetDeviceCaps(hdc, HORZRES);
+        cyVirtualDevicePixel = NtGdiGetDeviceCaps(hdc, VERTRES);
+        cxVirtualDeviceMm = NtGdiGetDeviceCaps(hdc, HORZSIZE);
+        cyVirtualDeviceMm = NtGdiGetDeviceCaps(hdc, VERTSIZE);
+    }
+    else if (cxVirtualDevicePixel == 0 || cyVirtualDevicePixel == 0 || 
+             cxVirtualDeviceMm == 0 || cyVirtualDeviceMm == 0)
+    {
+        return FALSE;
+    }
 
     dc = DC_LockDc(hdc);
     if (!dc) return FALSE;
@@ -1151,8 +1178,8 @@ DC_vGetAspectRatioFilter(PDC pDC, LPSIZE AspectRatio)
     {
         // "This specifies that Windows should only match fonts that have the
         // same aspect ratio as the display.", Programming Windows, Fifth Ed.
-        AspectRatio->cx = pDC->ppdev->GDIInfo.ulLogPixelsX;
-        AspectRatio->cy = pDC->ppdev->GDIInfo.ulLogPixelsY;
+        AspectRatio->cx = pDC->ppdev->gdiinfo.ulLogPixelsX;
+        AspectRatio->cy = pDC->ppdev->gdiinfo.ulLogPixelsY;
     }
     else
     {