Author: jgardou
Date: Wed Jul 23 16:05:47 2014
New Revision: 63731
URL:
http://svn.reactos.org/svn/reactos?rev=63731&view=rev
Log:
[WIN32K]
- Correctly use the Clip, Meta, Rao, API and Vis Regions in DCs
- Update the DC clipping object on demand each time a blt is performed
- Reduce the number of region allocated with handles when it's not needed
This commit fixes numerous bugs regarding clipping, most notably SetDIBitsToDevice
overlapping foreground windows
CORE-8353 #resolve #comment There are still a few quirks in winetests which will get fixed
in a next commit
CORE-7628 #comment should be fixed in rev 63731, please confirm.
Modified:
trunk/reactos/win32ss/gdi/ntgdi/arc.c
trunk/reactos/win32ss/gdi/ntgdi/bitblt.c
trunk/reactos/win32ss/gdi/ntgdi/cliprgn.c
trunk/reactos/win32ss/gdi/ntgdi/cliprgn.h
trunk/reactos/win32ss/gdi/ntgdi/dc.h
trunk/reactos/win32ss/gdi/ntgdi/dclife.c
trunk/reactos/win32ss/gdi/ntgdi/dcobjs.c
trunk/reactos/win32ss/gdi/ntgdi/dcstate.c
trunk/reactos/win32ss/gdi/ntgdi/dcutil.c
trunk/reactos/win32ss/gdi/ntgdi/dibobj.c
trunk/reactos/win32ss/gdi/ntgdi/fillshap.c
trunk/reactos/win32ss/gdi/ntgdi/freetype.c
trunk/reactos/win32ss/gdi/ntgdi/line.c
trunk/reactos/win32ss/gdi/ntgdi/path.c
trunk/reactos/win32ss/gdi/ntgdi/region.c
trunk/reactos/win32ss/gdi/ntgdi/region.h
trunk/reactos/win32ss/user/ntuser/cursoricon.c
trunk/reactos/win32ss/user/ntuser/cursoricon_new.c
trunk/reactos/win32ss/user/ntuser/dce.h
trunk/reactos/win32ss/user/ntuser/windc.c
Modified: trunk/reactos/win32ss/gdi/ntgdi/arc.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/arc.c?re…
==============================================================================
--- trunk/reactos/win32ss/gdi/ntgdi/arc.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/gdi/ntgdi/arc.c [iso-8859-1] Wed Jul 23 16:05:47 2014
@@ -335,8 +335,7 @@
worker.l = dwStartAngle;
worker1.l = dwSweepAngle;
- DC_vPrepareDCsForBlit(pDC, pDC->rosdc.CombinedClip->rclBounds,
- NULL, pDC->rosdc.CombinedClip->rclBounds);
+ DC_vPrepareDCsForBlit(pDC, NULL, NULL, NULL);
if (pDC->pdcattr->ulDirty_ & (DIRTY_FILL | DC_BRUSH_DIRTY))
DC_vUpdateFillBrush(pDC);
if (pDC->pdcattr->ulDirty_ & (DIRTY_LINE | DC_PEN_DIRTY))
@@ -381,8 +380,7 @@
return TRUE;
}
- DC_vPrepareDCsForBlit(dc, dc->rosdc.CombinedClip->rclBounds,
- NULL, dc->rosdc.CombinedClip->rclBounds);
+ DC_vPrepareDCsForBlit(dc, NULL, NULL, NULL);
if (dc->pdcattr->ulDirty_ & (DIRTY_FILL | DC_BRUSH_DIRTY))
DC_vUpdateFillBrush(dc);
Modified: trunk/reactos/win32ss/gdi/ntgdi/bitblt.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/bitblt.c…
==============================================================================
--- trunk/reactos/win32ss/gdi/ntgdi/bitblt.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/gdi/ntgdi/bitblt.c [iso-8859-1] Wed Jul 23 16:05:47 2014
@@ -107,7 +107,7 @@
/* Prepare DCs for blit */
TRACE("Preparing DCs for blit\n");
- DC_vPrepareDCsForBlit(DCDest, DestRect, DCSrc, SourceRect);
+ DC_vPrepareDCsForBlit(DCDest, &DestRect, DCSrc, &SourceRect);
/* Determine surfaces to be used in the bitblt */
BitmapDest = DCDest->dclevel.pSurface;
@@ -268,7 +268,7 @@
rcSrc.bottom += DCSrc->ptlDCOrig.y;
/* Prepare for blit */
- DC_vPrepareDCsForBlit(DCDest, rcDest, DCSrc, rcSrc);
+ DC_vPrepareDCsForBlit(DCDest, &rcDest, DCSrc, &rcSrc);
BitmapDest = DCDest->dclevel.pSurface;
if (!BitmapDest)
@@ -456,7 +456,7 @@
}
/* Prepare blit */
- DC_vPrepareDCsForBlit(DCDest, DestRect, DCSrc, SourceRect);
+ DC_vPrepareDCsForBlit(DCDest, &DestRect, DCSrc, &SourceRect);
if (pdcattr->ulDirty_ & (DIRTY_FILL | DC_BRUSH_DIRTY))
DC_vUpdateFillBrush(DCDest);
@@ -647,7 +647,7 @@
BrushOrigin.y = 0;
/* Only prepare Source and Dest, hdcMask represents a DIB */
- DC_vPrepareDCsForBlit(DCDest, DestRect, DCSrc, SourceRect);
+ DC_vPrepareDCsForBlit(DCDest, &DestRect, DCSrc, &SourceRect);
if (pdcattr->ulDirty_ & (DIRTY_FILL | DC_BRUSH_DIRTY))
DC_vUpdateFillBrush(DCDest);
@@ -826,7 +826,7 @@
BrushOrigin.y = pbrush->ptOrigin.y + pdc->ptlDCOrig.y;
#endif
- DC_vPrepareDCsForBlit(pdc, DestRect, NULL, DestRect);
+ DC_vPrepareDCsForBlit(pdc, &DestRect, NULL, NULL);
psurf = pdc->dclevel.pSurface;
Modified: trunk/reactos/win32ss/gdi/ntgdi/cliprgn.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/cliprgn.…
==============================================================================
--- trunk/reactos/win32ss/gdi/ntgdi/cliprgn.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/gdi/ntgdi/cliprgn.c [iso-8859-1] Wed Jul 23 16:05:47 2014
@@ -11,164 +11,102 @@
#define NDEBUG
#include <debug.h>
-int FASTCALL
-CLIPPING_UpdateGCRegion(DC* Dc)
-{
- PROSRGNDATA CombinedRegion;
- //HRGN hRgnVis;
- PREGION prgnClip, prgnGCClip;
-
- /* Would prefer this, but the rest of the code sucks... */
- //ASSERT(Dc->rosdc.hGCClipRgn);
- //ASSERT(Dc->rosdc.hClipRgn);
- ASSERT(Dc->prgnVis);
- //hRgnVis = Dc->prgnVis->BaseObject.hHmgr;
-
- if (Dc->rosdc.hGCClipRgn == NULL)
- Dc->rosdc.hGCClipRgn = IntSysCreateRectRgn(0, 0, 0, 0);
-
- prgnGCClip = REGION_LockRgn(Dc->rosdc.hGCClipRgn);
- ASSERT(prgnGCClip);
-
- if (Dc->rosdc.hClipRgn == NULL)
- IntGdiCombineRgn(prgnGCClip, Dc->prgnVis, NULL, RGN_COPY);
- else
- {
- prgnClip = REGION_LockRgn(Dc->rosdc.hClipRgn); // FIXME: Locking order, ugh!
- IntGdiCombineRgn(prgnGCClip, Dc->prgnVis, prgnClip, RGN_AND);
- REGION_UnlockRgn(prgnClip);
- }
- REGION_UnlockRgn(prgnGCClip);
-
- NtGdiOffsetRgn(Dc->rosdc.hGCClipRgn, Dc->ptlDCOrig.x, Dc->ptlDCOrig.y);
-
- if((CombinedRegion = RGNOBJAPI_Lock(Dc->rosdc.hGCClipRgn, NULL)))
- {
- CLIPOBJ *CombinedClip;
-
- CombinedClip = IntEngCreateClipRegion(CombinedRegion->rdh.nCount,
- CombinedRegion->Buffer,
- &CombinedRegion->rdh.rcBound);
-
- RGNOBJAPI_Unlock(CombinedRegion);
-
- if ( !CombinedClip )
- {
- DPRINT1("IntEngCreateClipRegion() failed\n");
- return ERROR;
- }
-
- if(Dc->rosdc.CombinedClip != NULL)
- IntEngDeleteClipRegion(Dc->rosdc.CombinedClip);
-
- Dc->rosdc.CombinedClip = CombinedClip ;
- }
-
- return NtGdiOffsetRgn(Dc->rosdc.hGCClipRgn, -Dc->ptlDCOrig.x,
-Dc->ptlDCOrig.y);
-}
-
-INT FASTCALL
-GdiSelectVisRgn(HDC hdc, HRGN hrgn)
-{
- int retval;
- DC *dc;
- PREGION prgn;
-
- if (!hrgn)
- {
- EngSetLastError(ERROR_INVALID_PARAMETER);
- return ERROR;
- }
- if (!(dc = DC_LockDc(hdc)))
- {
- EngSetLastError(ERROR_INVALID_HANDLE);
- return ERROR;
- }
-
- dc->fs &= ~DC_FLAG_DIRTY_RAO;
-
- ASSERT (dc->prgnVis != NULL);
-
- prgn = RGNOBJAPI_Lock(hrgn, NULL);
- retval = prgn ? IntGdiCombineRgn(dc->prgnVis, prgn, NULL, RGN_COPY) : ERROR;
- RGNOBJAPI_Unlock(prgn);
- if ( retval != ERROR )
- {
+VOID
+FASTCALL
+GdiSelectVisRgn(
+ HDC hdc,
+ PREGION prgn)
+{
+ DC *dc;
+
+ if (!(dc = DC_LockDc(hdc)))
+ {
+ EngSetLastError(ERROR_INVALID_HANDLE);
+ return;
+ }
+
+ dc->fs |= DC_FLAG_DIRTY_RAO;
+
+ ASSERT(dc->prgnVis != NULL);
+ ASSERT(prgn != NULL);
+
+ IntGdiCombineRgn(dc->prgnVis, prgn, NULL, RGN_COPY);
IntGdiOffsetRgn(dc->prgnVis, -dc->ptlDCOrig.x, -dc->ptlDCOrig.y);
- CLIPPING_UpdateGCRegion(dc);
- }
- DC_UnlockDc(dc);
-
- return retval;
-}
-
-
-int FASTCALL GdiExtSelectClipRgn(PDC dc,
- HRGN hrgn,
- int fnMode)
-{
- // dc->fs &= ~DC_FLAG_DIRTY_RAO;
-
- if (!hrgn)
- {
- if (fnMode == RGN_COPY)
- {
- if (dc->rosdc.hClipRgn != NULL)
- {
- GreDeleteObject(dc->rosdc.hClipRgn);
- dc->rosdc.hClipRgn = NULL;
- }
- }
- else
- {
- EngSetLastError(ERROR_INVALID_PARAMETER);
- return ERROR;
- }
- }
- else
- {
- if (!dc->rosdc.hClipRgn)
- {
- RECTL rect;
- if(dc->prgnVis)
- {
+
+ DC_UnlockDc(dc);
+}
+
+
+int
+FASTCALL
+IntGdiExtSelectClipRgn(
+ PDC dc,
+ PREGION prgn,
+ int fnMode)
+{
+ if (!prgn)
+ {
+ if (fnMode == RGN_COPY)
+ {
+ if (dc->dclevel.prgnClip != NULL)
+ {
+ REGION_Delete(dc->dclevel.prgnClip);
+ dc->dclevel.prgnClip = NULL;
+ dc->fs |= DC_FLAG_DIRTY_RAO;
+ }
+ return SIMPLEREGION;
+ }
+ else
+ {
+ EngSetLastError(ERROR_INVALID_PARAMETER);
+ return ERROR;
+ }
+ }
+
+ if (!dc->dclevel.prgnClip)
+ {
+ RECTL rect;
+
REGION_GetRgnBox(dc->prgnVis, &rect);
- dc->rosdc.hClipRgn = IntSysCreateRectRgnIndirect(&rect);
- }
- else
- {
- dc->rosdc.hClipRgn = IntSysCreateRectRgn(0, 0, 0, 0);
- }
- }
+ dc->dclevel.prgnClip = IntSysCreateRectpRgnIndirect(&rect);
+ }
+
+ dc->fs |= DC_FLAG_DIRTY_RAO;
+
if(fnMode == RGN_COPY)
- {
- NtGdiCombineRgn(dc->rosdc.hClipRgn, hrgn, 0, fnMode);
- }
- else
- NtGdiCombineRgn(dc->rosdc.hClipRgn, dc->rosdc.hClipRgn, hrgn, fnMode);
- }
-
- return CLIPPING_UpdateGCRegion(dc);
-}
-
-
-int APIENTRY NtGdiExtSelectClipRgn(HDC hDC,
- HRGN hrgn,
- int fnMode)
-{
- int retval;
- DC *dc;
-
- if (!(dc = DC_LockDc(hDC)))
- {
- EngSetLastError(ERROR_INVALID_HANDLE);
- return ERROR;
- }
-
- retval = GdiExtSelectClipRgn ( dc, hrgn, fnMode );
-
- DC_UnlockDc(dc);
- return retval;
+ return IntGdiCombineRgn(dc->dclevel.prgnClip, prgn, 0, fnMode);
+
+ return IntGdiCombineRgn(dc->dclevel.prgnClip, dc->dclevel.prgnClip, prgn,
fnMode);
+}
+
+
+int
+APIENTRY
+NtGdiExtSelectClipRgn(
+ HDC hDC,
+ HRGN hrgn,
+ int fnMode)
+{
+ int retval;
+ DC *dc;
+ PREGION prgn;
+
+ if (!(dc = DC_LockDc(hDC)))
+ {
+ EngSetLastError(ERROR_INVALID_HANDLE);
+ return ERROR;
+ }
+
+ prgn = REGION_LockRgn(hrgn);
+
+ /* IntGdiExtSelectClipRgn takes care of checking for NULL region */
+ retval = IntGdiExtSelectClipRgn(dc, prgn, fnMode);
+
+ if (prgn)
+ REGION_UnlockRgn(prgn);
+
+ DC_UnlockDc(dc);
+ return retval;
}
INT FASTCALL
@@ -177,7 +115,6 @@
INT retval;
PDC dc;
PROSRGNDATA pRgnNew, pRgn = NULL;
- BOOL Unlock = FALSE; // Small HACK
if (!(dc = DC_LockDc(hDC)))
{
@@ -193,10 +130,9 @@
{
pRgn = dc->dclevel.prgnMeta;
}
- else if (dc->rosdc.hClipRgn)
+ else if (dc->dclevel.prgnClip) // CLIPRGN
{
- Unlock = TRUE ;
- pRgn = REGION_LockRgn(dc->rosdc.hClipRgn); // CLIPRGN
+ pRgn = dc->dclevel.prgnClip;
}
if (pRgn)
@@ -206,7 +142,6 @@
if (!pRgnNew)
{
DC_UnlockDc(dc);
- if(Unlock) REGION_UnlockRgn(pRgn);
return ERROR;
}
@@ -217,12 +152,11 @@
REGION_Delete(pRgnNew);
DC_UnlockDc(dc);
- if(Unlock) REGION_UnlockRgn(pRgn);
return retval;
}
retval = REGION_GetRgnBox(dc->prgnVis, rc);
- IntDPtoLP(dc, (LPPOINT)rc, 2);
+
DC_UnlockDc(dc);
return retval;
@@ -265,53 +199,49 @@
int RightRect,
int BottomRect)
{
- INT Result;
- RECTL Rect;
- PREGION prgnNew, prgnClip;
- PDC dc = DC_LockDc(hDC);
-
- if (!dc)
- {
- EngSetLastError(ERROR_INVALID_HANDLE);
- return ERROR;
- }
-
- Rect.left = LeftRect;
- Rect.top = TopRect;
- Rect.right = RightRect;
- Rect.bottom = BottomRect;
-
- IntLPtoDP(dc, (LPPOINT)&Rect, 2);
-
- prgnNew = IntSysCreateRectpRgnIndirect(&Rect);
- if (!prgnNew)
- {
- Result = ERROR;
- }
- else
- {
- if (!dc->rosdc.hClipRgn)
- {
- dc->rosdc.hClipRgn = IntSysCreateRectRgn(0, 0, 0, 0);
- prgnClip = REGION_LockRgn(dc->rosdc.hClipRgn);
- IntGdiCombineRgn(prgnClip, dc->prgnVis, prgnNew, RGN_DIFF);
- REGION_UnlockRgn(prgnClip);
- Result = SIMPLEREGION;
- }
- else
- {
- prgnClip = REGION_LockRgn(dc->rosdc.hClipRgn);
- Result = IntGdiCombineRgn(prgnClip, prgnClip, prgnNew, RGN_DIFF);
- REGION_UnlockRgn(prgnClip);
- }
- REGION_Delete(prgnNew);
- }
- if (Result != ERROR)
- CLIPPING_UpdateGCRegion(dc);
-
- DC_UnlockDc(dc);
-
- return Result;
+ INT Result;
+ RECTL Rect;
+ PREGION prgnNew;
+ PDC dc = DC_LockDc(hDC);
+
+ if (!dc)
+ {
+ EngSetLastError(ERROR_INVALID_HANDLE);
+ return ERROR;
+ }
+
+ Rect.left = LeftRect;
+ Rect.top = TopRect;
+ Rect.right = RightRect;
+ Rect.bottom = BottomRect;
+
+ IntLPtoDP(dc, (LPPOINT)&Rect, 2);
+
+ prgnNew = IntSysCreateRectpRgnIndirect(&Rect);
+ if (!prgnNew)
+ {
+ Result = ERROR;
+ }
+ else
+ {
+ if (!dc->dclevel.prgnClip)
+ {
+ dc->dclevel.prgnClip = IntSysCreateRectpRgn(0, 0, 0, 0);
+ IntGdiCombineRgn(dc->dclevel.prgnClip, dc->prgnVis, prgnNew,
RGN_DIFF);
+ Result = SIMPLEREGION;
+ }
+ else
+ {
+ Result = IntGdiCombineRgn(dc->dclevel.prgnClip, dc->dclevel.prgnClip,
prgnNew, RGN_DIFF);
+ }
+ REGION_Delete(prgnNew);
+ }
+ if (Result != ERROR)
+ dc->fs |= DC_FLAG_DIRTY_RAO;
+
+ DC_UnlockDc(dc);
+
+ return Result;
}
int APIENTRY NtGdiIntersectClipRect(HDC hDC,
@@ -320,200 +250,191 @@
int RightRect,
int BottomRect)
{
- INT Result;
- RECTL Rect;
- HRGN NewRgn;
- PDC dc = DC_LockDc(hDC);
-
- DPRINT("NtGdiIntersectClipRect(%p, %d,%d-%d,%d)\n",
- hDC, LeftRect, TopRect, RightRect, BottomRect);
-
- if (!dc)
- {
- EngSetLastError(ERROR_INVALID_HANDLE);
- return ERROR;
- }
-
- Rect.left = LeftRect;
- Rect.top = TopRect;
- Rect.right = RightRect;
- Rect.bottom = BottomRect;
-
- IntLPtoDP(dc, (LPPOINT)&Rect, 2);
-
- NewRgn = IntSysCreateRectRgnIndirect(&Rect);
- if (!NewRgn)
- {
- Result = ERROR;
- }
- else if (!dc->rosdc.hClipRgn)
- {
- dc->rosdc.hClipRgn = NewRgn;
- Result = SIMPLEREGION;
- }
- else
- {
- Result = NtGdiCombineRgn(dc->rosdc.hClipRgn, dc->rosdc.hClipRgn, NewRgn,
RGN_AND);
- GreDeleteObject(NewRgn);
- }
- if (Result != ERROR)
- CLIPPING_UpdateGCRegion(dc);
-
- DC_UnlockDc(dc);
-
- return Result;
+ INT Result;
+ RECTL Rect;
+ PREGION pNewRgn;
+ PDC dc = DC_LockDc(hDC);
+
+ DPRINT("NtGdiIntersectClipRect(%p, %d,%d-%d,%d)\n",
+ hDC, LeftRect, TopRect, RightRect, BottomRect);
+
+ if (!dc)
+ {
+ EngSetLastError(ERROR_INVALID_HANDLE);
+ return ERROR;
+ }
+
+ Rect.left = LeftRect;
+ Rect.top = TopRect;
+ Rect.right = RightRect;
+ Rect.bottom = BottomRect;
+
+ IntLPtoDP(dc, (LPPOINT)&Rect, 2);
+
+ pNewRgn = IntSysCreateRectpRgnIndirect(&Rect);
+ if (!pNewRgn)
+ {
+ Result = ERROR;
+ }
+ else if (!dc->dclevel.prgnClip)
+ {
+ dc->dclevel.prgnClip = pNewRgn;
+ Result = SIMPLEREGION;
+ }
+ else
+ {
+ Result = IntGdiCombineRgn(dc->dclevel.prgnClip, dc->dclevel.prgnClip,
pNewRgn, RGN_AND);
+ REGION_Delete(pNewRgn);
+ }
+ if (Result != ERROR)
+ dc->fs |= DC_FLAG_DIRTY_RAO;
+
+ DC_UnlockDc(dc);
+
+ return Result;
}
int APIENTRY NtGdiOffsetClipRgn(HDC hDC,
int XOffset,
int YOffset)
{
- INT Result;
- DC *dc;
-
- if(!(dc = DC_LockDc(hDC)))
- {
- EngSetLastError(ERROR_INVALID_HANDLE);
- return ERROR;
- }
-
- if(dc->rosdc.hClipRgn != NULL)
- {
- Result = NtGdiOffsetRgn(dc->rosdc.hClipRgn,
- XOffset,
- YOffset);
- CLIPPING_UpdateGCRegion(dc);
- }
- else
- {
- Result = NULLREGION;
- }
-
- DC_UnlockDc(dc);
- return Result;
+ INT Result;
+ DC *dc;
+
+ if(!(dc = DC_LockDc(hDC)))
+ {
+ EngSetLastError(ERROR_INVALID_HANDLE);
+ return ERROR;
+ }
+
+ if(dc->dclevel.prgnClip != NULL)
+ {
+ Result = IntGdiOffsetRgn(dc->dclevel.prgnClip,
+ XOffset,
+ YOffset);
+ dc->fs |= DC_FLAG_DIRTY_RAO;
+ }
+ else
+ {
+ Result = NULLREGION;
+ }
+
+ DC_UnlockDc(dc);
+ return Result;
}
BOOL APIENTRY NtGdiPtVisible(HDC hDC,
int X,
int Y)
{
- HRGN rgn;
- DC *dc;
-
- if(!(dc = DC_LockDc(hDC)))
- {
- EngSetLastError(ERROR_INVALID_HANDLE);
- return FALSE;
- }
-
- rgn = dc->rosdc.hGCClipRgn;
- DC_UnlockDc(dc);
-
- return (rgn ? NtGdiPtInRegion(rgn, X, Y) : FALSE);
-}
-
-BOOL APIENTRY NtGdiRectVisible(HDC hDC,
- LPRECT UnsafeRect)
-{
- NTSTATUS Status = STATUS_SUCCESS;
- PROSRGNDATA Rgn;
- PDC dc = DC_LockDc(hDC);
- BOOL Result = FALSE;
- RECTL Rect;
-
- if (!dc)
- {
- EngSetLastError(ERROR_INVALID_HANDLE);
- return FALSE;
- }
-
- _SEH2_TRY
- {
- ProbeForRead(UnsafeRect,
+ BOOL ret = FALSE;
+ PDC dc;
+
+ if(!(dc = DC_LockDc(hDC)))
+ {
+ EngSetLastError(ERROR_INVALID_HANDLE);
+ return FALSE;
+ }
+
+ if (dc->prgnRao)
+ {
+ POINT pt = {X, Y};
+ IntLPtoDP(dc, &pt, 1);
+ ret = REGION_PtInRegion(dc->prgnRao, pt.x, pt.y);
+ }
+
+ DC_UnlockDc(dc);
+
+ return ret;
+}
+
+BOOL
+APIENTRY
+NtGdiRectVisible(
+ HDC hDC,
+ LPRECT UnsafeRect)
+{
+ NTSTATUS Status = STATUS_SUCCESS;
+ PDC dc = DC_LockDc(hDC);
+ BOOL Result = FALSE;
+ RECTL Rect;
+
+ if (!dc)
+ {
+ EngSetLastError(ERROR_INVALID_HANDLE);
+ return FALSE;
+ }
+
+ _SEH2_TRY
+ {
+ ProbeForRead(UnsafeRect,
sizeof(RECT),
1);
- Rect = *UnsafeRect;
- }
- _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
- {
- Status = _SEH2_GetExceptionCode();
- }
- _SEH2_END;
-
- if(!NT_SUCCESS(Status))
- {
- DC_UnlockDc(dc);
- SetLastNtError(Status);
- return FALSE;
- }
-
- if (dc->rosdc.hGCClipRgn)
- {
- if((Rgn = (PROSRGNDATA)RGNOBJAPI_Lock(dc->rosdc.hGCClipRgn, NULL)))
- {
+ Rect = *UnsafeRect;
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ Status = _SEH2_GetExceptionCode();
+ }
+ _SEH2_END;
+
+ if(!NT_SUCCESS(Status))
+ {
+ DC_UnlockDc(dc);
+ SetLastNtError(Status);
+ return FALSE;
+ }
+
+ if (dc->fs & DC_FLAG_DIRTY_RAO)
+ CLIPPING_UpdateGCRegion(dc);
+
+ if (dc->prgnRao)
+ {
IntLPtoDP(dc, (LPPOINT)&Rect, 2);
- Result = REGION_RectInRegion(Rgn, &Rect);
- RGNOBJAPI_Unlock(Rgn);
- }
- }
- DC_UnlockDc(dc);
-
- return Result;
+ Result = REGION_RectInRegion(dc->prgnRao, &Rect);
+ }
+ DC_UnlockDc(dc);
+
+ return Result;
}
int
FASTCALL
IntGdiSetMetaRgn(PDC pDC)
{
- INT Ret = ERROR;
- PROSRGNDATA TempRgn;
-
- if ( pDC->dclevel.prgnMeta )
- {
- if ( pDC->dclevel.prgnClip )
- {
- TempRgn = IntSysCreateRectpRgn(0,0,0,0);
- if (TempRgn)
- {
- Ret = IntGdiCombineRgn( TempRgn,
- pDC->dclevel.prgnMeta,
- pDC->dclevel.prgnClip,
- RGN_AND);
- if ( Ret )
- {
- GDIOBJ_vDereferenceObject(&pDC->dclevel.prgnMeta->BaseObject);
- if (!((PROSRGNDATA)pDC->dclevel.prgnMeta)->BaseObject.ulShareCount)
- REGION_Delete(pDC->dclevel.prgnMeta);
-
- pDC->dclevel.prgnMeta = TempRgn;
-
- GDIOBJ_vDereferenceObject(&pDC->dclevel.prgnClip->BaseObject);
- if (!((PROSRGNDATA)pDC->dclevel.prgnClip)->BaseObject.ulShareCount)
- REGION_Delete(pDC->dclevel.prgnClip);
-
- pDC->dclevel.prgnClip = NULL;
-
- IntGdiReleaseRaoRgn(pDC);
- }
- else
- REGION_Delete(TempRgn);
- }
- }
- else
- Ret = REGION_Complexity(pDC->dclevel.prgnMeta);
- }
- else
- {
- if ( pDC->dclevel.prgnClip )
- {
- Ret = REGION_Complexity(pDC->dclevel.prgnClip);
- pDC->dclevel.prgnMeta = pDC->dclevel.prgnClip;
- pDC->dclevel.prgnClip = NULL;
- }
- else
- Ret = SIMPLEREGION;
- }
- return Ret;
+ INT Ret = ERROR;
+
+ if ( pDC->dclevel.prgnMeta )
+ {
+ if ( pDC->dclevel.prgnClip )
+ {
+ Ret = IntGdiCombineRgn(pDC->dclevel.prgnMeta, pDC->dclevel.prgnMeta,
pDC->dclevel.prgnClip, RGN_AND);
+ if (Ret != ERROR)
+ {
+ REGION_Delete(pDC->dclevel.prgnClip);
+ pDC->dclevel.prgnClip = NULL;
+ IntGdiReleaseRaoRgn(pDC);
+ }
+ }
+ else
+ Ret = REGION_Complexity(pDC->dclevel.prgnMeta);
+ }
+ else
+ {
+ if ( pDC->dclevel.prgnClip )
+ {
+ Ret = REGION_Complexity(pDC->dclevel.prgnClip);
+ pDC->dclevel.prgnMeta = pDC->dclevel.prgnClip;
+ pDC->dclevel.prgnClip = NULL;
+ }
+ else
+ Ret = SIMPLEREGION;
+ }
+
+ if (Ret != ERROR)
+ pDC->fs |= DC_FLAG_DIRTY_RAO;
+
+ return Ret;
}
@@ -533,88 +454,95 @@
return Ret;
}
-INT FASTCALL
-NEW_CLIPPING_UpdateGCRegion(PDC pDC)
-{
- CLIPOBJ * co;
-
- /* Must have VisRgn set to a valid state! */
- ASSERT (pDC->prgnVis);
-
-// FIXME: this seems to be broken!
-
- if (pDC->prgnAPI)
- {
- REGION_Delete(pDC->prgnAPI);
- pDC->prgnAPI = IntSysCreateRectpRgn(0,0,0,0);
- }
-
- if (pDC->prgnRao)
- {
- REGION_Delete(pDC->prgnRao);
- pDC->prgnRao = IntSysCreateRectpRgn(0,0,0,0);
- }
-
- if (!pDC->prgnRao)
- {
- return ERROR;
- }
-
- if (pDC->dclevel.prgnMeta && pDC->dclevel.prgnClip)
- {
- IntGdiCombineRgn( pDC->prgnAPI,
- pDC->dclevel.prgnClip,
- pDC->dclevel.prgnMeta,
- RGN_AND);
- }
- else
- {
- if (pDC->dclevel.prgnClip)
- {
- IntGdiCombineRgn( pDC->prgnAPI,
- pDC->dclevel.prgnClip,
- NULL,
- RGN_COPY);
- }
- else if (pDC->dclevel.prgnMeta)
- {
- IntGdiCombineRgn( pDC->prgnAPI,
- pDC->dclevel.prgnMeta,
- NULL,
- RGN_COPY);
- }
- }
-
- IntGdiCombineRgn( pDC->prgnRao,
- pDC->prgnVis,
- pDC->prgnAPI,
- RGN_AND);
-
- RtlCopyMemory(&pDC->erclClip,
+VOID
+FASTCALL
+CLIPPING_UpdateGCRegion(PDC pDC)
+{
+ CLIPOBJ * co;
+
+ /* Must have VisRgn set to a valid state! */
+ ASSERT (pDC->prgnVis);
+
+ if (pDC->prgnAPI)
+ {
+ REGION_Delete(pDC->prgnAPI);
+ pDC->prgnAPI = NULL;
+ }
+
+ if (pDC->prgnRao)
+ REGION_Delete(pDC->prgnRao);
+
+ pDC->prgnRao = IntSysCreateRectpRgn(0,0,0,0);
+
+ ASSERT(pDC->prgnRao);
+
+ if (pDC->dclevel.prgnMeta || pDC->dclevel.prgnClip)
+ {
+ pDC->prgnAPI = IntSysCreateRectpRgn(0,0,0,0);
+ if (!pDC->dclevel.prgnMeta)
+ {
+ IntGdiCombineRgn(pDC->prgnAPI,
+ pDC->dclevel.prgnClip,
+ NULL,
+ RGN_COPY);
+ }
+ else if (!pDC->dclevel.prgnClip)
+ {
+ IntGdiCombineRgn(pDC->prgnAPI,
+ pDC->dclevel.prgnMeta,
+ NULL,
+ RGN_COPY);
+ }
+ else
+ {
+ IntGdiCombineRgn(pDC->prgnAPI,
+ pDC->dclevel.prgnClip,
+ pDC->dclevel.prgnMeta,
+ RGN_AND);
+ }
+ }
+
+ if (pDC->prgnAPI)
+ {
+ IntGdiCombineRgn(pDC->prgnRao,
+ pDC->prgnVis,
+ pDC->prgnAPI,
+ RGN_AND);
+ }
+ else
+ {
+ IntGdiCombineRgn(pDC->prgnRao,
+ pDC->prgnVis,
+ NULL,
+ RGN_COPY);
+ }
+
+
+ IntGdiOffsetRgn(pDC->prgnRao, pDC->ptlDCOrig.x, pDC->ptlDCOrig.y);
+
+ RtlCopyMemory(&pDC->erclClip,
&pDC->prgnRao->rdh.rcBound,
sizeof(RECTL));
- pDC->fs &= ~DC_FLAG_DIRTY_RAO;
-
- IntGdiOffsetRgn(pDC->prgnRao, pDC->ptlDCOrig.x, pDC->ptlDCOrig.y);
-
- // pDC->co should be used. Example, CLIPOBJ_cEnumStart uses XCLIPOBJ to build
- // the rects from region objects rects in pClipRgn->Buffer.
- // With pDC->co.pClipRgn->Buffer,
- // pDC->co.pClipRgn = pDC->prgnRao ? pDC->prgnRao : pDC->prgnVis;
-
- co = IntEngCreateClipRegion(pDC->prgnRao->rdh.nCount,
- pDC->prgnRao->Buffer,
- &pDC->erclClip);
- if (co)
- {
- if (pDC->rosdc.CombinedClip != NULL)
- IntEngDeleteClipRegion(pDC->rosdc.CombinedClip);
-
- pDC->rosdc.CombinedClip = co;
- }
-
- return IntGdiOffsetRgn(pDC->prgnRao, -pDC->ptlDCOrig.x, -pDC->ptlDCOrig.y);
+ pDC->fs &= ~DC_FLAG_DIRTY_RAO;
+
+ // pDC->co should be used. Example, CLIPOBJ_cEnumStart uses XCLIPOBJ to build
+ // the rects from region objects rects in pClipRgn->Buffer.
+ // With pDC->co.pClipRgn->Buffer,
+ // pDC->co.pClipRgn = pDC->prgnRao ? pDC->prgnRao : pDC->prgnVis;
+
+ co = IntEngCreateClipRegion(pDC->prgnRao->rdh.nCount,
+ pDC->prgnRao->Buffer,
+ &pDC->erclClip);
+ if (co)
+ {
+ if (pDC->rosdc.CombinedClip != NULL)
+ IntEngDeleteClipRegion(pDC->rosdc.CombinedClip);
+
+ pDC->rosdc.CombinedClip = co;
+ }
+
+ IntGdiOffsetRgn(pDC->prgnRao, -pDC->ptlDCOrig.x, -pDC->ptlDCOrig.y);
}
/* EOF */
Modified: trunk/reactos/win32ss/gdi/ntgdi/cliprgn.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/cliprgn.…
==============================================================================
--- trunk/reactos/win32ss/gdi/ntgdi/cliprgn.h [iso-8859-1] (original)
+++ trunk/reactos/win32ss/gdi/ntgdi/cliprgn.h [iso-8859-1] Wed Jul 23 16:05:47 2014
@@ -1,6 +1,6 @@
#pragma once
INT FASTCALL GdiGetClipBox(HDC hDC, RECTL *rc);
-INT FASTCALL GdiSelectVisRgn(HDC hdc, HRGN hrgn);
-INT FASTCALL GdiExtSelectClipRgn (PDC dc, HRGN hrgn, int fnMode);
-int FASTCALL CLIPPING_UpdateGCRegion(DC* Dc);
+VOID FASTCALL GdiSelectVisRgn(HDC hdc, PREGION prgn);
+INT FASTCALL IntGdiExtSelectClipRgn (PDC dc, PREGION prgn, int fnMode);
+VOID FASTCALL CLIPPING_UpdateGCRegion(DC* Dc);
Modified: trunk/reactos/win32ss/gdi/ntgdi/dc.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/dc.h?rev…
==============================================================================
--- trunk/reactos/win32ss/gdi/ntgdi/dc.h [iso-8859-1] (original)
+++ trunk/reactos/win32ss/gdi/ntgdi/dc.h [iso-8859-1] Wed Jul 23 16:05:47 2014
@@ -48,9 +48,6 @@
typedef struct _ROS_DC_INFO
{
- HRGN hClipRgn; /* Clip region (may be 0) */
- HRGN hGCClipRgn; /* GC clip region (ClipRgn AND VisRgn) */
-
CLIPOBJ *CombinedClip;
} ROS_DC_INFO;
@@ -199,9 +196,9 @@
BOOL FASTCALL DC_InvertXform(const XFORM *xformSrc, XFORM *xformDest);
VOID FASTCALL DC_vUpdateViewportExt(PDC pdc);
-VOID FASTCALL DC_vCopyState(PDC pdcSrc, PDC pdcDst, BOOL to);
+VOID FASTCALL DC_vCopyState(PDC pdcSrc, PDC pdcDst, BOOL To);
VOID FASTCALL DC_vFinishBlit(PDC pdc1, PDC pdc2);
-VOID FASTCALL DC_vPrepareDCsForBlit(PDC pdc1, RECT rc1, PDC pdc2, RECT rc2);
+VOID FASTCALL DC_vPrepareDCsForBlit(PDC pdcDest, const RECT* rcDest, PDC pdcSrc, const
RECT* rcSrc);
VOID NTAPI DC_vRestoreDC(IN PDC pdc, INT iSaveLevel);
Modified: trunk/reactos/win32ss/gdi/ntgdi/dclife.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/dclife.c…
==============================================================================
--- trunk/reactos/win32ss/gdi/ntgdi/dclife.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/gdi/ntgdi/dclife.c [iso-8859-1] Wed Jul 23 16:05:47 2014
@@ -95,22 +95,11 @@
void
DC_InitHack(PDC pdc)
{
- HRGN hVisRgn;
-
TextIntRealizeFont(pdc->pdcattr->hlfntNew,NULL);
pdc->pdcattr->iCS_CP = ftGdiGetTextCharsetInfo(pdc,NULL,0);
/* This should never fail */
ASSERT(pdc->dclevel.ppal);
-
- /* Select regions */
- pdc->rosdc.hClipRgn = NULL;
- pdc->rosdc.hGCClipRgn = NULL;
-
- hVisRgn = IntSysCreateRectRgn(0, 0, 1, 1);
- ASSERT(hVisRgn);
- GdiSelectVisRgn(pdc->BaseObject.hHmgr, hVisRgn);
- GreDeleteObject(hVisRgn);
}
VOID
@@ -170,7 +159,7 @@
pdc->erclBoundsApp.right = 0x00007ffc; // FIXME
pdc->erclBoundsApp.bottom = 0x00000333; // FIXME
pdc->erclClip = pdc->erclBounds;
-// pdc->co
+ pdc->co = gxcoTrivial;
pdc->fs |= DC_SYNCHRONIZEACCESS | DC_ACCUM_APP | DC_PERMANANT | DC_DISPLAY;
}
@@ -185,7 +174,7 @@
pdc->erclBounds.bottom = 0;
pdc->erclBoundsApp = pdc->erclBounds;
pdc->erclClip = pdc->erclWindow;
- //pdc->co = NULL
+ pdc->co = gxcoTrivial;
}
//pdc->dcattr.VisRectRegion:
@@ -237,6 +226,8 @@
/* Setup regions */
pdc->prgnAPI = NULL;
pdc->prgnRao = NULL;
+ pdc->dclevel.prgnClip = NULL;
+ pdc->dclevel.prgnMeta = NULL;
/* Allocate a Vis region */
pdc->prgnVis = IntSysCreateRectpRgn(0, 0, pdc->dclevel.sizl.cx,
pdc->dclevel.sizl.cy);
ASSERT(pdc->prgnVis);
@@ -372,17 +363,17 @@
LFONT_ShareUnlockFont(pdc->dclevel.plfnt);
/* Free regions */
- if (pdc->rosdc.hClipRgn && GreIsHandleValid(pdc->rosdc.hClipRgn))
- GreDeleteObject(pdc->rosdc.hClipRgn);
+ if (pdc->dclevel.prgnClip)
+ REGION_Delete(pdc->dclevel.prgnClip);
+ if (pdc->dclevel.prgnMeta)
+ REGION_Delete(pdc->dclevel.prgnMeta);
if (pdc->prgnVis)
- {
REGION_Delete(pdc->prgnVis);
- }
- if (pdc->rosdc.hGCClipRgn && GreIsHandleValid(pdc->rosdc.hGCClipRgn))
- {
- GreDeleteObject(pdc->rosdc.hGCClipRgn);
- }
- if (NULL != pdc->rosdc.CombinedClip)
+ if (pdc->prgnRao)
+ REGION_Delete(pdc->prgnRao);
+ if (pdc->prgnAPI)
+ REGION_Delete(pdc->prgnAPI);
+ if (pdc->rosdc.CombinedClip)
IntEngDeleteClipRegion(pdc->rosdc.CombinedClip);
PATH_Delete(pdc->dclevel.hPath);
@@ -397,17 +388,6 @@
NTAPI
DC_vSetOwner(PDC pdc, ULONG ulOwner)
{
-
- if (pdc->rosdc.hClipRgn)
- {
- IntGdiSetRegionOwner(pdc->rosdc.hClipRgn, ulOwner);
- }
-
- if (pdc->rosdc.hGCClipRgn)
- {
- IntGdiSetRegionOwner(pdc->rosdc.hGCClipRgn, ulOwner);
- }
-
if (pdc->dclevel.hPath)
{
GreSetObjectOwner(pdc->dclevel.hPath, ulOwner);
@@ -466,7 +446,7 @@
void
DC_vUpdateDC(PDC pdc)
{
- HRGN hVisRgn ;
+ // PREGION VisRgn ;
PPDEVOBJ ppdev = pdc->ppdev ;
pdc->dhpdev = ppdev->dhpdev;
@@ -475,10 +455,12 @@
pdc->dclevel.pSurface = PDEVOBJ_pSurface(ppdev);
PDEVOBJ_sizl(pdc->ppdev, &pdc->dclevel.sizl);
- hVisRgn = NtGdiCreateRectRgn(0, 0, pdc->dclevel.sizl.cx,
pdc->dclevel.sizl.cy);
- ASSERT(hVisRgn);
- GdiSelectVisRgn(pdc->BaseObject.hHmgr, hVisRgn);
- GreDeleteObject(hVisRgn);
+#if 0
+ VisRgn = IntSysCreateRectpRgn(0, 0, pdc->dclevel.sizl.cx,
pdc->dclevel.sizl.cy);
+ ASSERT(VisRgn);
+ GdiSelectVisRgn(pdc->BaseObject.hHmgr, VisRgn);
+ REGION_Delete(VisRgn);
+#endif
pdc->flGraphicsCaps = ppdev->devinfo.flGraphicsCaps;
pdc->flGraphicsCaps2 = ppdev->devinfo.flGraphicsCaps2;
@@ -492,75 +474,106 @@
* from where we take pixels. */
VOID
FASTCALL
-DC_vPrepareDCsForBlit(PDC pdc1,
- RECT rc1,
- PDC pdc2,
- RECT rc2)
+DC_vPrepareDCsForBlit(
+ PDC pdcDest,
+ const RECT* rcDest,
+ PDC pdcSrc,
+ const RECT* rcSrc)
{
PDC pdcFirst, pdcSecond;
- PRECT prcFirst, prcSecond;
+ const RECT *prcFirst, *prcSecond;
/* Update brushes */
- if (pdc1->pdcattr->ulDirty_ & (DIRTY_FILL | DC_BRUSH_DIRTY))
- DC_vUpdateFillBrush(pdc1);
- if (pdc1->pdcattr->ulDirty_ & (DIRTY_LINE | DC_PEN_DIRTY))
- DC_vUpdateLineBrush(pdc1);
- if(pdc1->pdcattr->ulDirty_ & DIRTY_TEXT)
- DC_vUpdateTextBrush(pdc1);
+ if (pdcDest->pdcattr->ulDirty_ & (DIRTY_FILL | DC_BRUSH_DIRTY))
+ DC_vUpdateFillBrush(pdcDest);
+ if (pdcDest->pdcattr->ulDirty_ & (DIRTY_LINE | DC_PEN_DIRTY))
+ DC_vUpdateLineBrush(pdcDest);
+ if(pdcDest->pdcattr->ulDirty_ & DIRTY_TEXT)
+ DC_vUpdateTextBrush(pdcDest);
/* Lock them in good order */
- if(pdc2)
- {
- if((ULONG_PTR)pdc1->ppdev->hsemDevLock >=
(ULONG_PTR)pdc2->ppdev->hsemDevLock)
- {
- pdcFirst = pdc1;
- prcFirst = &rc1;
- pdcSecond = pdc2;
- prcSecond = &rc2;
+ if(pdcSrc)
+ {
+ if((ULONG_PTR)pdcDest->ppdev->hsemDevLock >=
(ULONG_PTR)pdcSrc->ppdev->hsemDevLock)
+ {
+ pdcFirst = pdcDest;
+ prcFirst = rcDest;
+ pdcSecond = pdcSrc;
+ prcSecond = rcSrc;
}
else
{
- pdcFirst = pdc2;
- prcFirst = &rc2;
- pdcSecond = pdc1;
- prcSecond = &rc1;
+ pdcFirst = pdcSrc;
+ prcFirst = rcSrc;
+ pdcSecond = pdcDest;
+ prcSecond = rcDest;
}
}
else
{
- pdcFirst = pdc1 ;
- prcFirst = &rc1;
+ pdcFirst = pdcDest ;
+ prcFirst = rcDest;
pdcSecond = NULL;
prcSecond = NULL;
}
- if(pdcFirst && pdcFirst->dctype == DCTYPE_DIRECT)
+ /* Update clipping of dest DC if needed */
+ if (pdcDest->dctype == DCTYPE_DIRECT)
+ {
+ DCE* dce = DceGetDceFromDC(pdcDest->BaseObject.hHmgr);
+ if (dce)
+ DceUpdateVisRgn(dce, dce->pwndOrg, dce->DCXFlags);
+ }
+
+ if (pdcDest->fs & DC_FLAG_DIRTY_RAO)
+ CLIPPING_UpdateGCRegion(pdcDest);
+
+ /* Lock and update first DC */
+ if(pdcFirst->dctype == DCTYPE_DIRECT)
{
EngAcquireSemaphore(pdcFirst->ppdev->hsemDevLock);
- MouseSafetyOnDrawStart(pdcFirst->ppdev,
- prcFirst->left,
- prcFirst->top,
- prcFirst->right,
- prcFirst->bottom) ;
/* Update surface if needed */
if(pdcFirst->ppdev->pSurface != pdcFirst->dclevel.pSurface)
{
DC_vUpdateDC(pdcFirst);
}
}
- if(pdcSecond && pdcSecond->dctype == DCTYPE_DIRECT)
+
+ if(pdcFirst->dctype == DCTYPE_DIRECT)
+ {
+ if (!prcFirst)
+ prcFirst = &pdcFirst->erclClip;
+
+ MouseSafetyOnDrawStart(pdcFirst->ppdev,
+ prcFirst->left,
+ prcFirst->top,
+ prcFirst->right,
+ prcFirst->bottom) ;
+ }
+
+ if (!pdcSecond)
+ return;
+
+ /* Lock and update second DC */
+ if(pdcSecond->dctype == DCTYPE_DIRECT)
{
EngAcquireSemaphore(pdcSecond->ppdev->hsemDevLock);
- MouseSafetyOnDrawStart(pdcSecond->ppdev,
- prcSecond->left,
- prcSecond->top,
- prcSecond->right,
- prcSecond->bottom) ;
/* Update surface if needed */
if(pdcSecond->ppdev->pSurface != pdcSecond->dclevel.pSurface)
{
DC_vUpdateDC(pdcSecond);
}
+ }
+
+ if(pdcSecond->dctype == DCTYPE_DIRECT)
+ {
+ if (!prcSecond)
+ prcSecond = &pdcSecond->erclClip;
+ MouseSafetyOnDrawStart(pdcSecond->ppdev,
+ prcSecond->left,
+ prcSecond->top,
+ prcSecond->right,
+ prcSecond->bottom) ;
}
}
Modified: trunk/reactos/win32ss/gdi/ntgdi/dcobjs.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/dcobjs.c…
==============================================================================
--- trunk/reactos/win32ss/gdi/ntgdi/dcobjs.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/gdi/ntgdi/dcobjs.c [iso-8859-1] Wed Jul 23 16:05:47 2014
@@ -330,7 +330,7 @@
PDC pdc;
HBITMAP hbmpOld;
PSURFACE psurfNew, psurfOld;
- HRGN hVisRgn;
+ PREGION VisRgn;
HDC hdcOld;
ULONG cBitsPixel;
ASSERT_NOGDILOCKS();
@@ -452,15 +452,15 @@
pdc->pdcattr->ulDirty_ |= DIRTY_FILL | DIRTY_LINE;
/* FIXME: Improve by using a region without a handle and selecting it */
- hVisRgn = IntSysCreateRectRgn( 0,
+ VisRgn = IntSysCreateRectpRgn( 0,
0,
pdc->dclevel.sizl.cx,
pdc->dclevel.sizl.cy);
- if (hVisRgn)
- {
- GdiSelectVisRgn(hdc, hVisRgn);
- GreDeleteObject(hVisRgn);
+ if (VisRgn)
+ {
+ GdiSelectVisRgn(hdc, VisRgn);
+ REGION_Delete(VisRgn);
}
/* Unlock the DC */
@@ -509,7 +509,10 @@
/* Construct a region from the path */
else if (PATH_PathToRegion(pPath, pdcattr->jFillMode, &hrgnPath))
{
- success = GdiExtSelectClipRgn(pdc, hrgnPath, Mode) != ERROR;
+ PREGION prgnPath = REGION_LockRgn(hrgnPath);
+ ASSERT(prgnPath);
+ success = IntGdiExtSelectClipRgn(pdc, prgnPath, Mode) != ERROR;
+ REGION_UnlockRgn(prgnPath);
GreDeleteObject( hrgnPath );
/* Empty the path */
@@ -693,9 +696,7 @@
{
INT ret = 0;
PDC pdc;
- HRGN hrgnSrc = NULL;
PREGION prgnSrc = NULL;
- POINTL ptlOrg;
pdc = DC_LockDc(hdc);
if (!pdc)
@@ -707,8 +708,7 @@
switch (iCode)
{
case CLIPRGN:
- hrgnSrc = pdc->rosdc.hClipRgn;
-// if (pdc->dclevel.prgnClip) prgnSrc = pdc->dclevel.prgnClip;
+ prgnSrc = pdc->dclevel.prgnClip;
break;
case METARGN:
@@ -716,14 +716,15 @@
break;
case APIRGN:
+ if (pdc->fs & DC_FLAG_DIRTY_RAO)
+ CLIPPING_UpdateGCRegion(pdc);
if (pdc->prgnAPI)
{
prgnSrc = pdc->prgnAPI;
}
-// else if (pdc->dclevel.prgnClip) prgnSrc = pdc->dclevel.prgnClip;
- else if (pdc->rosdc.hClipRgn)
+ else if (pdc->dclevel.prgnClip)
{
- hrgnSrc = pdc->rosdc.hClipRgn;
+ prgnSrc = pdc->dclevel.prgnClip;
}
else if (pdc->dclevel.prgnMeta)
{
@@ -739,26 +740,18 @@
break;
}
- if (hrgnSrc)
- {
- ret = NtGdiCombineRgn(hrgnDest, hrgnSrc, 0, RGN_COPY) == ERROR ? -1 : 1;
- }
- else if (prgnSrc)
+ if (prgnSrc)
{
PREGION prgnDest = REGION_LockRgn(hrgnDest);
if (prgnDest)
{
ret = IntGdiCombineRgn(prgnDest, prgnSrc, 0, RGN_COPY) == ERROR ? -1 : 1;
+ if ((ret == 1) && (iCode == SYSRGN))
+ IntGdiOffsetRgn(prgnDest, pdc->ptlDCOrig.x, pdc->ptlDCOrig.y);
REGION_UnlockRgn(prgnDest);
}
else
ret = -1;
- }
-
- if (iCode == SYSRGN)
- {
- ptlOrg = pdc->ptlDCOrig;
- NtGdiOffsetRgn(hrgnDest, ptlOrg.x, ptlOrg.y );
}
DC_UnlockDc(pdc);
Modified: trunk/reactos/win32ss/gdi/ntgdi/dcstate.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/dcstate.…
==============================================================================
--- trunk/reactos/win32ss/gdi/ntgdi/dcstate.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/gdi/ntgdi/dcstate.c [iso-8859-1] Wed Jul 23 16:05:47 2014
@@ -51,23 +51,26 @@
pdcDst->dclevel.plfnt = pdcSrc->dclevel.plfnt;
/* Get/SetDCState() don't change hVisRgn field ("Undoc. Windows"
p.559). */
- if (To) // Copy "To" SaveDC state.
- {
- if (pdcSrc->rosdc.hClipRgn)
- {
- pdcDst->rosdc.hClipRgn = IntSysCreateRectRgn(0, 0, 0, 0);
- NtGdiCombineRgn(pdcDst->rosdc.hClipRgn, pdcSrc->rosdc.hClipRgn, 0,
RGN_COPY);
- }
- // FIXME: Handle prgnMeta!
- }
- else // Copy "!To" RestoreDC state.
- { /* The VisRectRegion field needs to be set to a valid state */
- GdiExtSelectClipRgn(pdcDst, pdcSrc->rosdc.hClipRgn, RGN_COPY);
- }
-}
-
-
-BOOL FASTCALL
+ if (!To)
+ {
+ IntGdiExtSelectClipRgn(pdcDst, pdcSrc->dclevel.prgnClip, RGN_COPY);
+ if (pdcDst->dclevel.prgnMeta)
+ {
+ REGION_Delete(pdcDst->dclevel.prgnMeta);
+ pdcDst->dclevel.prgnMeta = NULL;
+ }
+ if (pdcSrc->dclevel.prgnMeta)
+ {
+ pdcDst->dclevel.prgnMeta = IntSysCreateRectpRgn(0, 0, 0, 0);
+ IntGdiCombineRgn(pdcDst->dclevel.prgnMeta, pdcSrc->dclevel.prgnMeta,
NULL, RGN_COPY);
+ }
+ pdcDst->fs |= DC_FLAG_DIRTY_RAO;
+ }
+}
+
+
+BOOL
+FASTCALL
IntGdiCleanDC(HDC hDC)
{
PDC dc;
@@ -87,6 +90,16 @@
DC_vUpdateTextBrush(dc);
}
+ /* DC_vCopyState frees the Clip rgn and the Meta rgn. Take care of the other ones
+ * There is no need to clear prgnVis, as UserGetDC updates it immediately. */
+ if (dc->prgnRao)
+ REGION_Delete(dc->prgnRao);
+ if (dc->prgnAPI)
+ REGION_Delete(dc->prgnAPI);
+ dc->prgnRao = dc->prgnAPI = NULL;
+
+ dc->fs |= DC_FLAG_DIRTY_RAO;
+
DC_UnlockDc(dc);
return TRUE;
@@ -272,7 +285,7 @@
GDIOBJ_vSetObjectOwner(&pdcSave->BaseObject, GDI_OBJ_HMGR_PUBLIC);
/* Copy the current state */
- DC_vCopyState(pdc, pdcSave, TRUE);
+ DC_vCopyState(pdc, pdcSave, FALSE);
/* Only memory DC's change their surface */
if (pdc->dctype == DCTYPE_MEMORY)
Modified: trunk/reactos/win32ss/gdi/ntgdi/dcutil.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/dcutil.c…
==============================================================================
--- trunk/reactos/win32ss/gdi/ntgdi/dcutil.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/gdi/ntgdi/dcutil.c [iso-8859-1] Wed Jul 23 16:05:47 2014
@@ -367,7 +367,7 @@
}
else if (Flags & DCHF_VALIDATEVISRGN || 0 == Flags)
{
- dc->fs &= ~DC_FLAG_DIRTY_RAO;
+ //dc->fs &= ~DC_FLAG_DIRTY_RAO;
}
DC_UnlockDc(dc);
Modified: trunk/reactos/win32ss/gdi/ntgdi/dibobj.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/dibobj.c…
==============================================================================
--- trunk/reactos/win32ss/gdi/ntgdi/dibobj.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/gdi/ntgdi/dibobj.c [iso-8859-1] Wed Jul 23 16:05:47 2014
@@ -502,7 +502,7 @@
}
/* This is actually a blit */
- DC_vPrepareDCsForBlit(pDC, rcDest, NULL, rcDest);
+ DC_vPrepareDCsForBlit(pDC, &rcDest, NULL, NULL);
pSurf = pDC->dclevel.pSurface;
if (!pSurf)
{
@@ -1184,7 +1184,7 @@
}
/* Prepare DC for blit */
- DC_vPrepareDCsForBlit(pdc, rcDst, NULL, rcSrc);
+ DC_vPrepareDCsForBlit(pdc, &rcDst, NULL, NULL);
psurfDst = pdc->dclevel.pSurface;
Modified: trunk/reactos/win32ss/gdi/ntgdi/fillshap.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/fillshap…
==============================================================================
--- trunk/reactos/win32ss/gdi/ntgdi/fillshap.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/gdi/ntgdi/fillshap.c [iso-8859-1] Wed Jul 23 16:05:47 2014
@@ -307,7 +307,7 @@
tmpFillBrushObj.ptOrigin.x += dc->ptlDCOrig.x;
tmpFillBrushObj.ptOrigin.y += dc->ptlDCOrig.y;
- DC_vPrepareDCsForBlit(dc, RectBounds, NULL, RectBounds);
+ DC_vPrepareDCsForBlit(dc, &RectBounds, NULL, NULL);
ret = IntFillEllipse( dc,
CenterX - RadiusX,
@@ -480,8 +480,7 @@
return TRUE;
}
- DC_vPrepareDCsForBlit(dc, dc->rosdc.CombinedClip->rclBounds,
- NULL, dc->rosdc.CombinedClip->rclBounds);
+ DC_vPrepareDCsForBlit(dc, NULL, NULL, NULL);
if (dc->pdcattr->ulDirty_ & (DIRTY_FILL | DC_BRUSH_DIRTY))
DC_vUpdateFillBrush(dc);
@@ -567,7 +566,7 @@
DestRect.bottom--;
}
- DC_vPrepareDCsForBlit(dc, DestRect, NULL, DestRect);
+ DC_vPrepareDCsForBlit(dc, &DestRect, NULL, NULL);
if (pdcattr->ulDirty_ & (DIRTY_FILL | DC_BRUSH_DIRTY))
DC_vUpdateFillBrush(dc);
@@ -796,7 +795,7 @@
else
{
- DC_vPrepareDCsForBlit(dc, RectBounds, NULL, RectBounds);
+ DC_vPrepareDCsForBlit(dc, &RectBounds, NULL, NULL);
RtlCopyMemory(&brushTemp, pbrFill, sizeof(brushTemp));
brushTemp.ptOrigin.x += RectBounds.left - Left;
@@ -962,9 +961,9 @@
EXLATEOBJ_vInitialize(&exlo, &gpalRGB, psurf->ppal, 0, 0, 0);
+ DC_vPrepareDCsForBlit(pdc, &rclExtent, NULL, NULL);
+
ASSERT(pdc->rosdc.CombinedClip);
-
- DC_vPrepareDCsForBlit(pdc, rclExtent, NULL, rclExtent);
bRet = IntEngGradientFill(&psurf->SurfObj,
pdc->rosdc.CombinedClip,
@@ -1091,6 +1090,13 @@
return TRUE;
}
+ psurf = dc->dclevel.pSurface;
+ if (!psurf)
+ {
+ Ret = FALSE;
+ goto cleanup;
+ }
+
pdcattr = dc->pdcattr;
if (pdcattr->ulDirty_ & (DIRTY_FILL | DC_BRUSH_DIRTY))
@@ -1103,20 +1109,18 @@
Pt.y = YStart;
IntLPtoDP(dc, (LPPOINT)&Pt, 1);
- Ret = NtGdiPtInRegion(dc->rosdc.hGCClipRgn, Pt.x, Pt.y);
- if (Ret)
- IntGdiGetRgnBox(dc->rosdc.hGCClipRgn,(LPRECT)&DestRect);
+ if (dc->prgnRao)
+ {
+ Ret = REGION_PtInRegion(dc->prgnRao, Pt.x, Pt.y);
+ if (Ret)
+ REGION_GetRgnBox(dc->prgnRao ,(LPRECT)&DestRect);
+ else
+ goto cleanup;
+ }
else
- goto cleanup;
-
- DC_vPrepareDCsForBlit(dc, DestRect, NULL, DestRect);
-
- psurf = dc->dclevel.pSurface;
- if (!psurf)
- {
- Ret = FALSE;
- goto cleanup;
- }
+ RECTL_vSetRect(&DestRect, 0, psurf->SurfObj.sizlBitmap.cx, 0,
psurf->SurfObj.sizlBitmap.cy);
+
+ DC_vPrepareDCsForBlit(dc, &DestRect, NULL, NULL);
EXLATEOBJ_vInitialize(&exlo, &gpalRGB, psurf->ppal, 0, 0xffffff, 0);
@@ -1127,10 +1131,11 @@
ConvColor = XLATEOBJ_iXlate(&exlo.xlo, Color);
Ret = DIB_XXBPP_FloodFillSolid(&psurf->SurfObj,
&dc->eboFill.BrushObject, &DestRect, &Pt, ConvColor, FillType);
+ DC_vFinishBlit(dc, NULL);
+
EXLATEOBJ_vCleanup(&exlo);
cleanup:
- DC_vFinishBlit(dc, NULL);
DC_UnlockDc(dc);
return Ret;
}
Modified: trunk/reactos/win32ss/gdi/ntgdi/freetype.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/freetype…
==============================================================================
--- trunk/reactos/win32ss/gdi/ntgdi/freetype.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/gdi/ntgdi/freetype.c [iso-8859-1] Wed Jul 23 16:05:47 2014
@@ -3212,7 +3212,7 @@
LONGLONG TextLeft, RealXStart;
ULONG TextTop, previous, BackgroundLeft;
FT_Bool use_kerning;
- RECTL DestRect, MaskRect, DummyRect = {0, 0, 0, 0};
+ RECTL DestRect, MaskRect;
POINTL SourcePoint, BrushOrigin;
HBITMAP HSourceGlyph;
SURFOBJ *SourceGlyphSurf;
@@ -3308,7 +3308,7 @@
DestRect.right += dc->ptlDCOrig.x;
DestRect.bottom += dc->ptlDCOrig.y;
- DC_vPrepareDCsForBlit(dc, DestRect, NULL, DestRect);
+ DC_vPrepareDCsForBlit(dc, &DestRect, NULL, NULL);
if (pdcattr->ulDirty_ & DIRTY_BACKGROUND)
DC_vUpdateBackgroundBrush(dc);
@@ -3502,7 +3502,7 @@
BackgroundLeft = (RealXStart + 32) >> 6;
/* Lock blit with a dummy rect */
- DC_vPrepareDCsForBlit(dc, DummyRect, NULL, DummyRect);
+ DC_vPrepareDCsForBlit(dc, NULL, NULL, NULL);
psurf = dc->dclevel.pSurface ;
if(!psurf) psurf = psurfDefaultBitmap;
Modified: trunk/reactos/win32ss/gdi/ntgdi/line.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/line.c?r…
==============================================================================
--- trunk/reactos/win32ss/gdi/ntgdi/line.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/gdi/ntgdi/line.c [iso-8859-1] Wed Jul 23 16:05:47 2014
@@ -257,8 +257,7 @@
if (PATH_IsPathOpen(dc->dclevel))
return PATH_Polyline(dc, pt, Count);
- DC_vPrepareDCsForBlit(dc, dc->rosdc.CombinedClip->rclBounds,
- NULL, dc->rosdc.CombinedClip->rclBounds);
+ DC_vPrepareDCsForBlit(dc, NULL, NULL, NULL);
if (pdcattr->ulDirty_ & (DIRTY_FILL | DC_BRUSH_DIRTY))
DC_vUpdateFillBrush(dc);
@@ -411,7 +410,7 @@
rcLockRect.right += dc->ptlDCOrig.x;
rcLockRect.bottom += dc->ptlDCOrig.y;
- DC_vPrepareDCsForBlit(dc, rcLockRect, NULL, rcLockRect);
+ DC_vPrepareDCsForBlit(dc, &rcLockRect, NULL, NULL);
if (dc->pdcattr->ulDirty_ & (DIRTY_LINE | DC_PEN_DIRTY))
DC_vUpdateLineBrush(dc);
Modified: trunk/reactos/win32ss/gdi/ntgdi/path.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/path.c?r…
==============================================================================
--- trunk/reactos/win32ss/gdi/ntgdi/path.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/gdi/ntgdi/path.c [iso-8859-1] Wed Jul 23 16:05:47 2014
@@ -2511,8 +2511,7 @@
return FALSE;
}
- DC_vPrepareDCsForBlit(dc, dc->rosdc.CombinedClip->rclBounds,
- NULL, dc->rosdc.CombinedClip->rclBounds);
+ DC_vPrepareDCsForBlit(dc, NULL, NULL, NULL);
pdcattr = dc->pdcattr;
@@ -2777,8 +2776,7 @@
return FALSE;
}
- DC_vPrepareDCsForBlit(pDc, pDc->rosdc.CombinedClip->rclBounds,
- NULL, pDc->rosdc.CombinedClip->rclBounds);
+ DC_vPrepareDCsForBlit(pDc, NULL, NULL, NULL);
pdcattr = pDc->pdcattr;
@@ -2822,8 +2820,7 @@
return FALSE;
}
- DC_vPrepareDCsForBlit(pDc, pDc->rosdc.CombinedClip->rclBounds,
- NULL, pDc->rosdc.CombinedClip->rclBounds);
+ DC_vPrepareDCsForBlit(pDc, NULL, NULL, NULL);
pdcattr = pDc->pdcattr;
Modified: trunk/reactos/win32ss/gdi/ntgdi/region.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/region.c…
==============================================================================
--- trunk/reactos/win32ss/gdi/ntgdi/region.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/gdi/ntgdi/region.c [iso-8859-1] Wed Jul 23 16:05:47 2014
@@ -2300,11 +2300,13 @@
VOID FASTCALL
IntGdiReleaseRaoRgn(PDC pDC)
{
- INT Index = GDI_HANDLE_GET_INDEX(pDC->BaseObject.hHmgr);
- PGDI_TABLE_ENTRY Entry = &GdiHandleTable->Entries[Index];
- pDC->fs |= DC_FLAG_DIRTY_RAO;
- Entry->Flags |= GDI_ENTRY_VALIDATE_VIS;
- RECTL_vSetEmptyRect(&pDC->erclClip);
+ INT Index = GDI_HANDLE_GET_INDEX(pDC->BaseObject.hHmgr);
+ PGDI_TABLE_ENTRY Entry = &GdiHandleTable->Entries[Index];
+ pDC->fs |= DC_FLAG_DIRTY_RAO;
+ Entry->Flags |= GDI_ENTRY_VALIDATE_VIS;
+ RECTL_vSetEmptyRect(&pDC->erclClip);
+ REGION_Delete(pDC->prgnRao);
+ pDC->prgnRao = NULL;
}
VOID FASTCALL
@@ -2503,14 +2505,15 @@
return FALSE;
}
- NtGdiCombineRgn(tmpVisRgn, tmpVisRgn, dc->rosdc.hGCClipRgn, RGN_AND);
-
visrgn = RGNOBJAPI_Lock(tmpVisRgn, NULL);
if (visrgn == NULL)
{
GreDeleteObject(tmpVisRgn);
return FALSE;
}
+
+ if (dc->prgnRao)
+ IntGdiCombineRgn(visrgn, visrgn, dc->prgnRao, RGN_AND);
ClipRegion = IntEngCreateClipRegion(visrgn->rdh.nCount,
visrgn->Buffer,
@@ -2533,6 +2536,29 @@
// Fill the region
return bRet;
+}
+
+BOOL
+FASTCALL
+REGION_PtInRegion(
+ PREGION prgn,
+ INT X,
+ INT Y)
+{
+ ULONG i;
+ PRECT r;
+
+ if (prgn->rdh.nCount > 0 && INRECT(prgn->rdh.rcBound, X, Y))
+ {
+ r = prgn->Buffer;
+ for (i = 0; i < prgn->rdh.nCount; i++)
+ {
+ if (INRECT(r[i], X, Y))
+ return TRUE;
+ }
+ }
+
+ return FALSE;
}
BOOL
@@ -3861,27 +3887,19 @@
INT Y
)
{
- PROSRGNDATA rgn;
- ULONG i;
- PRECTL r;
-
- if (!(rgn = RGNOBJAPI_Lock(hRgn, NULL) ) )
+ PREGION prgn;
+ BOOL ret;
+
+ if (!(prgn = RGNOBJAPI_Lock(hRgn, NULL) ) )
return FALSE;
- if (rgn->rdh.nCount > 0 && INRECT(rgn->rdh.rcBound, X, Y))
- {
- r = rgn->Buffer;
- for (i = 0; i < rgn->rdh.nCount; i++)
- {
- if (INRECT(*r, X, Y))
- {
- RGNOBJAPI_Unlock(rgn);
- return TRUE;
- }
- r++;
- }
- }
- RGNOBJAPI_Unlock(rgn);
+ ret = REGION_PtInRegion(prgn, X, Y);
+
+ RGNOBJAPI_Unlock(prgn);
+ return ret;
+
+
+ RGNOBJAPI_Unlock(prgn);
return FALSE;
}
Modified: trunk/reactos/win32ss/gdi/ntgdi/region.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/region.h…
==============================================================================
--- trunk/reactos/win32ss/gdi/ntgdi/region.h [iso-8859-1] (original)
+++ trunk/reactos/win32ss/gdi/ntgdi/region.h [iso-8859-1] Wed Jul 23 16:05:47 2014
@@ -27,6 +27,7 @@
VOID FASTCALL REGION_UnionRectWithRgn(ROSRGNDATA *rgn, const RECTL *rect);
INT FASTCALL REGION_GetRgnBox(PROSRGNDATA Rgn, RECTL *pRect);
BOOL FASTCALL REGION_RectInRegion(PROSRGNDATA Rgn, const RECTL *rc);
+BOOL FASTCALL REGION_PtInRegion(PREGION, INT, INT);
BOOL FASTCALL REGION_CropAndOffsetRegion(PROSRGNDATA rgnDst, PROSRGNDATA rgnSrc, const
RECTL *rect, const POINT *off);
VOID FASTCALL REGION_SetRectRgn(PROSRGNDATA pRgn, INT LeftRect, INT TopRect, INT
RightRect, INT BottomRect);
VOID NTAPI REGION_vCleanup(PVOID ObjectBody);
Modified: trunk/reactos/win32ss/user/ntuser/cursoricon.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/cursor…
==============================================================================
--- trunk/reactos/win32ss/user/ntuser/cursoricon.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/user/ntuser/cursoricon.c [iso-8859-1] Wed Jul 23 16:05:47 2014
@@ -1287,7 +1287,7 @@
RECTL_vOffsetRect(&rcDest, pdc->ptlDCOrig.x, pdc->ptlDCOrig.y);
/* Prepare the underlying surface */
- DC_vPrepareDCsForBlit(pdc, rcDest, NULL, rcDest);
+ DC_vPrepareDCsForBlit(pdc, &rcDest, NULL, NULL);
/* Get the clip object */
pdcClipObj = pdc->rosdc.CombinedClip;
@@ -1472,7 +1472,7 @@
RECTL_vOffsetRect(&rcDest, pdc->ptlDCOrig.x, pdc->ptlDCOrig.y);
/* Prepare the underlying surface */
- DC_vPrepareDCsForBlit(pdc, rcDest, NULL, rcDest);
+ DC_vPrepareDCsForBlit(pdc, &rcDest, NULL, NULL);
/* Get the clip object */
pdcClipObj = pdc->rosdc.CombinedClip;
Modified: trunk/reactos/win32ss/user/ntuser/cursoricon_new.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/cursor…
==============================================================================
--- trunk/reactos/win32ss/user/ntuser/cursoricon_new.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/user/ntuser/cursoricon_new.c [iso-8859-1] Wed Jul 23 16:05:47
2014
@@ -1195,7 +1195,7 @@
RECTL_vOffsetRect(&rcDest, pdc->ptlDCOrig.x, pdc->ptlDCOrig.y);
/* Prepare the underlying surface */
- DC_vPrepareDCsForBlit(pdc, rcDest, NULL, rcDest);
+ DC_vPrepareDCsForBlit(pdc, &rcDest, NULL, NULL);
/* We now have our destination surface and rectangle */
psurfDest = pdc->dclevel.pSurface;
Modified: trunk/reactos/win32ss/user/ntuser/dce.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/dce.h?…
==============================================================================
--- trunk/reactos/win32ss/user/ntuser/dce.h [iso-8859-1] (original)
+++ trunk/reactos/win32ss/user/ntuser/dce.h [iso-8859-1] Wed Jul 23 16:05:47 2014
@@ -51,3 +51,5 @@
HWND FASTCALL UserGethWnd(HDC,PWNDOBJ*);
void FASTCALL DceFreeWindowDCE(PWND);
void FASTCALL DceFreeThreadDCE(PTHREADINFO);
+VOID FASTCALL DceUpdateVisRgn(DCE *Dce, PWND Window, ULONG Flags);
+DCE* FASTCALL DceGetDceFromDC(HDC hdc);
Modified: trunk/reactos/win32ss/user/ntuser/windc.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/windc.…
==============================================================================
--- trunk/reactos/win32ss/user/ntuser/windc.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/user/ntuser/windc.c [iso-8859-1] Wed Jul 23 16:05:47 2014
@@ -46,21 +46,47 @@
return IntGdiCreateDC(&DriverName, NULL, NULL, NULL, FALSE);
}
+/* Returns the DCE pointer from the HDC handle */
+DCE*
+FASTCALL
+DceGetDceFromDC(HDC hdc)
+{
+ LIST_ENTRY* Entry = LEDce.Flink;
+ DCE* dce;
+
+ while (Entry != &LEDce)
+ {
+ dce = CONTAINING_RECORD(Entry, DCE, List);
+ if (dce->hDC == hdc)
+ return dce;
+ Entry = Entry->Flink;
+ }
+
+ return NULL;
+}
+
static
-HRGN FASTCALL
+PREGION FASTCALL
DceGetVisRgn(PWND Window, ULONG Flags, HWND hWndChild, ULONG CFlags)
{
- HRGN VisRgn;
-
- VisRgn = VIS_ComputeVisibleRegion( Window,
- 0 == (Flags & DCX_WINDOW),
- 0 != (Flags & DCX_CLIPCHILDREN),
- 0 != (Flags & DCX_CLIPSIBLINGS));
-
- if (VisRgn == NULL)
- VisRgn = IntSysCreateRectRgn(0, 0, 0, 0);
-
- return VisRgn;
+ PREGION RetRgn;
+ HRGN hVisRgn;
+ hVisRgn = VIS_ComputeVisibleRegion( Window,
+ 0 == (Flags & DCX_WINDOW),
+ 0 != (Flags & DCX_CLIPCHILDREN),
+ 0 != (Flags & DCX_CLIPSIBLINGS));
+
+ RetRgn = IntSysCreateRectpRgn(0, 0, 0, 0);
+
+ if (hVisRgn != NULL)
+ {
+ PREGION VisRgn = REGION_LockRgn(hVisRgn);
+ IntGdiCombineRgn(RetRgn, VisRgn, NULL, RGN_COPY);
+ REGION_UnlockRgn(VisRgn);
+ GreDeleteObject(hVisRgn);
+ }
+
+ return RetRgn;
}
PDCE FASTCALL
@@ -150,6 +176,7 @@
dc->ptlDCOrig.y = Window->rcClient.top;
}
}
+ dc->fs |= DC_FLAG_DIRTY_RAO;
DC_UnlockDc(dc);
}
@@ -175,10 +202,11 @@
IntGdiSetHookFlags(Dce->hDC, DCHF_INVALIDATEVISRGN);
}
-static VOID FASTCALL
+VOID
+FASTCALL
DceUpdateVisRgn(DCE *Dce, PWND Window, ULONG Flags)
{
- HANDLE hRgnVisible = NULL;
+ PREGION RgnVisible = NULL;
ULONG DcxFlags;
PWND DesktopWindow;
@@ -189,7 +217,7 @@
Parent = Window->spwndParent;
if(!Parent)
{
- hRgnVisible = NULL;
+ RgnVisible = NULL;
goto noparent;
}
@@ -202,23 +230,23 @@
{
DcxFlags = Flags & ~(DCX_CLIPSIBLINGS | DCX_CLIPCHILDREN | DCX_WINDOW);
}
- hRgnVisible = DceGetVisRgn(Parent, DcxFlags, Window->head.h, Flags);
+ RgnVisible = DceGetVisRgn(Parent, DcxFlags, Window->head.h, Flags);
}
else if (Window == NULL)
{
DesktopWindow = UserGetWindowObject(IntGetDesktopWindow());
if (NULL != DesktopWindow)
{
- hRgnVisible = IntSysCreateRectRgnIndirect(&DesktopWindow->rcWindow);
+ RgnVisible = IntSysCreateRectpRgnIndirect(&DesktopWindow->rcWindow);
}
else
{
- hRgnVisible = NULL;
+ RgnVisible = NULL;
}
}
else
{
- hRgnVisible = DceGetVisRgn(Window, Flags, 0, 0);
+ RgnVisible = DceGetVisRgn(Window, Flags, 0, 0);
}
noparent:
@@ -226,33 +254,37 @@
{
if(Dce->hrgnClip != NULL)
{
- NtGdiCombineRgn(hRgnVisible, hRgnVisible, Dce->hrgnClip, RGN_AND);
+ PREGION RgnClip = REGION_LockRgn(Dce->hrgnClip);
+ IntGdiCombineRgn(RgnVisible, RgnVisible, RgnClip, RGN_AND);
+ REGION_UnlockRgn(RgnClip);
}
else
{
- if(hRgnVisible != NULL)
- {
- GreDeleteObject(hRgnVisible);
- }
- hRgnVisible = IntSysCreateRectRgn(0, 0, 0, 0);
- }
- }
- else if (Flags & DCX_EXCLUDERGN && Dce->hrgnClip != NULL)
- {
- NtGdiCombineRgn(hRgnVisible, hRgnVisible, Dce->hrgnClip, RGN_DIFF);
+ if(RgnVisible != NULL)
+ {
+ REGION_Delete(RgnVisible);
+ }
+ RgnVisible = IntSysCreateRectpRgn(0, 0, 0, 0);
+ }
+ }
+ else if ((Flags & DCX_EXCLUDERGN) && Dce->hrgnClip != NULL)
+ {
+ PREGION RgnClip = REGION_LockRgn(Dce->hrgnClip);
+ IntGdiCombineRgn(RgnVisible, RgnVisible, RgnClip, RGN_DIFF);
+ REGION_UnlockRgn(RgnClip);
}
Dce->DCXFlags &= ~DCX_DCEDIRTY;
- GdiSelectVisRgn(Dce->hDC, hRgnVisible);
+ GdiSelectVisRgn(Dce->hDC, RgnVisible);
if (VerifyWnd(Window)) // Window maybe dead by this time before finishing the DCE
release.
{
IntEngWindowChanged(Window, WOC_RGN_CLIENT);
}
- if (hRgnVisible != NULL)
- {
- GreDeleteObject(hRgnVisible);
+ if (RgnVisible != NULL)
+ {
+ REGION_Delete(RgnVisible);
}
}
@@ -889,10 +921,10 @@
dc->ptlDCOrig.y = CurrentWindow->rcClient.top;
}
- if (NULL != dc->rosdc.hClipRgn)
+ if (NULL != dc->dclevel.prgnClip)
{
- NtGdiOffsetRgn(dc->rosdc.hClipRgn, DeltaX, DeltaY);
- CLIPPING_UpdateGCRegion(dc);
+ IntGdiOffsetRgn(dc->dclevel.prgnClip, DeltaX, DeltaY);
+ dc->fs |= DC_FLAG_DIRTY_RAO;
}
if (NULL != pDCE->hrgnClip)
{