commit e5b128a

Devie Lu Linvega  ·  2025-12-24 19:09:01 +0000 UTC
parent 1daf64f
Trying to precalculate the blending table
1 files changed,  +25, -20
+25, -20
 1@@ -446,14 +446,14 @@ screen_colorize(void)
 2 	int i, shift, colors[4];
 3 	for(i = 0, shift = 4; i < 4; ++i, shift ^= 4) {
 4 		Uint8
 5-			r = (dev[0x8 + i / 2] >> shift) & 0xf,
 6-			g = (dev[0xa + i / 2] >> shift) & 0xf,
 7-			b = (dev[0xc + i / 2] >> shift) & 0xf;
 8+			r = dev[0x8 + i / 2] >> shift & 0xf,
 9+			g = dev[0xa + i / 2] >> shift & 0xf,
10+			b = dev[0xc + i / 2] >> shift & 0xf;
11 		colors[i] = 0x0f000000 | r << 16 | g << 8 | b;
12 		colors[i] |= colors[i] << 4;
13 	}
14 	for(i = 0; i < 16; i++)
15-		screen_palette[i] = colors[(i >> 2) ? (i >> 2) : (i & 3)];
16+		screen_palette[i] = colors[i >> 2 ? i >> 2 : i & 3];
17 	screen_reqdraw = 1;
18 }
19 
20@@ -574,7 +574,7 @@ screen_draw_sprite(void)
21 {
22 	const int ctrl = dev[0x2f];
23 	const int blend = ctrl & 0xf;
24-	const int above = ctrl & 0x40;
25+	const int above = ctrl & 0x40, layer_mask = above ? 0x3 : 0xc;
26 	const int opaque = blend % 5;
27 	const int fx = ctrl & 0x10 ? -1 : 1, fy = ctrl & 0x20 ? -1 : 1;
28 	const int qfx = fx > 0 ? 7 : 0, qfy = fy < 0 ? 7 : 0;
29@@ -582,7 +582,7 @@ screen_draw_sprite(void)
30 	const int wmar = MAR(screen_width), wmar2 = MAR2(screen_width);
31 	const int hmar2 = MAR2(screen_height);
32 	const Uint8 *table = blending[blend];
33-	int i, x1, x2, y1, y2, ax, ay, qx, qy, x = rX, y = rY;
34+	int i, x1, x2, y1, y2, ax, ay, bx, by, qx, qy, x = rX, y = rY;
35 	if(ctrl & 0x80) {
36 		const int addr_incr = rMA << 2;
37 		for(i = 0; i <= rML; i++, x += dyx, y += dxy, rA += addr_incr) {
38@@ -590,14 +590,17 @@ screen_draw_sprite(void)
39 			const Uint16 xmar2 = MAR2(x), ymar2 = MAR2(y);
40 			if(xmar < wmar && ymar2 < hmar2) {
41 				const Uint8 *sprite = &ram[rA];
42-				const int by = ymar2 * wmar2;
43-				for(ay = ymar * wmar2, qy = qfy; ay < by; ay += wmar2, qy += fy) {
44-					const int ch1 = sprite[qy], ch2 = sprite[qy + 8] << 1, bx = xmar2 + ay;
45-					for(ax = xmar + ay, qx = qfx; ax < bx; ax++, qx -= fx) {
46-						const int color = ((ch1 >> qx) & 1) | ((ch2 >> qx) & 2);
47+				for(ay = ymar * wmar2, by = ymar2 * wmar2, qy = qfy; ay < by; ay += wmar2, qy += fy) {
48+					const int ch1 = sprite[qy];
49+					const int ch2 = sprite[qy + 8] << 1;
50+					for(ax = xmar + ay, bx = xmar2 + ay, qx = qfx; ax < bx; ax++, qx -= fx) {
51+						const int color = (ch1 >> qx & 1) | (ch2 >> qx & 2);
52 						if(opaque || color) {
53-							const int src = screen_layers[ax];
54-							screen_layers[ax] = above ? (src & 0x3) | table[color] << 2 : (src & 0xc) | table[color];
55+							const int src = screen_layers[ax] & layer_mask;
56+							if(above)
57+								screen_layers[ax] = src | table[color] << 2;
58+							else
59+								screen_layers[ax] = src | table[color];
60 						}
61 					}
62 				}
63@@ -610,14 +613,16 @@ screen_draw_sprite(void)
64 			const Uint16 xmar2 = MAR2(x), ymar2 = MAR2(y);
65 			if(xmar < wmar && ymar2 < hmar2) {
66 				const Uint8 *sprite = &ram[rA];
67-				const int by = ymar2 * wmar2;
68-				for(ay = ymar * wmar2, qy = qfy; ay < by; ay += wmar2, qy += fy) {
69-					const int ch1 = sprite[qy], bx = xmar2 + ay;
70-					for(ax = xmar + ay, qx = qfx; ax < bx; ax++, qx -= fx) {
71-						const int color = (ch1 >> qx) & 1;
72+				for(ay = ymar * wmar2, by = ymar2 * wmar2, qy = qfy; ay < by; ay += wmar2, qy += fy) {
73+					const int ch1 = sprite[qy];
74+					for(ax = xmar + ay, bx = xmar2 + ay, qx = qfx; ax < bx; ax++, qx -= fx) {
75+						const int color = ch1 >> qx & 1;
76 						if(opaque || color) {
77-							const int src = screen_layers[ax];
78-							screen_layers[ax] = above ? (src & 0x3) | table[color] << 2 : (src & 0xc) | table[color];
79+							const int src = screen_layers[ax] & layer_mask;
80+							if(above)
81+								screen_layers[ax] = src | table[color] << 2;
82+							else
83+								screen_layers[ax] = src | table[color];
84 						}
85 					}
86 				}