From d225c3c95796f28047375c673c463c9bd03c9c77 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Tue, 1 Jan 2013 19:23:30 +0000 Subject: [PATCH] [WIN32K] - In NtGdiGetRandomRgn use the region pointers directly, instead of getting their handles. These regions might not even have a handle. - Fix last error code svn path=/trunk/; revision=58089 --- reactos/win32ss/gdi/ntgdi/dcobjs.c | 49 +++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 15 deletions(-) diff --git a/reactos/win32ss/gdi/ntgdi/dcobjs.c b/reactos/win32ss/gdi/ntgdi/dcobjs.c index db9bdbc8e06..85ef54bbcf9 100644 --- a/reactos/win32ss/gdi/ntgdi/dcobjs.c +++ b/reactos/win32ss/gdi/ntgdi/dcobjs.c @@ -615,12 +615,13 @@ NtGdiGetRandomRgn( INT ret = 0; PDC pdc; HRGN hrgnSrc = NULL; + PREGION prgnSrc = NULL; POINTL ptlOrg; pdc = DC_LockDc(hdc); if (!pdc) { - EngSetLastError(ERROR_INVALID_PARAMETER); + EngSetLastError(ERROR_INVALID_HANDLE); return -1; } @@ -628,34 +629,52 @@ NtGdiGetRandomRgn( { case CLIPRGN: hrgnSrc = pdc->rosdc.hClipRgn; -// if (pdc->dclevel.prgnClip) hrgnSrc = pdc->dclevel.prgnClip->BaseObject.hHmgr; +// if (pdc->dclevel.prgnClip) prgnSrc = pdc->dclevel.prgnClip; break; + case METARGN: - if (pdc->dclevel.prgnMeta) - hrgnSrc = pdc->dclevel.prgnMeta->BaseObject.hHmgr; + prgnSrc = pdc->dclevel.prgnMeta; break; + case APIRGN: - if (pdc->prgnAPI) hrgnSrc = pdc->prgnAPI->BaseObject.hHmgr; -// else if (pdc->dclevel.prgnClip) hrgnSrc = pdc->dclevel.prgnClip->BaseObject.hHmgr; - else if (pdc->rosdc.hClipRgn) hrgnSrc = pdc->rosdc.hClipRgn; - else if (pdc->dclevel.prgnMeta) hrgnSrc = pdc->dclevel.prgnMeta->BaseObject.hHmgr; - break; - case SYSRGN: - if (pdc->prgnVis) + if (pdc->prgnAPI) { - PREGION prgnDest = REGION_LockRgn(hrgnDest); - ret = IntGdiCombineRgn(prgnDest, pdc->prgnVis, 0, RGN_COPY) == ERROR ? -1 : 1; - REGION_UnlockRgn(prgnDest); + prgnSrc = pdc->prgnAPI; + } +// else if (pdc->dclevel.prgnClip) prgnSrc = pdc->dclevel.prgnClip; + else if (pdc->rosdc.hClipRgn) + { + hrgnSrc = pdc->rosdc.hClipRgn; + } + else if (pdc->dclevel.prgnMeta) + { + prgnSrc = pdc->dclevel.prgnMeta; } break; + + case SYSRGN: + prgnSrc = pdc->prgnVis; + break; + default: - hrgnSrc = NULL; + break; } if (hrgnSrc) { ret = NtGdiCombineRgn(hrgnDest, hrgnSrc, 0, RGN_COPY) == ERROR ? -1 : 1; } + else if (prgnSrc) + { + PREGION prgnDest = REGION_LockRgn(hrgnDest); + if (prgnDest) + { + ret = IntGdiCombineRgn(prgnDest, prgnSrc, 0, RGN_COPY) == ERROR ? -1 : 1; + REGION_UnlockRgn(prgnDest); + } + else + ret = -1; + } if (iCode == SYSRGN) {