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 
EPX_16(uint8 * srcPtr,int srcRowBytes,uint8 * dstPtr,int dstRowBytes,int width,int height)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