sna: Respect the error terms when reversing the PolyLine DDA

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2012-05-09 17:58:58 +01:00
parent a3d37fb29f
commit d5200510b8
1 changed files with 152 additions and 150 deletions

View File

@ -5948,6 +5948,7 @@ rectangle_continue:
}
} else if (adx >= ady) {
int x2_clipped = x2, y2_clipped = y2;
bool dirty;
/* X-major segment */
e1 = ady << 1;
@ -5985,43 +5986,54 @@ rectangle_continue:
e3 = e2 - e1;
e = e - e1;
if (sdx < 0) {
x = x2_clipped;
y = y2_clipped;
sdy = -sdy;
}
b->x1 = x;
b->y2 = b->y1 = y;
b->y1 = y;
dirty = false;
while (length--) {
e += e1;
x++;
dirty = true;
if (e >= 0) {
b->x2 = x;
b->y2++;
e += e3;
if (sdx < 0) {
b->x2 = b->x1 + 1;
b->x1 = x;
} else
b->x2 = x + 1;
b->y2 = b->y1 + 1;
if (++b == last_box) {
ret = &&X_continue;
goto *jump;
X_continue:
b = box;
}
y += sdy;
e += e3;
b->y2 = b->y1 = y;
b->x1 = x;
}
}
b->x2 = ++x;
b->y2++;
if (++b == last_box) {
ret = &&X_continue2;
goto *jump;
X_continue2:
b = box;
b->x1 = x + sdx;
b->y1 = y += sdy;
dirty = false;
}
x += sdx;
}
if (dirty) {
x -= sdx;
if (sdx < 0) {
b->x2 = b->x1 + 1;
b->x1 = x;
} else
b->x2 = x + 1;
b->y2 = b->y1 + 1;
if (++b == last_box) {
ret = &&X2_continue;
goto *jump;
X2_continue:
b = box;
}
}
} else {
int x2_clipped = x2, y2_clipped = y2;
bool dirty;
/* Y-major segment */
e1 = adx << 1;
@ -6060,62 +6072,50 @@ X_continue2:
e3 = e2 - e1;
e = e - e1;
if (sdx < 0) {
x = x2_clipped;
y = y2_clipped;
sdy = -sdy;
b->x1 = x;
b->y1 = y;
dirty = false;
while (length--) {
e += e1;
dirty = true;
if (e >= 0) {
e += e3;
if (sdy < 0) {
b->y2 = b->y1 + 1;
b->y1 = y;
} else
b->y2 = y + 1;
b->x2 = x + 1;
if (++b == last_box) {
ret = &&Y_continue;
goto *jump;
Y_continue:
b = box;
}
b->x1 = x += sdx;
b->y1 = y + sdy;
dirty = false;
}
y += sdy;
}
b->x2 = b->x1 = x;
if (sdy < 0) {
b->y2 = y + 1;
while (length--) {
e += e1;
y--;
if (e >= 0) {
b->y1 = y;
b->x2++;
if (++b == last_box) {
ret = &&Y_up_continue;
goto *jump;
Y_up_continue:
b = box;
}
e += e3;
b->x2 = b->x1 = ++x;
b->y2 = y;
}
}
if (dirty) {
if (sdy < 0) {
b->y2 = b->y1 + 1;
b->y1 = y;
} else
b->y2 = y + 1;
b->x2 = x + 1;
b->y1 = y;
} else {
b->y1 = y;
while (length--) {
e += e1;
y++;
if (e >= 0) {
b->y2 = y;
b->x2++;
if (++b == last_box) {
ret = &&Y_down_continue;
goto *jump;
Y_down_continue:
b = box;
}
e += e3;
b->x2 = b->x1 = ++x;
b->y1 = y;
}
if (++b == last_box) {
ret = &&Y2_continue;
goto *jump;
Y2_continue:
b = box;
}
b->y2 = ++y;
}
b->x2++;
if (++b == last_box) {
ret = &&Y_continue2;
goto *jump;
Y_continue2:
b = box;
}
}
}
@ -7222,6 +7222,8 @@ rectangle_continue:
b = box;
}
} else if (adx >= ady) {
bool dirty;
/* X-major segment */
e1 = ady << 1;
e2 = e1 - (adx << 1);
@ -7255,42 +7257,54 @@ rectangle_continue:
e3 = e2 - e1;
e = e - e1;
if (sdx < 0) {
x1 = x2;
y1 = y2;
sdy = -sdy;
}
b->x1 = x1;
b->y2 = b->y1 = y1;
while (--length) {
b->y1 = y1;
dirty = false;
while (length--) {
e += e1;
x1++;
dirty = true;
if (e >= 0) {
b->x2 = x1;
b->y2++;
e += e3;
if (sdx < 0) {
b->x2 = b->x1 + 1;
b->x1 = x1;
} else
b->x2 = x1 + 1;
b->y2 = b->y1 + 1;
if (++b == last_box) {
ret = &&X_continue;
goto *jump;
X_continue:
b = box;
}
y1 += sdy;
e += e3;
b->y2 = b->y1 = y1;
b->x1 = x1 + sdx;
b->y1 = y1 += sdy;
dirty = false;
}
x1 += sdx;
}
if (dirty) {
x1 -= sdx;
if (sdx < 0) {
b->x2 = b->x1 + 1;
b->x1 = x1;
} else
b->x2 = x1 + 1;
b->y2 = b->y1 + 1;
if (++b == last_box) {
ret = &&X2_continue;
goto *jump;
X2_continue:
b = box;
}
}
b->x2 = ++x1;
b->y2++;
if (++b == last_box) {
ret = &&X_continue2;
goto *jump;
X_continue2:
b = box;
}
} else {
bool dirty;
/* Y-major segment */
e1 = adx << 1;
e2 = e1 - (ady << 1);
@ -7326,62 +7340,50 @@ X_continue2:
e3 = e2 - e1;
e = e - e1;
if (sdx < 0) {
x1 = x2;
y1 = y2;
sdy = -sdy;
b->x1 = x1;
b->y1 = y1;
dirty = false;
while (length--) {
e += e1;
dirty = true;
if (e >= 0) {
e += e3;
if (sdy < 0) {
b->y2 = b->y1 + 1;
b->y1 = y1;
} else
b->y2 = y1 + 1;
b->x2 = x1 + 1;
if (++b == last_box) {
ret = &&Y_continue;
goto *jump;
Y_continue:
b = box;
}
b->x1 = x1 += sdx;
b->y1 = y1 + sdy;
dirty = false;
}
y1 += sdy;
}
b->x2 = b->x1 = x1;
if (sdy < 0) {
b->y2 = y1 + 1;
while (--length) {
e += e1;
y1--;
if (e >= 0) {
b->y1 = y1;
b->x2++;
if (++b == last_box) {
ret = &&Y_up_continue;
goto *jump;
Y_up_continue:
b = box;
}
e += e3;
b->x2 = b->x1 = ++x1;
b->y2 = y1;
}
}
if (dirty) {
if (sdy < 0) {
b->y2 = b->y1 + 1;
b->y1 = y1;
} else
b->y2 = y1 + 1;
b->x2 = x1 + 1;
b->y1 = y1;
} else {
b->y1 = y1;
while (--length) {
e += e1;
y1++;
if (e >= 0) {
b->y2 = y1;
b->x2++;
if (++b == last_box) {
ret = &&Y_down_continue;
goto *jump;
Y_down_continue:
b = box;
}
e += e3;
b->x2 = b->x1 = ++x1;
b->y1 = y1;
}
if (++b == last_box) {
ret = &&Y2_continue;
goto *jump;
Y2_continue:
b = box;
}
b->y2 = ++y1;
}
b->x2++;
if (++b == last_box) {
ret = &&Y_continue2;
goto *jump;
Y_continue2:
b = box;
}
}
} while (--n);