commit 2edca88
Devine Lu Linvega
·
2024-11-25 22:29:27 +0000 UTC
parent 8406e8c
(screen) Inlined sprite drawing routines
1 files changed,
+24,
-34
+24,
-34
1@@ -28,34 +28,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 void
6-screen_2bpp(Uint8 *layer, Uint8 *addr, Uint16 x1, Uint16 y1, Uint16 blend, int fx, int fy)
7-{
8- int x, y, qx, qy, opaque = blend % 5, length = MAR2(uxn_screen.width), row = y1 * length;
9- for(y = y1, qy = fy < 0 ? 7 : 0; y < y1 + 8; y++, qy += fy, row += length) {
10- int ch1 = addr[qy], ch2 = addr[qy + 8] << 1, x2 = x1 + 8 + row;
11- for(x = x1 + row, qx = fx > 0 ? 7 : 0; x < x2; x++, qx -= fx) {
12- int color = ((ch1 >> qx) & 1) | ((ch2 >> qx) & 2);
13- if(opaque || color)
14- layer[x] = blending[color][blend];
15- }
16- }
17-}
18-
19-static void
20-screen_1bpp(Uint8 *layer, Uint8 *addr, Uint16 x1, Uint16 y1, Uint16 blend, int fx, int fy)
21-{
22- int x, y, qx, qy, opaque = blend % 5, length = MAR2(uxn_screen.width), row = y1 * length;
23- for(y = y1, qy = fy < 0 ? 7 : 0; y < y1 + 8; y++, qy += fy, row += length) {
24- int ch1 = addr[qy], x2 = x1 + 8 + row;
25- for(x = x1 + row, qx = fx > 0 ? 7 : 0; x < x2; x++, qx -= fx) {
26- int color = (ch1 >> qx) & 1;
27- if(opaque || color)
28- layer[x] = blending[color][blend];
29- }
30- }
31-}
32-
33 int
34 screen_changed(void)
35 {
36@@ -248,22 +220,40 @@ screen_deo(Uxn *u, Uint8 addr)
37 Uint8 i;
38 Uint8 ctrl = u->dev[0x2f];
39 Uint8 twobpp = !!(ctrl & 0x80);
40- Uint8 color = ctrl & 0xf;
41+ Uint8 blend = ctrl & 0xf;
42 Uint8 *layer = ctrl & 0x40 ? uxn_screen.fg : uxn_screen.bg;
43 int fx = ctrl & 0x10 ? -1 : 1, fy = ctrl & 0x20 ? -1 : 1;
44- int x1, x2, y1, y2, x = rX, y = rY;
45+ int x1, x2, y1, y2, ch1, ch2, ax, ay, qx, qy, x = rX, y = rY;
46 int dxy = rDX * fy, dyx = rDY * fx, addr_incr = rMA << (1 + twobpp);
47 if(twobpp)
48 for(i = 0; i <= rML; i++, x += dyx, y += dxy, rA += addr_incr) {
49 Uint16 xx = MAR(x), yy = MAR(y);
50- if(xx < MAR(uxn_screen.width) && MAR(yy) < MAR2(uxn_screen.height))
51- screen_2bpp(layer, &u->ram[rA], xx, yy, color, fx, fy);
52+ if(xx < MAR(uxn_screen.width) && MAR(yy) < MAR2(uxn_screen.height)) {
53+ Uint8 *sprite = &u->ram[rA];
54+ int opaque = blend % 5, length = MAR2(uxn_screen.width), row = yy * length;
55+ for(ay = yy, qy = fy < 0 ? 7 : 0; ay < yy + 8; ay++, qy += fy, row += length) {
56+ ch1 = sprite[qy], ch2 = sprite[qy + 8] << 1, x2 = xx + 8 + row;
57+ for(ax = xx + row, qx = fx > 0 ? 7 : 0; ax < x2; ax++, qx -= fx) {
58+ int color = ((ch1 >> qx) & 1) | ((ch2 >> qx) & 2);
59+ if(opaque || color) layer[ax] = blending[color][blend];
60+ }
61+ }
62+ }
63 }
64 else
65 for(i = 0; i <= rML; i++, x += dyx, y += dxy, rA += addr_incr) {
66 Uint16 xx = MAR(x), yy = MAR(y);
67- if(xx < MAR(uxn_screen.width) && MAR(yy) < MAR2(uxn_screen.height))
68- screen_1bpp(layer, &u->ram[rA], xx, yy, color, fx, fy);
69+ if(xx < MAR(uxn_screen.width) && MAR(yy) < MAR2(uxn_screen.height)) {
70+ Uint8 *sprite = &u->ram[rA];
71+ int opaque = blend % 5, length = MAR2(uxn_screen.width), row = yy * length;
72+ for(ay = yy, qy = fy < 0 ? 7 : 0; ay < yy + 8; ay++, qy += fy, row += length) {
73+ ch1 = sprite[qy], x2 = xx + 8 + row;
74+ for(ax = xx + row, qx = fx > 0 ? 7 : 0; ax < x2; ax++, qx -= fx) {
75+ int color = (ch1 >> qx) & 1;
76+ if(opaque || color) layer[ax] = blending[color][blend];
77+ }
78+ }
79+ }
80 }
81 if(fx < 0)
82 x1 = x, x2 = rX;