From fad264815752b88e4ca4fc647b4ef0dd843a938e Mon Sep 17 00:00:00 2001 From: "chaos.proton@gmail.com" Date: Wed, 23 Nov 2011 19:00:08 +0000 Subject: [PATCH] components/rtgui_win: check the return value of overlapFunc overlapFunc will return RTGUI_REGION_STATUS_FAILURE in some circumstance(OOM etc), check it and return error if any thing goes wrong. It prevents garbage values crashing the system. Please ignore the eol diff noise. git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1802 bbd45198-f89e-11dd-88c7-29a3b14d5316 --- components/rtgui/common/region.c | 37 ++++++++++++++++---------------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/components/rtgui/common/region.c b/components/rtgui/common/region.c index 106550a702..cca9d7fd86 100644 --- a/components/rtgui/common/region.c +++ b/components/rtgui/common/region.c @@ -66,14 +66,14 @@ static rtgui_region_status_t rtgui_break(rtgui_region_t *pReg); * the y1 to y2 area spanned by the band), then the rectangle may be broken * down into two or more smaller rectangles stacked one atop the other. * - * ----------- ----------- - * | | | | band 0 - * | | -------- ----------- -------- - * | | | | in y-x banded | | | | band 1 - * | | | | form is | | | | - * ----------- | | ----------- -------- - * | | | | band 2 - * -------- -------- + * ----------- ----------- + * | | | | band 0 + * | | -------- ----------- -------- + * | | | | in y-x banded | | | | band 1 + * | | | | form is | | | | + * ----------- | | ----------- -------- + * | | | | band 2 + * -------- -------- * * An added constraint on the rectangles is that they must cover as much * horizontal area as possible: no two rectangles within a band are allowed @@ -113,8 +113,7 @@ static rtgui_region_status_t rtgui_break(rtgui_region_t *pReg); ((r1)->x2 >= (r2)->x2) && \ ((r1)->y1 <= (r2)->y1) && \ ((r1)->y2 >= (r2)->y2) ) - -/* true iff Box r1 and Box r2 constitute cross */ +/* true iff box r1 and box r2 constitute cross */ #define CROSS(r1,r2) \ ( ((r1)->x1 <= (r2)->x1) && \ ((r1)->x2 >= (r2)->x2) && \ @@ -641,8 +640,9 @@ rtgui_op( if (ybot > ytop) { curBand = newReg->data->numRects; - (* overlapFunc)(newReg, r1, r1BandEnd, r2, r2BandEnd, ytop, ybot, - pOverlap); + if ((* overlapFunc)(newReg, r1, r1BandEnd, r2, r2BandEnd, ytop, ybot, + pOverlap) == RTGUI_REGION_STATUS_FAILURE) + return RTGUI_REGION_STATUS_FAILURE; Coalesce(newReg, prevBand, curBand); } @@ -886,6 +886,7 @@ rtgui_region_intersect(rtgui_region_t *newReg, if (!rtgui_op(newReg, reg1, reg2, rtgui_region_intersectO, RTGUI_REGION_STATUS_FAILURE, RTGUI_REGION_STATUS_FAILURE, &overlap)) return RTGUI_REGION_STATUS_FAILURE; + rtgui_set_extents(newReg); } @@ -2243,13 +2244,13 @@ int rtgui_rect_is_intersect(const rtgui_rect_t *rect1, const rtgui_rect_t *rect2 { return RT_EOK; } - else if (CROSS(rect1,rect2)) - { - return RT_EOK; + else if (CROSS(rect1,rect2)) + { + return RT_EOK; } - else if (CROSS(rect2,rect1)) - { - return RT_EOK; + else if (CROSS(rect2,rect1)) + { + return RT_EOK; } return -RT_ERROR;