commit 2edca88

Devine Lu Linvega  ·  2024-11-25 22:29:27 +0000 UTC
parent 8406e8c
(screen) Inlined sprite drawing routines
1 files changed,  +24, -34
+24, -34
 1@@ -28,34 +28,6 @@ static Uint8 blending[4][16] = {
 2 	{1, 2, 3, 1, 1, 2, 3, 1, 1, 2, 3, 1, 1, 2, 3, 1},
 3 	{2, 3, 1, 2, 2, 3, 1, 2, 2, 3, 1, 2, 2, 3, 1, 2}};
 4 
 5-static void
 6-screen_2bpp(Uint8 *layer, Uint8 *addr, Uint16 x1, Uint16 y1, Uint16 blend, int fx, int fy)
 7-{
 8-	int x, y, qx, qy, opaque = blend % 5, length = MAR2(uxn_screen.width), row = y1 * length;
 9-	for(y = y1, qy = fy < 0 ? 7 : 0; y < y1 + 8; y++, qy += fy, row += length) {
10-		int ch1 = addr[qy], ch2 = addr[qy + 8] << 1, x2 = x1 + 8 + row;
11-		for(x = x1 + row, qx = fx > 0 ? 7 : 0; x < x2; x++, qx -= fx) {
12-			int color = ((ch1 >> qx) & 1) | ((ch2 >> qx) & 2);
13-			if(opaque || color)
14-				layer[x] = blending[color][blend];
15-		}
16-	}
17-}
18-
19-static void
20-screen_1bpp(Uint8 *layer, Uint8 *addr, Uint16 x1, Uint16 y1, Uint16 blend, int fx, int fy)
21-{
22-	int x, y, qx, qy, opaque = blend % 5, length = MAR2(uxn_screen.width), row = y1 * length;
23-	for(y = y1, qy = fy < 0 ? 7 : 0; y < y1 + 8; y++, qy += fy, row += length) {
24-		int ch1 = addr[qy], x2 = x1 + 8 + row;
25-		for(x = x1 + row, qx = fx > 0 ? 7 : 0; x < x2; x++, qx -= fx) {
26-			int color = (ch1 >> qx) & 1;
27-			if(opaque || color)
28-				layer[x] = blending[color][blend];
29-		}
30-	}
31-}
32-
33 int
34 screen_changed(void)
35 {
36@@ -248,22 +220,40 @@ screen_deo(Uxn *u, Uint8 addr)
37 		Uint8 i;
38 		Uint8 ctrl = u->dev[0x2f];
39 		Uint8 twobpp = !!(ctrl & 0x80);
40-		Uint8 color = ctrl & 0xf;
41+		Uint8 blend = ctrl & 0xf;
42 		Uint8 *layer = ctrl & 0x40 ? uxn_screen.fg : uxn_screen.bg;
43 		int fx = ctrl & 0x10 ? -1 : 1, fy = ctrl & 0x20 ? -1 : 1;
44-		int x1, x2, y1, y2, x = rX, y = rY;
45+		int x1, x2, y1, y2, ch1, ch2, ax, ay, qx, qy, x = rX, y = rY;
46 		int dxy = rDX * fy, dyx = rDY * fx, addr_incr = rMA << (1 + twobpp);
47 		if(twobpp)
48 			for(i = 0; i <= rML; i++, x += dyx, y += dxy, rA += addr_incr) {
49 				Uint16 xx = MAR(x), yy = MAR(y);
50-				if(xx < MAR(uxn_screen.width) && MAR(yy) < MAR2(uxn_screen.height))
51-					screen_2bpp(layer, &u->ram[rA], xx, yy, color, fx, fy);
52+				if(xx < MAR(uxn_screen.width) && MAR(yy) < MAR2(uxn_screen.height)) {
53+					Uint8 *sprite = &u->ram[rA];
54+					int opaque = blend % 5, length = MAR2(uxn_screen.width), row = yy * length;
55+					for(ay = yy, qy = fy < 0 ? 7 : 0; ay < yy + 8; ay++, qy += fy, row += length) {
56+						ch1 = sprite[qy], ch2 = sprite[qy + 8] << 1, x2 = xx + 8 + row;
57+						for(ax = xx + row, qx = fx > 0 ? 7 : 0; ax < x2; ax++, qx -= fx) {
58+							int color = ((ch1 >> qx) & 1) | ((ch2 >> qx) & 2);
59+							if(opaque || color) layer[ax] = blending[color][blend];
60+						}
61+					}
62+				}
63 			}
64 		else
65 			for(i = 0; i <= rML; i++, x += dyx, y += dxy, rA += addr_incr) {
66 				Uint16 xx = MAR(x), yy = MAR(y);
67-				if(xx < MAR(uxn_screen.width) && MAR(yy) < MAR2(uxn_screen.height))
68-					screen_1bpp(layer, &u->ram[rA], xx, yy, color, fx, fy);
69+				if(xx < MAR(uxn_screen.width) && MAR(yy) < MAR2(uxn_screen.height)) {
70+					Uint8 *sprite = &u->ram[rA];
71+					int opaque = blend % 5, length = MAR2(uxn_screen.width), row = yy * length;
72+					for(ay = yy, qy = fy < 0 ? 7 : 0; ay < yy + 8; ay++, qy += fy, row += length) {
73+						ch1 = sprite[qy], x2 = xx + 8 + row;
74+						for(ax = xx + row, qx = fx > 0 ? 7 : 0; ax < x2; ax++, qx -= fx) {
75+							int color = (ch1 >> qx) & 1;
76+							if(opaque || color) layer[ax] = blending[color][blend];
77+						}
78+					}
79+				}
80 			}
81 		if(fx < 0)
82 			x1 = x, x2 = rX;