~ubuntu-branches/ubuntu/lucid/mupen64plus/lucid-updates

« back to all changes in this revision

Viewing changes to glide64/TexMod.h

  • Committer: Bazaar Package Importer
  • Author(s): Sven Eckelmann
  • Date: 2009-09-08 22:17:00 UTC
  • Revision ID: james.westby@ubuntu.com-20090908221700-yela0ckgc1xwiqtn
Tags: upstream-1.5+dfsg1
ImportĀ upstreamĀ versionĀ 1.5+dfsg1

Show diffs side-by-side

added added

removed removed

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