commit e5b128a
Devie Lu Linvega
·
2025-12-24 19:09:01 +0000 UTC
parent 1daf64f
Trying to precalculate the blending table
1 files changed,
+25,
-20
+25,
-20
1@@ -446,14 +446,14 @@ screen_colorize(void)
2 int i, shift, colors[4];
3 for(i = 0, shift = 4; i < 4; ++i, shift ^= 4) {
4 Uint8
5- r = (dev[0x8 + i / 2] >> shift) & 0xf,
6- g = (dev[0xa + i / 2] >> shift) & 0xf,
7- b = (dev[0xc + i / 2] >> shift) & 0xf;
8+ r = dev[0x8 + i / 2] >> shift & 0xf,
9+ g = dev[0xa + i / 2] >> shift & 0xf,
10+ b = dev[0xc + i / 2] >> shift & 0xf;
11 colors[i] = 0x0f000000 | r << 16 | g << 8 | b;
12 colors[i] |= colors[i] << 4;
13 }
14 for(i = 0; i < 16; i++)
15- screen_palette[i] = colors[(i >> 2) ? (i >> 2) : (i & 3)];
16+ screen_palette[i] = colors[i >> 2 ? i >> 2 : i & 3];
17 screen_reqdraw = 1;
18 }
19
20@@ -574,7 +574,7 @@ screen_draw_sprite(void)
21 {
22 const int ctrl = dev[0x2f];
23 const int blend = ctrl & 0xf;
24- const int above = ctrl & 0x40;
25+ const int above = ctrl & 0x40, layer_mask = above ? 0x3 : 0xc;
26 const int opaque = blend % 5;
27 const int fx = ctrl & 0x10 ? -1 : 1, fy = ctrl & 0x20 ? -1 : 1;
28 const int qfx = fx > 0 ? 7 : 0, qfy = fy < 0 ? 7 : 0;
29@@ -582,7 +582,7 @@ screen_draw_sprite(void)
30 const int wmar = MAR(screen_width), wmar2 = MAR2(screen_width);
31 const int hmar2 = MAR2(screen_height);
32 const Uint8 *table = blending[blend];
33- int i, x1, x2, y1, y2, ax, ay, qx, qy, x = rX, y = rY;
34+ int i, x1, x2, y1, y2, ax, ay, bx, by, qx, qy, x = rX, y = rY;
35 if(ctrl & 0x80) {
36 const int addr_incr = rMA << 2;
37 for(i = 0; i <= rML; i++, x += dyx, y += dxy, rA += addr_incr) {
38@@ -590,14 +590,17 @@ screen_draw_sprite(void)
39 const Uint16 xmar2 = MAR2(x), ymar2 = MAR2(y);
40 if(xmar < wmar && ymar2 < hmar2) {
41 const Uint8 *sprite = &ram[rA];
42- const int by = ymar2 * wmar2;
43- for(ay = ymar * wmar2, qy = qfy; ay < by; ay += wmar2, qy += fy) {
44- const int ch1 = sprite[qy], ch2 = sprite[qy + 8] << 1, bx = xmar2 + ay;
45- for(ax = xmar + ay, qx = qfx; ax < bx; ax++, qx -= fx) {
46- const int color = ((ch1 >> qx) & 1) | ((ch2 >> qx) & 2);
47+ for(ay = ymar * wmar2, by = ymar2 * wmar2, qy = qfy; ay < by; ay += wmar2, qy += fy) {
48+ const int ch1 = sprite[qy];
49+ const int ch2 = sprite[qy + 8] << 1;
50+ for(ax = xmar + ay, bx = xmar2 + ay, qx = qfx; ax < bx; ax++, qx -= fx) {
51+ const int color = (ch1 >> qx & 1) | (ch2 >> qx & 2);
52 if(opaque || color) {
53- const int src = screen_layers[ax];
54- screen_layers[ax] = above ? (src & 0x3) | table[color] << 2 : (src & 0xc) | table[color];
55+ const int src = screen_layers[ax] & layer_mask;
56+ if(above)
57+ screen_layers[ax] = src | table[color] << 2;
58+ else
59+ screen_layers[ax] = src | table[color];
60 }
61 }
62 }
63@@ -610,14 +613,16 @@ screen_draw_sprite(void)
64 const Uint16 xmar2 = MAR2(x), ymar2 = MAR2(y);
65 if(xmar < wmar && ymar2 < hmar2) {
66 const Uint8 *sprite = &ram[rA];
67- const int by = ymar2 * wmar2;
68- for(ay = ymar * wmar2, qy = qfy; ay < by; ay += wmar2, qy += fy) {
69- const int ch1 = sprite[qy], bx = xmar2 + ay;
70- for(ax = xmar + ay, qx = qfx; ax < bx; ax++, qx -= fx) {
71- const int color = (ch1 >> qx) & 1;
72+ for(ay = ymar * wmar2, by = ymar2 * wmar2, qy = qfy; ay < by; ay += wmar2, qy += fy) {
73+ const int ch1 = sprite[qy];
74+ for(ax = xmar + ay, bx = xmar2 + ay, qx = qfx; ax < bx; ax++, qx -= fx) {
75+ const int color = ch1 >> qx & 1;
76 if(opaque || color) {
77- const int src = screen_layers[ax];
78- screen_layers[ax] = above ? (src & 0x3) | table[color] << 2 : (src & 0xc) | table[color];
79+ const int src = screen_layers[ax] & layer_mask;
80+ if(above)
81+ screen_layers[ax] = src | table[color] << 2;
82+ else
83+ screen_layers[ax] = src | table[color];
84 }
85 }
86 }