~ubuntu-branches/ubuntu/precise/mupen64plus/precise

« back to all changes in this revision

Viewing changes to glide64/wrapper/2xsai.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Sven Eckelmann
  • Date: 2009-09-08 22:17:00 UTC
  • Revision ID: james.westby@ubuntu.com-20090908221700-yela0ckgc1xwiqtn
Tags: upstream-1.5+dfsg1
ImportĀ upstreamĀ versionĀ 1.5+dfsg1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 
2
 *   Mupen64plus - glide64/wrapper/2xsai.cpp                               *
 
3
 *   Mupen64Plus homepage: http://code.google.com/p/mupen64plus/           *
 
4
 *   Copyright (C) 2005-2006 Hacktarux                                     *
 
5
 *                                                                         *
 
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.                                   *
 
10
 *                                                                         *
 
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.                          *
 
15
 *                                                                         *
 
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
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
21
 
 
22
#include "../winlnxdefs.h"
 
23
 
 
24
static __inline int GetResult( DWORD A, DWORD B, DWORD C, DWORD D )
 
25
{
 
26
    int x = 0; 
 
27
    int y = 0;
 
28
    int r = 0;
 
29
 
 
30
    if (A == C) x += 1; else if (B == C) y += 1;
 
31
    if (A == D) x += 1; else if (B == D) y += 1;
 
32
    if (x <= 1) r += 1; 
 
33
    if (y <= 1) r -= 1;
 
34
 
 
35
    return r;
 
36
}
 
37
 
 
38
static __inline DWORD INTERPOLATE( DWORD A, DWORD B)
 
39
{
 
40
    if (A != B)
 
41
        return  ((A & 0xFEFEFEFE) >> 1) + 
 
42
                (((B & 0xFEFEFEFE) >> 1) |
 
43
                (A & B & 0x01010101));
 
44
    else
 
45
        return A;
 
46
}
 
47
 
 
48
static __inline DWORD Q_INTERPOLATE( DWORD A, DWORD B, DWORD C, DWORD D)
 
49
{
 
50
    DWORD x =   ((A & 0xFCFCFCFC) >> 2) +
 
51
                ((B & 0xFCFCFCFC) >> 2) +
 
52
                ((C & 0xFCFCFCFC) >> 2) +
 
53
                ((D & 0xFCFCFCFC) >> 2);
 
54
    DWORD y =   (((A & 0x03030303) +
 
55
                (B & 0x03030303) +
 
56
                (C & 0x03030303) +
 
57
                (D & 0x03030303)) >> 2) & 0x03030303;
 
58
    return x | y;
 
59
}
 
60
 
 
61
void Super2xSaI( DWORD *srcPtr, DWORD *destPtr, DWORD width, DWORD height, DWORD pitch)
 
62
{
 
63
    DWORD destWidth = width << 1;
 
64
 
 
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;
 
71
 
 
72
    int row0, row1, row2, row3;
 
73
    int col0, col1, col2, col3;
 
74
 
 
75
    WORD y, x;
 
76
 
 
77
    for (y = 0; y < height; y++)
 
78
    {
 
79
        if (y > 0)
 
80
        {
 
81
            row0 = width;
 
82
            row0 = -row0;
 
83
        }
 
84
        else
 
85
            row0 = 0;
 
86
 
 
87
        row1 = 0;
 
88
 
 
89
        if (y < height - 1)
 
90
        {
 
91
            row2 = width;
 
92
 
 
93
            if (y < height - 2) 
 
94
                row3 = width << 1;
 
95
            else
 
96
                row3 = width;
 
97
        }
 
98
        else
 
99
        {
 
100
            row2 = 0;
 
101
            row3 = 0;
 
102
        }
 
103
 
 
104
        for (x = 0; x < width; x++)
 
105
        {
 
106
//--------------------------------------- B0 B1 B2 B3
 
107
//                                         4  5  6 S2
 
108
//                                         1  2  3 S1
 
109
//                                        A0 A1 A2 A3
 
110
            if (x > 0)
 
111
                col0 = -1;
 
112
            else
 
113
                col0 = 0;
 
114
 
 
115
            col1 = 0;
 
116
 
 
117
            if (x < width - 1)
 
118
            {
 
119
                col2 = 1;
 
120
 
 
121
                if (x < width - 2) 
 
122
                    col3 = 2;
 
123
                else
 
124
                    col3 = 1;
 
125
            }
 
126
            else
 
127
            {
 
128
                col2 = 0;
 
129
                col3 = 0;
 
130
            }
 
131
 
 
132
            colorB0 = *(srcPtr + col0 + row0);
 
133
            colorB1 = *(srcPtr + col1 + row0);
 
134
            colorB2 = *(srcPtr + col2 + row0);
 
135
            colorB3 = *(srcPtr + col3 + row0);
 
136
 
 
137
            color4 = *(srcPtr + col0 + row1);
 
138
            color5 = *(srcPtr + col1 + row1);
 
139
            color6 = *(srcPtr + col2 + row1);
 
140
            colorS2 = *(srcPtr + col3 + row1);
 
141
 
 
142
            color1 = *(srcPtr + col0 + row2);
 
143
            color2 = *(srcPtr + col1 + row2);
 
144
            color3 = *(srcPtr + col2 + row2);
 
145
            colorS1 = *(srcPtr + col3 + row2);
 
146
 
 
147
            colorA0 = *(srcPtr + col0 + row3);
 
148
            colorA1 = *(srcPtr + col1 + row3);
 
149
            colorA2 = *(srcPtr + col2 + row3);
 
150
            colorA3 = *(srcPtr + col3 + row3);
 
151
 
 
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)
 
158
            {
 
159
                int r = 0;
 
160
 
 
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);
 
165
 
 
166
                if (r > 0)
 
167
                    product2b = product1b = color6;
 
168
                else if (r < 0)
 
169
                    product2b = product1b = color5;
 
170
                else
 
171
                    product2b = product1b = INTERPOLATE (color5, color6);
 
172
            }
 
173
            else
 
174
            {
 
175
 
 
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);
 
180
                else
 
181
                    product2b = INTERPOLATE (color2, color3);
 
182
 
 
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);
 
187
                else
 
188
                    product1b = INTERPOLATE (color5, color6);
 
189
            }
 
190
 
 
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);
 
195
            else
 
196
                product2a = color2;
 
197
 
 
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);
 
202
            else
 
203
                product1a = color5;
 
204
 
 
205
 
 
206
            destPtr[0] = product1a;
 
207
            destPtr[1] = product1b;
 
208
            destPtr[destWidth] = product2a;
 
209
            destPtr[destWidth + 1] = product2b;
 
210
 
 
211
            srcPtr++;
 
212
            destPtr += 2;
 
213
        }
 
214
        srcPtr += (pitch-width);
 
215
        destPtr += (((pitch-width)<<1)+(pitch<<1));
 
216
    }
 
217
}
 
218