Glide Plugin GLES2 port from mupen64plus-ae, but with special FrameSkip code
[mupen64plus-pandora.git] / source / gles2glide64 / src / GlideHQ / TextureFilters_2xsai.h
CommitLineData
98e75f2d 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 }