git.cweiske.de
/
enigma2.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fixes bug #291
[enigma2.git]
/
lib
/
gdi
/
region.cpp
diff --git
a/lib/gdi/region.cpp
b/lib/gdi/region.cpp
index cbac53f8f2d9b1abc6f868164a762c2863fb7817..1208c97ec893d0dbc5be5311ff66f62c8f62b4dc 100644
(file)
--- a/
lib/gdi/region.cpp
+++ b/
lib/gdi/region.cpp
@@
-26,10
+26,11
@@
gRegion::gRegion(const eRect &rect) : extends(rect)
{
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;
{
// 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<eRect>::iterator prevBox = rects.begin() + prevStart;
if (!numRects)
return curStart;
std::vector<eRect>::iterator prevBox = rects.begin() + prevStart;
@@
-83,11
+84,11
@@
void gRegion::appendNonO(std::vector<eRect>::const_iterator r,
std::vector<eRect>::const_iterator rEnd, int y1, int y2)
{
int newRects = rEnd - r;
std::vector<eRect>::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 {
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);
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;
{
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);
do {
x1 = max(r1->x1, r2->x1);
@@
-130,8
+131,8
@@
void gRegion::subtractO(
int x1;
x1 = r1->x1;
int x1;
x1 = r1->x1;
-
assert
(y1<y2);
-
assert
(r1 != r1End && r2 != r2End);
+
ASSERT
(y1<y2);
+
ASSERT
(r1 != r1End && r2 != r2End);
do {
if (r2->x2 <= x1)
do {
if (r2->x2 <= x1)
@@
-145,7
+146,7
@@
void gRegion::subtractO(
} else
++r2;
} else if (r2->x1 < r1->x2) {
} else
++r2;
} else if (r2->x1 < r1->x2) {
-
assert
(x1<r2->x1);
+
ASSERT
(x1<r2->x1);
rects.push_back(eRect(x1, y1, r2->x1 - x1, y2 - y1));
x1 = r2->x2;
if (x1 >= r1->x2) {
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)
{
} while ((r1 != r1End) && (r2 != r2End));
while (r1 != r1End)
{
-
assert
(x1<r1->x2);
+
ASSERT
(x1<r1->x2);
rects.push_back(eRect(x1, y1, r1->x2 - x1, y2 - y1));
++r1;
if (r1 != r1End)
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;
{
int x1, x2;
-
assert
(y1 < y2);
-
assert
(r1 != r1End && r2 != r2End);
+
ASSERT
(y1 < y2);
+
ASSERT
(r1 != r1End && r2 != r2End);
if (r1->x1 < r2->x1)
{
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();
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;
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 {
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) {
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();
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;
}
}
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:
mergeO(r1, r1BandEnd, r2, r2BandEnd, ytop, ybot, overlap);
break;
default:
-
assert
(0);
+
ASSERT
(0);
break;
}
coalesce(prevBand, curBand);
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);
}
coalesce(prevBand, curBand);
AppendRegions(r2BandEnd, r2End);
}
+
extends = eRect();
extends = eRect();
- for (int a=0; a<rects.size(); ++a)
- extends = extends | eRect(rects[0].topLeft(), rects[rects.size()-1].bottomRight());
+ for (unsigned int a = 0; a<rects.size(); ++a)
+ extends = extends | rects[a];
+ if (!extends.valid())
+ extends = eRect::emptyRect();
}
void gRegion::intersect(const gRegion &r1, const gRegion &r2)
{
}
void gRegion::intersect(const gRegion &r1, const gRegion &r2)
{
+ /* in case one region is empty, the resulting regions is empty, too. */
if (r1.rects.empty())
{
if (r1.rects.empty())
{
- *this = r
2
;
+ *this = r
1
;
return;
}
if (r2.rects.empty())
{
return;
}
if (r2.rects.empty())
{
- *this = r
1
;
+ *this = r
2
;
return;
}
int overlap;
return;
}
int overlap;
@@
-416,8
+421,15
@@
gRegion &gRegion::operator|=(const gRegion &r2)
void gRegion::moveBy(ePoint offset)
{
extends.moveBy(offset);
void gRegion::moveBy(ePoint offset)
{
extends.moveBy(offset);
- int i;
+
unsigned
int i;
for (i=0; i<rects.size(); ++i)
rects[i].moveBy(offset);
}
for (i=0; i<rects.size(); ++i)
rects[i].moveBy(offset);
}
+void gRegion::scale(int x_n, int x_d, int y_n, int y_d)
+{
+ int i;
+ for (i=0; i<rects.size(); ++i)
+ rects[i].scale(x_n, x_d, y_n, y_d);
+}
+