mirror of
https://github.com/reactos/reactos.git
synced 2024-10-06 01:13:38 +00:00
[WIN32K]
Fix REGION_vSyncRegion and RGNOBJAPI_Unlock to actually make sense svn path=/trunk/; revision=65737
This commit is contained in:
parent
dd9435905a
commit
383e40f59f
|
@ -2274,51 +2274,47 @@ REGION_AllocUserRgnWithHandle(
|
||||||
return prgn;
|
return prgn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
VOID
|
VOID
|
||||||
NTAPI
|
|
||||||
REGION_vSyncRegion(
|
REGION_vSyncRegion(
|
||||||
PREGION pRgn)
|
PREGION prgn)
|
||||||
{
|
{
|
||||||
PRGN_ATTR pRgn_Attr = NULL;
|
PRGN_ATTR prgnattr;
|
||||||
|
|
||||||
if (pRgn && pRgn->prgnattr != &pRgn->rgnattr)
|
NT_ASSERT(prgn != NULL);
|
||||||
|
NT_ASSERT(prgn->prgnattr != NULL);
|
||||||
|
NT_ASSERT((prgn->prgnattr == &prgn->rgnattr) ||
|
||||||
|
(prgn->prgnattr->AttrFlags & ATTR_RGN_VALID));
|
||||||
|
|
||||||
|
/* Get the region attribute and check if it's dirty (modified) */
|
||||||
|
prgnattr = prgn->prgnattr;
|
||||||
|
if (prgnattr->AttrFlags & ATTR_RGN_DIRTY)
|
||||||
{
|
{
|
||||||
pRgn_Attr = GDIOBJ_pvGetObjectAttr(&pRgn->BaseObject);
|
NT_ASSERT(GreGetObjectOwner(prgn->BaseObject.hHmgr) == GDI_OBJ_HMGR_POWNED);
|
||||||
|
NT_ASSERT(prgnattr != &prgn->rgnattr);
|
||||||
|
|
||||||
if ( pRgn_Attr )
|
if (prgnattr->iComplexity == NULLREGION)
|
||||||
{
|
{
|
||||||
_SEH2_TRY
|
EMPTY_REGION(prgn);
|
||||||
{
|
}
|
||||||
if ( !(pRgn_Attr->AttrFlags & ATTR_CACHED) )
|
else if (prgnattr->iComplexity == SIMPLEREGION)
|
||||||
{
|
{
|
||||||
if ( pRgn_Attr->AttrFlags & (ATTR_RGN_VALID|ATTR_RGN_DIRTY) )
|
REGION_SetRectRgn(prgn,
|
||||||
{
|
prgnattr->Rect.left,
|
||||||
switch (pRgn_Attr->iComplexity)
|
prgnattr->Rect.top,
|
||||||
{
|
prgnattr->Rect.right,
|
||||||
case NULLREGION:
|
prgnattr->Rect.bottom);
|
||||||
EMPTY_REGION( pRgn );
|
}
|
||||||
break;
|
else
|
||||||
|
{
|
||||||
case SIMPLEREGION:
|
/* Should not happen, region attribute is corrupted! */
|
||||||
REGION_SetRectRgn( pRgn,
|
DPRINT1("Region attribute is corrupted, ignoring\n");
|
||||||
pRgn_Attr->Rect.left,
|
NT_ASSERT(FALSE);
|
||||||
pRgn_Attr->Rect.top,
|
|
||||||
pRgn_Attr->Rect.right,
|
|
||||||
pRgn_Attr->Rect.bottom );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
pRgn_Attr->AttrFlags &= ~ATTR_RGN_DIRTY;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
|
||||||
{
|
|
||||||
(VOID)0;
|
|
||||||
}
|
|
||||||
_SEH2_END;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Reset the flags */
|
||||||
|
prgnattr->AttrFlags &= ~(ATTR_RGN_DIRTY | ATTR_RGN_VALID);
|
||||||
}
|
}
|
||||||
|
|
||||||
PREGION
|
PREGION
|
||||||
|
@ -2344,35 +2340,27 @@ RGNOBJAPI_Lock(
|
||||||
VOID
|
VOID
|
||||||
FASTCALL
|
FASTCALL
|
||||||
RGNOBJAPI_Unlock(
|
RGNOBJAPI_Unlock(
|
||||||
PREGION pRgn)
|
PREGION prgn)
|
||||||
{
|
{
|
||||||
PRGN_ATTR pRgn_Attr;
|
PRGN_ATTR prgnattr;
|
||||||
|
|
||||||
if (pRgn && GreGetObjectOwner(pRgn->BaseObject.hHmgr) == GDI_OBJ_HMGR_POWNED)
|
NT_ASSERT(prgn != NULL);
|
||||||
|
NT_ASSERT(prgn->prgnattr != NULL);
|
||||||
|
|
||||||
|
/* Get the region attribute and check if it's user mode */
|
||||||
|
prgnattr = prgn->prgnattr;
|
||||||
|
if (prgnattr != &prgn->rgnattr)
|
||||||
{
|
{
|
||||||
pRgn_Attr = GDIOBJ_pvGetObjectAttr(&pRgn->BaseObject);
|
NT_ASSERT(GreGetObjectOwner(prgn->BaseObject.hHmgr) == GDI_OBJ_HMGR_POWNED);
|
||||||
|
prgnattr->iComplexity = REGION_Complexity(prgn);
|
||||||
if ( pRgn_Attr )
|
prgnattr->Rect.left = prgn->rdh.rcBound.left;
|
||||||
{
|
prgnattr->Rect.top = prgn->rdh.rcBound.top;
|
||||||
_SEH2_TRY
|
prgnattr->Rect.right = prgn->rdh.rcBound.right;
|
||||||
{
|
prgnattr->Rect.bottom = prgn->rdh.rcBound.bottom;
|
||||||
if ( pRgn_Attr->AttrFlags & ATTR_RGN_VALID )
|
prgnattr->AttrFlags |= ATTR_RGN_VALID;
|
||||||
{
|
|
||||||
pRgn_Attr->iComplexity = REGION_Complexity( pRgn );
|
|
||||||
pRgn_Attr->Rect.left = pRgn->rdh.rcBound.left;
|
|
||||||
pRgn_Attr->Rect.top = pRgn->rdh.rcBound.top;
|
|
||||||
pRgn_Attr->Rect.right = pRgn->rdh.rcBound.right;
|
|
||||||
pRgn_Attr->Rect.bottom = pRgn->rdh.rcBound.bottom;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
|
||||||
{
|
|
||||||
(VOID)0;
|
|
||||||
}
|
|
||||||
_SEH2_END;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
REGION_UnlockRgn(pRgn);
|
|
||||||
|
REGION_UnlockRgn(prgn);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -2403,6 +2391,7 @@ IntSysCreateRectpRgn(
|
||||||
/* Initialize it */
|
/* Initialize it */
|
||||||
prgn->Buffer = &prgn->rdh.rcBound;
|
prgn->Buffer = &prgn->rdh.rcBound;
|
||||||
prgn->prgnattr = &prgn->rgnattr;
|
prgn->prgnattr = &prgn->rgnattr;
|
||||||
|
prgn->prgnattr->AttrFlags = ATTR_RGN_VALID;
|
||||||
REGION_SetRectRgn(prgn, LeftRect, TopRect, RightRect, BottomRect);
|
REGION_SetRectRgn(prgn, LeftRect, TopRect, RightRect, BottomRect);
|
||||||
|
|
||||||
return prgn;
|
return prgn;
|
||||||
|
@ -3522,19 +3511,19 @@ NtGdiCombineRgn(
|
||||||
|
|
||||||
/* HACK: Sync usermode attributes */
|
/* HACK: Sync usermode attributes */
|
||||||
REGION_vSyncRegion(aprgn[0]);
|
REGION_vSyncRegion(aprgn[0]);
|
||||||
REGION_vSyncRegion(aprgn[1]);
|
if (aprgn[1] != aprgn[0])
|
||||||
if (aprgn[2]) REGION_vSyncRegion(aprgn[2]);
|
REGION_vSyncRegion(aprgn[1]);
|
||||||
|
if ((aprgn[2] != NULL) && (aprgn[2] != aprgn[0]) && (aprgn[2] != aprgn[1]))
|
||||||
|
REGION_vSyncRegion(aprgn[2]);
|
||||||
|
|
||||||
/* Call the internal function */
|
/* Call the internal function */
|
||||||
iResult = IntGdiCombineRgn(aprgn[0], aprgn[1], aprgn[2], iMode);
|
iResult = IntGdiCombineRgn(aprgn[0], aprgn[1], aprgn[2], iMode);
|
||||||
|
|
||||||
/// FIXME: need to sync user attr back
|
/* Unlock and return */
|
||||||
|
RGNOBJAPI_Unlock(aprgn[0]);
|
||||||
/* Cleanup and return */
|
RGNOBJAPI_Unlock(aprgn[1]);
|
||||||
REGION_UnlockRgn(aprgn[0]);
|
if (aprgn[2] != NULL)
|
||||||
REGION_UnlockRgn(aprgn[1]);
|
RGNOBJAPI_Unlock(aprgn[2]);
|
||||||
if (aprgn[2])
|
|
||||||
REGION_UnlockRgn(aprgn[2]);
|
|
||||||
|
|
||||||
return iResult;
|
return iResult;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue