Author: cwittich Date: Sat Oct 17 23:04:04 2009 New Revision: 43545
URL: http://svn.reactos.org/svn/reactos?rev=43545&view=rev Log: fix all gdi32 gdiobj winetests
Modified: trunk/reactos/subsystems/win32/win32k/objects/region.c
Modified: trunk/reactos/subsystems/win32/win32k/objects/region.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/obj... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/objects/region.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/objects/region.c [iso-8859-1] Sat Oct 17 23:04:04 2009 @@ -2988,20 +2988,47 @@ FASTCALL REGION_RectInRegion( PROSRGNDATA Rgn, - const RECTL *rc + const RECTL *rect ) { PRECTL pCurRect, pRectEnd; - - // this is (just) a useful optimization - if ((Rgn->rdh.nCount > 0) && EXTENTCHECK(&Rgn->rdh.rcBound, rc)) - { - for (pCurRect = Rgn->Buffer, pRectEnd = pCurRect + Rgn->rdh.nCount; pCurRect < pRectEnd; pCurRect++) - { - if (pCurRect->bottom <= rc->top) continue; // not far enough down yet - if (pCurRect->top >= rc->bottom) break; // too far down - if (pCurRect->right <= rc->left) continue; // not far enough over yet - if (pCurRect->left >= rc->right) continue; + RECT rc; + + /* swap the coordinates to make right >= left and bottom >= top */ + /* (region building rectangles are normalized the same way) */ + if( rect->top > rect->bottom) { + rc.top = rect->bottom; + rc.bottom = rect->top; + } else { + rc.top = rect->top; + rc.bottom = rect->bottom; + } + if( rect->right < rect->left) { + rc.right = rect->left; + rc.left = rect->right; + } else { + rc.right = rect->right; + rc.left = rect->left; + } + + /* this is (just) a useful optimization */ + if ((Rgn->rdh.nCount > 0) && EXTENTCHECK(&Rgn->rdh.rcBound, &rc)) + { + for (pCurRect = Rgn->Buffer, pRectEnd = pCurRect + + Rgn->rdh.nCount; pCurRect < pRectEnd; pCurRect++) + { + if (pCurRect->bottom <= rc.top) + continue; /* not far enough down yet */ + + if (pCurRect->top >= rc.bottom) + break; /* too far down */ + + if (pCurRect->right <= rc.left) + continue; /* not far enough over yet */ + + if (pCurRect->left >= rc.right) { + continue; + }
return TRUE; }