Delete old clipregion only and set a new one, if it could be created already, to avoid setting a NULL region.

See issue #4431 for more details.

svn path=/trunk/; revision=47349
This commit is contained in:
Timo Kreuzer 2010-05-25 11:41:29 +00:00
parent bb079cacb0
commit 71d693cef0

View file

@ -60,24 +60,28 @@ CLIPPING_UpdateGCRegion(DC* Dc)
NtGdiOffsetRgn(Dc->rosdc.hGCClipRgn, Dc->ptlDCOrig.x, Dc->ptlDCOrig.y); NtGdiOffsetRgn(Dc->rosdc.hGCClipRgn, Dc->ptlDCOrig.x, Dc->ptlDCOrig.y);
if((CombinedRegion = RGNOBJAPI_Lock(Dc->rosdc.hGCClipRgn, NULL))) if((CombinedRegion = RGNOBJAPI_Lock(Dc->rosdc.hGCClipRgn, NULL)))
{ {
if (Dc->rosdc.CombinedClip != NULL) CLIPOBJ *CombinedClip;
IntEngDeleteClipRegion(Dc->rosdc.CombinedClip);
CombinedClip = IntEngCreateClipRegion(CombinedRegion->rdh.nCount,
CombinedRegion->Buffer,
&CombinedRegion->rdh.rcBound);
Dc->rosdc.CombinedClip = IntEngCreateClipRegion( RGNOBJAPI_Unlock(CombinedRegion);
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;
}
if ( NULL == Dc->rosdc.CombinedClip )
{
DPRINT1("IntEngCreateClipRegion() failed\n");
return ERROR;
}
return NtGdiOffsetRgn(Dc->rosdc.hGCClipRgn, -Dc->ptlDCOrig.x, -Dc->ptlDCOrig.y); return NtGdiOffsetRgn(Dc->rosdc.hGCClipRgn, -Dc->ptlDCOrig.x, -Dc->ptlDCOrig.y);
} }
@ -607,9 +611,6 @@ NEW_CLIPPING_UpdateGCRegion(PDC pDC)
IntGdiOffsetRgn(pDC->prgnRao, pDC->ptlDCOrig.x, pDC->ptlDCOrig.y); IntGdiOffsetRgn(pDC->prgnRao, pDC->ptlDCOrig.x, pDC->ptlDCOrig.y);
if (pDC->rosdc.CombinedClip != NULL)
IntEngDeleteClipRegion(pDC->rosdc.CombinedClip);
// pDC->co should be used. Example, CLIPOBJ_cEnumStart uses XCLIPOBJ to build // pDC->co should be used. Example, CLIPOBJ_cEnumStart uses XCLIPOBJ to build
// the rects from region objects rects in pClipRgn->Buffer. // the rects from region objects rects in pClipRgn->Buffer.
// With pDC->co.pClipRgn->Buffer, // With pDC->co.pClipRgn->Buffer,
@ -619,7 +620,13 @@ NEW_CLIPPING_UpdateGCRegion(PDC pDC)
((PROSRGNDATA)pDC->prgnRao)->Buffer, ((PROSRGNDATA)pDC->prgnRao)->Buffer,
&pDC->erclClip); &pDC->erclClip);
pDC->rosdc.CombinedClip = co; 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); return IntGdiOffsetRgn(pDC->prgnRao, -pDC->ptlDCOrig.x, -pDC->ptlDCOrig.y);
} }