X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/3bad22d5566624804a73b3791980bab2d84c8266..68685e85480d5539ba0bb884c4ebeaa8c31a07f9:/lib/gdi/region.cpp diff --git a/lib/gdi/region.cpp b/lib/gdi/region.cpp index cbac53f8..73d9ac2d 100644 --- a/lib/gdi/region.cpp +++ b/lib/gdi/region.cpp @@ -26,10 +26,11 @@ gRegion::gRegion(const eRect &rect) : extends(rect) { - rects.push_back(rect); + if (rect.valid() && !rect.empty()) + rects.push_back(rect); } -gRegion::gRegion() +gRegion::gRegion() : extends(eRect::emptyRect()) { } @@ -41,7 +42,7 @@ int gRegion::do_coalesce(int prevStart, unsigned int curStart) { // Figure out how many rectangles are in the band. unsigned int numRects = curStart - prevStart; - assert(numRects == rects.size() - curStart); + ASSERT(numRects == rects.size() - curStart); if (!numRects) return curStart; std::vector::iterator prevBox = rects.begin() + prevStart; @@ -83,11 +84,11 @@ void gRegion::appendNonO(std::vector::const_iterator r, std::vector::const_iterator rEnd, int y1, int y2) { int newRects = rEnd - r; - assert(y1 < y2); - assert(newRects != 0); + ASSERT(y1 < y2); + ASSERT(newRects != 0); rects.reserve(rects.size() + newRects); do { - assert(r->x1 < r->x2); + ASSERT(r->x1 < r->x2); rects.push_back(eRect(r->x1, y1, r->x2 - r->x1, y2 - y1)); r++; } while (r != rEnd); @@ -103,8 +104,8 @@ void gRegion::intersectO( { int x1, x2; - assert(y1 < y2); - assert(r1 != r1End && r2 != r2End); + ASSERT(y1 < y2); + ASSERT(r1 != r1End && r2 != r2End); do { x1 = max(r1->x1, r2->x1); @@ -130,8 +131,8 @@ void gRegion::subtractO( int x1; x1 = r1->x1; - assert(y1x2 <= x1) @@ -145,7 +146,7 @@ void gRegion::subtractO( } else ++r2; } else if (r2->x1 < r1->x2) { - assert(x1x1); + ASSERT(x1x1); rects.push_back(eRect(x1, y1, r2->x1 - x1, y2 - y1)); x1 = r2->x2; if (x1 >= r1->x2) { @@ -165,7 +166,7 @@ void gRegion::subtractO( } while ((r1 != r1End) && (r2 != r2End)); while (r1 != r1End) { - assert(x1x2); + ASSERT(x1x2); rects.push_back(eRect(x1, y1, r1->x2 - x1, y2 - y1)); ++r1; if (r1 != r1End) @@ -198,8 +199,8 @@ void gRegion::mergeO( { int x1, x2; - assert(y1 < y2); - assert(r1 != r1End && r2 != r2End); + ASSERT(y1 < y2); + ASSERT(r1 != r1End && r2 != r2End); if (r1->x1 < r2->x1) { @@ -243,8 +244,8 @@ void gRegion::regionOp(const gRegion ®1, const gRegion ®2, int opcode, int int newSize = reg1.rects.size(); int numRects = reg2.rects.size(); - assert(r1 != r1End); - assert(r2 != r2End); + ASSERT(r1 != r1End); + ASSERT(r2 != r2End); if (numRects > newSize) newSize = numRects; @@ -255,8 +256,8 @@ void gRegion::regionOp(const gRegion ®1, const gRegion ®2, int opcode, int int ybot = min(r1->y1, r2->y1); prevBand = 0; do { - assert(r1 != r1End); - assert(r2 != r2End); + ASSERT(r1 != r1End); + ASSERT(r2 != r2End); FindBand(r1, r1BandEnd, r1End, r1y1); FindBand(r2, r2BandEnd, r2End, r2y1); if (r1y1 < r2y1) { @@ -265,8 +266,8 @@ void gRegion::regionOp(const gRegion ®1, const gRegion ®2, int opcode, int bot = min(r1->y2, r2y1); if (top != bot) { curBand = rects.size(); - appendNonO(r1, r1BandEnd, top, bot); - coalesce(prevBand, curBand); + appendNonO(r1, r1BandEnd, top, bot); + coalesce(prevBand, curBand); } } ytop = r2y1; @@ -298,7 +299,7 @@ void gRegion::regionOp(const gRegion ®1, const gRegion ®2, int opcode, int mergeO(r1, r1BandEnd, r2, r2BandEnd, ytop, ybot, overlap); break; default: - assert(0); + ASSERT(0); break; } coalesce(prevBand, curBand); @@ -319,22 +320,26 @@ void gRegion::regionOp(const gRegion ®1, const gRegion ®2, int opcode, int coalesce(prevBand, curBand); AppendRegions(r2BandEnd, r2End); } + extends = eRect(); - for (int a=0; a