X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/d6f6602d7cea3a7899990fe79216af7d98d05917..ee359c263a2c534db6a94601f1d7906cdd9f04c7:/lib/gdi/region.cpp diff --git a/lib/gdi/region.cpp b/lib/gdi/region.cpp index f341e79a..1208c97e 100644 --- a/lib/gdi/region.cpp +++ b/lib/gdi/region.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #undef max #define max(a,b) ((a) > (b) ? (a) : (b)) @@ -25,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()) { } @@ -40,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; @@ -82,12 +84,12 @@ 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); - rects.push_back(eRect(r->x1, y1, r->x2, y2)); + ASSERT(r->x1 < r->x2); + rects.push_back(eRect(r->x1, y1, r->x2 - r->x1, y2 - y1)); r++; } while (r != rEnd); } @@ -102,15 +104,15 @@ 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); x2 = min(r1->x2, r2->x2); if (x1 < x2) - rects.push_back(eRect(x1, y1, x2, y2)); + rects.push_back(eRect(x1, y1, x2 - x1, y2 - y1)); if (r1->x2 == x2) r1++; if (r2->x2 == x2) @@ -129,8 +131,8 @@ void gRegion::subtractO( int x1; x1 = r1->x1; - assert(y1x2 <= x1) @@ -144,8 +146,8 @@ void gRegion::subtractO( } else ++r2; } else if (r2->x1 < r1->x2) { - assert(x1x1); - rects.push_back(eRect(x1, y1, r2->x1, y2)); + ASSERT(x1x1); + rects.push_back(eRect(x1, y1, r2->x1 - x1, y2 - y1)); x1 = r2->x2; if (x1 >= r1->x2) { ++r1; @@ -156,7 +158,7 @@ void gRegion::subtractO( } else { if (r1->x2 > x1) - rects.push_back(eRect(x1, y1, r1->x2, y2)); + rects.push_back(eRect(x1, y1, r1->x2 - x1, y2 - y1)); ++r1; if (r1 != r1End) x1 = r1->x1; @@ -164,8 +166,8 @@ void gRegion::subtractO( } while ((r1 != r1End) && (r2 != r2End)); while (r1 != r1End) { - assert(x1x2); - rects.push_back(eRect(x1, y1, r1->x2, y2)); + ASSERT(x1x2); + rects.push_back(eRect(x1, y1, r1->x2 - x1, y2 - y1)); ++r1; if (r1 != r1End) x1 = r1->x1; @@ -180,7 +182,7 @@ void gRegion::subtractO( if (x2 < r->x2) x2 = r->x2; \ } else { \ /* Add current rectangle, start new one */ \ - rects.push_back(eRect(x1, y1, x2, y2)); \ + rects.push_back(eRect(x1, y1, x2 - x1, y2 - y1)); \ x1 = r->x1; \ x2 = r->x2; \ } \ @@ -197,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) { @@ -225,7 +227,7 @@ void gRegion::mergeO( MERGERECT(r2); } while (r2 != r2End); } - rects.push_back(eRect(x1, y1, x2, y2)); + rects.push_back(eRect(x1, y1, x2 - x1, y2 - y1)); } void gRegion::regionOp(const gRegion ®1, const gRegion ®2, int opcode, int &overlap) @@ -242,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; @@ -254,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) { @@ -264,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; @@ -297,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); @@ -318,10 +320,28 @@ void gRegion::regionOp(const gRegion ®1, const gRegion ®2, int opcode, int coalesce(prevBand, curBand); AppendRegions(r2BandEnd, r2End); } + + extends = eRect(); + + for (unsigned int a = 0; a