1
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
2
* Mupen64plus - glide64/wrapper/2xsai.cpp *
3
* Mupen64Plus homepage: http://code.google.com/p/mupen64plus/ *
4
* Copyright (C) 2005-2006 Hacktarux *
6
* This program is free software; you can redistribute it and/or modify *
7
* it under the terms of the GNU General Public License as published by *
8
* the Free Software Foundation; either version 2 of the License, or *
9
* (at your option) any later version. *
11
* This program is distributed in the hope that it will be useful, *
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14
* GNU General Public License for more details. *
16
* You should have received a copy of the GNU General Public License *
17
* along with this program; if not, write to the *
18
* Free Software Foundation, Inc., *
19
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
20
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
22
#include "../winlnxdefs.h"
24
static __inline int GetResult( DWORD A, DWORD B, DWORD C, DWORD D )
30
if (A == C) x += 1; else if (B == C) y += 1;
31
if (A == D) x += 1; else if (B == D) y += 1;
38
static __inline DWORD INTERPOLATE( DWORD A, DWORD B)
41
return ((A & 0xFEFEFEFE) >> 1) +
42
(((B & 0xFEFEFEFE) >> 1) |
43
(A & B & 0x01010101));
48
static __inline DWORD Q_INTERPOLATE( DWORD A, DWORD B, DWORD C, DWORD D)
50
DWORD x = ((A & 0xFCFCFCFC) >> 2) +
51
((B & 0xFCFCFCFC) >> 2) +
52
((C & 0xFCFCFCFC) >> 2) +
53
((D & 0xFCFCFCFC) >> 2);
54
DWORD y = (((A & 0x03030303) +
57
(D & 0x03030303)) >> 2) & 0x03030303;
61
void Super2xSaI( DWORD *srcPtr, DWORD *destPtr, DWORD width, DWORD height, DWORD pitch)
63
DWORD destWidth = width << 1;
65
DWORD color4, color5, color6;
66
DWORD color1, color2, color3;
67
DWORD colorA0, colorA1, colorA2, colorA3;
68
DWORD colorB0, colorB1, colorB2, colorB3;
69
DWORD colorS1, colorS2;
70
DWORD product1a, product1b, product2a, product2b;
72
int row0, row1, row2, row3;
73
int col0, col1, col2, col3;
77
for (y = 0; y < height; y++)
104
for (x = 0; x < width; x++)
106
//--------------------------------------- B0 B1 B2 B3
132
colorB0 = *(srcPtr + col0 + row0);
133
colorB1 = *(srcPtr + col1 + row0);
134
colorB2 = *(srcPtr + col2 + row0);
135
colorB3 = *(srcPtr + col3 + row0);
137
color4 = *(srcPtr + col0 + row1);
138
color5 = *(srcPtr + col1 + row1);
139
color6 = *(srcPtr + col2 + row1);
140
colorS2 = *(srcPtr + col3 + row1);
142
color1 = *(srcPtr + col0 + row2);
143
color2 = *(srcPtr + col1 + row2);
144
color3 = *(srcPtr + col2 + row2);
145
colorS1 = *(srcPtr + col3 + row2);
147
colorA0 = *(srcPtr + col0 + row3);
148
colorA1 = *(srcPtr + col1 + row3);
149
colorA2 = *(srcPtr + col2 + row3);
150
colorA3 = *(srcPtr + col3 + row3);
152
//--------------------------------------
153
if (color2 == color6 && color5 != color3)
154
product2b = product1b = color2;
155
else if (color5 == color3 && color2 != color6)
156
product2b = product1b = color5;
157
else if (color5 == color3 && color2 == color6)
161
r += GetResult (color6, color5, color1, colorA1);
162
r += GetResult (color6, color5, color4, colorB1);
163
r += GetResult (color6, color5, colorA2, colorS1);
164
r += GetResult (color6, color5, colorB2, colorS2);
167
product2b = product1b = color6;
169
product2b = product1b = color5;
171
product2b = product1b = INTERPOLATE (color5, color6);
176
if (color6 == color3 && color3 == colorA1 && color2 != colorA2 && color3 != colorA0)
177
product2b = Q_INTERPOLATE (color3, color3, color3, color2);
178
else if (color5 == color2 && color2 == colorA2 && colorA1 != color3 && color2 != colorA3)
179
product2b = Q_INTERPOLATE (color2, color2, color2, color3);
181
product2b = INTERPOLATE (color2, color3);
183
if (color6 == color3 && color6 == colorB1 && color5 != colorB2 && color6 != colorB0)
184
product1b = Q_INTERPOLATE (color6, color6, color6, color5);
185
else if (color5 == color2 && color5 == colorB2 && colorB1 != color6 && color5 != colorB3)
186
product1b = Q_INTERPOLATE (color6, color5, color5, color5);
188
product1b = INTERPOLATE (color5, color6);
191
if (color5 == color3 && color2 != color6 && color4 == color5 && color5 != colorA2)
192
product2a = INTERPOLATE (color2, color5);
193
else if (color5 == color1 && color6 == color5 && color4 != color2 && color5 != colorA0)
194
product2a = INTERPOLATE(color2, color5);
198
if (color2 == color6 && color5 != color3 && color1 == color2 && color2 != colorB2)
199
product1a = INTERPOLATE (color2, color5);
200
else if (color4 == color2 && color3 == color2 && color1 != color5 && color2 != colorB0)
201
product1a = INTERPOLATE(color2, color5);
206
destPtr[0] = product1a;
207
destPtr[1] = product1b;
208
destPtr[destWidth] = product2a;
209
destPtr[destWidth + 1] = product2b;
214
srcPtr += (pitch-width);
215
destPtr += (((pitch-width)<<1)+(pitch<<1));