Author: fireball
Date: Sun Aug 2 12:32:57 2009
New Revision: 42333
URL:
http://svn.reactos.org/svn/reactos?rev=42333&view=rev
Log:
- Handle case when RosGdiSetDeviceClipping is being called without rects at all (with a
respective DPRINT1).
- Use combined clipping object everywhere to ensure drawing happens only in allowed
rectangle, see arwinss nr. 15. As a side effect, it fixes FireFox and other apps which
would corrupt memory if trying to blit to area outside of DC.
- Enable commented out XLATE object creation in GreStretchBltMask. Start menu icons now
get masked properly too, but still are black.
Modified:
branches/arwinss/reactos/subsystems/win32/win32k/gdi/dc.c
branches/arwinss/reactos/subsystems/win32/win32k/gdi/misc.c
branches/arwinss/reactos/subsystems/win32/win32k/gre/bitblt.c
branches/arwinss/reactos/subsystems/win32/win32k/gre/lineto.c
branches/arwinss/reactos/subsystems/win32/win32k/gre/polyfill.c
branches/arwinss/reactos/subsystems/win32/win32k/gre/rect.c
Modified: branches/arwinss/reactos/subsystems/win32/win32k/gdi/dc.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win3…
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/gdi/dc.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/gdi/dc.c [iso-8859-1] Sun Aug 2
12:32:57 2009
@@ -373,14 +373,17 @@
/* Capture the rects buffer */
_SEH2_TRY
{
- ProbeForRead(pRects, count * sizeof(RECTL), 1);
-
- /* Use pool allocated buffer if data doesn't fit */
- if (count > sizeof(*pStackBuf) / sizeof(RECTL))
- pSafeRects = ExAllocatePool(PagedPool, sizeof(RECTL) * count);
-
- /* Copy points data */
- RtlCopyMemory(pSafeRects, pRects, count * sizeof(RECTL));
+ if (count > 0)
+ {
+ ProbeForRead(pRects, count * sizeof(RECTL), 1);
+
+ /* Use pool allocated buffer if data doesn't fit */
+ if (count > sizeof(*pStackBuf) / sizeof(RECTL))
+ pSafeRects = ExAllocatePool(PagedPool, sizeof(RECTL) * count);
+
+ /* Copy points data */
+ RtlCopyMemory(pSafeRects, pRects, count * sizeof(RECTL));
+ }
/* Copy bounding rect */
ProbeForRead(rcBounds, sizeof(RECTL), 1);
@@ -421,8 +424,25 @@
if (pDC->CombinedClip)
IntEngDeleteClipRegion(pDC->CombinedClip);
- /* Set the clipping object */
- pDC->CombinedClip = IntEngCreateClipRegion(count, pSafeRects, &rcSafeBounds);
+ if (count == 0)
+ {
+ /* Special case, set it to full screen then */
+ RECTL_vSetRect(&rcSafeBounds,
+ pDC->rcVport.left,
+ pDC->rcVport.top,
+ pDC->rcVport.right,
+ pDC->rcVport.bottom);
+
+ /* Set the clipping object */
+ pDC->CombinedClip = IntEngCreateClipRegion(1, &rcSafeBounds,
&rcSafeBounds);
+
+ DPRINT1("FIXME: Setting device clipping to NULL region, using full screen
instead\n");
+ }
+ else
+ {
+ /* Set the clipping object */
+ pDC->CombinedClip = IntEngCreateClipRegion(count, pSafeRects,
&rcSafeBounds);
+ }
DPRINT("RosGdiSetDeviceClipping() for DC %x, bounding rect (%d,%d)-(%d,
%d)\n",
physDev, rcSafeBounds.left, rcSafeBounds.top, rcSafeBounds.right,
rcSafeBounds.bottom);
Modified: branches/arwinss/reactos/subsystems/win32/win32k/gdi/misc.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win3…
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/gdi/misc.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/gdi/misc.c [iso-8859-1] Sun Aug 2
12:32:57 2009
@@ -71,7 +71,6 @@
BOOL APIENTRY RosGdiLineTo( HDC physDev, INT x1, INT y1, INT x2, INT y2 )
{
PDC pDC;
- CLIPOBJ *pClipObj;
RECTL scrRect;
POINT pt[2];
@@ -80,12 +79,7 @@
/* Get a pointer to the DC */
pDC = DC_Lock(physDev);
- scrRect.left = scrRect.top = 0;
- scrRect.right = PrimarySurface.GDIInfo.ulHorzRes;
- scrRect.bottom = PrimarySurface.GDIInfo.ulVertRes;
-
- pClipObj = IntEngCreateClipRegion(1, NULL, &scrRect);
-
+ /* Set points */
pt[0].x = x1; pt[0].y = y1;
pt[1].x = x2; pt[1].y = y2;
@@ -96,16 +90,13 @@
pt[1].y += pDC->rcVport.top + pDC->rcDcRect.top;
GreLineTo(&pDC->pBitmap->SurfObj,
- pClipObj,
- //pDC->CombinedClip,
+ pDC->CombinedClip,
&(pDC->pLineBrush->BrushObj),
pt[0].x, pt[0].y,
pt[1].x, pt[1].y,
&scrRect,
0);
- IntEngDeleteClipRegion(pClipObj);
-
/* Release the object */
DC_Unlock(pDC);
Modified: branches/arwinss/reactos/subsystems/win32/win32k/gre/bitblt.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win3…
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/gre/bitblt.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/gre/bitblt.c [iso-8859-1] Sun Aug 2
12:32:57 2009
@@ -111,14 +111,12 @@
/* Is the source surface device managed? */
else if (psoSrc && psurfSrc->flHooks & HOOK_BITBLT)
{
- DPRINT1("psoSrc %p\n", psoSrc);
pfnBitBlt = GDIDEVFUNCS(psoSrc).BitBlt;
}
else
{
pfnBitBlt = EngBitBlt;
}
-
bResult = pfnBitBlt(psoTrg,
psoSrc,
psoMask,
@@ -204,7 +202,7 @@
&pDest->pBitmap->SurfObj,
pSrc ? &pSrc->pBitmap->SurfObj : NULL,
NULL,
- NULL,//dc->rosdc.CombinedClip,
+ pDest->CombinedClip,
XlateObj,
&DestRect,
&SourcePoint,
@@ -231,6 +229,8 @@
POINTL BrushOrigin = {0, 0};
BOOLEAN bRet = FALSE;
+ DPRINT("GrePatBlt %p %d %d %d %d %x %p\n", pDC, XLeft, YLeft, Width,
Height, ROP, BrushObj);
+
if (!(BrushObj->flAttrs & GDIBRUSH_IS_NULL))
{
if (Width > 0)
@@ -267,7 +267,7 @@
&pDC->pBitmap->SurfObj,
NULL,
NULL,
- NULL,//dc->rosdc.CombinedClip,
+ pDC->CombinedClip,
NULL,
&DestRect,
NULL,
@@ -354,13 +354,13 @@
}
/* Create the XLATEOBJ. */
- XlateObj = NULL;/*IntCreateXlateForBlt(DCDest, DCSrc, BitmapDest, BitmapSrc);
+ XlateObj = IntCreateXlateForBlt(DCDest, DCSrc, BitmapDest, BitmapSrc);
if (XlateObj == (XLATEOBJ*)-1)
{
SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES);
XlateObj = NULL;
goto failed;
- }*/
+ }
}
/* Offset the brush */
@@ -384,7 +384,7 @@
Status = EngpStretchBlt(&BitmapDest->SurfObj,
&BitmapSrc->SurfObj,
BitmapMask ? &BitmapMask->SurfObj : NULL,
- NULL,//DCDest->CombinedClip,
+ DCDest->CombinedClip,
XlateObj,
&DestRect,
&SourceRect,
Modified: branches/arwinss/reactos/subsystems/win32/win32k/gre/lineto.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win3…
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/gre/lineto.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/gre/lineto.c [iso-8859-1] Sun Aug 2
12:32:57 2009
@@ -124,7 +124,7 @@
for (i=0; i<count-1; i++)
{
bRet = GreLineTo(&pDC->pBitmap->SurfObj,
- NULL,//dc->rosdc.CombinedClip,
+ pDC->CombinedClip,
&pDC->pLineBrush->BrushObj,
ptPoints[i].x + pDC->rcDcRect.left +
pDC->rcVport.left,
ptPoints[i].y + pDC->rcDcRect.top + pDC->rcVport.top,
Modified: branches/arwinss/reactos/subsystems/win32/win32k/gre/polyfill.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win3…
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/gre/polyfill.c [iso-8859-1]
(original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/gre/polyfill.c [iso-8859-1] Sun Aug
2 12:32:57 2009
@@ -431,7 +431,7 @@
//DPRINT("Fill Line (%d, %d) to (%d, %d)\n",x1, ScanLine, x2, ScanLine);
GreLineTo(&psurf->SurfObj,
- NULL,//dc->rosdc.CombinedClip,
+ dc->CombinedClip,
BrushObj,
x1,
ScanLine,
@@ -503,7 +503,7 @@
//DPRINT("Fill Line (%d, %d) to (%d, %d)\n",x1, ScanLine, x2, ScanLine);
GreLineTo(&psurf->SurfObj,
- NULL,//dc->rosdc.CombinedClip,
+ dc->CombinedClip,
BrushObj,
x1,
ScanLine,
@@ -526,7 +526,7 @@
//DPRINT("Fill Line (%d, %d) to (%d, %d)\n",x1, ScanLine, x2, ScanLine);
GreLineTo(&psurf->SurfObj,
- NULL, //dc->rosdc.CombinedClip,
+ dc->CombinedClip,
BrushObj,
x1,
ScanLine,
@@ -649,7 +649,7 @@
GrepBitBltEx(psurf,
NULL,
NULL,
- NULL,//dc->rosdc.CombinedClip,
+ dc->CombinedClip,
NULL,
&LineRect,
NULL,
Modified: branches/arwinss/reactos/subsystems/win32/win32k/gre/rect.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win3…
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/gre/rect.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/gre/rect.c [iso-8859-1] Sun Aug 2
12:32:57 2009
@@ -45,7 +45,7 @@
bRet = GrepBitBltEx(&pDC->pBitmap->SurfObj,
NULL,
NULL,
- NULL,//dc->rosdc.CombinedClip,
+ pDC->CombinedClip,
NULL,
&DestRect,
NULL,
@@ -63,28 +63,28 @@
{
Mix = ROP2_TO_MIX(R2_COPYPEN);/*pdcattr->jROP2*/
GreLineTo(&pDC->pBitmap->SurfObj,
- NULL,//dc->rosdc.CombinedClip,
+ pDC->CombinedClip,
&pDC->pLineBrush->BrushObj,
DestRect.left, DestRect.top, DestRect.right, DestRect.top,
&DestRect, // Bounding rectangle
Mix);
GreLineTo(&pDC->pBitmap->SurfObj,
- NULL,//dc->rosdc.CombinedClip,
+ pDC->CombinedClip,
&pDC->pLineBrush->BrushObj,
DestRect.right, DestRect.top, DestRect.right, DestRect.bottom,
&DestRect, // Bounding rectangle
Mix);
GreLineTo(&pDC->pBitmap->SurfObj,
- NULL,//dc->rosdc.CombinedClip,
+ pDC->CombinedClip,
&pDC->pLineBrush->BrushObj,
DestRect.right, DestRect.bottom, DestRect.left, DestRect.bottom,
&DestRect, // Bounding rectangle
Mix);
GreLineTo(&pDC->pBitmap->SurfObj,
- NULL,//dc->rosdc.CombinedClip,
+ pDC->CombinedClip,
&pDC->pLineBrush->BrushObj,
DestRect.left, DestRect.bottom, DestRect.left, DestRect.top,
&DestRect, // Bounding rectangle
@@ -135,7 +135,7 @@
for (i=0; i<count-1; i++)
{
bRet = GreLineTo(&pDC->pBitmap->SurfObj,
- NULL,//dc->rosdc.CombinedClip,
+ pDC->CombinedClip,
&pDC->pLineBrush->BrushObj,
ptPoints[i].x,
ptPoints[i].y,