shithub: sce

Download patch

ref: 901dd9c361590f17f29ad5145845c8f070d1d2a9
parent: 4819125f8871bab19a4058f14b56bd933d78a357
author: qwx <qwx@sciops.net>
date: Wed Mar 11 19:24:41 EDT 2020

drw: refactor drawpic, make it more comprehensible

--- a/drw.c
+++ b/drw.c
@@ -74,60 +74,62 @@
 	}
 }
 
+static int
+boundpic(Rectangle *r)
+{
+	r->min.x -= pan.x / scale;
+	r->min.y -= pan.y / scale;
+	if(r->min.x + r->max.x < 0 || r->min.x >= fbw / scale
+	|| r->min.y + r->max.y < 0 || r->min.y >= fbh)
+		return -1;
+	if(r->min.x < 0){
+		r->max.x += r->min.x;
+		r->min.x = 0;
+	}else if(r->min.x + r->max.x > fbw / scale)
+		r->max.x = fbw / scale - r->min.x;
+	if(r->min.y < 0){
+		r->max.y += r->min.y;
+		r->min.y = 0;
+	}else if(r->min.y + r->max.y > fbh)
+		r->max.y = fbh - r->min.y;
+	r->min.x *= scale;
+	r->max.x *= scale;
+	return 0;
+}
+
 static void
 drawpic(int x, int y, Pic *pic)
 {
-	int n, k, w, pw, s, off;
-	u32int v, *pp, *ip;
+	int n, w, Δp, Δq;
+	u32int v, *p, *q;
+	Rectangle r;
 
-	/* FIXME: naming here sucks and is very confusing */
-	off = 0;
-	ip = pic->p;
-	pw = pic->w;
-	n = pic->h;
-	x -= pic->dx;
-	y -= pic->dy;
-	x -= pan.x / scale;
-	y -= pan.y / scale;
-	x *= scale;
-	if(x + pw * scale < 0 || x > fbw
-	|| y + n < 0 || y > fbh)
+	r = Rect(x - pic->dx, y - pic->dy, pic->w, pic->h);
+	if(boundpic(&r) < 0)
 		return;
-	if(y < 0){
-		ip -= y * pw;
-		n += y;
-		y = 0;
+	q = pic->p;
+	Δq = 0;
+	if(r.max.x < pic->w){
+		Δq = pic->w - r.max.x;
+		if(r.min.x == 0)
+			q += Δq;
 	}
-	if(x < 0){
-		ip -= x / scale;
-		off += pw;
-		pw += x / scale;
-		off -= pw;
-		x = 0;
-	}
-	pp = fb + y * fbw + x;
-	if(pp >= fbe)
-		return;
-	if(x + pw * scale > fbw){
-		off += pw;
-		pw = (fbw - x) / scale;
-		off -= pw;
-	}
-	if(y + n > fbh)
-		n = fbh - y;
-	w = fbw - pw * scale;
-	while(n-- > 0){
-		k = pw;
-		while(k-- > 0){
-			v = *ip++;
+	if(r.max.y < pic->h && r.min.y == 0)
+		q += pic->w * (pic->h - r.max.y);
+	p = fb + r.min.y * fbw + r.min.x;
+	Δp = fbw - r.max.x * scale;
+	while(r.max.y-- > 0){
+		w = r.max.x;
+		while(w-- > 0){
+			v = *q++;
 			if(v & 0xff << 24){
-				for(s=0; s<scale; s++)
-					*pp++ = v;
+				for(n=0; n<scale; n++)
+					*p++ = v;
 			}else
-				pp += scale;
+				p += scale;
 		}
-		ip += off;
-		pp += w;
+		q += Δq;
+		p += Δp;
 	}
 }