2
* Glide64 - Glide video plugin for Nintendo 64 emulators.
3
* Copyright (c) 2002 Dave2001
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
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.
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
21
//****************************************************************
23
// Glide64 - Glide Plugin for Nintendo 64 emulators (tested mostly with Project64)
24
// Project started on December 29th, 2001
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.
30
// Official Glide64 development channel: #Glide64 on EFnet
32
// Original author: Dave2001 (Dave2999@hotmail.com)
33
// Other authors: Gonetz, Gugaman
35
//****************************************************************
41
static void mod_tex_inter_color_using_factor (WORD *dst, int size, DWORD color, DWORD factor)
43
float percent = factor / 255.0f;
44
float percent_i = 1 - percent;
49
cr = (color >> 12) & 0xF;
50
cg = (color >> 8) & 0xF;
51
cb = (color >> 4) & 0xF;
53
for (int i=0; i<size; i++)
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;
64
static void mod_tex_inter_col_using_col1 (WORD *dst, int size, DWORD color0, DWORD color1)
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;
77
cr = (color0 >> 12) & 0xF;
78
cg = (color0 >> 8) & 0xF;
79
cb = (color0 >> 4) & 0xF;
81
for (int i=0; i<size; i++)
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;
92
static void mod_full_color_sub_tex (WORD *dst, int size, DWORD color)
98
cr = (color >> 12) & 0xF;
99
cg = (color >> 8) & 0xF;
100
cb = (color >> 4) & 0xF;
103
for (int i=0; i<size; i++)
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;
114
static void mod_col_inter_col1_using_tex (WORD *dst, int size, DWORD color0, DWORD color1)
116
DWORD cr0, cg0, cb0, cr1, cg1, cb1;
120
float percent_r, percent_g, percent_b;
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;
129
for (int i=0; i<size; i++)
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;
143
static void mod_col_inter_col1_using_texa (WORD *dst, int size, DWORD color0, DWORD color1)
145
DWORD cr0, cg0, cb0, cr1, cg1, cb1;
149
float percent, percent_i;
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;
158
for (int i=0; i<size; i++)
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;
171
static void mod_col_inter_col1_using_texa__mul_tex (WORD *dst, int size, DWORD color0, DWORD color1)
173
DWORD cr0, cg0, cb0, cr1, cg1, cb1;
177
float percent, percent_i;
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;
186
for (int i=0; i<size; i++)
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;
199
static void mod_col_inter_tex_using_tex (WORD *dst, int size, DWORD color)
205
float percent_r, percent_g, percent_b;
207
cr = (color >> 12) & 0xF;
208
cg = (color >> 8) & 0xF;
209
cb = (color >> 4) & 0xF;
211
for (int i=0; i<size; i++)
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;
225
static void mod_col_inter_tex_using_texa (WORD *dst, int size, DWORD color)
231
float percent, percent_i;
233
cr = (color >> 12) & 0xF;
234
cg = (color >> 8) & 0xF;
235
cb = (color >> 4) & 0xF;
237
for (int i=0; i<size; i++)
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;
250
static void mod_col2_inter__col_inter_col1_using_tex__using_texa (WORD *dst, int size,
251
DWORD color0, DWORD color1,
254
DWORD cr0, cg0, cb0, cr1, cg1, cb1, cr2, cg2, cb2;
258
float percent_r, percent_g, percent_b, percent_a;
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;
270
for (int i=0; i<size; i++)
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;
285
static void mod_tex_scale_fac_add_fac (WORD *dst, int size, DWORD factor)
287
float percent = factor / 255.0f;
290
float base_a = (1.0f - percent) * 15.0f;
292
for (int i=0; i<size; i++)
295
a = (BYTE)(base_a + percent * (col>>12));
296
*(dst++) = (a<<12) | (col & 0x0FFF);
300
static void mod_tex_sub_col_mul_fac_add_tex (WORD *dst, int size, DWORD color, DWORD factor)
302
float percent = factor / 255.0f;
307
cr = (color >> 12) & 0xF;
308
cg = (color >> 8) & 0xF;
309
cb = (color >> 4) & 0xF;
311
for (int i=0; i<size; i++)
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;
328
*(dst++) = a | ((WORD)r << 8) | ((WORD)g << 4) | (WORD)b;
332
static void mod_tex_scale_col_add_col (WORD *dst, int size, DWORD color, DWORD factor)
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;
339
float base = (1.0f - percent) * 15.0f;
342
for (int i=0; i<size; i++)
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;
352
static void mod_tex_add_col (WORD *dst, int size, DWORD color)
354
DWORD cr, cg, cb, ca;
358
cr = (color >> 12) & 0xF;
359
cg = (color >> 8) & 0xF;
360
cb = (color >> 4) & 0xF;
363
for (int i=0; i<size; i++)
366
a = (BYTE)((col >> 12) & 0xF);
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;
375
static void mod_col_mul_texa_add_tex (WORD *dst, int size, DWORD color)
383
cr = (color >> 12) & 0xF;
384
cg = (color >> 8) & 0xF;
385
cb = (color >> 4) & 0xF;
387
for (int i=0; i<size; i++)
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;
399
static void mod_tex_sub_col (WORD *dst, int size, DWORD color)
401
DWORD cr, cg, cb, ca;
405
cr = (color >> 12) & 0xF;
406
cg = (color >> 8) & 0xF;
407
cb = (color >> 4) & 0xF;
410
for (int i=0; i<size; i++)
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;
421
static void mod_tex_sub_col_mul_fac (WORD *dst, int size, DWORD color, DWORD factor)
423
float percent = factor / 255.0f;
428
cr = (color >> 12) & 0xF;
429
cg = (color >> 8) & 0xF;
430
cb = (color >> 4) & 0xF;
432
for (int i=0; i<size; i++)
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;
449
*(dst++) = (a << 12) | ((WORD)r << 8) | ((WORD)g << 4) | (WORD)b;
453
static void mod_col_inter_tex_using_col1 (WORD *dst, int size, DWORD color0, DWORD color1)
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;
466
cr = (color0 >> 12) & 0xF;
467
cg = (color0 >> 8) & 0xF;
468
cb = (color0 >> 4) & 0xF;
470
for (int i=0; i<size; i++)
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;
481
static void mod_tex_inter_noise_using_col (WORD *dst, int size, DWORD color)
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;
493
for (int i=0; i<size; i++)
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;
505
static void mod_tex_inter_col_using_texa (WORD *dst, int size, DWORD color)
511
float percent, percent_i;
513
cr = (color >> 12) & 0xF;
514
cg = (color >> 8) & 0xF;
515
cb = (color >> 4) & 0xF;
517
for (int i=0; i<size; i++)
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;
530
static void mod_tex_mul_col (WORD *dst, int size, DWORD color)
536
float percent, percent_i;
538
cr = (float)((color >> 12) & 0xF)/16.0f;
539
cg = (float)((color >> 8) & 0xF)/16.0f;
540
cb = (float)((color >> 4) & 0xF)/16.0f;
542
for (int i=0; i<size; i++)
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;
555
static void mod_tex_scale_fac_add_col (WORD *dst, int size, DWORD color, DWORD factor)
557
float percent = factor / 255.0f;
562
cr = (color >> 12) & 0xF;
563
cg = (color >> 8) & 0xF;
564
cb = (color >> 4) & 0xF;
566
for (int i=0; i<size; i++)
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;