[GDI32] GdiDrawStream: Improve handling of small rcDest sizes
authorGiannis Adamopoulos <gadamopoulos@reactos.org>
Wed, 22 Nov 2017 15:28:18 +0000 (17:28 +0200)
committerGiannis Adamopoulos <gadamopoulos@reactos.org>
Wed, 22 Nov 2017 15:28:18 +0000 (17:28 +0200)
- Abort drawing if rcDest has negative height or width.
- Ignore sizing margins if rcDest is too small.
CORE-13513

win32ss/gdi/gdi32/misc/misc.c

index 65287d0..6675e73 100644 (file)
@@ -677,6 +677,19 @@ GdiDrawStream(HDC dc, ULONG l, PGDI_DRAW_STREAM pDS)
         else
             sizingtype = ST_STRETCH;
 
+        if (pDS->rcDest.right < pDS->rcDest.left || pDS->rcDest.bottom < pDS->rcDest.top)
+            return 0;
+
+        if (sm.cxLeftWidth + sm.cxRightWidth > pDS->rcDest.right - pDS->rcDest.left)
+        {
+            sm.cxLeftWidth = sm.cxRightWidth = 0;
+        }
+
+        if (sm.cyTopHeight + sm.cyBottomHeight > pDS->rcDest.bottom - pDS->rcDest.top)
+        {
+            sm.cyTopHeight = sm.cyBottomHeight = 0;
+        }
+
         UXTHEME_DrawImageBackground(pDS->hDC, 
                                     pDS->hImage, 
                                     &pDS->rcSrc,