2
Copyright (C) 2003 Rice1964
4
This program is free software; you can redistribute it and/or
5
modify it under the terms of the GNU General Public License
6
as published by the Free Software Foundation; either version 2
7
of the License, or (at your option) any later version.
9
This program is distributed in the hope that it will be useful,
10
but WITHOUT ANY WARRANTY; without even the implied warranty of
11
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
GNU General Public License for more details.
14
You should have received a copy of the GNU General Public License
15
along with this program; if not, write to the Free Software
16
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20
#include "TextureFilters.h"
23
/************************************************************************/
25
/************************************************************************/
26
static __inline int SAI_GetResult1_32( uint32 A, uint32 B, uint32 C, uint32 D, uint32 E )
32
if (A == C) x += 1; else if (B == C) y += 1;
33
if (A == D) x += 1; else if (B == D) y += 1;
40
static __inline uint16 SAI_GetResult1_16( uint16 A, uint16 B, uint16 C, uint16 D, uint16 E )
46
if (A == C) x += 1; else if (B == C) y += 1;
47
if (A == D) x += 1; else if (B == D) y += 1;
49
if (y <= 1 && r>0) r -= 1;
54
static __inline int SAI_GetResult2_32( uint32 A, uint32 B, uint32 C, uint32 D, uint32 E)
60
if (A == C) x += 1; else if (B == C) y += 1;
61
if (A == D) x += 1; else if (B == D) y += 1;
68
static __inline uint16 SAI_GetResult2_16( uint16 A, uint16 B, uint16 C, uint16 D, uint16 E)
74
if (A == C) x += 1; else if (B == C) y += 1;
75
if (A == D) x += 1; else if (B == D) y += 1;
76
if (x <= 1 && r>0 ) r -= 1;
83
static __inline int SAI_GetResult_32( uint32 A, uint32 B, uint32 C, uint32 D )
89
if (A == C) x += 1; else if (B == C) y += 1;
90
if (A == D) x += 1; else if (B == D) y += 1;
97
static __inline uint16 SAI_GetResult_16( uint16 A, uint16 B, uint16 C, uint16 D )
103
if (A == C) x += 1; else if (B == C) y += 1;
104
if (A == D) x += 1; else if (B == D) y += 1;
106
if (y <= 1 && r>0 ) r -= 1;
112
static __inline uint32 SAI_INTERPOLATE_32( uint32 A, uint32 B)
115
return ((A & 0xFEFEFEFE) >> 1) +
116
(((B & 0xFEFEFEFE) >> 1) |
117
(A & B & 0x01010101));
122
static __inline uint16 SAI_INTERPOLATE_16( uint16 A, uint16 B)
125
return ((A & 0xFEFE) >> 1) +
126
(((B & 0xFEFE) >> 1) |
133
static __inline uint32 SAI_Q_INTERPOLATE_32( uint32 A, uint32 B, uint32 C, uint32 D)
135
uint32 x = ((A & 0xFCFCFCFC) >> 2) +
136
((B & 0xFCFCFCFC) >> 2) +
137
((C & 0xFCFCFCFC) >> 2) +
138
((D & 0xFCFCFCFC) >> 2);
139
uint32 y = (((A & 0x03030303) +
142
(D & 0x03030303)) >> 2) & 0x03030303;
146
static __inline uint16 SAI_Q_INTERPOLATE_16( uint16 A, uint16 B, uint16 C, uint16 D)
148
uint16 x = ((A & 0xFCFC) >> 2) +
149
((B & 0xFCFC) >> 2) +
150
((C & 0xFCFC) >> 2) +
152
uint16 y = (((A & 0x0303) +
155
(D & 0x0303)) >> 2) & 0x0303;
160
void Super2xSaI_32( uint32 *srcPtr, uint32 *destPtr, uint32 width, uint32 height, uint32 pitch)
162
uint32 destWidth = width << 1;
163
//uint32 destHeight = height << 1;
165
uint32 color4, color5, color6;
166
uint32 color1, color2, color3;
167
uint32 colorA0, colorA1, colorA2, colorA3;
168
uint32 colorB0, colorB1, colorB2, colorB3;
169
uint32 colorS1, colorS2;
170
uint32 product1a, product1b, product2a, product2b;
172
int row0, row1, row2, row3;
173
int col0, col1, col2, col3;
175
for (uint16 y = 0; y < height; y++)
202
for (uint16 x = 0; x < width; x++)
204
//--------------------------------------- B0 B1 B2 B3
230
colorB0 = *(srcPtr + col0 + row0);
231
colorB1 = *(srcPtr + col1 + row0);
232
colorB2 = *(srcPtr + col2 + row0);
233
colorB3 = *(srcPtr + col3 + row0);
235
color4 = *(srcPtr + col0 + row1);
236
color5 = *(srcPtr + col1 + row1);
237
color6 = *(srcPtr + col2 + row1);
238
colorS2 = *(srcPtr + col3 + row1);
240
color1 = *(srcPtr + col0 + row2);
241
color2 = *(srcPtr + col1 + row2);
242
color3 = *(srcPtr + col2 + row2);
243
colorS1 = *(srcPtr + col3 + row2);
245
colorA0 = *(srcPtr + col0 + row3);
246
colorA1 = *(srcPtr + col1 + row3);
247
colorA2 = *(srcPtr + col2 + row3);
248
colorA3 = *(srcPtr + col3 + row3);
250
//--------------------------------------
251
if (color2 == color6 && color5 != color3)
252
product2b = product1b = color2;
253
else if (color5 == color3 && color2 != color6)
254
product2b = product1b = color5;
255
else if (color5 == color3 && color2 == color6)
259
r += SAI_GetResult_32 (color6, color5, color1, colorA1);
260
r += SAI_GetResult_32 (color6, color5, color4, colorB1);
261
r += SAI_GetResult_32 (color6, color5, colorA2, colorS1);
262
r += SAI_GetResult_32 (color6, color5, colorB2, colorS2);
265
product2b = product1b = color6;
267
product2b = product1b = color5;
269
product2b = product1b = SAI_INTERPOLATE_32 (color5, color6);
274
if (color6 == color3 && color3 == colorA1 && color2 != colorA2 && color3 != colorA0)
275
product2b = SAI_Q_INTERPOLATE_32 (color3, color3, color3, color2);
276
else if (color5 == color2 && color2 == colorA2 && colorA1 != color3 && color2 != colorA3)
277
product2b = SAI_Q_INTERPOLATE_32 (color2, color2, color2, color3);
279
product2b = SAI_INTERPOLATE_32 (color2, color3);
281
if (color6 == color3 && color6 == colorB1 && color5 != colorB2 && color6 != colorB0)
282
product1b = SAI_Q_INTERPOLATE_32 (color6, color6, color6, color5);
283
else if (color5 == color2 && color5 == colorB2 && colorB1 != color6 && color5 != colorB3)
284
product1b = SAI_Q_INTERPOLATE_32 (color6, color5, color5, color5);
286
product1b = SAI_INTERPOLATE_32 (color5, color6);
289
if (color5 == color3 && color2 != color6 && color4 == color5 && color5 != colorA2)
290
product2a = SAI_INTERPOLATE_32 (color2, color5);
291
else if (color5 == color1 && color6 == color5 && color4 != color2 && color5 != colorA0)
292
product2a = SAI_INTERPOLATE_32(color2, color5);
296
if (color2 == color6 && color5 != color3 && color1 == color2 && color2 != colorB2)
297
product1a = SAI_INTERPOLATE_32 (color2, color5);
298
else if (color4 == color2 && color3 == color2 && color1 != color5 && color2 != colorB0)
299
product1a = SAI_INTERPOLATE_32(color2, color5);
304
destPtr[0] = product1a;
305
destPtr[1] = product1b;
306
destPtr[destWidth] = product2a;
307
destPtr[destWidth + 1] = product2b;
312
srcPtr += (pitch-width);
313
destPtr += (((pitch-width)<<1)+(pitch<<1));
318
void Super2xSaI_16( uint16 *srcPtr, uint16 *destPtr, uint32 width, uint32 height, uint32 pitch)
320
uint32 destWidth = width << 1;
321
//uint32 destHeight = height << 1;
323
uint16 color4, color5, color6;
324
uint16 color1, color2, color3;
325
uint16 colorA0, colorA1, colorA2, colorA3;
326
uint16 colorB0, colorB1, colorB2, colorB3;
327
uint16 colorS1, colorS2;
328
uint16 product1a, product1b, product2a, product2b;
330
int row0, row1, row2, row3;
331
int col0, col1, col2, col3;
333
for (uint16 y = 0; y < height; y++)
360
for (uint16 x = 0; x < width; x++)
362
//--------------------------------------- B0 B1 B2 B3
388
colorB0 = *(srcPtr + col0 + row0);
389
colorB1 = *(srcPtr + col1 + row0);
390
colorB2 = *(srcPtr + col2 + row0);
391
colorB3 = *(srcPtr + col3 + row0);
393
color4 = *(srcPtr + col0 + row1);
394
color5 = *(srcPtr + col1 + row1);
395
color6 = *(srcPtr + col2 + row1);
396
colorS2 = *(srcPtr + col3 + row1);
398
color1 = *(srcPtr + col0 + row2);
399
color2 = *(srcPtr + col1 + row2);
400
color3 = *(srcPtr + col2 + row2);
401
colorS1 = *(srcPtr + col3 + row2);
403
colorA0 = *(srcPtr + col0 + row3);
404
colorA1 = *(srcPtr + col1 + row3);
405
colorA2 = *(srcPtr + col2 + row3);
406
colorA3 = *(srcPtr + col3 + row3);
408
//--------------------------------------
409
if (color2 == color6 && color5 != color3)
410
product2b = product1b = color2;
411
else if (color5 == color3 && color2 != color6)
412
product2b = product1b = color5;
413
else if (color5 == color3 && color2 == color6)
417
r += SAI_GetResult_16 (color6, color5, color1, colorA1);
418
r += SAI_GetResult_16 (color6, color5, color4, colorB1);
419
r += SAI_GetResult_16 (color6, color5, colorA2, colorS1);
420
r += SAI_GetResult_16 (color6, color5, colorB2, colorS2);
423
product2b = product1b = color6;
425
product2b = product1b = color5;
427
product2b = product1b = SAI_INTERPOLATE_16 (color5, color6);
432
if (color6 == color3 && color3 == colorA1 && color2 != colorA2 && color3 != colorA0)
433
product2b = SAI_Q_INTERPOLATE_16 (color3, color3, color3, color2);
434
else if (color5 == color2 && color2 == colorA2 && colorA1 != color3 && color2 != colorA3)
435
product2b = SAI_Q_INTERPOLATE_16 (color2, color2, color2, color3);
437
product2b = SAI_INTERPOLATE_16 (color2, color3);
439
if (color6 == color3 && color6 == colorB1 && color5 != colorB2 && color6 != colorB0)
440
product1b = SAI_Q_INTERPOLATE_16 (color6, color6, color6, color5);
441
else if (color5 == color2 && color5 == colorB2 && colorB1 != color6 && color5 != colorB3)
442
product1b = SAI_Q_INTERPOLATE_16 (color6, color5, color5, color5);
444
product1b = SAI_INTERPOLATE_16 (color5, color6);
447
if (color5 == color3 && color2 != color6 && color4 == color5 && color5 != colorA2)
448
product2a = SAI_INTERPOLATE_16 (color2, color5);
449
else if (color5 == color1 && color6 == color5 && color4 != color2 && color5 != colorA0)
450
product2a = SAI_INTERPOLATE_16(color2, color5);
454
if (color2 == color6 && color5 != color3 && color1 == color2 && color2 != colorB2)
455
product1a = SAI_INTERPOLATE_16 (color2, color5);
456
else if (color4 == color2 && color3 == color2 && color1 != color5 && color2 != colorB0)
457
product1a = SAI_INTERPOLATE_16(color2, color5);
462
destPtr[0] = product1a;
463
destPtr[1] = product1b;
464
destPtr[destWidth] = product2a;
465
destPtr[destWidth + 1] = product2b;
470
srcPtr += (pitch-width);
471
destPtr += (((pitch-width)<<1)+(pitch<<1));