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())