diff --git a/win32ss/gdi/ntgdi/cliprgn.c b/win32ss/gdi/ntgdi/cliprgn.c index 163106e..2f4f53c 100644 --- a/win32ss/gdi/ntgdi/cliprgn.c +++ b/win32ss/gdi/ntgdi/cliprgn.c @@ -18,40 +18,25 @@ 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; // Need to validate Vis. + Entry->Flags |= GDI_ENTRY_VALIDATE_VIS; + RECTL_vSetEmptyRect(&pDC->erclClip); + REGION_Delete(pDC->prgnRao); + pDC->prgnRao = NULL; } VOID FASTCALL IntGdiReleaseVisRgn(PDC pDC) { - IntGdiReleaseRaoRgn(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); REGION_Delete(pDC->prgnVis); - pDC->prgnVis = prgnDefault; // Vis can not be NULL!!! + pDC->prgnVis = prgnDefault; } -// -// Updating Vis Region Attribute for DC Attributes. -// BTW: This system region has an user attribute for it. -// -VOID -FASTCALL -UpdateVisRgn( - PDC pdc) -{ - INT Index = GDI_HANDLE_GET_INDEX(pdc->BaseObject.hHmgr); - PGDI_TABLE_ENTRY pEntry = &GdiHandleTable->Entries[Index]; - - /* Setup Vis Region Attribute information to User side */ - pEntry->Flags |= GDI_ENTRY_VALIDATE_VIS; - pdc->pdcattr->VisRectRegion.iComplexity = REGION_GetRgnBox(pdc->prgnVis, &pdc->pdcattr->VisRectRegion.Rect); - pdc->pdcattr->VisRectRegion.AttrFlags = ATTR_RGN_VALID; - pEntry->Flags &= ~GDI_ENTRY_VALIDATE_VIS; -} - -// -// Selecting Vis Region. -// VOID FASTCALL GdiSelectVisRgn( @@ -66,241 +51,61 @@ GdiSelectVisRgn( return; } - if (!prgn) - { - DPRINT1("SVR: Setting NULL Region\n"); - IntGdiReleaseVisRgn(dc); - IntSetDefaultRegion(dc); - DC_UnlockDc(dc); - return; - } - dc->fs |= DC_FLAG_DIRTY_RAO; ASSERT(dc->prgnVis != NULL); ASSERT(prgn != NULL); - REGION_bCopy(dc->prgnVis, prgn); + IntGdiCombineRgn(dc->prgnVis, prgn, NULL, RGN_COPY); REGION_bOffsetRgn(dc->prgnVis, -dc->ptlDCOrig.x, -dc->ptlDCOrig.y); DC_UnlockDc(dc); } -_Success_(return!=ERROR) + int FASTCALL -IntSelectClipRgn( - _In_ PDC dc, - _In_ PREGION prgn, - _In_ int fnMode) +IntGdiExtSelectClipRgn( + PDC dc, + PREGION prgn, + int fnMode) { - int Ret = ERROR; - PREGION prgnNClip, prgnOrigClip = dc->dclevel.prgnClip; - - // - // No Coping Regions and no intersecting Regions or an User calling w NULL Region or have the Original Clip Region. - // - if (fnMode != RGN_COPY && (fnMode != RGN_AND || !prgn || prgnOrigClip)) + if (fnMode == RGN_COPY) { - prgnNClip = IntSysCreateRectpRgn(0, 0, 0, 0); - - // Have Original Clip Region. - if (prgnOrigClip) - { - // This will fail on NULL prgn. - Ret = IntGdiCombineRgn(prgnNClip, prgnOrigClip, prgn, fnMode); - - if (Ret) - { - REGION_Delete(prgnOrigClip); - dc->dclevel.prgnClip = prgnNClip; - IntGdiReleaseRaoRgn(dc); - } - else - REGION_Delete(prgnNClip); - } - else // NULL Original Clip Region, setup a new one and process mode. + if (!prgn) { - PREGION prgnClip; - RECTL rcl; - PSURFACE pSurface; - - // See IntSetDefaultRegion. - - rcl.left = 0; - rcl.top = 0; - rcl.right = dc->dclevel.sizl.cx; - rcl.bottom = dc->dclevel.sizl.cy; - - //EngAcquireSemaphoreShared(pdc->ppdev->hsemDevLock); - if (dc->ppdev->flFlags & PDEV_META_DEVICE) - { - pSurface = dc->dclevel.pSurface; - if (pSurface && pSurface->flags & PDEV_SURFACE) - { - rcl.left += dc->ppdev->ptlOrigion.x; - rcl.top += dc->ppdev->ptlOrigion.y; - rcl.right += dc->ppdev->ptlOrigion.x; - rcl.bottom += dc->ppdev->ptlOrigion.y; - } - } - //EngReleaseSemaphore(pdc->ppdev->hsemDevLock); -#if 0 - rcl.left += dc->ptlDCOrig.x; - rcl.top += dc->ptlDCOrig.y; - rcl.right += dc->ptlDCOrig.x; - rcl.bottom += dc->ptlDCOrig.y; -#endif - prgnClip = IntSysCreateRectpRgnIndirect(&rcl); - - Ret = IntGdiCombineRgn(prgnNClip, prgnClip, prgn, fnMode); - - if (Ret) + if (dc->dclevel.prgnClip != NULL) { - dc->dclevel.prgnClip = prgnNClip; - IntGdiReleaseRaoRgn(dc); + REGION_Delete(dc->dclevel.prgnClip); + dc->dclevel.prgnClip = NULL; + dc->fs |= DC_FLAG_DIRTY_RAO; } - else - REGION_Delete(prgnNClip); - - REGION_Delete(prgnClip); + return SIMPLEREGION; } - return Ret; - } - // Fall through to normal RectOS mode. + if (!dc->dclevel.prgnClip) + dc->dclevel.prgnClip = IntSysCreateRectpRgn(0, 0, 0, 0); - // - // Handle NULL Region and Original Clip Region. - // - if (!prgn) - { - if (prgnOrigClip) - { - REGION_Delete(dc->dclevel.prgnClip); - dc->dclevel.prgnClip = NULL; - IntGdiReleaseRaoRgn(dc); - } - return SIMPLEREGION; - } + dc->fs |= DC_FLAG_DIRTY_RAO; - // - // Combine the new Clip region with original Clip and caller Region. - // - if ( prgnOrigClip && - (Ret = IntGdiCombineRgn(prgnOrigClip, prgn, NULL, RGN_COPY)) ) // Clip could fail. - { - IntGdiReleaseRaoRgn(dc); - } - else // NULL original Clip, just copy caller region to new. - { - prgnNClip = IntSysCreateRectpRgn(0, 0, 0, 0); - REGION_bCopy(prgnNClip, prgn); - Ret = REGION_Complexity(prgnNClip); - dc->dclevel.prgnClip = prgnNClip; - IntGdiReleaseRaoRgn(dc); + return IntGdiCombineRgn(dc->dclevel.prgnClip, prgn, NULL, RGN_COPY); } - return Ret; -} - -// -// Call from Gdi Batch Subsystem. -// -// Was setup to just handle RGN_COPY only and return VOID, since this was called from Gdi32. -// Tested in place of the other, complexity aside. -// -_Success_(return!=ERROR) -int -FASTCALL -IntGdiExtSelectClipRect( - _In_ PDC dc, - _In_ PRECTL prcl, - _In_ int fnMode) -{ - int Ret = ERROR; - PREGION prgn; - RECTL rect; - BOOL NoRegion = fnMode & GDIBS_NORECT; - - fnMode &= ~GDIBS_NORECT; + ASSERT(prgn != NULL); - if (NoRegion) // NULL Region. + if (!dc->dclevel.prgnClip) { - if (fnMode == RGN_COPY) - { - Ret = IntSelectClipRgn( dc, NULL, RGN_COPY); - - if (dc->fs & DC_FLAG_DIRTY_RAO) - CLIPPING_UpdateGCRegion(dc); + RECTL rect; - if (Ret) // Copy? Return Vis complexity. - Ret = REGION_Complexity(dc->prgnVis); - } + REGION_GetRgnBox(dc->prgnVis, &rect); + dc->dclevel.prgnClip = IntSysCreateRectpRgnIndirect(&rect); } - else // Have a box to build a region with. - { // See CORE-16246 : Needs to be a one box Clip Region. - if ( dc->dclevel.prgnClip && (REGION_Complexity(dc->dclevel.prgnClip) == SIMPLEREGION) ) - { - REGION_GetRgnBox(dc->dclevel.prgnClip, &rect); - if (prcl->left == rect.left && - prcl->top == rect.top && - prcl->right == rect.right && - prcl->bottom == rect.bottom) - { - return REGION_Complexity( dc->prgnRao ? dc->prgnRao : dc->prgnVis ); - } - } - - prgn = IntSysCreateRectpRgnIndirect(prcl); - - Ret = IntSelectClipRgn( dc, prgn, fnMode); - - if (dc->fs & DC_FLAG_DIRTY_RAO) - CLIPPING_UpdateGCRegion(dc); - - if (Ret) // In this case NtGdiExtSelectClipRgn tests pass. - Ret = REGION_Complexity( dc->prgnRao ? dc->prgnRao : dc->prgnVis ); + dc->fs |= DC_FLAG_DIRTY_RAO; - REGION_Delete(prgn); - } - return Ret; + return IntGdiCombineRgn(dc->dclevel.prgnClip, dc->dclevel.prgnClip, prgn, fnMode); } -_Success_(return!=ERROR) -int -FASTCALL -IntGdiExtSelectClipRgn( - _In_ PDC dc, - _In_ PREGION prgn, - _In_ int fnMode) -{ - int Ret = ERROR; - - if (!prgn) - { - if (fnMode == RGN_COPY) - { - if ((Ret = IntSelectClipRgn( dc, NULL, RGN_COPY))) - Ret = REGION_Complexity(dc->prgnVis); - } - } - else - { - if ((Ret = IntSelectClipRgn( dc, prgn, fnMode))) - { - DPRINT("IntGdiExtSelectClipRgn A %d\n",Ret); - // Update the Rao, it must be this way for now. - if (dc->fs & DC_FLAG_DIRTY_RAO) - CLIPPING_UpdateGCRegion(dc); - - Ret = REGION_Complexity( dc->prgnRao ? dc->prgnRao : dc->prgnVis ); - DPRINT("IntGdiExtSelectClipRgn B %d\n",Ret); - } - } - return Ret; -} int APIENTRY @@ -313,12 +118,6 @@ NtGdiExtSelectClipRgn( DC *dc; PREGION prgn; - if ( fnMode < RGN_AND || fnMode > RGN_COPY ) - { - EngSetLastError(ERROR_INVALID_PARAMETER); - return ERROR; - } - if (!(dc = DC_LockDc(hDC))) { EngSetLastError(ERROR_INVALID_HANDLE); @@ -329,23 +128,12 @@ NtGdiExtSelectClipRgn( if ((prgn == NULL) && (fnMode != RGN_COPY)) { - //EngSetLastError(ERROR_INVALID_HANDLE); doesn't set this. + EngSetLastError(ERROR_INVALID_HANDLE); retval = ERROR; } else { -#if 0 // Testing GDI Batch. - { - RECTL rcl; - if (prgn) - REGION_GetRgnBox(prgn, &rcl); - else - fnMode |= GDIBS_NORECT; - retval = IntGdiExtSelectClipRect(dc, &rcl, fnMode); - } -#else retval = IntGdiExtSelectClipRgn(dc, prgn, fnMode); -#endif } if (prgn) @@ -439,10 +227,9 @@ NtGdiExcludeClipRect( _In_ INT xRight, _In_ INT yBottom) { - INT iComplexity = ERROR; + INT iComplexity; RECTL rect; PDC pdc; - PREGION prgn; /* Lock the DC */ pdc = DC_LockDc(hdc); @@ -453,25 +240,46 @@ NtGdiExcludeClipRect( } /* Convert coordinates to device space */ - rect.left = xLeft; - rect.top = yTop; - rect.right = xRight; + rect.left = xLeft; + rect.top = yTop; + rect.right = xRight; rect.bottom = yBottom; RECTL_vMakeWellOrdered(&rect); IntLPtoDP(pdc, (LPPOINT)&rect, 2); - prgn = IntSysCreateRectpRgnIndirect(&rect); - if ( prgn ) + /* Check if we already have a clip region */ + if (pdc->dclevel.prgnClip != NULL) { - iComplexity = IntSelectClipRgn( pdc, prgn, RGN_DIFF ); - - REGION_Delete(prgn); + /* We have a region, subtract the rect */ + iComplexity = REGION_SubtractRectFromRgn(pdc->dclevel.prgnClip, + pdc->dclevel.prgnClip, + &rect); + } + else + { + /* We don't have a clip region yet, create an empty region */ + pdc->dclevel.prgnClip = IntSysCreateRectpRgn(0, 0, 0, 0); + if (pdc->dclevel.prgnClip == NULL) + { + iComplexity = ERROR; + } + else + { + /* Subtract the rect from the VIS region */ + iComplexity = REGION_SubtractRectFromRgn(pdc->dclevel.prgnClip, + pdc->prgnVis, + &rect); + } } /* Emulate Windows behavior */ if (iComplexity == SIMPLEREGION) iComplexity = COMPLEXREGION; + /* If we succeeded, mark the RAO region as dirty */ + if (iComplexity != ERROR) + pdc->fs |= DC_FLAG_DIRTY_RAO; + /* Unlock the DC */ DC_UnlockDc(pdc); @@ -487,10 +295,10 @@ NtGdiIntersectClipRect( _In_ INT xRight, _In_ INT yBottom) { - INT iComplexity = ERROR; + INT iComplexity; RECTL rect; + PREGION prgnNew; PDC pdc; - PREGION prgn; DPRINT("NtGdiIntersectClipRect(%p, %d,%d-%d,%d)\n", hdc, xLeft, yTop, xRight, yBottom); @@ -504,24 +312,39 @@ NtGdiIntersectClipRect( } /* Convert coordinates to device space */ - rect.left = xLeft; - rect.top = yTop; - rect.right = xRight; + rect.left = xLeft; + rect.top = yTop; + rect.right = xRight; rect.bottom = yBottom; - RECTL_vMakeWellOrdered(&rect); IntLPtoDP(pdc, (LPPOINT)&rect, 2); - prgn = IntSysCreateRectpRgnIndirect(&rect); - if ( prgn ) + /* Check if we already have a clip region */ + if (pdc->dclevel.prgnClip != NULL) { - iComplexity = IntSelectClipRgn( pdc, prgn, RGN_AND ); - - REGION_Delete(prgn); + /* We have a region, crop it */ + iComplexity = REGION_CropRegion(pdc->dclevel.prgnClip, + pdc->dclevel.prgnClip, + &rect); + } + else + { + /* We don't have a region yet, allocate a new one */ + prgnNew = IntSysCreateRectpRgnIndirect(&rect); + if (prgnNew == NULL) + { + iComplexity = ERROR; + } + else + { + /* Set the new region */ + pdc->dclevel.prgnClip = prgnNew; + iComplexity = SIMPLEREGION; + } } - /* Emulate Windows behavior */ - if ( iComplexity == SIMPLEREGION ) - iComplexity = COMPLEXREGION; + /* If we succeeded, mark the RAO region as dirty */ + if (iComplexity != ERROR) + pdc->fs |= DC_FLAG_DIRTY_RAO; /* Unlock the DC */ DC_UnlockDc(pdc); @@ -544,7 +367,6 @@ NtGdiOffsetClipRgn( pdc = DC_LockDc(hdc); if (pdc == NULL) { - if (!hdc) EngSetLastError(ERROR_INVALID_HANDLE); return ERROR; } @@ -568,8 +390,6 @@ NtGdiOffsetClipRgn( } else { - IntGdiReleaseRaoRgn(pdc); - UpdateVisRgn(pdc); iComplexity = REGION_Complexity(pdc->dclevel.prgnClip); } @@ -593,7 +413,6 @@ BOOL APIENTRY NtGdiPtVisible(HDC hDC, { BOOL ret = FALSE; PDC dc; - PREGION prgn; if(!(dc = DC_LockDc(hDC))) { @@ -601,13 +420,11 @@ BOOL APIENTRY NtGdiPtVisible(HDC hDC, return FALSE; } - prgn = dc->prgnRao ? dc->prgnRao : dc->prgnVis; - - if (prgn) + if (dc->prgnRao) { POINT pt = {X, Y}; IntLPtoDP(dc, &pt, 1); - ret = REGION_PtInRegion(prgn, pt.x, pt.y); + ret = REGION_PtInRegion(dc->prgnRao, pt.x, pt.y); } DC_UnlockDc(dc); @@ -625,7 +442,6 @@ NtGdiRectVisible( PDC dc = DC_LockDc(hDC); BOOL Result = FALSE; RECTL Rect; - PREGION prgn; if (!dc) { @@ -656,11 +472,10 @@ NtGdiRectVisible( if (dc->fs & DC_FLAG_DIRTY_RAO) CLIPPING_UpdateGCRegion(dc); - prgn = dc->prgnRao ? dc->prgnRao : dc->prgnVis; - if (prgn) + if (dc->prgnRao) { IntLPtoDP(dc, (LPPOINT)&Rect, 2); - Result = REGION_RectInRegion(prgn, &Rect); + Result = REGION_RectInRegion(dc->prgnRao, &Rect); } DC_UnlockDc(dc); @@ -677,23 +492,13 @@ IntGdiSetMetaRgn(PDC pDC) { if ( pDC->dclevel.prgnClip ) { - PREGION prgn = IntSysCreateRectpRgn(0,0,0,0); - if ( prgn ) + // preferably REGION_IntersectRegion + Ret = IntGdiCombineRgn(pDC->dclevel.prgnMeta, pDC->dclevel.prgnMeta, pDC->dclevel.prgnClip, RGN_AND); + if (Ret != ERROR) { - if (REGION_bIntersectRegion(prgn, pDC->dclevel.prgnMeta, pDC->dclevel.prgnClip)) - { - // See Restore/SaveDC - REGION_Delete(pDC->dclevel.prgnMeta); - pDC->dclevel.prgnMeta = prgn; - - REGION_Delete(pDC->dclevel.prgnClip); - pDC->dclevel.prgnClip = NULL; - IntGdiReleaseRaoRgn(pDC); - - Ret = REGION_Complexity(pDC->dclevel.prgnMeta); - } - else - REGION_Delete(prgn); + REGION_Delete(pDC->dclevel.prgnClip); + pDC->dclevel.prgnClip = NULL; + IntGdiReleaseRaoRgn(pDC); } } else @@ -711,6 +516,9 @@ IntGdiSetMetaRgn(PDC pDC) Ret = SIMPLEREGION; } + if (Ret != ERROR) + pDC->fs |= DC_FLAG_DIRTY_RAO; + return Ret; } @@ -735,38 +543,9 @@ VOID FASTCALL CLIPPING_UpdateGCRegion(PDC pDC) { - // Moved from Release Rao. Though it still gets over written. - RECTL_vSetEmptyRect(&pDC->erclClip); - /* Must have VisRgn set to a valid state! */ ASSERT (pDC->prgnVis); -#if 0 // (w2k3) This works with limitations. (w7u) ReactOS relies on Rao. - if ( !pDC->dclevel.prgnClip && - !pDC->dclevel.prgnMeta && - !pDC->prgnAPI) - { - if (pDC->prgnRao) - REGION_Delete(pDC->prgnRao); - pDC->prgnRao = NULL; - - REGION_bOffsetRgn(pDC->prgnVis, pDC->ptlDCOrig.x, pDC->ptlDCOrig.y); - - RtlCopyMemory(&pDC->erclClip, - &pDC->prgnVis->rdh.rcBound, - sizeof(RECTL)); - IntEngUpdateClipRegion(&pDC->co, - pDC->prgnVis->rdh.nCount, - pDC->prgnVis->Buffer, - &pDC->erclClip); - - REGION_bOffsetRgn(pDC->prgnVis, -pDC->ptlDCOrig.x, -pDC->ptlDCOrig.y); - - pDC->fs &= ~DC_FLAG_DIRTY_RAO; - UpdateVisRgn(pDC); - return; - } -#endif if (pDC->prgnAPI) { REGION_Delete(pDC->prgnAPI); @@ -785,43 +564,50 @@ CLIPPING_UpdateGCRegion(PDC pDC) pDC->prgnAPI = IntSysCreateRectpRgn(0,0,0,0); if (!pDC->dclevel.prgnMeta) { - REGION_bCopy(pDC->prgnAPI, - pDC->dclevel.prgnClip); + IntGdiCombineRgn(pDC->prgnAPI, + pDC->dclevel.prgnClip, + NULL, + RGN_COPY); } else if (!pDC->dclevel.prgnClip) { - REGION_bCopy(pDC->prgnAPI, - pDC->dclevel.prgnMeta); + IntGdiCombineRgn(pDC->prgnAPI, + pDC->dclevel.prgnMeta, + NULL, + RGN_COPY); } else { - REGION_bIntersectRegion(pDC->prgnAPI, - pDC->dclevel.prgnClip, - pDC->dclevel.prgnMeta); + IntGdiCombineRgn(pDC->prgnAPI, + pDC->dclevel.prgnClip, + pDC->dclevel.prgnMeta, + RGN_AND); } } if (pDC->prgnAPI) { - REGION_bIntersectRegion(pDC->prgnRao, - pDC->prgnVis, - pDC->prgnAPI); + IntGdiCombineRgn(pDC->prgnRao, + pDC->prgnVis, + pDC->prgnAPI, + RGN_AND); } else { - REGION_bCopy(pDC->prgnRao, - pDC->prgnVis); + IntGdiCombineRgn(pDC->prgnRao, + pDC->prgnVis, + NULL, + RGN_COPY); } REGION_bOffsetRgn(pDC->prgnRao, pDC->ptlDCOrig.x, pDC->ptlDCOrig.y); RtlCopyMemory(&pDC->erclClip, - &pDC->prgnRao->rdh.rcBound, - sizeof(RECTL)); + &pDC->prgnRao->rdh.rcBound, + sizeof(RECTL)); pDC->fs &= ~DC_FLAG_DIRTY_RAO; - UpdateVisRgn(pDC); // pDC->co should be used. Example, CLIPOBJ_cEnumStart uses XCLIPOBJ to build // the rects from region objects rects in pClipRgn->Buffer. diff --git a/win32ss/gdi/ntgdi/cliprgn.h b/win32ss/gdi/ntgdi/cliprgn.h index d8230b9..af7933b 100644 --- a/win32ss/gdi/ntgdi/cliprgn.h +++ b/win32ss/gdi/ntgdi/cliprgn.h @@ -12,7 +12,3 @@ INT FASTCALL IntGdiExtSelectClipRgn (PDC dc, PREGION prgn, int fnMode); VOID FASTCALL CLIPPING_UpdateGCRegion(DC* Dc); VOID FASTCALL IntGdiReleaseRaoRgn(PDC); VOID FASTCALL IntGdiReleaseVisRgn(PDC); -VOID FASTCALL UpdateVisRgn(PDC); -BOOL FASTCALL REGION_bCopy(PREGION,PREGION); -BOOL FASTCALL REGION_bIntersectRegion(PREGION,PREGION,PREGION); -int FASTCALL IntGdiExtSelectClipRect(PDC,PRECTL,int); diff --git a/win32ss/gdi/ntgdi/dclife.c b/win32ss/gdi/ntgdi/dclife.c index ebf914f..51d5929 100644 --- a/win32ss/gdi/ntgdi/dclife.c +++ b/win32ss/gdi/ntgdi/dclife.c @@ -112,11 +112,6 @@ DC_InitHack(PDC pdc) DC_vCopyState(pdc, defaultDCstate, TRUE); } - if (prgnDefault == NULL) - { - prgnDefault = IntSysCreateRectpRgn(0, 0, 0, 0); - } - TextIntRealizeFont(pdc->pdcattr->hlfntNew,NULL); pdc->pdcattr->iCS_CP = ftGdiGetTextCharsetInfo(pdc,NULL,0); @@ -252,9 +247,6 @@ DC_vInitDc( pdc->prgnVis = IntSysCreateRectpRgn(0, 0, pdc->dclevel.sizl.cx, pdc->dclevel.sizl.cy); ASSERT(pdc->prgnVis); - /* Setup Vis Region Attribute information */ - UpdateVisRgn(pdc); - /* Initialize Clip object */ IntEngInitClipObj(&pdc->co); diff --git a/win32ss/gdi/ntgdi/dcutil.c b/win32ss/gdi/ntgdi/dcutil.c index 0ac907f..aa130f0 100644 --- a/win32ss/gdi/ntgdi/dcutil.c +++ b/win32ss/gdi/ntgdi/dcutil.c @@ -401,10 +401,11 @@ IntSetDefaultRegion(PDC pdc) pdc->erclWindow = rclWnd; pdc->erclClip = rclClip; /* Might be an InitDC or DCE... */ - pdc->ptlFillOrigin = pdc->dcattr.ptlBrushOrigin; + pdc->ptlFillOrigin.x = pdc->dcattr.ptlBrushOrigin.x; + pdc->ptlFillOrigin.y = pdc->dcattr.ptlBrushOrigin.y; return TRUE; } - // No Vis use the Default System Region. + pdc->prgnVis = prgnDefault; return FALSE; } diff --git a/win32ss/gdi/ntgdi/fillshap.c b/win32ss/gdi/ntgdi/fillshap.c index c18ff00..a42a341 100644 --- a/win32ss/gdi/ntgdi/fillshap.c +++ b/win32ss/gdi/ntgdi/fillshap.c @@ -1081,7 +1081,6 @@ NtGdiExtFloodFill( RECTL DestRect; POINTL Pt; ULONG ConvColor; - PREGION prgn; dc = DC_LockDc(hDC); if (!dc) @@ -1106,14 +1105,13 @@ NtGdiExtFloodFill( DC_vPrepareDCsForBlit(dc, &DestRect, NULL, NULL); + /// FIXME: what about prgnVIS? And what about REAL clipping? psurf = dc->dclevel.pSurface; - - prgn = dc->prgnRao ? dc->prgnRao : dc->prgnVis; - if (prgn) + if (dc->prgnRao) { - Ret = REGION_PtInRegion(prgn, Pt.x, Pt.y); + Ret = REGION_PtInRegion(dc->prgnRao, Pt.x, Pt.y); if (Ret) - REGION_GetRgnBox(prgn, (LPRECT)&DestRect); + REGION_GetRgnBox(dc->prgnRao, (LPRECT)&DestRect); else { DC_vFinishBlit(dc, NULL); diff --git a/win32ss/gdi/ntgdi/gdibatch.c b/win32ss/gdi/ntgdi/gdibatch.c index ab68c50..cccc706 100644 --- a/win32ss/gdi/ntgdi/gdibatch.c +++ b/win32ss/gdi/ntgdi/gdibatch.c @@ -424,13 +424,7 @@ GdiFlushUserBatch(PDC dc, PGDIBATCHHDR pHdr) } case GdiBCExtSelClipRgn: - { - PGDIBSEXTSELCLPRGN pgO; - if (!dc) break; - pgO = (PGDIBSEXTSELCLPRGN) pHdr; - IntGdiExtSelectClipRect( dc, &pgO->rcl, pgO->fnMode); break; - } case GdiBCSelObj: { diff --git a/win32ss/gdi/ntgdi/line.c b/win32ss/gdi/ntgdi/line.c index 5274fa2..5e53b0b 100644 --- a/win32ss/gdi/ntgdi/line.c +++ b/win32ss/gdi/ntgdi/line.c @@ -63,12 +63,14 @@ AddPenLinesBounds(PDC dc, int count, POINT *points) DPRINT(" r %d b %d\n",rect.right,rect.bottom); { - RECTL rcRgn = dc->erclClip; // Use the clip box for now. - - if (RECTL_bIntersectRect( &rcRgn, &rcRgn, &bounds )) - IntUpdateBoundsRect(dc, &rcRgn); + RECTL rcRgn; + if (dc->fs & DC_FLAG_DIRTY_RAO) CLIPPING_UpdateGCRegion(dc); + if (REGION_GetRgnBox(dc->prgnRao, &rcRgn)) + { + if (RECTL_bIntersectRect( &rcRgn, &rcRgn, &bounds )) IntUpdateBoundsRect(dc, &rcRgn); + } else - IntUpdateBoundsRect(dc, &bounds); + IntUpdateBoundsRect(dc, &bounds); } } diff --git a/win32ss/gdi/gdi32/include/gdi32p.h b/win32ss/gdi/gdi32/include/gdi32p.h index 50c13f8..d73eb70 100644 --- a/win32ss/gdi/gdi32/include/gdi32p.h +++ b/win32ss/gdi/gdi32/include/gdi32p.h @@ -398,7 +398,7 @@ GdiAllocBatchCommand( else if (Cmd == GdiBCTextOut) cjSize = sizeof(GDIBSTEXTOUT); else if (Cmd == GdiBCExtTextOut) cjSize = sizeof(GDIBSEXTTEXTOUT); else if (Cmd == GdiBCSetBrushOrg) cjSize = sizeof(GDIBSSETBRHORG); - else if (Cmd == GdiBCExtSelClipRgn) cjSize = sizeof(GDIBSEXTSELCLPRGN); + else if (Cmd == GdiBCExtSelClipRgn) cjSize = 0; else if (Cmd == GdiBCSelObj) cjSize = sizeof(GDIBSOBJECT); else if (Cmd == GdiBCDelRgn) cjSize = sizeof(GDIBSOBJECT); else if (Cmd == GdiBCDelObj) cjSize = sizeof(GDIBSOBJECT);