xf86-video-intel: src/sna/sna_accel.c

Chris Wilson ickle at kemper.freedesktop.org
Wed May 9 11:26:21 PDT 2012


 src/sna/sna_accel.c |  288 ++++++++++++++++++++++++++--------------------------
 1 file changed, 145 insertions(+), 143 deletions(-)

New commits:
commit d5200510b8f2a0ccb2e0c45dfebc659f8360780c
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed May 9 17:58:58 2012 +0100

    sna: Respect the error terms when reversing the PolyLine DDA
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index d52328d..5f4e74f 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -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->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;
 
-				b->x2 = ++x;
-				b->y2++;
-				if (++b == last_box) {
-					ret = &&X_continue2;
-					goto *jump;
-X_continue2:
-					b = box;
+					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;
 
-				b->x2 = b->x1 = x;
-				if (sdy < 0) {
-					b->y2 = y + 1;
-					while (length--) {
-						e += e1;
-						y--;
-						if (e >= 0) {
+						if (sdy < 0) {
+							b->y2 = b->y1 + 1;
 							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;
-						}
-					}
+						} 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 = &&Y_continue;
+							goto *jump;
+Y_continue:
+							b = box;
 						}
-					}
 
-					b->y2 = ++y;
+						b->x1 = x += sdx;
+						b->y1 = y + sdy;
+						dirty = false;
+					}
+					y += sdy;
 				}
-				b->x2++;
-				if (++b == last_box) {
-					ret = &&Y_continue2;
-					goto *jump;
-Y_continue2:
-					b = box;
+
+				if (dirty) {
+					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 = &&Y2_continue;
+						goto *jump;
+Y2_continue:
+						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;
+
+						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;
 
-				b->x2 = ++x1;
-				b->y2++;
-				if (++b == last_box) {
-					ret = &&X_continue2;
-					goto *jump;
-X_continue2:
-					b = box;
+					if (++b == last_box) {
+						ret = &&X2_continue;
+						goto *jump;
+X2_continue:
+						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;
 
-				b->x2 = b->x1 = x1;
-				if (sdy < 0) {
-					b->y2 = y1 + 1;
-					while (--length) {
-						e += e1;
-						y1--;
-						if (e >= 0) {
+						if (sdy < 0) {
+							b->y2 = b->y1 + 1;
 							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;
-						}
-					}
+						} 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 = &&Y_continue;
+							goto *jump;
+Y_continue:
+							b = box;
 						}
-					}
 
-					b->y2 = ++y1;
+						b->x1 = x1 += sdx;
+						b->y1 = y1 + sdy;
+						dirty = false;
+					}
+					y1 += sdy;
 				}
-				b->x2++;
-				if (++b == last_box) {
-					ret = &&Y_continue2;
-					goto *jump;
-Y_continue2:
-					b = box;
+
+				if (dirty) {
+					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 = &&Y2_continue;
+						goto *jump;
+Y2_continue:
+						b = box;
+					}
 				}
 			}
 		} while (--n);


More information about the xorg-commit mailing list