Rice GLES2 (from mupen64plus-ae) plugin. Compile but doesn't works well on the OpenPa...
[mupen64plus-pandora.git] / source / gles2rice / src / TextureFilters_2xsai.cpp
1 /*
2 Copyright (C) 2003 Rice1964
3
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.
8
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.
13
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.
17
18 */
19
20 #include "TextureFilters.h"
21
22
23 /************************************************************************/
24 /* 2xSAI filters                                                        */
25 /************************************************************************/
26 static __inline int SAI_GetResult1_32( uint32 A, uint32 B, uint32 C, uint32 D, uint32 E )
27 {
28     int x = 0;
29     int y = 0;
30     int r = 0;
31
32     if (A == C) x += 1; else if (B == C) y += 1;
33     if (A == D) x += 1; else if (B == D) y += 1;
34     if (x <= 1) r += 1; 
35     if (y <= 1) r -= 1;
36
37     return r;
38 }
39
40 static __inline uint16 SAI_GetResult1_16( uint16 A, uint16 B, uint16 C, uint16 D, uint16 E )
41 {
42     uint16 x = 0;
43     uint16 y = 0;
44     uint16 r = 0;
45
46     if (A == C) x += 1; else if (B == C) y += 1;
47     if (A == D) x += 1; else if (B == D) y += 1;
48     if (x <= 1) r += 1; 
49     if (y <= 1 && r>0) r -= 1;
50
51     return r;
52 }
53
54 static __inline int SAI_GetResult2_32( uint32 A, uint32 B, uint32 C, uint32 D, uint32 E) 
55 {
56     int x = 0; 
57     int y = 0;
58     int r = 0;
59
60     if (A == C) x += 1; else if (B == C) y += 1;
61     if (A == D) x += 1; else if (B == D) y += 1;
62     if (x <= 1) r -= 1; 
63     if (y <= 1) r += 1;
64
65     return r;
66 }
67
68 static __inline uint16 SAI_GetResult2_16( uint16 A, uint16 B, uint16 C, uint16 D, uint16 E) 
69 {
70     uint16 x = 0; 
71     uint16 y = 0;
72     uint16 r = 0;
73
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; 
77     if (y <= 1) r += 1;
78
79     return r;
80 }
81
82
83 static __inline int SAI_GetResult_32( uint32 A, uint32 B, uint32 C, uint32 D )
84 {
85     int x = 0; 
86     int y = 0;
87     int r = 0;
88
89     if (A == C) x += 1; else if (B == C) y += 1;
90     if (A == D) x += 1; else if (B == D) y += 1;
91     if (x <= 1) r += 1; 
92     if (y <= 1) r -= 1;
93
94     return r;
95 }
96
97 static __inline uint16 SAI_GetResult_16( uint16 A, uint16 B, uint16 C, uint16 D )
98 {
99     uint16 x = 0; 
100     uint16 y = 0;
101     uint16 r = 0;
102
103     if (A == C) x += 1; else if (B == C) y += 1;
104     if (A == D) x += 1; else if (B == D) y += 1;
105     if (x <= 1) r += 1; 
106     if (y <= 1 && r>0 ) r -= 1;
107
108     return r;
109 }
110
111
112 static __inline uint32 SAI_INTERPOLATE_32( uint32 A, uint32 B)
113 {
114     if (A != B)
115         return  ((A & 0xFEFEFEFE) >> 1) + 
116         (((B & 0xFEFEFEFE) >> 1) |
117         (A & B & 0x01010101));
118     else
119         return A;
120 }
121
122 static __inline uint16 SAI_INTERPOLATE_16( uint16 A, uint16 B)
123 {
124     if (A != B)
125         return  ((A & 0xFEFE) >> 1) + 
126         (((B & 0xFEFE) >> 1) |
127         (A & B & 0x0101));
128     else
129         return A;
130 }
131
132
133 static __inline uint32 SAI_Q_INTERPOLATE_32( uint32 A, uint32 B, uint32 C, uint32 D)
134 {
135     uint32 x =  ((A & 0xFCFCFCFC) >> 2) +
136         ((B & 0xFCFCFCFC) >> 2) +
137         ((C & 0xFCFCFCFC) >> 2) +
138         ((D & 0xFCFCFCFC) >> 2);
139     uint32 y =  (((A & 0x03030303) +
140         (B & 0x03030303) +
141         (C & 0x03030303) +
142         (D & 0x03030303)) >> 2) & 0x03030303;
143     return x | y;
144 }
145
146 static __inline uint16 SAI_Q_INTERPOLATE_16( uint16 A, uint16 B, uint16 C, uint16 D)
147 {
148     uint16 x =  ((A & 0xFCFC) >> 2) +
149         ((B & 0xFCFC) >> 2) +
150         ((C & 0xFCFC) >> 2) +
151         ((D & 0xFCFC) >> 2);
152     uint16 y =  (((A & 0x0303) +
153         (B & 0x0303) +
154         (C & 0x0303) +
155         (D & 0x0303)) >> 2) & 0x0303;
156     return x | y;
157 }
158
159
160 void Super2xSaI_32( uint32 *srcPtr, uint32 *destPtr, uint32 width, uint32 height, uint32 pitch)
161 {
162     uint32 destWidth = width << 1;
163     //uint32 destHeight = height << 1;
164
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;
171
172     int row0, row1, row2, row3;
173     int col0, col1, col2, col3;
174
175     for (uint16 y = 0; y < height; y++)
176     {
177         if (y > 0)
178         {
179             row0 = width;
180             row0 = -row0;
181         }
182         else
183             row0 = 0;
184
185         row1 = 0;
186
187         if (y < height - 1)
188         {
189             row2 = width;
190
191             if (y < height - 2) 
192                 row3 = width << 1;
193             else
194                 row3 = width;
195         }
196         else
197         {
198             row2 = 0;
199             row3 = 0;
200         }
201
202         for (uint16 x = 0; x < width; x++)
203         {
204             //--------------------------------------- B0 B1 B2 B3
205             //                                         4  5  6 S2
206             //                                         1  2  3 S1
207             //                                        A0 A1 A2 A3
208             if (x > 0)
209                 col0 = -1;
210             else
211                 col0 = 0;
212
213             col1 = 0;
214
215             if (x < width - 1)
216             {
217                 col2 = 1;
218
219                 if (x < width - 2) 
220                     col3 = 2;
221                 else
222                     col3 = 1;
223             }
224             else
225             {
226                 col2 = 0;
227                 col3 = 0;
228             }
229
230             colorB0 = *(srcPtr + col0 + row0);
231             colorB1 = *(srcPtr + col1 + row0);
232             colorB2 = *(srcPtr + col2 + row0);
233             colorB3 = *(srcPtr + col3 + row0);
234
235             color4 = *(srcPtr + col0 + row1);
236             color5 = *(srcPtr + col1 + row1);
237             color6 = *(srcPtr + col2 + row1);
238             colorS2 = *(srcPtr + col3 + row1);
239
240             color1 = *(srcPtr + col0 + row2);
241             color2 = *(srcPtr + col1 + row2);
242             color3 = *(srcPtr + col2 + row2);
243             colorS1 = *(srcPtr + col3 + row2);
244
245             colorA0 = *(srcPtr + col0 + row3);
246             colorA1 = *(srcPtr + col1 + row3);
247             colorA2 = *(srcPtr + col2 + row3);
248             colorA3 = *(srcPtr + col3 + row3);
249
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)
256             {
257                 int r = 0;
258
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);
263
264                 if (r > 0)
265                     product2b = product1b = color6;
266                 else if (r < 0)
267                     product2b = product1b = color5;
268                 else
269                     product2b = product1b = SAI_INTERPOLATE_32 (color5, color6);
270             }
271             else
272             {
273
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);
278                 else
279                     product2b = SAI_INTERPOLATE_32 (color2, color3);
280
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);
285                 else
286                     product1b = SAI_INTERPOLATE_32 (color5, color6);
287             }
288
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);
293             else
294                 product2a = color2;
295
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);
300             else
301                 product1a = color5;
302
303
304             destPtr[0] = product1a;
305             destPtr[1] = product1b;
306             destPtr[destWidth] = product2a;
307             destPtr[destWidth + 1] = product2b;
308
309             srcPtr++;
310             destPtr += 2;
311         }
312         srcPtr += (pitch-width);
313         destPtr += (((pitch-width)<<1)+(pitch<<1));
314     }
315 }
316
317
318 void Super2xSaI_16( uint16 *srcPtr, uint16 *destPtr, uint32 width, uint32 height, uint32 pitch)
319 {
320     uint32 destWidth = width << 1;
321     //uint32 destHeight = height << 1;
322
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;
329
330     int row0, row1, row2, row3;
331     int col0, col1, col2, col3;
332
333     for (uint16 y = 0; y < height; y++)
334     {
335         if (y > 0)
336         {
337             row0 = width;
338             row0 = -row0;
339         }
340         else
341             row0 = 0;
342
343         row1 = 0;
344
345         if (y < height - 1)
346         {
347             row2 = width;
348
349             if (y < height - 2) 
350                 row3 = width << 1;
351             else
352                 row3 = width;
353         }
354         else
355         {
356             row2 = 0;
357             row3 = 0;
358         }
359
360         for (uint16 x = 0; x < width; x++)
361         {
362             //--------------------------------------- B0 B1 B2 B3
363             //                                         4  5  6 S2
364             //                                         1  2  3 S1
365             //                                        A0 A1 A2 A3
366             if (x > 0)
367                 col0 = -1;
368             else
369                 col0 = 0;
370
371             col1 = 0;
372
373             if (x < width - 1)
374             {
375                 col2 = 1;
376
377                 if (x < width - 2) 
378                     col3 = 2;
379                 else
380                     col3 = 1;
381             }
382             else
383             {
384                 col2 = 0;
385                 col3 = 0;
386             }
387
388             colorB0 = *(srcPtr + col0 + row0);
389             colorB1 = *(srcPtr + col1 + row0);
390             colorB2 = *(srcPtr + col2 + row0);
391             colorB3 = *(srcPtr + col3 + row0);
392
393             color4 = *(srcPtr + col0 + row1);
394             color5 = *(srcPtr + col1 + row1);
395             color6 = *(srcPtr + col2 + row1);
396             colorS2 = *(srcPtr + col3 + row1);
397
398             color1 = *(srcPtr + col0 + row2);
399             color2 = *(srcPtr + col1 + row2);
400             color3 = *(srcPtr + col2 + row2);
401             colorS1 = *(srcPtr + col3 + row2);
402
403             colorA0 = *(srcPtr + col0 + row3);
404             colorA1 = *(srcPtr + col1 + row3);
405             colorA2 = *(srcPtr + col2 + row3);
406             colorA3 = *(srcPtr + col3 + row3);
407
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)
414             {
415                 int r = 0;
416
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);
421
422                 if (r > 0)
423                     product2b = product1b = color6;
424                 else if (r < 0)
425                     product2b = product1b = color5;
426                 else
427                     product2b = product1b = SAI_INTERPOLATE_16 (color5, color6);
428             }
429             else
430             {
431
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);
436                 else
437                     product2b = SAI_INTERPOLATE_16 (color2, color3);
438
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);
443                 else
444                     product1b = SAI_INTERPOLATE_16 (color5, color6);
445             }
446
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);
451             else
452                 product2a = color2;
453
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);
458             else
459                 product1a = color5;
460
461
462             destPtr[0] = product1a;
463             destPtr[1] = product1b;
464             destPtr[destWidth] = product2a;
465             destPtr[destWidth + 1] = product2b;
466
467             srcPtr++;
468             destPtr += 2;
469         }
470         srcPtr += (pitch-width);
471         destPtr += (((pitch-width)<<1)+(pitch<<1));
472     }
473 }
474