commit 1968801

Devine Lu Linvega  ·  2023-04-13 03:31:30 +0000 UTC
parent a92e541
Simplified screen device
1 files changed,  +33, -42
+33, -42
  1@@ -22,12 +22,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 int
  6-clamp(int val, int min, int max)
  7-{
  8-	return (val >= min) ? (val <= max) ? val : max : min;
  9-}
 10-
 11 static void
 12 screen_write(UxnScreen *p, Layer *layer, Uint16 x, Uint16 y, Uint8 color)
 13 {
 14@@ -49,12 +43,6 @@ screen_fill(UxnScreen *p, Layer *layer, Uint16 x1, Uint16 y1, Uint16 x2, Uint16
 15 			screen_write(p, layer, h, v, color);
 16 }
 17 
 18-static void
 19-screen_wipe(UxnScreen *p, Layer *layer, Uint16 x, Uint16 y)
 20-{
 21-	screen_fill(p, layer, x, y, x + 8, y + 8, 0);
 22-}
 23-
 24 static void
 25 screen_blit(UxnScreen *p, Layer *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color, Uint8 flipx, Uint8 flipy, Uint8 twobpp)
 26 {
 27@@ -79,9 +67,9 @@ screen_palette(UxnScreen *p, Uint8 *addr)
 28 	int i, shift;
 29 	for(i = 0, shift = 4; i < 4; ++i, shift ^= 4) {
 30 		Uint8
 31-			r = (addr[0 + i / 2] >> shift) & 0x0f,
 32-			g = (addr[2 + i / 2] >> shift) & 0x0f,
 33-			b = (addr[4 + i / 2] >> shift) & 0x0f;
 34+			r = (addr[0 + i / 2] >> shift) & 0xf,
 35+			g = (addr[2 + i / 2] >> shift) & 0xf,
 36+			b = (addr[4 + i / 2] >> shift) & 0xf;
 37 		p->palette[i] = 0x0f000000 | r << 16 | g << 8 | b;
 38 		p->palette[i] |= p->palette[i] << 4;
 39 	}
 40@@ -91,20 +79,22 @@ screen_palette(UxnScreen *p, Uint8 *addr)
 41 void
 42 screen_resize(UxnScreen *p, Uint16 width, Uint16 height)
 43 {
 44-	Uint8
 45-		*bg = realloc(p->bg.pixels, width * height),
 46-		*fg = realloc(p->fg.pixels, width * height);
 47-	Uint32
 48-		*pixels = realloc(p->pixels, width * height * sizeof(Uint32));
 49-	if(bg) p->bg.pixels = bg;
 50-	if(fg) p->fg.pixels = fg;
 51-	if(pixels) p->pixels = pixels;
 52-	if(bg && fg && pixels) {
 53-		p->width = width;
 54-		p->height = height;
 55-		screen_fill(p, &p->bg, 0, 0, p->width, p->height, 0);
 56-		screen_fill(p, &p->fg, 0, 0, p->width, p->height, 0);
 57-	}
 58+	Uint8 *bg, *fg;
 59+	Uint32 *pixels;
 60+	if(width < 0x20 || height < 0x20 || width >= 0x400 || height >= 0x400)
 61+		return;
 62+	bg = realloc(p->bg.pixels, width * height),
 63+	fg = realloc(p->fg.pixels, width * height);
 64+	pixels = realloc(p->pixels, width * height * sizeof(Uint32));
 65+	if(!bg || !fg || !pixels)
 66+		return;
 67+	p->bg.pixels = bg;
 68+	p->fg.pixels = fg;
 69+	p->pixels = pixels;
 70+	p->width = width;
 71+	p->height = height;
 72+	screen_fill(p, &p->bg, 0, 0, p->width, p->height, 0);
 73+	screen_fill(p, &p->fg, 0, 0, p->width, p->height, 0);
 74 }
 75 
 76 void
 77@@ -135,17 +125,18 @@ screen_deo(Uint8 *ram, Uint8 *d, Uint8 port)
 78 {
 79 	switch(port) {
 80 	case 0x3:
 81-		screen_resize(&uxn_screen, clamp(PEEK2(d + 2), 1, 1024), uxn_screen.height);
 82+		screen_resize(&uxn_screen, PEEK2(d + 2), uxn_screen.height);
 83 		break;
 84 	case 0x5:
 85-		screen_resize(&uxn_screen, uxn_screen.width, clamp(PEEK2(d + 4), 1, 1024));
 86+		screen_resize(&uxn_screen, uxn_screen.width, PEEK2(d + 4));
 87 		break;
 88 	case 0xe: {
 89 		Uint16 x = PEEK2(d + 0x8), y = PEEK2(d + 0xa);
 90 		Layer *layer = (d[0xf] & 0x40) ? &uxn_screen.fg : &uxn_screen.bg;
 91-		if(d[0xe] & 0x80)
 92-			screen_fill(&uxn_screen, layer, (d[0xe] & 0x10) ? 0 : x, (d[0xe] & 0x20) ? 0 : y, (d[0xe] & 0x10) ? x : uxn_screen.width, (d[0xe] & 0x20) ? y : uxn_screen.height, d[0xe] & 0x3);
 93-		else {
 94+		if(d[0xe] & 0x80) {
 95+			Uint8 xflip = d[0xe] & 0x10, yflip = d[0xe] & 0x20;
 96+			screen_fill(&uxn_screen, layer, xflip ? 0 : x, yflip ? 0 : y, xflip ? x : uxn_screen.width, yflip ? y : uxn_screen.height, d[0xe] & 0x3);
 97+		} else {
 98 			screen_write(&uxn_screen, layer, x, y, d[0xe] & 0x3);
 99 			if(d[0x6] & 0x1) POKE2(d + 0x8, x + 1); /* auto x+1 */
100 			if(d[0x6] & 0x2) POKE2(d + 0xa, y + 1); /* auto y+1 */
101@@ -154,24 +145,24 @@ screen_deo(Uint8 *ram, Uint8 *d, Uint8 port)
102 	}
103 	case 0xf: {
104 		Uint16 x = PEEK2(d + 0x8), y = PEEK2(d + 0xa), dx, dy, addr = PEEK2(d + 0xc);
105-		Uint8 i, n, twobpp = !!(d[0xf] & 0x80);
106+		Uint8 i, n = d[0x6] >> 4, twobpp = !!(d[0xf] & 0x80);
107 		Layer *layer = (d[0xf] & 0x40) ? &uxn_screen.fg : &uxn_screen.bg;
108-		n = d[0x6] >> 4;
109 		dx = (d[0x6] & 0x01) << 3;
110 		dy = (d[0x6] & 0x02) << 2;
111 		if(addr > 0x10000 - ((n + 1) << (3 + twobpp)))
112 			return;
113 		for(i = 0; i <= n; i++) {
114-			if(!(d[0xf] & 0xf))
115-				screen_wipe(&uxn_screen, layer, x + dy * i, y + dx * i);
116-			else {
117+			if(!(d[0xf] & 0xf)) {
118+				Uint16 ex = x + dy * i, ey = y + dx * i;
119+				screen_fill(&uxn_screen, layer, ex, ey, ex + 8, ey + 8, 0);
120+			} else {
121 				screen_blit(&uxn_screen, layer, x + dy * i, y + dx * i, &ram[addr], d[0xf] & 0xf, d[0xf] & 0x10, d[0xf] & 0x20, twobpp);
122 				addr += (d[0x6] & 0x04) << (1 + twobpp);
123 			}
124 		}
125-		if(d[0x6] & 0x1) POKE2(d + 0x8, x + dx); /* auto x+8 */
126-		if(d[0x6] & 0x2) POKE2(d + 0xa, y + dy); /* auto y+8 */
127-		if(d[0x6] & 0x4) POKE2(d + 0xc, addr);   /* auto addr+length */
128+		POKE2(d + 0x8, x + dx); /* auto x+8 */
129+		POKE2(d + 0xa, y + dy); /* auto y+8 */
130+		POKE2(d + 0xc, addr);   /* auto addr+length */
131 		break;
132 	}
133 	}