Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/libmupen64plus/mupen64plus-video-glide64/src/TexModCI.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
#define min(a,b) ((a) < (b) ? (a) : (b))
39
#define max(a,b) ((a) > (b) ? (a) : (b))
40
#endif // _WIN32
41
42
static void mod_tex_inter_color_using_factor_CI (DWORD color, DWORD factor)
43
{
44
float percent = factor / 255.0f;
45
float percent_i = 1 - percent;
46
BYTE cr, cg, cb;
47
WORD col;
48
BYTE a, r, g, b;
49
50
cr = (BYTE)((color >> 24) & 0xFF);
51
cg = (BYTE)((color >> 16) & 0xFF);
52
cb = (BYTE)((color >> 8) & 0xFF);
53
54
for (int i=0; i<256; i++)
55
{
56
col = rdp.pal_8[i];
57
a = (BYTE)(col&0x0001);;
58
r = (BYTE)((float)((col&0xF800) >> 11) / 31.0f * 255.0f);
59
g = (BYTE)((float)((col&0x07C0) >> 6) / 31.0f * 255.0f);
60
b = (BYTE)((float)((col&0x003E) >> 1) / 31.0f * 255.0f);
61
r = (BYTE)(min(255, percent_i * r + percent * cr));
62
g = (BYTE)(min(255, percent_i * g + percent * cg));
63
b = (BYTE)(min(255, percent_i * b + percent * cb));
64
rdp.pal_8[i] = (WORD)(((WORD)(r >> 3) << 11) |
65
((WORD)(g >> 3) << 6) |
66
((WORD)(b >> 3) << 1) |
67
((WORD)(a ) << 0));
68
}
69
}
70
71
static void mod_tex_inter_col_using_col1_CI (DWORD color0, DWORD color1)
72
{
73
BYTE cr, cg, cb;
74
WORD col;
75
BYTE a, r, g, b;
76
77
float percent_r = ((color1 >> 24) & 0xFF) / 255.0f;
78
float percent_g = ((color1 >> 16) & 0xFF) / 255.0f;
79
float percent_b = ((color1 >> 8) & 0xFF) / 255.0f;
80
float percent_r_i = 1.0f - percent_r;
81
float percent_g_i = 1.0f - percent_g;
82
float percent_b_i = 1.0f - percent_b;
83
84
cr = (BYTE)((color0 >> 24) & 0xFF);
85
cg = (BYTE)((color0 >> 16) & 0xFF);
86
cb = (BYTE)((color0 >> 8) & 0xFF);
87
88
for (int i=0; i<256; i++)
89
{
90
col = rdp.pal_8[i];
91
a = (BYTE)(col&0x0001);;
92
r = (BYTE)((float)((col&0xF800) >> 11) / 31.0f * 255.0f);
93
g = (BYTE)((float)((col&0x07C0) >> 6) / 31.0f * 255.0f);
94
b = (BYTE)((float)((col&0x003E) >> 1) / 31.0f * 255.0f);
95
r = (BYTE)(min(255, percent_r_i * r + percent_r * cr));
96
g = (BYTE)(min(255, percent_g_i * g + percent_g * cg));
97
b = (BYTE)(min(255, percent_b_i * b + percent_b * cb));
98
rdp.pal_8[i] = (WORD)(((WORD)(r >> 3) << 11) |
99
((WORD)(g >> 3) << 6) |
100
((WORD)(b >> 3) << 1) |
101
((WORD)(a ) << 0));
102
}
103
}
104
105
static void mod_full_color_sub_tex_CI (DWORD color)
106
{
107
BYTE cr, cg, cb, ca;
108
WORD col;
109
BYTE a, r, g, b;
110
111
cr = (BYTE)((color >> 24) & 0xFF);
112
cg = (BYTE)((color >> 16) & 0xFF);
113
cb = (BYTE)((color >> 8) & 0xFF);
114
ca = (BYTE)(color & 0xFF);
115
116
for (int i=0; i<256; i++)
117
{
118
col = rdp.pal_8[i];
119
a = (BYTE)(col&0x0001);;
120
r = (BYTE)((float)((col&0xF800) >> 11) / 31.0f * 255.0f);
121
g = (BYTE)((float)((col&0x07C0) >> 6) / 31.0f * 255.0f);
122
b = (BYTE)((float)((col&0x003E) >> 1) / 31.0f * 255.0f);
123
a = max(0, ca - a);
124
r = max(0, cr - r);
125
g = max(0, cg - g);
126
b = max(0, cb - b);
127
rdp.pal_8[i] = (WORD)(((WORD)(r >> 3) << 11) |
128
((WORD)(g >> 3) << 6) |
129
((WORD)(b >> 3) << 1) |
130
((WORD)(a ) << 0));
131
}
132
}
133
134
static void mod_col_inter_col1_using_tex_CI (DWORD color0, DWORD color1)
135
{
136
DWORD cr0, cg0, cb0, cr1, cg1, cb1;
137
WORD col;
138
BYTE a, r, g, b;
139
float percent_r, percent_g, percent_b;
140
141
cr0 = (BYTE)((color0 >> 24) & 0xFF);
142
cg0 = (BYTE)((color0 >> 16) & 0xFF);
143
cb0 = (BYTE)((color0 >> 8) & 0xFF);
144
cr1 = (BYTE)((color1 >> 24) & 0xFF);
145
cg1 = (BYTE)((color1 >> 16) & 0xFF);
146
cb1 = (BYTE)((color1 >> 8) & 0xFF);
147
148
for (int i=0; i<256; i++)
149
{
150
col = rdp.pal_8[i];
151
a = (BYTE)(col&0x0001);;
152
percent_r = ((col&0xF800) >> 11) / 31.0f;
153
percent_g = ((col&0x07C0) >> 6) / 31.0f;
154
percent_b = ((col&0x003E) >> 1) / 31.0f;
155
r = (BYTE)(min((1.0f-percent_r) * cr0 + percent_r * cr1, 255));
156
g = (BYTE)(min((1.0f-percent_g) * cg0 + percent_g * cg1, 255));
157
b = (BYTE)(min((1.0f-percent_b) * cb0 + percent_b * cb1, 255));
158
rdp.pal_8[i] = (WORD)(((WORD)(r >> 3) << 11) |
159
((WORD)(g >> 3) << 6) |
160
((WORD)(b >> 3) << 1) |
161
((WORD)(a ) << 0));
162
}
163
}
164
165
166
167
static void mod_tex_sub_col_mul_fac_add_tex_CI (DWORD color, DWORD factor)
168
{
169
float percent = factor / 255.0f;
170
BYTE cr, cg, cb, a;
171
WORD col;
172
float r, g, b;
173
174
cr = (BYTE)((color >> 24) & 0xFF);
175
cg = (BYTE)((color >> 16) & 0xFF);
176
cb = (BYTE)((color >> 8) & 0xFF);
177
178
for (int i=0; i<256; i++)
179
{
180
col = rdp.pal_8[i];
181
a = (BYTE)(col&0x0001);;
182
r = (BYTE)((float)((col&0xF800) >> 11) / 31.0f * 255.0f);
183
g = (BYTE)((float)((col&0x07C0) >> 6) / 31.0f * 255.0f);
184
b = (BYTE)((float)((col&0x003E) >> 1) / 31.0f * 255.0f);
185
r = (r - cr) * percent + r;
186
if (r > 255.0f) r = 255.0f;
187
if (r < 0.0f) r = 0.0f;
188
g = (g - cg) * percent + g;
189
if (g > 255.0f) g = 255.0f;
190
if (g < 0.0f) g = 0.0f;
191
b = (b - cb) * percent + b;
192
if (b > 255.0f) g = 255.0f;
193
if (b < 0.0f) b = 0.0f;
194
rdp.pal_8[i] = (WORD)(((WORD)((BYTE)(r) >> 3) << 11) |
195
((WORD)((BYTE)(g) >> 3) << 6) |
196
((WORD)((BYTE)(b) >> 3) << 1) |
197
(WORD)(a) );
198
}
199
}
200
201
static void mod_tex_scale_col_add_col_CI (DWORD color, DWORD factor)
202
{
203
float percent = factor / 255.0f;
204
float percent_r = (1.0f - ((color >> 24) & 0xFF) / 255.0f) * percent;
205
float percent_g = (1.0f - ((color >> 16) & 0xFF) / 255.0f) * percent;
206
float percent_b = (1.0f - ((color >> 8) & 0xFF) / 255.0f) * percent;
207
WORD col;
208
float base = (1.0f - percent) * 255.0f;
209
BYTE a, r, g, b;
210
211
for (int i=0; i<256; i++)
212
{
213
col = rdp.pal_8[i];
214
a = (BYTE)(col&0x0001);;
215
r = (BYTE)((float)((col&0xF800) >> 11) / 31.0f * 255.0f);
216
g = (BYTE)((float)((col&0x07C0) >> 6) / 31.0f * 255.0f);
217
b = (BYTE)((float)((col&0x003E) >> 1) / 31.0f * 255.0f);
218
r = (BYTE)(min(base + percent_r * r, 255));
219
g = (BYTE)(min(base + percent_g * g, 255));
220
b = (BYTE)(min(base + percent_b * b, 255));
221
rdp.pal_8[i] = (WORD)(((WORD)(r >> 3) << 11) |
222
((WORD)(g >> 3) << 6) |
223
((WORD)(b >> 3) << 1) |
224
(WORD)(a) );
225
}
226
}
227
228
229
static void mod_tex_add_col_CI (DWORD color)
230
{
231
BYTE cr, cg, cb;
232
WORD col;
233
BYTE a, r, g, b;
234
235
cr = (BYTE)((color >> 24) & 0xFF);
236
cg = (BYTE)((color >> 16) & 0xFF);
237
cb = (BYTE)((color >> 8) & 0xFF);
238
239
for (int i=0; i<256; i++)
240
{
241
col = rdp.pal_8[i];
242
a = (BYTE)(col&0x0001);;
243
r = (BYTE)((float)((col&0xF800) >> 11) / 31.0f * 255.0f);
244
g = (BYTE)((float)((col&0x07C0) >> 6) / 31.0f * 255.0f);
245
b = (BYTE)((float)((col&0x003E) >> 1) / 31.0f * 255.0f);
246
r = min(cr + r, 255);
247
g = min(cg + g, 255);
248
b = min(cb + b, 255);
249
rdp.pal_8[i] = (WORD)(((WORD)(r >> 3) << 11) |
250
((WORD)(g >> 3) << 6) |
251
((WORD)(b >> 3) << 1) |
252
((WORD)(a ) << 0));
253
}
254
}
255
256
static void mod_tex_sub_col_CI (DWORD color)
257
{
258
BYTE cr, cg, cb;
259
WORD col;
260
BYTE a, r, g, b;
261
262
cr = (BYTE)((color >> 24) & 0xFF);
263
cg = (BYTE)((color >> 16) & 0xFF);
264
cb = (BYTE)((color >> 8) & 0xFF);
265
266
for (int i=0; i<256; i++)
267
{
268
col = rdp.pal_8[i];
269
a = (BYTE)(col&0x0001);;
270
r = (BYTE)((float)((col&0xF800) >> 11) / 31.0f * 255.0f);
271
g = (BYTE)((float)((col&0x07C0) >> 6) / 31.0f * 255.0f);
272
b = (BYTE)((float)((col&0x003E) >> 1) / 31.0f * 255.0f);
273
r = max(r - cr, 0);
274
g = max(g - cg, 0);
275
b = max(b - cb, 0);
276
rdp.pal_8[i] = (WORD)(((WORD)(r >> 3) << 11) |
277
((WORD)(g >> 3) << 6) |
278
((WORD)(b >> 3) << 1) |
279
((WORD)(a ) << 0));
280
}
281
}
282
283
static void mod_tex_sub_col_mul_fac_CI (DWORD color, DWORD factor)
284
{
285
float percent = factor / 255.0f;
286
BYTE cr, cg, cb;
287
WORD col;
288
BYTE a;
289
float r, g, b;
290
291
cr = (BYTE)((color >> 24) & 0xFF);
292
cg = (BYTE)((color >> 16) & 0xFF);
293
cb = (BYTE)((color >> 8) & 0xFF);
294
295
for (int i=0; i<256; i++)
296
{
297
col = rdp.pal_8[i];
298
a = (BYTE)(col&0x0001);
299
r = (float)((col&0xF800) >> 11) / 31.0f * 255.0f;
300
g = (float)((col&0x07C0) >> 6) / 31.0f * 255.0f;
301
b = (float)((col&0x003E) >> 1) / 31.0f * 255.0f;
302
r = (r - cr) * percent;
303
if (r > 255.0f) r = 255.0f;
304
if (r < 0.0f) r = 0.0f;
305
g = (g - cg) * percent;
306
if (g > 255.0f) g = 255.0f;
307
if (g < 0.0f) g = 0.0f;
308
b = (b - cb) * percent;
309
if (b > 255.0f) g = 255.0f;
310
if (b < 0.0f) b = 0.0f;
311
312
rdp.pal_8[i] = (WORD)(((WORD)((BYTE)(r) >> 3) << 11) |
313
((WORD)((BYTE)(g) >> 3) << 6) |
314
((WORD)((BYTE)(b) >> 3) << 1) |
315
(WORD)(a) );
316
}
317
}
318
319
static void mod_col_inter_tex_using_col1_CI (DWORD color0, DWORD color1)
320
{
321
BYTE cr, cg, cb;
322
WORD col;
323
BYTE a, r, g, b;
324
325
float percent_r = ((color1 >> 24) & 0xFF) / 255.0f;
326
float percent_g = ((color1 >> 16) & 0xFF) / 255.0f;
327
float percent_b = ((color1 >> 8) & 0xFF) / 255.0f;
328
float percent_r_i = 1.0f - percent_r;
329
float percent_g_i = 1.0f - percent_g;
330
float percent_b_i = 1.0f - percent_b;
331
332
cr = (BYTE)((color0 >> 24) & 0xFF);
333
cg = (BYTE)((color0 >> 16) & 0xFF);
334
cb = (BYTE)((color0 >> 8) & 0xFF);
335
336
for (int i=0; i<256; i++)
337
{
338
col = rdp.pal_8[i];
339
a = (BYTE)(col&0x0001);;
340
r = (BYTE)((float)((col&0xF800) >> 11) / 31.0f * 255.0f);
341
g = (BYTE)((float)((col&0x07C0) >> 6) / 31.0f * 255.0f);
342
b = (BYTE)((float)((col&0x003E) >> 1) / 31.0f * 255.0f);
343
r = (BYTE)(min(255, percent_r * r + percent_r_i * cr));
344
g = (BYTE)(min(255, percent_g * g + percent_g_i * cg));
345
b = (BYTE)(min(255, percent_b * b + percent_b_i * cb));
346
rdp.pal_8[i] = (WORD)(((WORD)(r >> 3) << 11) |
347
((WORD)(g >> 3) << 6) |
348
((WORD)(b >> 3) << 1) |
349
((WORD)(a ) << 0));
350
}
351
}
352
353
static void mod_tex_inter_col_using_texa_CI (DWORD color)
354
{
355
BYTE a, r, g, b;
356
357
r = (BYTE)((float)((color >> 24) & 0xFF) / 255.0f * 31.0f);
358
g = (BYTE)((float)((color >> 16) & 0xFF) / 255.0f * 31.0f);
359
b = (BYTE)((float)((color >> 8) & 0xFF) / 255.0f * 31.0f);
360
a = (color&0xFF) ? 1 : 0;
361
WORD col16 = (WORD)((r<<11)|(g<<6)|(b<<1)|a);
362
363
for (int i=0; i<256; i++)
364
{
365
if (rdp.pal_8[i]&1)
366
rdp.pal_8[i] = col16;
367
}
368
}
369
370
static void mod_tex_mul_col_CI (DWORD color)
371
{
372
BYTE a, r, g, b;
373
WORD col;
374
float cr, cg, cb;
375
376
cr = (float)((color >> 24) & 0xFF) / 255.0f;
377
cg = (float)((color >> 16) & 0xFF) / 255.0f;
378
cb = (float)((color >> 8) & 0xFF) / 255.0f;
379
380
for (int i=0; i<256; i++)
381
{
382
col = rdp.pal_8[i];
383
a = (BYTE)(col&0x0001);;
384
r = (BYTE)((float)((col&0xF800) >> 11) * cr);
385
g = (BYTE)((float)((col&0x07C0) >> 6) * cg);
386
b = (BYTE)((float)((col&0x003E) >> 1) * cb);
387
rdp.pal_8[i] = (WORD)(((WORD)(r >> 3) << 11) |
388
((WORD)(g >> 3) << 6) |
389
((WORD)(b >> 3) << 1) |
390
((WORD)(a ) << 0));
391
}
392
}
393
394
static void ModifyPalette(DWORD mod, DWORD modcolor, DWORD modcolor1, DWORD modfactor)
395
{
396
switch (mod)
397
{
398
case TMOD_TEX_INTER_COLOR_USING_FACTOR:
399
mod_tex_inter_color_using_factor_CI (modcolor, modfactor);
400
break;
401
case TMOD_TEX_INTER_COL_USING_COL1:
402
mod_tex_inter_col_using_col1_CI (modcolor, modcolor1);
403
break;
404
case TMOD_FULL_COLOR_SUB_TEX:
405
mod_full_color_sub_tex_CI (modcolor);
406
break;
407
case TMOD_COL_INTER_COL1_USING_TEX:
408
mod_col_inter_col1_using_tex_CI (modcolor, modcolor1);
409
break;
410
case TMOD_TEX_SUB_COL_MUL_FAC_ADD_TEX:
411
mod_tex_sub_col_mul_fac_add_tex_CI (modcolor, modfactor);
412
break;
413
case TMOD_TEX_SCALE_COL_ADD_COL:
414
mod_tex_scale_col_add_col_CI (modcolor, modfactor);
415
break;
416
case TMOD_TEX_ADD_COL:
417
mod_tex_add_col_CI (modcolor);
418
break;
419
case TMOD_TEX_SUB_COL:
420
mod_tex_sub_col_CI (modcolor);
421
break;
422
case TMOD_TEX_SUB_COL_MUL_FAC:
423
mod_tex_sub_col_mul_fac_CI (modcolor, modfactor);
424
break;
425
case TMOD_COL_INTER_TEX_USING_COL1:
426
mod_col_inter_tex_using_col1_CI (modcolor, modcolor1);
427
break;
428
case TMOD_TEX_INTER_COL_USING_TEXA:
429
mod_tex_inter_col_using_texa_CI (modcolor);
430
break;
431
case TMOD_TEX_MUL_COL:
432
mod_tex_mul_col_CI (modcolor);
433
break;
434
default:
435
;
436
}
437
}
438
439
440