commit ed588f9

Devine Lu Linvega  ·  2023-04-10 21:13:41 +0000 UTC
parent adc0ccd
Standardized screen device to the SDL version
3 files changed,  +30, -39
+21, -28
 1@@ -4,7 +4,7 @@
 2 #include "screen.h"
 3 
 4 /*
 5-Copyright (c) 2021 Devine Lu Linvega, Andrew Alderwick
 6+Copyright (c) 2021-2023 Devine Lu Linvega, Andrew Alderwick
 7 
 8 Permission to use, copy, modify, and distribute this software for any
 9 purpose with or without fee is hereby granted, provided that the above
10@@ -16,12 +16,11 @@ WITH REGARD TO THIS SOFTWARE.
11 
12 UxnScreen uxn_screen;
13 
14-static Uint8 blending[5][16] = {
15+static Uint8 blending[4][16] = {
16 	{0, 0, 0, 0, 1, 0, 1, 1, 2, 2, 0, 2, 3, 3, 3, 0},
17 	{0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3},
18 	{1, 2, 3, 1, 1, 2, 3, 1, 1, 2, 3, 1, 1, 2, 3, 1},
19-	{2, 3, 1, 2, 2, 3, 1, 2, 2, 3, 1, 2, 2, 3, 1, 2},
20-	{1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0}};
21+	{2, 3, 1, 2, 2, 3, 1, 2, 2, 3, 1, 2, 2, 3, 1, 2}};
22 
23 static void
24 screen_write(UxnScreen *p, Layer *layer, Uint16 x, Uint16 y, Uint8 color)
25@@ -35,12 +34,21 @@ screen_write(UxnScreen *p, Layer *layer, Uint16 x, Uint16 y, Uint8 color)
26 	}
27 }
28 
29+static void
30+screen_wipe(UxnScreen *p, Layer *layer, Uint16 x, Uint16 y)
31+{
32+	int v, h;
33+	for(v = 0; v < 8; v++)
34+		for(h = 0; h < 8; h++)
35+			screen_write(p, layer, x + h, y + v, 0);
36+}
37+
38 static void
39 screen_blit(UxnScreen *p, Layer *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color, Uint8 flipx, Uint8 flipy, Uint8 twobpp)
40 {
41-	int v, h, opaque = blending[4][color];
42+	int v, h, opaque = (color % 5) || !color;
43 	for(v = 0; v < 8; v++) {
44-		Uint16 c = sprite[v] | (twobpp ? sprite[v + 8] : 0) << 8;
45+		Uint16 c = sprite[v] | (twobpp ? (sprite[v + 8] << 8) : 0);
46 		for(h = 7; h >= 0; --h, c >>= 1) {
47 			Uint8 ch = (c & 1) | ((c >> 7) & 2);
48 			if(opaque || ch)
49@@ -53,24 +61,6 @@ screen_blit(UxnScreen *p, Layer *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8
50 	}
51 }
52 
53-static void
54-screen_wipe(UxnScreen *p, Layer *layer, Uint16 x, Uint16 y)
55-{
56-	int v, h;
57-	for(v = 0; v < 8; v++)
58-		for(h = 0; h < 8; h++)
59-			screen_write(p, layer, x + h, y + v, 0);
60-}
61-
62-static void
63-layer_clear(UxnScreen *p, Layer *layer)
64-{
65-	Uint32 i, size = p->width * p->height;
66-	for(i = 0; i < size; i++)
67-		layer->pixels[i] = 0x00;
68-	layer->changed = 1;
69-}
70-
71 void
72 screen_palette(UxnScreen *p, Uint8 *addr)
73 {
74@@ -100,15 +90,18 @@ screen_resize(UxnScreen *p, Uint16 width, Uint16 height)
75 	if(bg && fg && pixels) {
76 		p->width = width;
77 		p->height = height;
78-		screen_clear(p);
79+		screen_clear(p, &p->bg);
80+		screen_clear(p, &p->fg);
81 	}
82 }
83 
84 void
85-screen_clear(UxnScreen *p)
86+screen_clear(UxnScreen *p, Layer *layer)
87 {
88-	layer_clear(p, &p->bg);
89-	layer_clear(p, &p->fg);
90+	Uint32 i, size = p->width * p->height;
91+	for(i = 0; i < size; i++)
92+		layer->pixels[i] = 0x00;
93+	layer->changed = 1;
94 }
95 
96 void
+1, -1
1@@ -25,7 +25,7 @@ extern UxnScreen uxn_screen;
2 
3 void screen_palette(UxnScreen *p, Uint8 *addr);
4 void screen_resize(UxnScreen *p, Uint16 width, Uint16 height);
5-void screen_clear(UxnScreen *p);
6+void screen_clear(UxnScreen *p, Layer *layer);
7 void screen_redraw(UxnScreen *p, Uint32 *pixels);
8 
9 Uint8 screen_dei(Uxn *u, Uint8 addr);
+8, -10
 1@@ -46,7 +46,7 @@ Uint16 dei_mask[] = {0x0000, 0x0000, 0x003c, 0x0014, 0x0014, 0x0014, 0x0014, 0x0
 2 static int
 3 emu_error(char *msg, const char *err)
 4 {
 5-	fprintf(stderr, "Error %s: %s\n", msg, err);
 6+	fprintf(stderr, "%s: %s\n", msg, err);
 7 	return 0;
 8 }
 9 
10@@ -91,9 +91,8 @@ emu_start(Uxn *u, char *rom)
11 		return 0;
12 	if(!uxn_screen.width || !uxn_screen.height)
13 		screen_resize(&uxn_screen, WIDTH, HEIGHT);
14-	screen_clear(&uxn_screen);
15 	if(!uxn_eval(u, PAGE_PROGRAM))
16-		return emu_error("Boot", "Failed to start rom.");
17+		return emu_error("boot", "Failed to start rom.");
18 	return 1;
19 }
20 
21@@ -189,7 +188,7 @@ display_start(char *title)
22 	visual = DefaultVisual(display, 0);
23 	window = XCreateSimpleWindow(display, RootWindow(display, 0), 0, 0, uxn_screen.width + PAD * 2, uxn_screen.height + PAD * 2, 1, 0, 0);
24 	if(visual->class != TrueColor)
25-		return emu_error("Init", "True-color visual failed");
26+		return emu_error("init", "True-color visual failed");
27 	XSelectInput(display, window, ButtonPressMask | ButtonReleaseMask | PointerMotionMask | ExposureMask | KeyPressMask | KeyReleaseMask);
28 	wmDelete = XInternAtom(display, "WM_DELETE_WINDOW", True);
29 	XSetWMProtocols(display, window, &wmDelete, 1);
30@@ -210,15 +209,15 @@ main(int argc, char **argv)
31 	struct pollfd fds[3];
32 	static const struct itimerspec screen_tspec = {{0, 16666666}, {0, 16666666}};
33 	if(argc < 2)
34-		return emu_error("Usage", "uxn11 game.rom args");
35+		return emu_error("usage", "uxn11 game.rom args");
36 	rom_path = argv[1];
37 	if(!uxn_boot(&u, (Uint8 *)calloc(0x10000 * RAM_PAGES, sizeof(Uint8))))
38-		return emu_error("Boot", "Failed");
39+		return emu_error("boot", "Failed");
40 	/* start sequence */
41 	if(!emu_start(&u, rom_path))
42-		return emu_error("Start", rom_path);
43+		return emu_error("start", rom_path);
44 	if(!display_start(rom_path))
45-		return emu_error("Display", "Failed");
46+		return emu_error("display", "Failed");
47 	/* console vector */
48 	for(i = 2; i < argc; i++) {
49 		char *p = argv[i];
50@@ -244,9 +243,8 @@ main(int argc, char **argv)
51 		if((fds[2].revents & POLLIN) != 0) {
52 			n = read(fds[2].fd, coninp, CONINBUFSIZE - 1);
53 			coninp[n] = 0;
54-			for(i = 0; i < n; i++) {
55+			for(i = 0; i < n; i++)
56 				console_input(&u, coninp[i]);
57-			}
58 		}
59 		if(uxn_screen.fg.changed || uxn_screen.bg.changed)
60 			emu_draw();