commit 1fb58f0

Devine Lu Linvega  ·  2023-04-13 16:43:55 +0000 UTC
parent 1968801
(screen.c) Faster drawing of pixel
1 files changed,  +20, -17
+20, -17
 1@@ -23,24 +23,25 @@ static Uint8 blending[4][16] = {
 2 	{2, 3, 1, 2, 2, 3, 1, 2, 2, 3, 1, 2, 2, 3, 1, 2}};
 3 
 4 static void
 5-screen_write(UxnScreen *p, Layer *layer, Uint16 x, Uint16 y, Uint8 color)
 6+screen_pixel(UxnScreen *p, Layer *layer, Uint16 x, Uint16 y, Uint8 color)
 7 {
 8-	if(x < p->width && y < p->height) {
 9-		Uint32 i = x + y * p->width;
10-		if(color != layer->pixels[i]) {
11-			layer->pixels[i] = color;
12-			layer->changed = 1;
13-		}
14-	}
15+	if(x >= p->width || y >= p->height)
16+		return;
17+	layer->pixels[x + y * p->width] = color;
18 }
19 
20 static void
21 screen_fill(UxnScreen *p, Layer *layer, Uint16 x1, Uint16 y1, Uint16 x2, Uint16 y2, Uint8 color)
22 {
23-	int v, h;
24-	for(v = y1; v < y2; v++)
25-		for(h = x1; h < x2; h++)
26-			screen_write(p, layer, h, v, color);
27+	int x, y;
28+	if(x2 >= p->width) x2 = p->width;
29+	if(y2 >= p->height) y2 = p->height;
30+	if(x1 >= x2 || y1 >= y2)
31+		return;
32+	for(y = y1; y < y2; y++)
33+		for(x = x1; x < x2; x++)
34+			layer->pixels[x + y * p->width] = color;
35+	layer->changed = 1;
36 }
37 
38 static void
39@@ -52,13 +53,14 @@ screen_blit(UxnScreen *p, Layer *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8
40 		for(h = 7; h >= 0; --h, c >>= 1) {
41 			Uint8 ch = (c & 1) | ((c >> 7) & 2);
42 			if(opaque || ch)
43-				screen_write(p,
44+				screen_pixel(p,
45 					layer,
46 					x + (flipx ? 7 - h : h),
47 					y + (flipy ? 7 - v : v),
48 					blending[ch][color]);
49 		}
50 	}
51+	layer->changed = 1;
52 }
53 
54 void
55@@ -137,7 +139,8 @@ screen_deo(Uint8 *ram, Uint8 *d, Uint8 port)
56 			Uint8 xflip = d[0xe] & 0x10, yflip = d[0xe] & 0x20;
57 			screen_fill(&uxn_screen, layer, xflip ? 0 : x, yflip ? 0 : y, xflip ? x : uxn_screen.width, yflip ? y : uxn_screen.height, d[0xe] & 0x3);
58 		} else {
59-			screen_write(&uxn_screen, layer, x, y, d[0xe] & 0x3);
60+			screen_pixel(&uxn_screen, layer, x, y, d[0xe] & 0x3);
61+			layer->changed = 1;
62 			if(d[0x6] & 0x1) POKE2(d + 0x8, x + 1); /* auto x+1 */
63 			if(d[0x6] & 0x2) POKE2(d + 0xa, y + 1); /* auto y+1 */
64 		}
65@@ -160,9 +163,9 @@ screen_deo(Uint8 *ram, Uint8 *d, Uint8 port)
66 				addr += (d[0x6] & 0x04) << (1 + twobpp);
67 			}
68 		}
69-		POKE2(d + 0x8, x + dx); /* auto x+8 */
70-		POKE2(d + 0xa, y + dy); /* auto y+8 */
71-		POKE2(d + 0xc, addr);   /* auto addr+length */
72+		if(d[0x6] & 0x1) POKE2(d + 0x8, x + dx); /* auto x+8 */
73+		if(d[0x6] & 0x2) POKE2(d + 0xa, y + dy); /* auto y+8 */
74+		if(d[0x6] & 0x4) POKE2(d + 0xc, addr);   /* auto addr+length */
75 		break;
76 	}
77 	}