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 | |
11 | void 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 | |