commit ec581b0
Devine Lu Linvega
·
2024-11-25 17:59:52 +0000 UTC
parent 8f266a4
(screen) Margined screen strategy
2 files changed,
+25,
-29
+24,
-28
1@@ -17,16 +17,8 @@ WITH REGARD TO THIS SOFTWARE.
2
3 UxnScreen uxn_screen;
4
5-#define BOUNDARY(a, b, c, d, e) \
6- { \
7- if(a > 0xfff8) { \
8- b = 0, c = 0 - a; \
9- if(d > 0x8000) d = 0; \
10- } else if(a > e) \
11- return; \
12- else if(a > e - 8) \
13- d = e; \
14- }
15+#define MARGIN 0x8
16+#define MARGIN2 0x10
17
18 /* c = !ch ? (color % 5 ? color >> 2 : 0) : color % 4 + ch == 1 ? 0 : (ch - 2 + (color & 3)) % 3 + 1; */
19
20@@ -41,12 +33,10 @@ screen_2bpp(Uint8 *layer, Uint8 *addr, Uint16 x1, Uint16 y1, Uint16 blend, int f
21 {
22 int x, y, opaque = (blend % 5);
23 Uint16 top = y1, bottom = y1 + 8, left = x1, right = x1 + 8, offx = 0, offy = 0;
24- BOUNDARY(y1, top, offy, bottom, uxn_screen.height)
25- BOUNDARY(x1, left, offx, right, uxn_screen.width)
26 for(y = top; y < bottom; y++) {
27 int ptr = fy < 0 ? 7 - (y - top) : y - top + offy * fy;
28 int ch1 = addr[ptr], ch2 = addr[ptr + 8];
29- int row = y * uxn_screen.width;
30+ int row = y * (uxn_screen.width + MARGIN2);
31 for(x = left; x < right; x++) {
32 int shift = (fx > 0 ? 7 - (x - left) : x - left) + offx;
33 int color = ((ch1 >> shift) & 1) | (((ch2 >> shift) & 1) << 1);
34@@ -61,12 +51,10 @@ screen_1bpp(Uint8 *layer, Uint8 *addr, Uint16 x1, Uint16 y1, Uint16 blend, int f
35 {
36 int x, y, opaque = (blend % 5);
37 Uint16 top = y1, bottom = y1 + 8, left = x1, right = x1 + 8, offx = 0, offy = 0;
38- BOUNDARY(y1, top, offy, bottom, uxn_screen.height)
39- BOUNDARY(x1, left, offx, right, uxn_screen.width)
40 for(y = top; y < bottom; y++) {
41 int ptr = fy < 0 ? 7 - (y - top) : y - top + offy * fy;
42 int ch1 = addr[ptr];
43- int row = y * uxn_screen.width;
44+ int row = y * (uxn_screen.width + MARGIN2);
45 for(x = left; x < right; x++) {
46 int shift = fx > 0 ? 7 - (x - left) : x - left + offx;
47 int color = (ch1 >> shift) & 1;
48@@ -110,7 +98,7 @@ screen_change(int x1, int y1, int x2, int y2)
49 void
50 screen_fill(Uint8 *layer, int color)
51 {
52- int i, length = uxn_screen.width * uxn_screen.height;
53+ int i, length = (uxn_screen.width + MARGIN2) * uxn_screen.height;
54 for(i = 0; i < length; i++)
55 layer[i] = color;
56 }
57@@ -118,7 +106,7 @@ screen_fill(Uint8 *layer, int color)
58 void
59 screen_rect(Uint8 *layer, Uint16 x1, Uint16 y1, Uint16 x2, Uint16 y2, int color)
60 {
61- int row, x, y, w = uxn_screen.width, h = uxn_screen.height;
62+ int row, x, y, w = (uxn_screen.width + MARGIN2), h = (uxn_screen.height + MARGIN2);
63 for(y = y1; y < y2 && y < h; y++)
64 for(x = x1, row = y * w; x < x2 && x < w; x++)
65 layer[x + row] = color;
66@@ -150,7 +138,8 @@ screen_resize(Uint16 width, Uint16 height, int scale)
67 if(uxn_screen.width == width && uxn_screen.height == height && uxn_screen.scale == scale)
68 return;
69 if(dim_change) {
70- bg = malloc(width * height), fg = malloc(width * height);
71+ int wmar = width + MARGIN2, hmar = height + MARGIN2;
72+ bg = malloc(wmar * hmar), fg = malloc(wmar * hmar);
73 if(bg && fg)
74 pixels = realloc(uxn_screen.pixels, width * height * sizeof(Uint32) * scale * scale);
75 if(!bg || !fg || !pixels) {
76@@ -188,8 +177,7 @@ screen_redraw(void)
77 palette[i] = uxn_screen.palette[(i >> 2) ? (i >> 2) : (i & 3)];
78 for(y = y1; y < y2; y++) {
79 int ys = y * s;
80- int o = y * w;
81- for(x = x1, i = x1 + o; x < x2; x++, i++) {
82+ for(x = x1, i = (x + MARGIN) + (y + MARGIN) * (w + MARGIN2); x < x2; x++, i++) {
83 int c = palette[fg[i] << 2 | bg[i]];
84 for(k = 0; k < s; k++) {
85 int oo = ((ys + k) * w + x) * s;
86@@ -250,14 +238,14 @@ screen_deo(Uxn *u, Uint8 addr)
87 y1 = 0, y2 = rY;
88 else
89 y1 = rY, y2 = uxn_screen.height;
90- screen_rect(layer, x1, y1, x2, y2, color);
91+ screen_rect(layer, x1 + MARGIN, y1 + MARGIN, x2 + MARGIN, y2 + MARGIN, color);
92 screen_change(x1, y1, x2, y2);
93 }
94 /* pixel mode */
95 else {
96- Uint16 w = uxn_screen.width;
97+ Uint16 w = uxn_screen.width+MARGIN2;
98 if(rX >= 0 && rY >= 0 && rX < w && rY < uxn_screen.height)
99- layer[rX + rY * w] = color;
100+ layer[rX+MARGIN + (rY+MARGIN) * w] = color;
101 screen_change(rX, rY, rX + 1, rY + 1);
102 if(rMX) rX++;
103 if(rMY) rY++;
104@@ -274,11 +262,19 @@ screen_deo(Uxn *u, Uint8 addr)
105 int x1, x2, y1, y2, x = rX, y = rY;
106 int dxy = rDX * fy, dyx = rDY * fx, addr_incr = rMA << (1 + twobpp);
107 if(twobpp)
108- for(i = 0; i <= rML; i++, x += dyx, y += dxy, rA += addr_incr)
109- screen_2bpp(layer, &u->ram[rA], x, y, color, fx, fy);
110+ for(i = 0; i <= rML; i++, x += dyx, y += dxy, rA += addr_incr) {
111+ Uint16 xx = x + MARGIN;
112+ Uint16 yy = y + MARGIN;
113+ if(xx < uxn_screen.width + MARGIN && yy + MARGIN < uxn_screen.height + MARGIN2)
114+ screen_2bpp(layer, &u->ram[rA], xx, yy, color, fx, fy);
115+ }
116 else
117- for(i = 0; i <= rML; i++, x += dyx, y += dxy, rA += addr_incr)
118- screen_1bpp(layer, &u->ram[rA], x, y, color, fx, fy);
119+ for(i = 0; i <= rML; i++, x += dyx, y += dxy, rA += addr_incr) {
120+ Uint16 xx = x + MARGIN;
121+ Uint16 yy = y + MARGIN;
122+ if(xx < uxn_screen.width + MARGIN && yy + MARGIN < uxn_screen.height + MARGIN2)
123+ screen_1bpp(layer, &u->ram[rA], x + MARGIN, y + MARGIN, color, fx, fy);
124+ }
125 if(fx < 0)
126 x1 = x, x2 = rX;
127 else
+1,
-1
1@@ -261,7 +261,7 @@ main(int argc, char **argv)
2 {
3 int i = 1;
4 if(argc == 2 && argv[1][0] == '-' && argv[1][1] == 'v')
5- return !fprintf(stdout, "Uxn11 - Varvara Emulator, 12 Nov 2024.\n");
6+ return !fprintf(stdout, "Uxn11 - Varvara Emulator, 25 Nov 2024.\n");
7 else if(argc == 1)
8 return !fprintf(stdout, "usage: %s [-v] file.rom [args..]\n", argv[0]);
9 else if(!display_init())