]> 4ch.mooo.com Git - 16.git/blob - 16/w_modex/XPAL.CPP
b052855f1a2b1c60cacc96c5192f980f4371a5b6
[16.git] / 16 / w_modex / XPAL.CPP
1 #include <conio.h>\r
2 #include <dos.h>\r
3 #include <mem.h>\r
4 \r
5 #include "modex.hpp"\r
6 #include "xpal.hpp"\r
7 \r
8 BYTE Xpal[768];\r
9 \r
10 void\r
11 set_paletteX(BYTE *pal, FLAG downgrade)\r
12 {\r
13     short int i;\r
14     BYTE *buf;\r
15 \r
16     memcpy(Xpal, pal, 768);\r
17 \r
18     buf = Xpal;\r
19     if (downgrade) {\r
20         i=768;\r
21         while (i--) {\r
22             *buf++ = (*buf >> 2);\r
23         }\r
24     }\r
25 \r
26     outp(0x03c8, 0);  // Start with color 0\r
27     buf = Xpal;\r
28     i=256;\r
29     while (i--) {\r
30         outp(0x03c9, *buf++);\r
31         outp(0x03c9, *buf++);\r
32         outp(0x03c9, *buf++);\r
33     }\r
34 }\r
35 \r
36 \r
37 void\r
38 get_paletteX(BYTE *pal, FLAG upgrade)\r
39 {\r
40     int i;\r
41 \r
42     memcpy(pal, Xpal, 768);\r
43 \r
44     if (upgrade) {\r
45         i=768;\r
46         while (i--) {\r
47             *pal++ = (*pal << 2);\r
48         }\r
49     }\r
50 }\r
51 \r
52 \r
53 void\r
54 get_BIOSpaletteX(BYTE *pal, FLAG upgrade)\r
55 {\r
56     int i;\r
57     union REGS r;\r
58 \r
59     r.x.eax = 0x1017;\r
60     r.x.ebx = 0;\r
61     r.x.ecx = 256;\r
62     r.x.edx = (unsigned long) pal;\r
63 \r
64     int386(0x10, &r, &r);\r
65 \r
66     if (upgrade) {\r
67         i=768;\r
68         while (i--) {\r
69             *pal++ = (*pal << 2);\r
70         }\r
71     }\r
72 }\r
73 \r
74 \r
75 void\r
76 photo_negativeX(void)\r
77 {\r
78     short int i;\r
79     BYTE temp_pal[768];\r
80     BYTE *temp;\r
81 \r
82     get_paletteX(temp_pal, 0);\r
83     temp = temp_pal;\r
84 \r
85     for (i=0; i < 256; i++) {\r
86         *temp++ = (64 - (*temp));\r
87         *temp++ = (64 - (*temp));\r
88         *temp++ = (64 - (*temp));\r
89     }\r
90 \r
91     set_paletteX(temp_pal, 0);\r
92 }\r
93 \r
94 \r
95 void\r
96 grey_paletteX(void)\r
97 {\r
98     smooth64_paletteX(1, 1, 1);\r
99 }\r
100 \r
101 \r
102 void\r
103 RGB_paletteX(void)\r
104 {\r
105     BYTE r, g, b;\r
106     BYTE temp_pal[768];\r
107     BYTE *temp;\r
108 \r
109     temp = temp_pal;\r
110 \r
111     for (r=0; r < 8; r++) {\r
112         for (g=0; g < 8; g++) {\r
113             for (b=0; b < 4; b++) {\r
114                 *temp++ = (r << 3);\r
115                 *temp++ = (g << 3);\r
116                 *temp++ = (b << 4);\r
117             }\r
118         }\r
119     }\r
120 \r
121     set_paletteX(temp_pal, 0);\r
122 }\r
123 \r
124 \r
125 void\r
126 smooth64_paletteX(BYTE r, BYTE g, BYTE b)\r
127 {\r
128     short int i;\r
129     BYTE temp_pal[768];\r
130     BYTE *temp;\r
131 \r
132     memset(temp_pal, 0, 768);\r
133 \r
134 \r
135     if (r) {\r
136         temp = temp_pal;\r
137         for (i=0; i < 64; i++) {\r
138             *temp = i;\r
139             temp += 3;\r
140         }\r
141     }\r
142 \r
143     if (g) {\r
144         temp = temp_pal + 1;\r
145         for (i=0; i < 64; i++) {\r
146             *temp = i;\r
147             temp += 3;\r
148         }\r
149     }\r
150 \r
151     if (b) {\r
152         temp = temp_pal + 2;\r
153         for (i=0; i < 64; i++) {\r
154             *temp = i;\r
155             temp += 3;\r
156         }\r
157     }\r
158 \r
159     set_paletteX(temp_pal, 0);\r
160 }\r
161 \r
162 \r
163 void\r
164 brighten_paletteX(SBYTE r, SBYTE g, SBYTE b)\r
165 {\r
166     short int i, j, scratch;\r
167     BYTE temp_pal[768];\r
168     BYTE *temp;\r
169     SBYTE dummy[3];\r
170 \r
171     get_paletteX(temp_pal, 0);\r
172     temp = temp_pal;\r
173 \r
174     dummy[0] = r;\r
175     dummy[1] = g;\r
176     dummy[2] = b;\r
177 \r
178     for (i=0; i < 256; i++) {\r
179         for (j=0; j < 3; j++) {\r
180             scratch = *temp + dummy[j];\r
181             if (scratch <= 0) {\r
182                 *temp++ = 0;\r
183             } else if (scratch >= 63) {\r
184                 *temp++ = 63;\r
185             } else {\r
186                 *temp++ = scratch;\r
187             }\r
188         }\r
189     }\r
190 \r
191     set_paletteX(temp_pal, 0);\r
192 }\r
193 \r
194 \r
195 void\r
196 stretch_paletteX(BYTE r, BYTE g, BYTE b)\r
197 {\r
198     short int i, j, scratch;\r
199     BYTE temp_pal[768];\r
200     BYTE *temp;\r
201     BYTE dummy[3];\r
202 \r
203     get_paletteX(temp_pal, 0);\r
204     temp = temp_pal;\r
205 \r
206     dummy[0] = r;\r
207     dummy[1] = g;\r
208     dummy[2] = b;\r
209 \r
210     for (i=0; i < 256; i++) {\r
211         for (j=0; j < 3; j++) {\r
212             scratch = ((((*temp - 32) * dummy[j]) + 8) >> 4) + 32;\r
213             if (scratch <= 0) {\r
214                 *temp++ = 0;\r
215             } else if (scratch >= 63) {\r
216                 *temp++ = 63;\r
217             } else {\r
218                 *temp++ = scratch;\r
219             }\r
220         }\r
221     }\r
222 \r
223     set_paletteX(temp_pal, 0);\r
224 }\r
225 \r
226 \r
227 void\r
228 rot_palette(BYTE dist)\r
229 {\r
230     int shift, i;\r
231     BYTE temp_pal[768];\r
232 \r
233     shift = (dist * 3);\r
234     memcpy(temp_pal, Xpal + shift, 768 - shift);\r
235     memcpy(temp_pal + (768 - shift), Xpal, shift);\r
236 \r
237     set_paletteX(temp_pal, 0);\r
238 }\r
239 \r
240 \r
241 BYTE\r
242 find_RGB(BYTE r, BYTE g, BYTE b)\r
243 {\r
244     long shortest_dist, temp_dist;\r
245     short int i, shortest_pal;\r
246 \r
247     shortest_pal = 0;\r
248     shortest_dist = (r - Xpal[0]) * (r - Xpal[0]) +\r
249                     (g - Xpal[1]) * (g - Xpal[1]) +\r
250                     (b - Xpal[2]) * (b - Xpal[2]);\r
251 \r
252     for (i=1; i < 256; i++) {\r
253         temp_dist = (r - Xpal[(i * 3) + 0]) * (r - Xpal[(i * 3) + 0]) +\r
254                     (g - Xpal[(i * 3) + 1]) * (g - Xpal[(i * 3) + 1]) +\r
255                     (b - Xpal[(i * 3) + 2]) * (b - Xpal[(i * 3) + 2]);\r
256 \r
257         if (temp_dist < shortest_dist) {\r
258             shortest_dist = temp_dist;\r
259             shortest_pal = i;\r
260         }\r
261     }\r
262 \r
263     return i;\r
264 }\r
265 \r