summaryrefslogtreecommitdiff
path: root/apps/plugins/rockboy/palette.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/rockboy/palette.c')
-rw-r--r--apps/plugins/rockboy/palette.c153
1 files changed, 153 insertions, 0 deletions
diff --git a/apps/plugins/rockboy/palette.c b/apps/plugins/rockboy/palette.c
new file mode 100644
index 0000000000..5c5083d247
--- /dev/null
+++ b/apps/plugins/rockboy/palette.c
@@ -0,0 +1,153 @@
1
2
3#include "rockmacros.h"
4#include "defs.h"
5#include "fb.h"
6#include "palette.h"
7
8
9static byte palmap[32768];
10static byte pallock[256];
11static int palrev[256];
12
13/* Course color mapping, for when palette is exhausted. */
14static byte crsmap[4][32768];
15static int crsrev[4][256];
16static const int crsmask[4] = { 0x7BDE, 0x739C, 0x6318, 0x4210 };
17
18enum plstatus
19{
20 pl_unused = 0,
21 pl_linger,
22 pl_active,
23 pl_locked
24};
25
26/*
27static byte bestmatch(int c)
28{
29 byte n, best;
30 int r, g, b;
31 int r2, g2, b2, c2;
32 int err, besterr;
33
34 r = (c & 0x001F) << 3;
35 g = (c & 0x03E0) >> 2;
36 b = (c & 0x7C00) >> 7;
37
38 best = 0;
39 besterr = 1024;
40 for (n = 1; n; n++)
41 {
42 c2 = palrev[n];
43 r2 = (c2 & 0x001F) << 3;
44 g2 = (c2 & 0x03E0) >> 2;
45 b2 = (c2 & 0x7C00) >> 7;
46 err = abs(r-r2) + abs(b-b2) + abs(g-g2);
47 if (err < besterr)
48 {
49 besterr = err;
50 best = n;
51 }
52 }
53 return best;
54}
55*/
56
57static void makecourse(int c, byte n)
58{
59 int i;
60 for (i = 0; i < 4; i++)
61 {
62 c &= crsmask[i];
63 crsmap[i][c] = n;
64 crsrev[i][n] = c;
65 }
66}
67
68static byte findcourse(int c)
69{
70 int i;
71 byte n;
72 for (i = 0; i < 4; i++)
73 {
74 c &= crsmask[i];
75 n = crsmap[i][c];
76 if (crsrev[i][n] == c)
77 return n;
78 }
79 return 0;
80}
81
82
83void pal_lock(byte n)
84{
85 if (!n) return;
86 if (pallock[n] >= pl_locked)
87 pallock[n]++;
88 else pallock[n] = pl_locked;
89}
90
91byte pal_getcolor(int c, int r, int g, int b)
92{
93 byte n;
94 static byte l;
95 n = palmap[c];
96 if (n && pallock[n] && palrev[n] == c)
97 {
98 pal_lock(n);
99 return n;
100 }
101 for (n = l+1; n != l; n++)
102 {
103 if (!n || pallock[n] /* || n < 16 */) continue;
104 pal_lock(n);
105 palmap[c] = n;
106 palrev[n] = c;
107 makecourse(c, n);
108 vid_setpal(n, r, g, b);
109 return (l = n);
110 }
111 n = findcourse(c);
112 pal_lock(n);
113 return n;
114}
115
116void pal_release(byte n)
117{
118 if (pallock[n] >= pl_locked)
119 pallock[n]--;
120}
121
122
123void pal_expire(void)
124{
125 int i;
126 for (i = 0; i < 256; i++)
127 if (pallock[i] && pallock[i] < pl_locked)
128 pallock[i]--;
129}
130
131
132void pal_set332(void)
133{
134 int i, r, g, b;
135
136 fb.indexed = 0;
137 fb.cc[0].r = 5;
138 fb.cc[1].r = 5;
139 fb.cc[2].r = 6;
140 fb.cc[0].l = 0;
141 fb.cc[1].l = 3;
142 fb.cc[2].l = 6;
143
144 i = 0;
145 for (b = 0; b < 4; b++) for (g = 0; g < 8; g++) for (r = 0; r < 8; r++)
146 vid_setpal(i++, (r<<5)|(r<<2)|(r>>1),
147 (g<<5)|(g<<2)|(g>>1), (b<<6)|(b<<4)|(b<<2)|b);
148}
149
150
151
152
153