Glide Plugin GLES2 port from mupen64plus-ae, but with special FrameSkip code
[mupen64plus-pandora.git] / source / gles2glide64 / src / Glide64 / TexMod.h
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 }