Browse code

(screen) Created static fill function

Devine Lu Linvega authored on 11/04/2023 18:11:12
Showing 2 changed files
... ...
@@ -38,12 +38,19 @@ screen_write(UxnScreen *p, Layer *layer, Uint16 x, Uint16 y, Uint8 color)
38 38
 }
39 39
 
40 40
 static void
41
-screen_wipe(UxnScreen *p, Layer *layer, Uint16 x, Uint16 y)
41
+screen_fill(UxnScreen *p, Layer *layer, Uint16 x1, Uint16 y1, Uint16 x2, Uint16 y2, Uint8 color)
42 42
 {
43 43
 	int v, h;
44
-	for(v = 0; v < 8; v++)
45
-		for(h = 0; h < 8; h++)
46
-			screen_write(p, layer, x + h, y + v, 0);
44
+	for(v = y1; v < y2; v++)
45
+		for(h = x1; h < x2; h++)
46
+			screen_write(p, layer, h, v, color);
47
+	layer->changed = 1;
48
+}
49
+
50
+static void
51
+screen_wipe(UxnScreen *p, Layer *layer, Uint16 x, Uint16 y)
52
+{
53
+	screen_fill(p, layer, x, y, x + 8, y + 8, 0);
47 54
 }
48 55
 
49 56
 static void
... ...
@@ -93,20 +100,11 @@ screen_resize(UxnScreen *p, Uint16 width, Uint16 height)
93 100
 	if(bg && fg && pixels) {
94 101
 		p->width = width;
95 102
 		p->height = height;
96
-		screen_fill(p, &p->bg, 0);
97
-		screen_fill(p, &p->fg, 0);
103
+		screen_fill(p, &p->bg, 0, 0, p->width, p->height, 0);
104
+		screen_fill(p, &p->fg, 0, 0, p->width, p->height, 0);
98 105
 	}
99 106
 }
100 107
 
101
-void
102
-screen_fill(UxnScreen *p, Layer *layer, Uint8 color)
103
-{
104
-	Uint32 i, size = p->width * p->height;
105
-	for(i = 0; i < size; i++)
106
-		layer->pixels[i] = color;
107
-	layer->changed = 1;
108
-}
109
-
110 108
 void
111 109
 screen_redraw(UxnScreen *p)
112 110
 {
... ...
@@ -164,10 +162,14 @@ screen_deo(Uint8 *ram, Uint8 *d, Uint8 port)
164 162
 		break;
165 163
 	case 0xe: {
166 164
 		Uint16 x = PEEK2(d + 0x8), y = PEEK2(d + 0xa);
167
-		Uint8 layer = d[0xe] & 0x40;
168
-		screen_write(&uxn_screen, layer ? &uxn_screen.fg : &uxn_screen.bg, x, y, d[0xe] & 0x3);
169
-		if(d[0x6] & 0x01) POKE2(d + 0x8, x + 1); /* auto x+1 */
170
-		if(d[0x6] & 0x02) POKE2(d + 0xa, y + 1); /* auto y+1 */
165
+		Layer *layer = (d[0xf] & 0x40) ? &uxn_screen.fg : &uxn_screen.bg;
166
+		if(d[0xe] & 0x80) {
167
+			screen_fill(&uxn_screen, layer, x, y, uxn_screen.width, uxn_screen.height, d[0xe] & 0x3);
168
+		} else {
169
+			screen_write(&uxn_screen, layer, x, y, d[0xe] & 0x3);
170
+			if(d[0x6] & 0x01) POKE2(d + 0x8, x + 1); /* auto x+1 */
171
+			if(d[0x6] & 0x02) POKE2(d + 0xa, y + 1); /* auto y+1 */
172
+		}
171 173
 		break;
172 174
 	}
173 175
 	case 0xf: {
... ...
@@ -27,7 +27,6 @@ extern UxnScreen uxn_screen;
27 27
 
28 28
 void screen_palette(UxnScreen *p, Uint8 *addr);
29 29
 void screen_resize(UxnScreen *p, Uint16 width, Uint16 height);
30
-void screen_fill(UxnScreen *p, Layer *layer, Uint8 color);
31 30
 void screen_redraw(UxnScreen *p);
32 31
 void screen_mono(UxnScreen *p);
33 32