From b5b4c9ab4bdc7cb54458ca8601316b7eceea89d0 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Tue, 17 Jun 2008 05:19:08 +0000 Subject: [PATCH] Update changes to Clip regions andregions. New support for Rao and Vis. svn path=/trunk/; revision=33998 --- .../subsystems/win32/win32k/include/cliprgn.h | 1 - .../subsystems/win32/win32k/include/intgdi.h | 1 + .../subsystems/win32/win32k/include/region.h | 7 ++ .../subsystems/win32/win32k/objects/cliprgn.c | 25 ++----- reactos/subsystems/win32/win32k/objects/dc.c | 1 - .../subsystems/win32/win32k/objects/region.c | 73 +++++++++++++++++++ 6 files changed, 89 insertions(+), 19 deletions(-) diff --git a/reactos/subsystems/win32/win32k/include/cliprgn.h b/reactos/subsystems/win32/win32k/include/cliprgn.h index 6610b2d4d9d..621c73db362 100644 --- a/reactos/subsystems/win32/win32k/include/cliprgn.h +++ b/reactos/subsystems/win32/win32k/include/cliprgn.h @@ -5,7 +5,6 @@ #include INT FASTCALL IntGdiGetClipBox(PDC, LPRECT rc); -INT FASTCALL IntGdiSelectVisRgn(PDC, PROSRGNDATA); INT FASTCALL IntGdiExtSelectClipRgn (PDC, PROSRGNDATA, int); INT FASTCALL GdiGetClipBox(HDC hDC, LPRECT rc); diff --git a/reactos/subsystems/win32/win32k/include/intgdi.h b/reactos/subsystems/win32/win32k/include/intgdi.h index 02d0ba19863..03bf496c08b 100644 --- a/reactos/subsystems/win32/win32k/include/intgdi.h +++ b/reactos/subsystems/win32/win32k/include/intgdi.h @@ -6,6 +6,7 @@ /* Brush functions */ extern HDC hSystemBM; +extern HSEMAPHORE hsemDriverMgmt; XLATEOBJ* FASTCALL IntGdiCreateBrushXlate(PDC Dc, GDIBRUSHOBJ *BrushObj, BOOLEAN *Failed); diff --git a/reactos/subsystems/win32/win32k/include/region.h b/reactos/subsystems/win32/win32k/include/region.h index f6d1bb83a12..6448a3fa96c 100644 --- a/reactos/subsystems/win32/win32k/include/region.h +++ b/reactos/subsystems/win32/win32k/include/region.h @@ -34,6 +34,13 @@ BOOL FASTCALL REGION_CropAndOffsetRegion(PROSRGNDATA rgnDst, PROSRGNDATA rgnSrc, VOID FASTCALL REGION_SetRectRgn(PROSRGNDATA pRgn, INT LeftRect, INT TopRect, INT RightRect, INT BottomRect); BOOL INTERNAL_CALL REGION_Cleanup(PVOID ObjectBody); +extern PROSRGNDATA prgnDefault; +extern HRGN hrgnDefault; + +VOID FASTCALL REGION_Delete(PROSRGNDATA); +VOID FASTCALL IntGdiReleaseRaoRgn(PDC); +VOID FASTCALL IntGdiReleaseVisRgn(PDC); + INT STDCALL IntGdiGetRgnBox(HRGN, LPRECT); BOOL FASTCALL IntGdiPaintRgn(PDC, HRGN ); HRGN FASTCALL GdiCreatePolyPolygonRgn(CONST PPOINT, CONST PINT, INT, INT ); diff --git a/reactos/subsystems/win32/win32k/objects/cliprgn.c b/reactos/subsystems/win32/win32k/objects/cliprgn.c index 221909e2c5b..3d9d98cfbcd 100644 --- a/reactos/subsystems/win32/win32k/objects/cliprgn.c +++ b/reactos/subsystems/win32/win32k/objects/cliprgn.c @@ -442,29 +442,22 @@ IntGdiSetMetaRgn(PDC pDC) RGN_AND); if ( Ret ) { - TempRgn = GDIOBJ_ShareLockObj(TempRgn->BaseObject.hHmgr, - GDI_OBJECT_TYPE_REGION); - GDIOBJ_ShareUnlockObjByPtr(pDC->DcLevel.prgnMeta); if (!((PROSRGNDATA)pDC->DcLevel.prgnMeta)->BaseObject.ulShareCount) - REGION_FreeRgn(pDC->DcLevel.prgnMeta); + REGION_Delete(pDC->DcLevel.prgnMeta); pDC->DcLevel.prgnMeta = TempRgn; GDIOBJ_ShareUnlockObjByPtr(pDC->DcLevel.prgnClip); if (!((PROSRGNDATA)pDC->DcLevel.prgnClip)->BaseObject.ulShareCount) - REGION_FreeRgn(pDC->DcLevel.prgnClip); + REGION_Delete(pDC->DcLevel.prgnClip); pDC->DcLevel.prgnClip = NULL; - pDC->DC_Flags |= DC_FLAG_DIRTY_RAO; - pDC->erclClip.left = 0; - pDC->erclClip.top = 0; - pDC->erclClip.right = 0; - pDC->erclClip.bottom = 0; + IntGdiReleaseRaoRgn(pDC); } else - REGION_FreeRgn(TempRgn); + REGION_Delete(TempRgn); } } else @@ -510,16 +503,14 @@ NEW_CLIPPING_UpdateGCRegion(PDC pDC) if (pDC->prgnAPI) { - REGION_FreeRgn(pDC->prgnAPI); - pDC->prgnAPI = REGION_AllocRgnWithHandle(1); - REGION_SetRectRgn(pDC->prgnAPI, 0, 0, 0, 0); + REGION_Delete(pDC->prgnAPI); + pDC->prgnAPI = IntGdiCreateRectRgn(0,0,0,0); } if (pDC->prgnRao) { - REGION_FreeRgn(pDC->prgnRao); - pDC->prgnRao = REGION_AllocRgnWithHandle(1); - REGION_SetRectRgn(pDC->prgnRao, 0, 0, 0, 0); + REGION_Delete(pDC->prgnRao); + pDC->prgnRao = IntGdiCreateRectRgn(0,0,0,0); } if (pDC->DcLevel.prgnMeta && pDC->DcLevel.prgnClip) diff --git a/reactos/subsystems/win32/win32k/objects/dc.c b/reactos/subsystems/win32/win32k/objects/dc.c index 11dc504b8fe..ee62db8a93a 100644 --- a/reactos/subsystems/win32/win32k/objects/dc.c +++ b/reactos/subsystems/win32/win32k/objects/dc.c @@ -2785,7 +2785,6 @@ IntEnumHDev(VOID) return &PrimarySurface; } -HSEMAPHORE hsemDriverMgmt = NULL; // Hax, should be in dllmain.c and global. VOID FASTCALL IntGdiReferencePdev(PGDIDEVICE pPDev) diff --git a/reactos/subsystems/win32/win32k/objects/region.c b/reactos/subsystems/win32/win32k/objects/region.c index d3c02b0666c..33755439917 100644 --- a/reactos/subsystems/win32/win32k/objects/region.c +++ b/reactos/subsystems/win32/win32k/objects/region.c @@ -118,6 +118,9 @@ SOFTWARE. #define NDEBUG #include +PROSRGNDATA prgnDefault = NULL; +HRGN hrgnDefault = NULL; + // Internal Functions #if 1 @@ -488,6 +491,7 @@ INT FASTCALL REGION_Complexity( PROSRGNDATA obj ) { + if (!obj) return NULLREGION; switch(obj->rdh.nCount) { DPRINT("Region Complexity -> %d",obj->rdh.nCount); @@ -2076,6 +2080,73 @@ REGION_Cleanup(PVOID ObjectBody) return TRUE; } +VOID FASTCALL +REGION_Delete(PROSRGNDATA pRgn) +{ + if ( pRgn == prgnDefault) return; + return REGION_FreeRgn(pRgn); +} + + +VOID FASTCALL +IntGdiReleaseRaoRgn(PDC pDC) +{ + INT Index = GDI_HANDLE_GET_INDEX(pDC->BaseObject.hHmgr); + PGDI_TABLE_ENTRY Entry = &GdiHandleTable->Entries[Index]; + pDC->DC_Flags |= DC_FLAG_DIRTY_RAO; + Entry->Flags |= GDI_ENTRY_FLAG_NEED_UPDATE; + IntGdiSetEmptyRect((PRECT)&pDC->erclClip); +} + + +VOID FASTCALL +IntGdiReleaseVisRgn(PDC pDC) +{ + INT Index = GDI_HANDLE_GET_INDEX(pDC->BaseObject.hHmgr); + PGDI_TABLE_ENTRY Entry = &GdiHandleTable->Entries[Index]; + pDC->DC_Flags |= DC_FLAG_DIRTY_RAO; + Entry->Flags |= GDI_ENTRY_FLAG_NEED_UPDATE; + IntGdiSetEmptyRect((PRECT)&pDC->erclClip); + REGION_Delete(pDC->prgnVis); + pDC->prgnVis = prgnDefault; +} + +VOID FASTCALL +IntUpdateVisRectRgn(PDC pDC, PROSRGNDATA pRgn) +{ + INT Index = GDI_HANDLE_GET_INDEX(pDC->BaseObject.hHmgr); + PGDI_TABLE_ENTRY Entry = &GdiHandleTable->Entries[Index]; + PDC_ATTR pDc_Attr; + RECTL rcl; + + if (Entry->Flags & GDI_ENTRY_FLAG_NEED_UPDATE) + { + pDc_Attr = pDC->pDc_Attr; + if ( !pDc_Attr ) pDc_Attr = &pDC->Dc_Attr; + + pDc_Attr->VisRectRegion.Flags = REGION_Complexity(pRgn); + + if (pRgn && pDc_Attr->VisRectRegion.Flags != NULLREGION) + { + rcl.left = pRgn->rdh.rcBound.left; + rcl.top = pRgn->rdh.rcBound.top; + rcl.right = pRgn->rdh.rcBound.right; + rcl.bottom = pRgn->rdh.rcBound.bottom; + + rcl.left -= pDC->erclWindow.left; + rcl.top -= pDC->erclWindow.top; + rcl.right -= pDC->erclWindow.left; + rcl.bottom -= pDC->erclWindow.top; + } + else + IntGdiSetEmptyRect((PRECT)&rcl); + + pDc_Attr->VisRectRegion.Rect = rcl; + + Entry->Flags &= ~GDI_ENTRY_FLAG_NEED_UPDATE; + } +} + INT FASTCALL IntGdiCombineRgn(PROSRGNDATA destRgn, @@ -2221,6 +2292,8 @@ IntGdiCreateRectRgn(INT LeftRect, INT TopRect, INT RightRect, INT BottomRect) REGION_SetRectRgn(pRgn, LeftRect, TopRect, RightRect, BottomRect); REGION_UnlockRgn(pRgn); + // Return pointer with Share locks. + pRgn = GDIOBJ_ShareLockObj(pRgn->BaseObject.hHmgr, GDI_OBJECT_TYPE_REGION); return pRgn; }