shithub: qk1

Download patch

ref: d14469607cb5d64b170ef6e9b79c3d812ff20641
parent: 0570725cbd9dfbf3268d12b5ba32b984931efd6f
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Fri Jan 5 13:07:55 EST 2024

another spans tweak from Yamagi Quake 2: faster for strictly horizontal/vertical texture scans

--- a/d_scan.c
+++ b/d_scan.c
@@ -50,30 +50,64 @@
 static inline void
 dospan_solid(pixel_t *pdest, pixel_t *pbase, int s, int t, int sstep, int tstep, int spancount, int width, uzint *pz, uzint izi, int izistep)
 {
-	pixel_t pix;
-	do{
-		*pz++ = izi;
-		pix = pbase[(s >> 16) + (t >> 16) * width];
-		s += sstep;
-		t += tstep;
-		izi += izistep;
-		*pdest++ = pix;
-	}while(--spancount);
+	if(((t + tstep*spancount) >> 16) == (t >> 16)){
+		pbase += (t >> 16) * width;
+		do{
+			*pdest++ = pbase[s >> 16];
+			*pz++ = izi;
+			s += sstep;
+			izi += izistep;
+		}while(--spancount);
+	}else if(((s + sstep*spancount) >> 16) == (s >> 16)){
+		pbase += s >> 16;
+		do{
+			*pdest++ = pbase[(t >> 16) * width];
+			*pz++ = izi;
+			t += tstep;
+			izi += izistep;
+		}while(--spancount);
+	}else{
+		do{
+			*pdest++ = pbase[(s >> 16) + (t >> 16) * width];
+			*pz++ = izi;
+			s += sstep;
+			t += tstep;
+			izi += izistep;
+		}while(--spancount);
+	}
 }
 
 static inline void
 dospan_solid_f1(pixel_t *pdest, pixel_t *pbase, int s, int t, int sstep, int tstep, int spancount, int width, uzint *pz, uzint izi, int izistep, fog_t *fog)
 {
-	pixel_t pix;
-	do{
-		*pz++ = izi;
-		izi += izistep;
-		pix = pbase[(s >> 16) + (t >> 16) * width];
-		s += sstep;
-		t += tstep;
-		*pdest++ = blendfog(pix, *fog);
-		fogstep(*fog);
-	}while(--spancount);
+	if(((t + tstep*spancount) >> 16) == (t >> 16)){
+		pbase += (t >> 16) * width;
+		do{
+			*pz++ = izi;
+			izi += izistep;
+			*pdest++ = blendfog(pbase[s >> 16], *fog);
+			fogstep(*fog);
+			s += sstep;
+		}while(--spancount);
+	}else if(((s + sstep*spancount) >> 16) == (s >> 16)){
+		pbase += s >> 16;
+		do{
+			*pz++ = izi;
+			izi += izistep;
+			*pdest++ = blendfog(pbase[(t >> 16) * width], *fog);
+			fogstep(*fog);
+			t += tstep;
+		}while(--spancount);
+	}else{
+		do{
+			*pz++ = izi;
+			izi += izistep;
+			*pdest++ = blendfog(pbase[(s >> 16) + (t >> 16) * width], *fog);
+			fogstep(*fog);
+			s += sstep;
+			t += tstep;
+		}while(--spancount);
+	}
 }
 
 static inline void
@@ -81,16 +115,40 @@
 {
 	pixel_t pix;
 
-	do{
-		pix = pbase[(s >> 16) + (t >> 16) * width];
-		s += sstep;
-		t += tstep;
-		if(opaque(pix) && *pz <= izi)
-			*pdest = blendalpha(pix, *pdest, alpha);
-		izi += izistep;
-		pdest++;
-		pz++;
-	}while(--spancount);
+	if(((t + tstep*spancount) >> 16) == (t >> 16)){
+		pbase += (t >> 16) * width;
+		do{
+			pix = pbase[s >> 16];
+			s += sstep;
+			if(opaque(pix) && *pz <= izi)
+				*pdest = blendalpha(pix, *pdest, alpha);
+			izi += izistep;
+			pdest++;
+			pz++;
+		}while(--spancount);
+	}else if(((s + sstep*spancount) >> 16) == (s >> 16)){
+		pbase += s >> 16;
+		do{
+			pix = pbase[(t >> 16) * width];
+			t += tstep;
+			if(opaque(pix) && *pz <= izi)
+				*pdest = blendalpha(pix, *pdest, alpha);
+			izi += izistep;
+			pdest++;
+			pz++;
+		}while(--spancount);
+	}else{
+		do{
+			pix = pbase[(s >> 16) + (t >> 16) * width];
+			s += sstep;
+			t += tstep;
+			if(opaque(pix) && *pz <= izi)
+				*pdest = blendalpha(pix, *pdest, alpha);
+			izi += izistep;
+			pdest++;
+			pz++;
+		}while(--spancount);
+	}
 }
 
 static inline void
