ALL: Huge upstream synch + PerRom DelaySI & CountPerOp parameters
[mupen64plus-pandora.git] / source / gles2glide64 / src / Glide64 / TexMod.h
CommitLineData
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
40static 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
63static 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
91static 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
113static 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
142static 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
170static 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
198static 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
224static 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
249static 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
284static 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
299static 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
331static 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
360static 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
382static 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
406static 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
427static 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
459static 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
487static 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
511static 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
536static 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
558static 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}