Glide Plugin GLES2 port from mupen64plus-ae, but with special FrameSkip code
[mupen64plus-pandora.git] / source / gles2glide64 / src / GlideHQ / TextureFilters_2xsai.h
1 /*
2  * Texture Filtering
3  * Version:  1.0
4  *
5  * Copyright (C) 2007  Hiroshi Morii   All Rights Reserved.
6  * Email koolsmoky(at)users.sourceforge.net
7  * Web   http://www.3dfxzone.it/koolsmoky
8  *
9  * this is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2, or (at your option)
12  * any later version.
13  *
14  * this is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with GNU Make; see the file COPYING.  If not, write to
21  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
22  */
23
24 /* Based on Derek Liauw Kie Fa and Rice1964 Super2xSaI code */
25
26   int row0, row1, row2, row3;
27   int col0, col1, col2, col3;
28
29   uint16 x;
30   uint16 y;
31
32   for (y = 0; y < height; y++) {
33     if ((y > 0) && (y < height - 1)) {
34       row0 = width;
35       row0 = -row0;
36       row1 = 0;
37       row2 = width;
38       row3 = (y == height - 2 ? width : width << 1);
39     } else {
40       row0 = 0;
41       row1 = 0;
42       row2 = 0;
43       row3 = 0;
44     }
45
46     for (x = 0; x < width; x++) {
47 //--------------------------------------- B0 B1 B2 B3
48 //                                         4  5  6 S2
49 //                                         1  2  3 S1
50 //                                        A0 A1 A2 A3
51       if ((x > 0) && (x < width - 1)) {
52         col0 = -1;
53         col1 = 0;
54         col2 = 1;
55         col3 = (x == width - 2 ? 1 : 2);
56       } else {
57         col0 = 0;
58         col1 = 0;
59         col2 = 0;
60         col3 = 0;
61       }
62
63       colorB0 = *(srcPtr + col0 + row0);
64       colorB1 = *(srcPtr + col1 + row0);
65       colorB2 = *(srcPtr + col2 + row0);
66       colorB3 = *(srcPtr + col3 + row0);
67
68       color4 = *(srcPtr + col0 + row1);
69       color5 = *(srcPtr + col1 + row1);
70       color6 = *(srcPtr + col2 + row1);
71       colorS2 = *(srcPtr + col3 + row1);
72
73       color1 = *(srcPtr + col0 + row2);
74       color2 = *(srcPtr + col1 + row2);
75       color3 = *(srcPtr + col2 + row2);
76       colorS1 = *(srcPtr + col3 + row2);
77
78       colorA0 = *(srcPtr + col0 + row3);
79       colorA1 = *(srcPtr + col1 + row3);
80       colorA2 = *(srcPtr + col2 + row3);
81       colorA3 = *(srcPtr + col3 + row3);
82
83 //--------------------------------------
84       if (color2 == color6 && color5 != color3)
85         product2b = product1b = color2;
86       else if (color5 == color3 && color2 != color6)
87         product2b = product1b = color5;
88       else if (color5 == color3 && color2 == color6) {
89         int r = 0;
90
91         r += GET_RESULT(color6, color5, color1, colorA1);
92         r += GET_RESULT(color6, color5, color4, colorB1);
93         r += GET_RESULT(color6, color5, colorA2, colorS1);
94         r += GET_RESULT(color6, color5, colorB2, colorS2);
95
96         if (r > 0)
97           product2b = product1b = color6;
98         else if (r < 0)
99           product2b = product1b = color5;
100         else
101           product2b = product1b = SAI_INTERPOLATE(color5, color6);
102
103       } else {
104
105         if (color6 == color3 && color3 == colorA1 && color2 != colorA2 && color3 != colorA0)
106           product2b = SAI_Q_INTERPOLATE(color3, color3, color3, color2);
107         else if (color5 == color2 && color2 == colorA2 && colorA1 != color3 && color2 != colorA3)
108           product2b = SAI_Q_INTERPOLATE(color2, color2, color2, color3);
109         else
110           product2b = SAI_INTERPOLATE(color2, color3);
111
112         if (color6 == color3 && color6 == colorB1 && color5 != colorB2 && color6 != colorB0)
113           product1b = SAI_Q_INTERPOLATE(color6, color6, color6, color5);
114         else if (color5 == color2 && color5 == colorB2 && colorB1 != color6 && color5 != colorB3)
115           product1b = SAI_Q_INTERPOLATE(color6, color5, color5, color5);
116         else
117           product1b = SAI_INTERPOLATE(color5, color6);
118       }
119
120       if (color5 == color3 && color2 != color6 && color4 == color5 && color5 != colorA2)
121         product2a = SAI_INTERPOLATE(color2, color5);
122       else if (color5 == color1 && color6 == color5 && color4 != color2 && color5 != colorA0)
123         product2a = SAI_INTERPOLATE(color2, color5);
124       else
125         product2a = color2;
126
127       if (color2 == color6 && color5 != color3 && color1 == color2 && color2 != colorB2)
128         product1a = SAI_INTERPOLATE(color2, color5);
129       else if (color4 == color2 && color3 == color2 && color1 != color5 && color2 != colorB0)
130         product1a = SAI_INTERPOLATE(color2, color5);
131       else
132         product1a = color5;
133
134
135       destPtr[0] = product1a;
136       destPtr[1] = product1b;
137       destPtr[destWidth] = product2a;
138       destPtr[destWidth + 1] = product2b;
139
140       srcPtr++;
141       destPtr += 2;
142     }
143     srcPtr += (pitch-width);
144     destPtr += (((pitch-width)<<1)+(pitch<<1));
145   }