Fix REGION_vSyncRegion and RGNOBJAPI_Unlock to actually make sense

svn path=/trunk/; revision=65737
This commit is contained in:
Timo Kreuzer 2014-12-18 08:13:06 +00:00
parent dd9435905a
commit 383e40f59f

View file

@ -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);
pRgn_Attr = GDIOBJ_pvGetObjectAttr(&pRgn->BaseObject); NT_ASSERT((prgn->prgnattr == &prgn->rgnattr) ||
(prgn->prgnattr->AttrFlags & ATTR_RGN_VALID));
if ( pRgn_Attr ) /* Get the region attribute and check if it's dirty (modified) */
prgnattr = prgn->prgnattr;
if (prgnattr->AttrFlags & ATTR_RGN_DIRTY)
{ {
_SEH2_TRY NT_ASSERT(GreGetObjectOwner(prgn->BaseObject.hHmgr) == GDI_OBJ_HMGR_POWNED);
{ NT_ASSERT(prgnattr != &prgn->rgnattr);
if ( !(pRgn_Attr->AttrFlags & ATTR_CACHED) )
{
if ( pRgn_Attr->AttrFlags & (ATTR_RGN_VALID|ATTR_RGN_DIRTY) )
{
switch (pRgn_Attr->iComplexity)
{
case NULLREGION:
EMPTY_REGION( pRgn );
break;
case SIMPLEREGION: if (prgnattr->iComplexity == NULLREGION)
REGION_SetRectRgn( pRgn,
pRgn_Attr->Rect.left,
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; EMPTY_REGION(prgn);
} }
_SEH2_END; else if (prgnattr->iComplexity == SIMPLEREGION)
{
REGION_SetRectRgn(prgn,
prgnattr->Rect.left,
prgnattr->Rect.top,
prgnattr->Rect.right,
prgnattr->Rect.bottom);
}
else
{
/* Should not happen, region attribute is corrupted! */
DPRINT1("Region attribute is corrupted, ignoring\n");
NT_ASSERT(FALSE);
} }
} }
/* 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);
pRgn_Attr = GDIOBJ_pvGetObjectAttr(&pRgn->BaseObject);
if ( pRgn_Attr ) /* Get the region attribute and check if it's user mode */
prgnattr = prgn->prgnattr;
if (prgnattr != &prgn->rgnattr)
{ {
_SEH2_TRY NT_ASSERT(GreGetObjectOwner(prgn->BaseObject.hHmgr) == GDI_OBJ_HMGR_POWNED);
{ prgnattr->iComplexity = REGION_Complexity(prgn);
if ( pRgn_Attr->AttrFlags & ATTR_RGN_VALID ) prgnattr->Rect.left = prgn->rdh.rcBound.left;
{ prgnattr->Rect.top = prgn->rdh.rcBound.top;
pRgn_Attr->iComplexity = REGION_Complexity( pRgn ); prgnattr->Rect.right = prgn->rdh.rcBound.right;
pRgn_Attr->Rect.left = pRgn->rdh.rcBound.left; prgnattr->Rect.bottom = prgn->rdh.rcBound.bottom;
pRgn_Attr->Rect.top = pRgn->rdh.rcBound.top; prgnattr->AttrFlags |= ATTR_RGN_VALID;
pRgn_Attr->Rect.right = pRgn->rdh.rcBound.right;
pRgn_Attr->Rect.bottom = pRgn->rdh.rcBound.bottom;
} }
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) REGION_UnlockRgn(prgn);
{
(VOID)0;
}
_SEH2_END;
}
}
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]);
if (aprgn[1] != aprgn[0])
REGION_vSyncRegion(aprgn[1]); REGION_vSyncRegion(aprgn[1]);
if (aprgn[2]) REGION_vSyncRegion(aprgn[2]); 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;
} }