Index: reactos/win32ss/gdi/ntgdi/region.c =================================================================== --- reactos/win32ss/gdi/ntgdi/region.c (revision 74543) +++ reactos/win32ss/gdi/ntgdi/region.c (working copy) @@ -2088,6 +2088,24 @@ NT_ASSERT(FALSE); } + /* Kill all rectangles of width zero and/or height zero */ + for (i = j = 0; i < prgn->rdh.nCount; ++i) + { + if (prgn->Buffer[i].left == prgn->Buffer[i].right || + prgn->Buffer[i].top == prgn->Buffer[i].bottom) + { + continue; + } + + if (j != i) + { + prgn->Buffer[j] = prgn->Buffer[i]; + } + j++; + } + prgn->rdh.nCount = j; + prgn->rdh.nRgnSize = prgn->rdh.nCount * sizeof(RECTL); + /* Reset bounds */ RECTL_vSetEmptyRect(&prgn->rdh.rcBound); @@ -2103,13 +2121,20 @@ &prgn->Buffer[i]); } + if (prgn->rdh.nCount == 0) + { + ExFreePoolWithTag(prgn->Buffer, GDITAG_REGION); + prgn->Buffer = NULL; + return TRUE; + } + /* Loop all rects in the region */ for (i = 0; i < prgn->rdh.nCount - 1; i++) { - for (j = i; i < prgn->rdh.nCount; i++) + for (j = i + 1; j < prgn->rdh.nCount; j++) { NT_ASSERT(prgn->Buffer[i].top < prgn->Buffer[i].bottom); - NT_ASSERT(prgn->Buffer[j].top >= prgn->Buffer[i].top); + NT_ASSERT(prgn->Buffer[i].top <= prgn->Buffer[j].top); } }