1/*****************************************************************************\
2 Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
3 This file is licensed under the Snes9x License.
4 For further information, consult the LICENSE file in the root directory.
5\*****************************************************************************/
6
7#include "snes9x.h"
8#include "epx.h"
9
10
11void EPX_16 (uint8 *srcPtr, int srcRowBytes, uint8 *dstPtr, int dstRowBytes, int width, int height)
12{
13 uint16 colorX, colorA, colorB, colorC, colorD;
14 uint16 *sP, *uP, *lP;
15 uint32 *dP1, *dP2;
16 int w;
17
18 height -= 2;
19
20 // D
21 // A X C
22 // B
23
24 // top edge
25
26 sP = (uint16 *) srcPtr;
27 lP = (uint16 *) (srcPtr + srcRowBytes);
28 dP1 = (uint32 *) dstPtr;
29 dP2 = (uint32 *) (dstPtr + dstRowBytes);
30
31 // left edge
32
33 colorX = *sP;
34 colorC = *++sP;
35 colorB = *lP++;
36
37 if ((colorX != colorC) && (colorB != colorX))
38 {
39 #ifdef MSB_FIRST
40 *dP1 = (colorX << 16) + colorX;
41 *dP2 = (colorX << 16) + ((colorB == colorC) ? colorB : colorX);
42 #else
43 *dP1 = colorX + (colorX << 16);
44 *dP2 = colorX + (((colorB == colorC) ? colorB : colorX) << 16);
45 #endif
46 }
47 else
48 *dP1 = *dP2 = (colorX << 16) + colorX;
49
50 dP1++;
51 dP2++;
52
53 //
54
55 for (w = width - 2; w; w--)
56 {
57 colorA = colorX;
58 colorX = colorC;
59 colorC = *++sP;
60 colorB = *lP++;
61
62 if ((colorA != colorC) && (colorB != colorX))
63 {
64 #ifdef MSB_FIRST
65 *dP1 = (colorX << 16) + colorX;
66 *dP2 = (((colorA == colorB) ? colorA : colorX) << 16) + ((colorB == colorC) ? colorB : colorX);
67 #else
68 *dP1 = colorX + (colorX << 16);
69 *dP2 = ((colorA == colorB) ? colorA : colorX) + (((colorB == colorC) ? colorB : colorX) << 16);
70 #endif
71 }
72 else
73 *dP1 = *dP2 = (colorX << 16) + colorX;
74
75 dP1++;
76 dP2++;
77 }
78
79 // right edge
80
81 colorA = colorX;
82 colorX = colorC;
83 colorB = *lP;
84
85 if ((colorA != colorX) && (colorB != colorX))
86 {
87 #ifdef MSB_FIRST
88 *dP1 = (colorX << 16) + colorX;
89 *dP2 = (((colorA == colorB) ? colorA : colorX) << 16) + colorX;
90 #else
91 *dP1 = colorX + (colorX << 16);
92 *dP2 = ((colorA == colorB) ? colorA : colorX) + (colorX << 16);
93 #endif
94 }
95 else
96 *dP1 = *dP2 = (colorX << 16) + colorX;
97
98 srcPtr += srcRowBytes;
99 dstPtr += dstRowBytes << 1;
100
101 //
102
103 for (; height; height--)
104 {
105 sP = (uint16 *) srcPtr;
106 uP = (uint16 *) (srcPtr - srcRowBytes);
107 lP = (uint16 *) (srcPtr + srcRowBytes);
108 dP1 = (uint32 *) dstPtr;
109 dP2 = (uint32 *) (dstPtr + dstRowBytes);
110
111 // left edge
112
113 colorX = *sP;
114 colorC = *++sP;
115 colorB = *lP++;
116 colorD = *uP++;
117
118 if ((colorX != colorC) && (colorB != colorD))
119 {
120 #ifdef MSB_FIRST
121 *dP1 = (colorX << 16) + ((colorC == colorD) ? colorC : colorX);
122 *dP2 = (colorX << 16) + ((colorB == colorC) ? colorB : colorX);
123 #else
124 *dP1 = colorX + (((colorC == colorD) ? colorC : colorX) << 16);
125 *dP2 = colorX + (((colorB == colorC) ? colorB : colorX) << 16);
126 #endif
127 }
128 else
129 *dP1 = *dP2 = (colorX << 16) + colorX;
130
131 dP1++;
132 dP2++;
133
134 //
135
136 for (w = width - 2; w; w--)
137 {
138 colorA = colorX;
139 colorX = colorC;
140 colorC = *++sP;
141 colorB = *lP++;
142 colorD = *uP++;
143
144 if ((colorA != colorC) && (colorB != colorD))
145 {
146 #ifdef MSB_FIRST
147 *dP1 = (((colorD == colorA) ? colorD : colorX) << 16) + ((colorC == colorD) ? colorC : colorX);
148 *dP2 = (((colorA == colorB) ? colorA : colorX) << 16) + ((colorB == colorC) ? colorB : colorX);
149 #else
150 *dP1 = ((colorD == colorA) ? colorD : colorX) + (((colorC == colorD) ? colorC : colorX) << 16);
151 *dP2 = ((colorA == colorB) ? colorA : colorX) + (((colorB == colorC) ? colorB : colorX) << 16);
152 #endif
153 }
154 else
155 *dP1 = *dP2 = (colorX << 16) + colorX;
156
157 dP1++;
158 dP2++;
159 }
160
161 // right edge
162
163 colorA = colorX;
164 colorX = colorC;
165 colorB = *lP;
166 colorD = *uP;
167
168 if ((colorA != colorX) && (colorB != colorD))
169 {
170 #ifdef MSB_FIRST
171 *dP1 = (((colorD == colorA) ? colorD : colorX) << 16) + colorX;
172 *dP2 = (((colorA == colorB) ? colorA : colorX) << 16) + colorX;
173 #else
174 *dP1 = ((colorD == colorA) ? colorD : colorX) + (colorX << 16);
175 *dP2 = ((colorA == colorB) ? colorA : colorX) + (colorX << 16);
176 #endif
177 }
178 else
179 *dP1 = *dP2 = (colorX << 16) + colorX;
180
181 srcPtr += srcRowBytes;
182 dstPtr += dstRowBytes << 1;
183 }
184
185 // bottom edge
186
187 sP = (uint16 *) srcPtr;
188 uP = (uint16 *) (srcPtr - srcRowBytes);
189 dP1 = (uint32 *) dstPtr;
190 dP2 = (uint32 *) (dstPtr + dstRowBytes);
191
192 // left edge
193
194 colorX = *sP;
195 colorC = *++sP;
196 colorD = *uP++;
197
198 if ((colorX != colorC) && (colorX != colorD))
199 {
200 #ifdef MSB_FIRST
201 *dP1 = (colorX << 16) + ((colorC == colorD) ? colorC : colorX);
202 *dP2 = (colorX << 16) + colorX;
203 #else
204 *dP1 = colorX + (((colorC == colorD) ? colorC : colorX) << 16);
205 *dP2 = colorX + (colorX << 16);
206 #endif
207 }
208 else
209 *dP1 = *dP2 = (colorX << 16) + colorX;
210
211 dP1++;
212 dP2++;
213
214 //
215
216 for (w = width - 2; w; w--)
217 {
218 colorA = colorX;
219 colorX = colorC;
220 colorC = *++sP;
221 colorD = *uP++;
222
223 if ((colorA != colorC) && (colorX != colorD))
224 {
225 #ifdef MSB_FIRST
226 *dP1 = (((colorD == colorA) ? colorD : colorX) << 16) + ((colorC == colorD) ? colorC : colorX);
227 *dP2 = (colorX << 16) + colorX;
228 #else
229 *dP1 = ((colorD == colorA) ? colorD : colorX) + (((colorC == colorD) ? colorC : colorX) << 16);
230 *dP2 = colorX + (colorX << 16);
231 #endif
232 }
233 else
234 *dP1 = *dP2 = (colorX << 16) + colorX;
235
236 dP1++;
237 dP2++;
238 }
239
240 // right edge
241
242 colorA = colorX;
243 colorX = colorC;
244 colorD = *uP;
245
246 if ((colorA != colorX) && (colorX != colorD))
247 {
248 #ifdef MSB_FIRST
249 *dP1 = (((colorD == colorA) ? colorD : colorX) << 16) + colorX;
250 *dP2 = (colorX << 16) + colorX;
251 #else
252 *dP1 = ((colorD == colorA) ? colorD : colorX) + (colorX << 16);
253 *dP2 = colorX + (colorX << 16);
254 #endif
255 }
256 else
257 *dP1 = *dP2 = (colorX << 16) + colorX;
258}
259