From 71d693cef0f72fb06a6d030c98e0ac5cd8527e3f Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Tue, 25 May 2010 11:41:29 +0000 Subject: [PATCH] [WIN32K] 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 --- .../subsystems/win32/win32k/objects/cliprgn.c | 45 +++++++++++-------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/reactos/subsystems/win32/win32k/objects/cliprgn.c b/reactos/subsystems/win32/win32k/objects/cliprgn.c index c5297c38ba2..77415e686b6 100644 --- a/reactos/subsystems/win32/win32k/objects/cliprgn.c +++ b/reactos/subsystems/win32/win32k/objects/cliprgn.c @@ -60,24 +60,28 @@ CLIPPING_UpdateGCRegion(DC* Dc) NtGdiOffsetRgn(Dc->rosdc.hGCClipRgn, Dc->ptlDCOrig.x, Dc->ptlDCOrig.y); - if((CombinedRegion = RGNOBJAPI_Lock(Dc->rosdc.hGCClipRgn, NULL))) - { - if (Dc->rosdc.CombinedClip != NULL) - IntEngDeleteClipRegion(Dc->rosdc.CombinedClip); + if((CombinedRegion = RGNOBJAPI_Lock(Dc->rosdc.hGCClipRgn, NULL))) + { + CLIPOBJ *CombinedClip; + + CombinedClip = IntEngCreateClipRegion(CombinedRegion->rdh.nCount, + CombinedRegion->Buffer, + &CombinedRegion->rdh.rcBound); - Dc->rosdc.CombinedClip = IntEngCreateClipRegion( - CombinedRegion->rdh.nCount, - CombinedRegion->Buffer, - &CombinedRegion->rdh.rcBound); + RGNOBJAPI_Unlock(CombinedRegion); - 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); } @@ -607,9 +611,6 @@ NEW_CLIPPING_UpdateGCRegion(PDC pDC) 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 // the rects from region objects rects in pClipRgn->Buffer. // With pDC->co.pClipRgn->Buffer, @@ -619,7 +620,13 @@ NEW_CLIPPING_UpdateGCRegion(PDC pDC) ((PROSRGNDATA)pDC->prgnRao)->Buffer, &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); }