commit 47b472b

Devine Lu Linvega  ·  2024-11-26 01:51:15 +0000 UTC
parent 597efb3
(screen) Inlined rect primitive
3 files changed,  +18, -26
+16, -23
 1@@ -67,16 +67,6 @@ screen_fill(Uint8 *layer, int color)
 2 		layer[i] = color;
 3 }
 4 
 5-void
 6-screen_rect(Uint8 *layer, Uint16 x1, Uint16 y1, Uint16 x2, Uint16 y2, int color)
 7-{
 8-	int ax, bx, ay, by;
 9-	int w = MAR2(uxn_screen.width), hor = x2 - x1, ver = y2 - y1;
10-	for(ay = y1 * w, by = ay + ver * w; ay < by; ay += w)
11-		for(ax = ay + x1, bx = ax + hor; ax < bx; ax++)
12-			layer[ax] = color;
13-}
14-
15 void
16 screen_palette(void)
17 {
18@@ -189,21 +179,24 @@ screen_deo(Uxn *u, Uint8 addr)
19 	case 0x2c:
20 	case 0x2d: rA = (u->dev[0x2c] << 8) | u->dev[0x2d]; return;
21 	case 0x2e: {
22-		Uint8 ctrl = u->dev[0x2e];
23-		Uint8 color = ctrl & 0x3;
24+		int ctrl = u->dev[0x2e];
25+		int color = ctrl & 0x3;
26 		Uint8 *layer = ctrl & 0x40 ? uxn_screen.fg : uxn_screen.bg;
27 		/* fill mode */
28 		if(ctrl & 0x80) {
29-			Uint16 x1, y1, x2, y2;
30+			int x1, y1, x2, y2, ax, bx, ay, by, w, hor, ver;
31 			if(ctrl & 0x10)
32-				x1 = 0, x2 = rX;
33+				x1 = MAR(0), x2 = MAR(rX);
34 			else
35-				x1 = rX, x2 = uxn_screen.width;
36+				x1 = MAR(rX), x2 = MAR(uxn_screen.width);
37 			if(ctrl & 0x20)
38-				y1 = 0, y2 = rY;
39+				y1 = MAR(0), y2 = MAR(rY);
40 			else
41-				y1 = rY, y2 = uxn_screen.height;
42-			screen_rect(layer, MAR(x1), MAR(y1), MAR(x2), MAR(y2), color);
43+				y1 = MAR(rY), y2 = MAR(uxn_screen.height);
44+			w = MAR2(uxn_screen.width), hor = x2 - x1, ver = y2 - y1;
45+			for(ay = y1 * w, by = ay + ver * w; ay < by; ay += w)
46+				for(ax = ay + x1, bx = ax + hor; ax < bx; ax++)
47+					layer[ax] = color;
48 			screen_change(x1, y1, x2, y2);
49 		}
50 		/* pixel mode */
51@@ -218,14 +211,14 @@ screen_deo(Uxn *u, Uint8 addr)
52 		return;
53 	}
54 	case 0x2f: {
55-		Uint8 i;
56-		Uint8 ctrl = u->dev[0x2f];
57-		Uint8 twobpp = !!(ctrl & 0x80);
58-		Uint8 blend = ctrl & 0xf;
59-		Uint8 *layer = ctrl & 0x40 ? uxn_screen.fg : uxn_screen.bg;
60+		int i;
61+		int ctrl = u->dev[0x2f];
62+		int twobpp = !!(ctrl & 0x80);
63+		int blend = ctrl & 0xf;
64 		int fx = ctrl & 0x10 ? -1 : 1, fy = ctrl & 0x20 ? -1 : 1;
65 		int x1, x2, y1, y2, ax, ay, qx, qy, x = rX, y = rY;
66 		int dxy = rDX * fy, dyx = rDY * fx, addr_incr = rMA << (1 + twobpp);
67+		Uint8 *layer = ctrl & 0x40 ? uxn_screen.fg : uxn_screen.bg;
68 		if(twobpp)
69 			for(i = 0; i <= rML; i++, x += dyx, y += dxy, rA += addr_incr) {
70 				Uint16 xx = MAR(x), yy = MAR(y);
+0, -1
1@@ -20,7 +20,6 @@ extern int emu_resize(int width, int height);
2 int screen_changed(void);
3 void screen_change(int x1, int y1, int x2, int y2);
4 void screen_fill(Uint8 *layer, int color);
5-void screen_rect(Uint8 *layer, Uint16 x1, Uint16 y1, Uint16 x2, Uint16 y2, int color);
6 void screen_palette(void);
7 void screen_resize(Uint16 width, Uint16 height, int scale);
8 void screen_redraw();
+2, -2
 1@@ -93,8 +93,8 @@ emu_restart(char *rom, int soft)
 2 {
 3 	close_console();
 4 	screen_resize(WIDTH, HEIGHT, uxn_screen.scale);
 5-	screen_rect(uxn_screen.bg, 0, 0, uxn_screen.width, uxn_screen.height, 0);
 6-	screen_rect(uxn_screen.fg, 0, 0, uxn_screen.width, uxn_screen.height, 0);
 7+	screen_fill(uxn_screen.bg, 0);
 8+	screen_fill(uxn_screen.fg, 0);
 9 	system_reboot(rom, soft);
10 }
11