@@ -98,17 +156,43 @@
 {
 	pixel_t pix;
 
-	do{
-		pix = pbase[(s >> 16) + (t >> 16) * width];
-		s += sstep;
-		t += tstep;
-		if(opaque(pix) && *pz <= izi)
-			*pdest = blendalpha(0xff<<24 | blendfog(pix, *fog), *pdest, alpha);
-		izi += izistep;
-		pdest++;
-		pz++;
-		fogstep(*fog);
-	}while(--spancount);
+	if(((t + tstep*spancount) >> 16) == (t >> 16)){
+		pbase += (t >> 16) * width;
+		do{
+			pix = pbase[s >> 16];
+			s += sstep;
+			if(opaque(pix) && *pz <= izi)
+				*pdest = blendalpha(0xff<<24 | blendfog(pix, *fog), *pdest, alpha);
+			fogstep(*fog);
+			izi += izistep;
+			pdest++;
+			pz++;
+		}while(--spancount);
+	}else if(((s + sstep*spancount) >> 16) == (s >> 16)){
+		pbase += s >> 16;
+		do{
+			pix = pbase[(t >> 16) * width];
+			t += tstep;
+			if(opaque(pix) && *pz <= izi)
+				*pdest = blendalpha(0xff<<24 | blendfog(pix, *fog), *pdest, alpha);
+			fogstep(*fog);
+			izi += izistep;
+			pdest++;
+			pz++;
+		}while(--spancount);
+	}else{
+		do{
+			pix = pbase[(s >> 16) + (t >> 16) * width];
+			s += sstep;
+			t += tstep;
+			if(opaque(pix) && *pz <= izi)
+				*pdest = blendalpha(0xff<<24 | blendfog(pix, *fog), *pdest, alpha);
+			fogstep(*fog);
+			izi += izistep;
+			pdest++;
+			pz++;
+		}while(--spancount);
+	}
 }
 
 static inline void
@@ -116,18 +200,46 @@
 {
 	pixel_t pix;
 
-	do{
-		pix = pbase[(s >> 16) + (t >> 16) * width];
-		s += sstep;
-		t += tstep;
-		if(opaque(pix) && *pz <= izi){
-			*pdest = pix;
-			*pz = izi;
-		}
-		izi += izistep;
-		pdest++;
-		pz++;
-	}while(--spancount);
+	if(((t + tstep*spancount) >> 16) == (t >> 16)){
+		pbase += (t >> 16) * width;
+		do{
+			pix = pbase[s >> 16];
+			s += sstep;
+			if(opaque(pix) && *pz <= izi){
+				*pdest = pix;
+				*pz = izi;
+			}
+			izi += izistep;
+			pdest++;
+			pz++;
+		}while(--spancount);
+	}else if(((s + sstep*spancount) >> 16) == (s >> 16)){
+		pbase += s >> 16;
+		do{
+			pix = pbase[(t >> 16) * width];
+			t += tstep;
+			if(opaque(pix) && *pz <= izi){
+				*pdest = pix;
+				*pz = izi;
+			}
+			izi += izistep;
+			pdest++;
+			pz++;
+		}while(--spancount);
+	}else{
+		do{
+			pix = pbase[(s >> 16) + (t >> 16) * width];
+			s += sstep;
+			t += tstep;
+			if(opaque(pix) && *pz <= izi){
+				*pdest = pix;
+				*pz = izi;
+			}
+			izi += izistep;
+			pdest++;
+			pz++;
+		}while(--spancount);
+	}
 }
 
 static inline void
@@ -135,19 +247,49 @@
 {
 	pixel_t pix;
 
-	do{
-		pix = pbase[(s >> 16) + (t >> 16) * width];
-		s += sstep;
-		t += tstep;
-		if(opaque(pix) && *pz <= izi){
-			*pdest = blendfog(pix, *fog);
-			*pz = izi;
-		}
-		izi += izistep;
-		pdest++;
-		pz++;
-		fogstep(*fog);
-	}while(--spancount);
+	if(((t + tstep*spancount) >> 16) == (t >> 16)){
+		pbase += (t >> 16) * width;
+		do{
+			pix = pbase[s >> 16];
+			s += sstep;
+			if(opaque(pix) && *pz <= izi){
+				*pdest = blendfog(pix, *fog);
+				*pz = izi;
+			}
+			fogstep(*fog);
+			izi += izistep;
+			pdest++;
+			pz++;
+		}while(--spancount);
+	}else if(((s + sstep*spancount) >> 16) == (s >> 16)){
+		pbase += s >> 16;
+		do{
+			pix = pbase[(t >> 16) * width];
+			t += tstep;
+			if(opaque(pix) && *pz <= izi){
+				*pdest = blendfog(pix, *fog);
+				*pz = izi;
+			}
+			fogstep(*fog);
+			izi += izistep;
+			pdest++;
+			pz++;
+		}while(--spancount);
+	}else{
+		do{
+			pix = pbase[(s >> 16) + (t >> 16) * width];
+			s += sstep;
+			t += tstep;
+			if(opaque(pix) && *pz <= izi){
+				*pdest = blendfog(pix, *fog);
+				*pz = izi;
+			}
+			fogstep(*fog);
+			izi += izistep;
+			pdest++;
+			pz++;
+		}while(--spancount);
+	}
 }
 
 static void