Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/libmupen64plus/mupen64plus-video-glide64/src/TexMod.h
2 views
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 ([email protected])
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;
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
362
for (int i=0; i<size; i++)
363
{
364
col = *dst;
365
a = (BYTE)((col >> 12) & 0xF);
366
// a = col & 0xF000;
367
r = (BYTE)(cr + ((col >> 8) & 0xF))&0xF;
368
g = (BYTE)(cg + ((col >> 4) & 0xF))&0xF;
369
b = (BYTE)(cb + (col & 0xF))&0xF;
370
*(dst++) = (a << 12) | (r << 8) | (g << 4) | b;
371
}
372
}
373
374
static void mod_col_mul_texa_add_tex (WORD *dst, int size, DWORD color)
375
{
376
DWORD cr, cg, cb;
377
WORD col;
378
BYTE r, g, b;
379
WORD a;
380
float factor;
381
382
cr = (color >> 12) & 0xF;
383
cg = (color >> 8) & 0xF;
384
cb = (color >> 4) & 0xF;
385
386
for (int i=0; i<size; i++)
387
{
388
col = *dst;
389
a = col & 0xF000;
390
factor = (a >> 12) / 15.0f;
391
r = (BYTE)(cr*factor + ((col >> 8) & 0xF))&0xF;
392
g = (BYTE)(cg*factor + ((col >> 4) & 0xF))&0xF;
393
b = (BYTE)(cb*factor + (col & 0xF))&0xF;
394
*(dst++) = a | (r << 8) | (g << 4) | b;
395
}
396
}
397
398
static void mod_tex_sub_col (WORD *dst, int size, DWORD color)
399
{
400
DWORD cr, cg, cb, ca;
401
WORD col;
402
BYTE a, r, g, b;
403
404
cr = (color >> 12) & 0xF;
405
cg = (color >> 8) & 0xF;
406
cb = (color >> 4) & 0xF;
407
ca = color & 0xF;
408
409
for (int i=0; i<size; i++)
410
{
411
col = *dst;
412
a = (BYTE)(((col >> 12) & 0xF) - ca);
413
r = (BYTE)(((col >> 8) & 0xF) - cr);
414
g = (BYTE)(((col >> 4) & 0xF) - cg);
415
b = (BYTE)((col & 0xF) - cb);
416
*(dst++) = (a << 12) | (r << 8) | (g << 4) | b;
417
}
418
}
419
420
static void mod_tex_sub_col_mul_fac (WORD *dst, int size, DWORD color, DWORD factor)
421
{
422
float percent = factor / 255.0f;
423
DWORD cr, cg, cb;
424
WORD col, a;
425
float r, g, b;
426
427
cr = (color >> 12) & 0xF;
428
cg = (color >> 8) & 0xF;
429
cb = (color >> 4) & 0xF;
430
431
for (int i=0; i<size; i++)
432
{
433
col = *dst;
434
a = (BYTE)((col >> 12) & 0xF);
435
r = (float)((col >> 8) & 0xF);
436
r = (r - cr) * percent;
437
if (r > 15.0f) r = 15.0f;
438
if (r < 0.0f) r = 0.0f;
439
g = (float)((col >> 4) & 0xF);
440
g = (g - cg) * percent;
441
if (g > 15.0f) g = 15.0f;
442
if (g < 0.0f) g = 0.0f;
443
b = (float)(col & 0xF);
444
b = (b - cb) * percent;
445
if (b > 15.0f) b = 15.0f;
446
if (b < 0.0f) b = 0.0f;
447
448
*(dst++) = (a << 12) | ((WORD)r << 8) | ((WORD)g << 4) | (WORD)b;
449
}
450
}
451
452
static void mod_col_inter_tex_using_col1 (WORD *dst, int size, DWORD color0, DWORD color1)
453
{
454
DWORD cr, cg, cb;
455
WORD col, a;
456
BYTE r, g, b;
457
458
float percent_r = ((color1 >> 12) & 0xF) / 15.0f;
459
float percent_g = ((color1 >> 8) & 0xF) / 15.0f;
460
float percent_b = ((color1 >> 4) & 0xF) / 15.0f;
461
float percent_r_i = 1.0f - percent_r;
462
float percent_g_i = 1.0f - percent_g;
463
float percent_b_i = 1.0f - percent_b;
464
465
cr = (color0 >> 12) & 0xF;
466
cg = (color0 >> 8) & 0xF;
467
cb = (color0 >> 4) & 0xF;
468
469
for (int i=0; i<size; i++)
470
{
471
col = *dst;
472
a = (BYTE)((col >> 12) & 0xF);
473
r = (BYTE)(percent_r * ((col >> 8) & 0xF) + percent_r_i * cr);
474
g = (BYTE)(percent_g * ((col >> 4) & 0xF) + percent_g_i * cg);
475
b = (BYTE)(percent_b * (col & 0xF) + percent_b_i * cb);
476
*(dst++) = (a << 12) | (r << 8) | (g << 4) | b;
477
}
478
}
479
480
static void mod_tex_inter_noise_using_col (WORD *dst, int size, DWORD color)
481
{
482
WORD col, a;
483
BYTE r, g, b, noise;
484
485
float percent_r = ((color >> 12) & 0xF) / 15.0f;
486
float percent_g = ((color >> 8) & 0xF) / 15.0f;
487
float percent_b = ((color >> 4) & 0xF) / 15.0f;
488
float percent_r_i = 1.0f - percent_r;
489
float percent_g_i = 1.0f - percent_g;
490
float percent_b_i = 1.0f - percent_b;
491
492
for (int i=0; i<size; i++)
493
{
494
col = *dst;
495
a = col & 0xF000;
496
noise = rand()%16;
497
r = (BYTE)(percent_r_i * ((col >> 8) & 0xF) + percent_r * noise);
498
g = (BYTE)(percent_g_i * ((col >> 4) & 0xF) + percent_g * noise);
499
b = (BYTE)(percent_b_i * (col & 0xF) + percent_b * noise);
500
*(dst++) = a | (r << 8) | (g << 4) | b;
501
}
502
}
503
504
static void mod_tex_inter_col_using_texa (WORD *dst, int size, DWORD color)
505
{
506
DWORD cr, cg, cb;
507
WORD col;
508
BYTE r, g, b;
509
WORD a;
510
float percent, percent_i;
511
512
cr = (color >> 12) & 0xF;
513
cg = (color >> 8) & 0xF;
514
cb = (color >> 4) & 0xF;
515
516
for (int i=0; i<size; i++)
517
{
518
col = *dst;
519
a = col & 0xF000;
520
percent = (a >> 12) / 15.0f;
521
percent_i = 1.0f - percent;
522
r = (BYTE)(percent * cr + percent_i * ((col & 0x0F00) >> 8));
523
g = (BYTE)(percent * cg + percent_i * ((col & 0x00F0) >> 4));
524
b = (BYTE)(percent * cb + percent_i * (col & 0x000F));
525
*(dst++) = a | (r << 8) | (g << 4) | b;
526
}
527
}
528
529
static void mod_tex_mul_col (WORD *dst, int size, DWORD color)
530
{
531
float cr, cg, cb;
532
WORD col;
533
BYTE r, g, b;
534
WORD a;
535
536
cr = (float)((color >> 12) & 0xF)/16.0f;
537
cg = (float)((color >> 8) & 0xF)/16.0f;
538
cb = (float)((color >> 4) & 0xF)/16.0f;
539
540
for (int i=0; i<size; i++)
541
{
542
col = *dst;
543
a = col & 0xF000;
544
r = (BYTE)(cr * ((col & 0x0F00) >> 8));
545
g = (BYTE)(cg * ((col & 0x00F0) >> 4));
546
b = (BYTE)(cb * (col & 0x000F));
547
*(dst++) = a | (r << 8) | (g << 4) | b;
548
}
549
}
550
551
static void mod_tex_scale_fac_add_col (WORD *dst, int size, DWORD color, DWORD factor)
552
{
553
float percent = factor / 255.0f;
554
DWORD cr, cg, cb;
555
WORD col;
556
float r, g, b;
557
558
cr = (color >> 12) & 0xF;
559
cg = (color >> 8) & 0xF;
560
cb = (color >> 4) & 0xF;
561
562
for (int i=0; i<size; i++)
563
{
564
col = *dst;
565
r = cr + percent * (float)((col>>8)&0xF);
566
g = cg + percent * (float)((col>>4)&0xF);
567
b = cb + percent * (float)(col&0xF);
568
*(dst++) = (col&0xF000) | ((BYTE)r << 8) | ((BYTE)g << 4) | (BYTE)b;
569
}
570
}
571
572
573