98e75f2d |
1 | /* |
2 | * Glide64 - Glide video plugin for Nintendo 64 emulators. |
3 | * Copyright (c) 2002 Dave2001 |
4 | * Copyright (c) 2003-2009 Sergey 'Gonetz' Lipski |
5 | * |
6 | * This program is free software; you can redistribute it and/or modify |
7 | * it under the terms of the GNU General Public License as published by |
8 | * the Free Software Foundation; either version 2 of the License, or |
9 | * any later version. |
10 | * |
11 | * This program is distributed in the hope that it will be useful, |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | * GNU General Public License for more details. |
15 | * |
16 | * You should have received a copy of the GNU General Public License |
17 | * along with this program; if not, write to the Free Software |
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
19 | */ |
20 | |
21 | //**************************************************************** |
22 | // |
23 | // Glide64 - Glide Plugin for Nintendo 64 emulators |
24 | // Project started on December 29th, 2001 |
25 | // |
26 | // Authors: |
27 | // Dave2001, original author, founded the project in 2001, left it in 2002 |
28 | // Gugaman, joined the project in 2002, left it in 2002 |
29 | // Sergey 'Gonetz' Lipski, joined the project in 2002, main author since fall of 2002 |
30 | // Hiroshi 'KoolSmoky' Morii, joined the project in 2007 |
31 | // |
32 | //**************************************************************** |
33 | // |
34 | // To modify Glide64: |
35 | // * Write your name and (optional)email, commented by your work, so I know who did it, and so that you can find which parts you modified when it comes time to send it to me. |
36 | // * Do NOT send me the whole project or file that you modified. Take out your modified code sections, and tell me where to put them. If people sent the whole thing, I would have many different versions, but no idea how to combine them all. |
37 | // |
38 | //**************************************************************** |
39 | |
40 | static void mod_tex_inter_color_using_factor (wxUint16 *dst, int size, wxUint32 color, wxUint32 factor) |
41 | { |
42 | float percent = factor / 255.0f; |
43 | float percent_i = 1 - percent; |
44 | wxUint32 cr, cg, cb; |
45 | wxUint16 col, a; |
46 | wxUint8 r, g, b; |
47 | |
48 | cr = (color >> 12) & 0xF; |
49 | cg = (color >> 8) & 0xF; |
50 | cb = (color >> 4) & 0xF; |
51 | |
52 | for (int i=0; i<size; i++) |
53 | { |
54 | col = *dst; |
55 | a = col & 0xF000; |
56 | r = (wxUint8)(percent_i * ((col >> 8) & 0xF) + percent * cr); |
57 | g = (wxUint8)(percent_i * ((col >> 4) & 0xF) + percent * cg); |
58 | b = (wxUint8)(percent_i * (col & 0xF) + percent * cb); |
59 | *(dst++) = a | (r << 8) | (g << 4) | b; |
60 | } |
61 | } |
62 | |
63 | static void mod_tex_inter_col_using_col1 (wxUint16 *dst, int size, wxUint32 color0, wxUint32 color1) |
64 | { |
65 | wxUint32 cr, cg, cb; |
66 | wxUint16 col, a; |
67 | wxUint8 r, g, b; |
68 | |
69 | float percent_r = ((color1 >> 12) & 0xF) / 15.0f; |
70 | float percent_g = ((color1 >> 8) & 0xF) / 15.0f; |
71 | float percent_b = ((color1 >> 4) & 0xF) / 15.0f; |
72 | float percent_r_i = 1.0f - percent_r; |
73 | float percent_g_i = 1.0f - percent_g; |
74 | float percent_b_i = 1.0f - percent_b; |
75 | |
76 | cr = (color0 >> 12) & 0xF; |
77 | cg = (color0 >> 8) & 0xF; |
78 | cb = (color0 >> 4) & 0xF; |
79 | |
80 | for (int i=0; i<size; i++) |
81 | { |
82 | col = *dst; |
83 | a = col & 0xF000; |
84 | r = (wxUint8)(percent_r_i * ((col >> 8) & 0xF) + percent_r * cr); |
85 | g = (wxUint8)(percent_g_i * ((col >> 4) & 0xF) + percent_g * cg); |
86 | b = (wxUint8)(percent_b_i * (col & 0xF) + percent_b * cb); |
87 | *(dst++) = a | (r << 8) | (g << 4) | b; |
88 | } |
89 | } |
90 | |
91 | static void mod_full_color_sub_tex (wxUint16 *dst, int size, wxUint32 color) |
92 | { |
93 | wxUint32 cr, cg, cb, ca; |
94 | wxUint16 col; |
95 | wxUint8 a, r, g, b; |
96 | |
97 | cr = (color >> 12) & 0xF; |
98 | cg = (color >> 8) & 0xF; |
99 | cb = (color >> 4) & 0xF; |
100 | ca = color & 0xF; |
101 | |
102 | for (int i=0; i<size; i++) |
103 | { |
104 | col = *dst; |
105 | a = (wxUint8)(ca - ((col >> 12) & 0xF)); |
106 | r = (wxUint8)(cr - ((col >> 8) & 0xF)); |
107 | g = (wxUint8)(cg - ((col >> 4) & 0xF)); |
108 | b = (wxUint8)(cb - (col & 0xF)); |
109 | *(dst++) = (a << 12) | (r << 8) | (g << 4) | b; |
110 | } |
111 | } |
112 | |
113 | static void mod_col_inter_col1_using_tex (wxUint16 *dst, int size, wxUint32 color0, wxUint32 color1) |
114 | { |
115 | wxUint32 cr0, cg0, cb0, cr1, cg1, cb1; |
116 | wxUint16 col; |
117 | wxUint8 r, g, b; |
118 | wxUint16 a; |
119 | float percent_r, percent_g, percent_b; |
120 | |
121 | cr0 = (color0 >> 12) & 0xF; |
122 | cg0 = (color0 >> 8) & 0xF; |
123 | cb0 = (color0 >> 4) & 0xF; |
124 | cr1 = (color1 >> 12) & 0xF; |
125 | cg1 = (color1 >> 8) & 0xF; |
126 | cb1 = (color1 >> 4) & 0xF; |
127 | |
128 | for (int i=0; i<size; i++) |
129 | { |
130 | col = *dst; |
131 | a = col & 0xF000; |
132 | percent_r = ((col >> 8) & 0xF) / 15.0f; |
133 | percent_g = ((col >> 4) & 0xF) / 15.0f; |
134 | percent_b = (col & 0xF) / 15.0f; |
135 | r = min(15, (wxUint8)((1.0f-percent_r) * cr0 + percent_r * cr1 + 0.0001f)); |
136 | g = min(15, (wxUint8)((1.0f-percent_g) * cg0 + percent_g * cg1 + 0.0001f)); |
137 | b = min(15, (wxUint8)((1.0f-percent_b) * cb0 + percent_b * cb1 + 0.0001f)); |
138 | *(dst++) = a | (r << 8) | (g << 4) | b; |
139 | } |
140 | } |
141 | |
142 | static void mod_col_inter_col1_using_texa (wxUint16 *dst, int size, wxUint32 color0, wxUint32 color1) |
143 | { |
144 | wxUint32 cr0, cg0, cb0, cr1, cg1, cb1; |
145 | wxUint16 col; |
146 | wxUint8 r, g, b; |
147 | wxUint16 a; |
148 | float percent, percent_i; |
149 | |
150 | cr0 = (color0 >> 12) & 0xF; |
151 | cg0 = (color0 >> 8) & 0xF; |
152 | cb0 = (color0 >> 4) & 0xF; |
153 | cr1 = (color1 >> 12) & 0xF; |
154 | cg1 = (color1 >> 8) & 0xF; |
155 | cb1 = (color1 >> 4) & 0xF; |
156 | |
157 | for (int i=0; i<size; i++) |
158 | { |
159 | col = *dst; |
160 | a = col & 0xF000; |
161 | percent = (a >> 12) / 15.0f; |
162 | percent_i = 1.0f - percent; |
163 | r = (wxUint8)(percent_i * cr0 + percent * cr1); |
164 | g = (wxUint8)(percent_i * cg0 + percent * cg1); |
165 | b = (wxUint8)(percent_i * cb0 + percent * cb1); |
166 | *(dst++) = a | (r << 8) | (g << 4) | b; |
167 | } |
168 | } |
169 | |
170 | static void mod_col_inter_col1_using_texa__mul_tex (wxUint16 *dst, int size, wxUint32 color0, wxUint32 color1) |
171 | { |
172 | wxUint32 cr0, cg0, cb0, cr1, cg1, cb1; |
173 | wxUint16 col; |
174 | wxUint8 r, g, b; |
175 | wxUint16 a; |
176 | float percent, percent_i; |
177 | |
178 | cr0 = (color0 >> 12) & 0xF; |
179 | cg0 = (color0 >> 8) & 0xF; |
180 | cb0 = (color0 >> 4) & 0xF; |
181 | cr1 = (color1 >> 12) & 0xF; |
182 | cg1 = (color1 >> 8) & 0xF; |
183 | cb1 = (color1 >> 4) & 0xF; |
184 | |
185 | for (int i=0; i<size; i++) |
186 | { |
187 | col = *dst; |
188 | a = col & 0xF000; |
189 | percent = (a >> 12) / 15.0f; |
190 | percent_i = 1.0f - percent; |
191 | r = (wxUint8)(((percent_i * cr0 + percent * cr1) / 15.0f) * (((col & 0x0F00) >> 8) / 15.0f) * 15.0f); |
192 | g = (wxUint8)(((percent_i * cg0 + percent * cg1) / 15.0f) * (((col & 0x00F0) >> 4) / 15.0f) * 15.0f); |
193 | b = (wxUint8)(((percent_i * cb0 + percent * cb1) / 15.0f) * ((col & 0x000F) / 15.0f) * 15.0f); |
194 | *(dst++) = a | (r << 8) | (g << 4) | b; |
195 | } |
196 | } |
197 | |
198 | static void mod_col_inter_tex_using_tex (wxUint16 *dst, int size, wxUint32 color) |
199 | { |
200 | wxUint32 cr, cg, cb; |
201 | wxUint16 col; |
202 | wxUint8 r, g, b; |
203 | wxUint16 a; |
204 | float percent_r, percent_g, percent_b; |
205 | |
206 | cr = (color >> 12) & 0xF; |
207 | cg = (color >> 8) & 0xF; |
208 | cb = (color >> 4) & 0xF; |
209 | |
210 | for (int i=0; i<size; i++) |
211 | { |
212 | col = *dst; |
213 | a = col & 0xF000; |
214 | percent_r = ((col >> 8) & 0xF) / 15.0f; |
215 | percent_g = ((col >> 4) & 0xF) / 15.0f; |
216 | percent_b = (col & 0xF) / 15.0f; |
217 | r = (wxUint8)((1.0f-percent_r) * cr + percent_r * ((col & 0x0F00) >> 8)); |
218 | g = (wxUint8)((1.0f-percent_g) * cg + percent_g * ((col & 0x00F0) >> 4)); |
219 | b = (wxUint8)((1.0f-percent_b) * cb + percent_b * (col & 0x000F)); |
220 | *(dst++) = a | (r << 8) | (g << 4) | b; |
221 | } |
222 | } |
223 | |
224 | static void mod_col_inter_tex_using_texa (wxUint16 *dst, int size, wxUint32 color) |
225 | { |
226 | wxUint32 cr, cg, cb; |
227 | wxUint16 col; |
228 | wxUint8 r, g, b; |
229 | wxUint16 a; |
230 | float percent, percent_i; |
231 | |
232 | cr = (color >> 12) & 0xF; |
233 | cg = (color >> 8) & 0xF; |
234 | cb = (color >> 4) & 0xF; |
235 | |
236 | for (int i=0; i<size; i++) |
237 | { |
238 | col = *dst; |
239 | a = col & 0xF000; |
240 | percent = (a >> 12) / 15.0f; |
241 | percent_i = 1.0f - percent; |
242 | r = (wxUint8)(percent_i * cr + percent * ((col & 0x0F00) >> 8)); |
243 | g = (wxUint8)(percent_i * cg + percent * ((col & 0x00F0) >> 4)); |
244 | b = (wxUint8)(percent_i * cb + percent * (col & 0x000F)); |
245 | *(dst++) = a | (r << 8) | (g << 4) | b; |
246 | } |
247 | } |
248 | |
249 | static void mod_col2_inter__col_inter_col1_using_tex__using_texa (wxUint16 *dst, int size, |
250 | wxUint32 color0, wxUint32 color1, |
251 | wxUint32 color2) |
252 | { |
253 | wxUint32 cr0, cg0, cb0, cr1, cg1, cb1, cr2, cg2, cb2; |
254 | wxUint16 col; |
255 | wxUint8 r, g, b; |
256 | wxUint16 a; |
257 | float percent_r, percent_g, percent_b, percent_a; |
258 | |
259 | cr0 = (color0 >> 12) & 0xF; |
260 | cg0 = (color0 >> 8) & 0xF; |
261 | cb0 = (color0 >> 4) & 0xF; |
262 | cr1 = (color1 >> 12) & 0xF; |
263 | cg1 = (color1 >> 8) & 0xF; |
264 | cb1 = (color1 >> 4) & 0xF; |
265 | cr2 = (color2 >> 12) & 0xF; |
266 | cg2 = (color2 >> 8) & 0xF; |
267 | cb2 = (color2 >> 4) & 0xF; |
268 | |
269 | for (int i=0; i<size; i++) |
270 | { |
271 | col = *dst; |
272 | a = col & 0xF000; |
273 | percent_a = (a >> 12) / 15.0f; |
274 | percent_r = ((col >> 8) & 0xF) / 15.0f; |
275 | percent_g = ((col >> 4) & 0xF) / 15.0f; |
276 | percent_b = (col & 0xF) / 15.0f; |
277 | r = (wxUint8)(((1.0f-percent_r) * cr0 + percent_r * cr1) * percent_a + cr2 * (1.0f-percent_a)); |
278 | g = (wxUint8)(((1.0f-percent_g) * cg0 + percent_g * cg1) * percent_a + cg2 * (1.0f-percent_a)); |
279 | b = (wxUint8)(((1.0f-percent_b) * cb0 + percent_b * cb1) * percent_a + cb2 * (1.0f-percent_a)); |
280 | *(dst++) = a | (r << 8) | (g << 4) | b; |
281 | } |
282 | } |
283 | |
284 | static void mod_tex_scale_fac_add_fac (wxUint16 *dst, int size, wxUint32 factor) |
285 | { |
286 | float percent = factor / 255.0f; |
287 | wxUint16 col; |
288 | wxUint8 a; |
289 | float base_a = (1.0f - percent) * 15.0f; |
290 | |
291 | for (int i=0; i<size; i++) |
292 | { |
293 | col = *dst; |
294 | a = (wxUint8)(base_a + percent * (col>>12)); |
295 | *(dst++) = (a<<12) | (col & 0x0FFF); |
296 | } |
297 | } |
298 | |
299 | static void mod_tex_sub_col_mul_fac_add_tex (wxUint16 *dst, int size, wxUint32 color, wxUint32 factor) |
300 | { |
301 | float percent = factor / 255.0f; |
302 | wxUint32 cr, cg, cb; |
303 | wxUint16 col, a; |
304 | float r, g, b; |
305 | |
306 | cr = (color >> 12) & 0xF; |
307 | cg = (color >> 8) & 0xF; |
308 | cb = (color >> 4) & 0xF; |
309 | |
310 | for (int i=0; i<size; i++) |
311 | { |
312 | col = *dst; |
313 | a = col & 0xF000; |
314 | r = (float)((col >> 8) & 0xF); |
315 | r = /*max(*/(r - cr) * percent/*, 0.0f)*/ + r; |
316 | if (r > 15.0f) r = 15.0f; |
317 | if (r < 0.0f) r = 0.0f; |
318 | g = (float)((col >> 4) & 0xF); |
319 | g = /*max(*/(g - cg) * percent/*, 0.0f)*/ + g; |
320 | if (g > 15.0f) g = 15.0f; |
321 | if (g < 0.0f) g = 0.0f; |
322 | b = (float)(col & 0xF); |
323 | b = /*max(*/(b - cb) * percent/*, 0.0f)*/ + b; |
324 | if (b > 15.0f) b = 15.0f; |
325 | if (b < 0.0f) b = 0.0f; |
326 | |
327 | *(dst++) = a | ((wxUint16)r << 8) | ((wxUint16)g << 4) | (wxUint16)b; |
328 | } |
329 | } |
330 | |
331 | static void mod_tex_scale_col_add_col (wxUint16 *dst, int size, wxUint32 color0, wxUint32 color1) |
332 | { |
333 | wxUint32 cr0, cg0, cb0, cr1, cg1, cb1; |
334 | wxUint16 col; |
335 | wxUint8 r, g, b; |
336 | wxUint16 a; |
337 | float percent_r, percent_g, percent_b; |
338 | |
339 | cr0 = (color0 >> 12) & 0xF; |
340 | cg0 = (color0 >> 8) & 0xF; |
341 | cb0 = (color0 >> 4) & 0xF; |
342 | cr1 = (color1 >> 12) & 0xF; |
343 | cg1 = (color1 >> 8) & 0xF; |
344 | cb1 = (color1 >> 4) & 0xF; |
345 | |
346 | for (int i=0; i<size; i++) |
347 | { |
348 | col = *dst; |
349 | a = col & 0xF000; |
350 | percent_r = ((col >> 8) & 0xF) / 15.0f; |
351 | percent_g = ((col >> 4) & 0xF) / 15.0f; |
352 | percent_b = (col & 0xF) / 15.0f; |
353 | r = min(15, (wxUint8)(percent_r * cr0 + cr1 + 0.0001f)); |
354 | g = min(15, (wxUint8)(percent_g * cg0 + cg1 + 0.0001f)); |
355 | b = min(15, (wxUint8)(percent_b * cb0 + cb1 + 0.0001f)); |
356 | *(dst++) = a | (r << 8) | (g << 4) | b; |
357 | } |
358 | } |
359 | |
360 | static void mod_tex_add_col (wxUint16 *dst, int size, wxUint32 color) |
361 | { |
362 | wxUint32 cr, cg, cb; |
363 | wxUint16 col; |
364 | wxUint8 a, r, g, b; |
365 | |
366 | cr = (color >> 12) & 0xF; |
367 | cg = (color >> 8) & 0xF; |
368 | cb = (color >> 4) & 0xF; |
369 | |
370 | for (int i=0; i<size; i++) |
371 | { |
372 | col = *dst; |
373 | a = (wxUint8)((col >> 12) & 0xF); |
374 | // a = col & 0xF000; |
375 | r = (wxUint8)(cr + ((col >> 8) & 0xF))&0xF; |
376 | g = (wxUint8)(cg + ((col >> 4) & 0xF))&0xF; |
377 | b = (wxUint8)(cb + (col & 0xF))&0xF; |
378 | *(dst++) = (a << 12) | (r << 8) | (g << 4) | b; |
379 | } |
380 | } |
381 | |
382 | static void mod_col_mul_texa_add_tex (wxUint16 *dst, int size, wxUint32 color) |
383 | { |
384 | wxUint32 cr, cg, cb; |
385 | wxUint16 col; |
386 | wxUint8 r, g, b; |
387 | wxUint16 a; |
388 | float factor; |
389 | |
390 | cr = (color >> 12) & 0xF; |
391 | cg = (color >> 8) & 0xF; |
392 | cb = (color >> 4) & 0xF; |
393 | |
394 | for (int i=0; i<size; i++) |
395 | { |
396 | col = *dst; |
397 | a = col & 0xF000; |
398 | factor = (a >> 12) / 15.0f; |
399 | r = (wxUint8)(cr*factor + ((col >> 8) & 0xF))&0xF; |
400 | g = (wxUint8)(cg*factor + ((col >> 4) & 0xF))&0xF; |
401 | b = (wxUint8)(cb*factor + (col & 0xF))&0xF; |
402 | *(dst++) = a | (r << 8) | (g << 4) | b; |
403 | } |
404 | } |
405 | |
406 | static void mod_tex_sub_col (wxUint16 *dst, int size, wxUint32 color) |
407 | { |
408 | int cr, cg, cb; |
409 | wxUint16 col; |
410 | wxUint8 a, r, g, b; |
411 | |
412 | cr = (color >> 12) & 0xF; |
413 | cg = (color >> 8) & 0xF; |
414 | cb = (color >> 4) & 0xF; |
415 | |
416 | for (int i=0; i<size; i++) |
417 | { |
418 | col = *dst; |
419 | a = (wxUint8)(col & 0xF000); |
420 | r = (wxUint8)max((((col >> 8) & 0xF) - cr), 0); |
421 | g = (wxUint8)max((((col >> 4) & 0xF) - cg), 0); |
422 | b = (wxUint8)max(((col & 0xF) - cb), 0); |
423 | *(dst++) = (a << 12) | (r << 8) | (g << 4) | b; |
424 | } |
425 | } |
426 | |
427 | static void mod_tex_sub_col_mul_fac (wxUint16 *dst, int size, wxUint32 color, wxUint32 factor) |
428 | { |
429 | float percent = factor / 255.0f; |
430 | wxUint32 cr, cg, cb; |
431 | wxUint16 col, a; |
432 | float r, g, b; |
433 | |
434 | cr = (color >> 12) & 0xF; |
435 | cg = (color >> 8) & 0xF; |
436 | cb = (color >> 4) & 0xF; |
437 | |
438 | for (int i=0; i<size; i++) |
439 | { |
440 | col = *dst; |
441 | a = (wxUint8)((col >> 12) & 0xF); |
442 | r = (float)((col >> 8) & 0xF); |
443 | r = (r - cr) * percent; |
444 | if (r > 15.0f) r = 15.0f; |
445 | if (r < 0.0f) r = 0.0f; |
446 | g = (float)((col >> 4) & 0xF); |
447 | g = (g - cg) * percent; |
448 | if (g > 15.0f) g = 15.0f; |
449 | if (g < 0.0f) g = 0.0f; |
450 | b = (float)(col & 0xF); |
451 | b = (b - cb) * percent; |
452 | if (b > 15.0f) b = 15.0f; |
453 | if (b < 0.0f) b = 0.0f; |
454 | |
455 | *(dst++) = (a << 12) | ((wxUint16)r << 8) | ((wxUint16)g << 4) | (wxUint16)b; |
456 | } |
457 | } |
458 | |
459 | static void mod_col_inter_tex_using_col1 (wxUint16 *dst, int size, wxUint32 color0, wxUint32 color1) |
460 | { |
461 | wxUint32 cr, cg, cb; |
462 | wxUint16 col, a; |
463 | wxUint8 r, g, b; |
464 | |
465 | float percent_r = ((color1 >> 12) & 0xF) / 15.0f; |
466 | float percent_g = ((color1 >> 8) & 0xF) / 15.0f; |
467 | float percent_b = ((color1 >> 4) & 0xF) / 15.0f; |
468 | float percent_r_i = 1.0f - percent_r; |
469 | float percent_g_i = 1.0f - percent_g; |
470 | float percent_b_i = 1.0f - percent_b; |
471 | |
472 | cr = (color0 >> 12) & 0xF; |
473 | cg = (color0 >> 8) & 0xF; |
474 | cb = (color0 >> 4) & 0xF; |
475 | |
476 | for (int i=0; i<size; i++) |
477 | { |
478 | col = *dst; |
479 | a = (wxUint8)((col >> 12) & 0xF); |
480 | r = (wxUint8)(percent_r * ((col >> 8) & 0xF) + percent_r_i * cr); |
481 | g = (wxUint8)(percent_g * ((col >> 4) & 0xF) + percent_g_i * cg); |
482 | b = (wxUint8)(percent_b * (col & 0xF) + percent_b_i * cb); |
483 | *(dst++) = (a << 12) | (r << 8) | (g << 4) | b; |
484 | } |
485 | } |
486 | |
487 | static void mod_tex_inter_noise_using_col (wxUint16 *dst, int size, wxUint32 color) |
488 | { |
489 | wxUint16 col, a; |
490 | wxUint8 r, g, b, noise; |
491 | |
492 | float percent_r = ((color >> 12) & 0xF) / 15.0f; |
493 | float percent_g = ((color >> 8) & 0xF) / 15.0f; |
494 | float percent_b = ((color >> 4) & 0xF) / 15.0f; |
495 | float percent_r_i = 1.0f - percent_r; |
496 | float percent_g_i = 1.0f - percent_g; |
497 | float percent_b_i = 1.0f - percent_b; |
498 | |
499 | for (int i=0; i<size; i++) |
500 | { |
501 | col = *dst; |
502 | a = col & 0xF000; |
503 | noise = rand()%16; |
504 | r = (wxUint8)(percent_r_i * ((col >> 8) & 0xF) + percent_r * noise); |
505 | g = (wxUint8)(percent_g_i * ((col >> 4) & 0xF) + percent_g * noise); |
506 | b = (wxUint8)(percent_b_i * (col & 0xF) + percent_b * noise); |
507 | *(dst++) = a | (r << 8) | (g << 4) | b; |
508 | } |
509 | } |
510 | |
511 | static void mod_tex_inter_col_using_texa (wxUint16 *dst, int size, wxUint32 color) |
512 | { |
513 | wxUint32 cr, cg, cb; |
514 | wxUint16 col; |
515 | wxUint8 r, g, b; |
516 | wxUint16 a; |
517 | float percent, percent_i; |
518 | |
519 | cr = (color >> 12) & 0xF; |
520 | cg = (color >> 8) & 0xF; |
521 | cb = (color >> 4) & 0xF; |
522 | |
523 | for (int i=0; i<size; i++) |
524 | { |
525 | col = *dst; |
526 | a = col & 0xF000; |
527 | percent = (a >> 12) / 15.0f; |
528 | percent_i = 1.0f - percent; |
529 | r = (wxUint8)(percent * cr + percent_i * ((col & 0x0F00) >> 8)); |
530 | g = (wxUint8)(percent * cg + percent_i * ((col & 0x00F0) >> 4)); |
531 | b = (wxUint8)(percent * cb + percent_i * (col & 0x000F)); |
532 | *(dst++) = a | (r << 8) | (g << 4) | b; |
533 | } |
534 | } |
535 | |
536 | static void mod_tex_mul_col (wxUint16 *dst, int size, wxUint32 color) |
537 | { |
538 | float cr, cg, cb; |
539 | wxUint16 col; |
540 | wxUint8 r, g, b; |
541 | wxUint16 a; |
542 | |
543 | cr = (float)((color >> 12) & 0xF)/16.0f; |
544 | cg = (float)((color >> 8) & 0xF)/16.0f; |
545 | cb = (float)((color >> 4) & 0xF)/16.0f; |
546 | |
547 | for (int i=0; i<size; i++) |
548 | { |
549 | col = *dst; |
550 | a = col & 0xF000; |
551 | r = (wxUint8)(cr * ((col & 0x0F00) >> 8)); |
552 | g = (wxUint8)(cg * ((col & 0x00F0) >> 4)); |
553 | b = (wxUint8)(cb * (col & 0x000F)); |
554 | *(dst++) = a | (r << 8) | (g << 4) | b; |
555 | } |
556 | } |
557 | |
558 | static void mod_tex_scale_fac_add_col (wxUint16 *dst, int size, wxUint32 color, wxUint32 factor) |
559 | { |
560 | float percent = factor / 255.0f; |
561 | wxUint32 cr, cg, cb; |
562 | wxUint16 col; |
563 | float r, g, b; |
564 | |
565 | cr = (color >> 12) & 0xF; |
566 | cg = (color >> 8) & 0xF; |
567 | cb = (color >> 4) & 0xF; |
568 | |
569 | for (int i=0; i<size; i++) |
570 | { |
571 | col = *dst; |
572 | r = cr + percent * (float)((col>>8)&0xF); |
573 | g = cg + percent * (float)((col>>4)&0xF); |
574 | b = cb + percent * (float)(col&0xF); |
575 | *(dst++) = (col&0xF000) | ((wxUint8)r << 8) | ((wxUint8)g << 4) | (wxUint8)b; |
576 | } |
577 | } |