1 // Graphics format: 8 � 8 pixel tiles, 4/8 bits/pixel.
2 
3 // Create a unique name for each of the functions
4 #define FN(a,b,c,d,e,f,g,h) RenderTile ## a ## _ ## b ## _ROT ## c ## d ## e ## f ## g ## h
5 #define FUNCTIONNAME(a,b,c,d,e,f,g,h) FN(a,b,c,d,e,f,g,h)
6 
7 #if ROT == 0
8 
9  #if XFLIP == 0
10   #define ADVANCECOLUMN pPixel += (BPP >> 3)
11  #else
12   #error illegal XFLIP value
13  #endif
14 
15  #if YFLIP == 0
16   #define ADVANCEROW pTileRow += ((BPP >> 3) * XSIZE)
17  #else
18   #error illegal YFLIP value
19  #endif
20 
21 #else
22  #error unsupported rotation angle specified
23 #endif
24 
25 #if DOCLIP == 0
26  #define CLIP _NOCLIP
27 #elif DOCLIP == 1
28  #define CLIP _CLIP
29 #else
30  #error illegal doclip value.
31 #endif
32 
33 #if EIGHTBIT == 0
34  #define DEPTH _16
35 #elif EIGHTBIT == 1
36  #define DEPTH _256
37 #else
38  #error illegal eightbit value
39 #endif
40 
41 #define TESTCOLOUR(x) x
42 
43 #if BPP == 16
44  #define PLOTPIXEL(a) if (TESTCOLOUR(a)) {							\
45    	*((UINT16*)pPixel) = (UINT16)pTilePalette[a];	\
46  }
47 #elif BPP == 24
48  #define PLOTPIXEL(a) if (TESTCOLOUR(a)) {							\
49 	UINT32 nRGB = pTilePalette[a];							\
50 	pPixel[0] = (UINT8)nRGB;								\
51 	pPixel[1] = (UINT8)(nRGB >> 8);							\
52 	pPixel[2] = (UINT8)(nRGB >> 16);						\
53  }
54 #elif BPP == 32
55  #define PLOTPIXEL(a) if (TESTCOLOUR(a)) {							\
56 	 *((UINT32*)pPixel) = (UINT32)pTilePalette[a];		\
57  }
58 #else
59  #error unsupported bitdepth specified.
60 #endif
61 
62 // For decorating the function name
63 #if XFLIP == 1
64  #if YFLIP == 1
65   #define FLIP _FLIPXY
66  #else
67   #define FLIP _FLIPX
68  #endif
69 #elif YFLIP == 1
70  #define FLIP _FLIPY
71 #else
72  #define FLIP _NOFLIP
73 #endif
74 
75 #if ROWSELECT == 0
76  #define SELECT _NOROWSELECT
77 #elif ROWSELECT == 1
78  #define SELECT _ROWSELECT
79 #else
80  #error unsupported rowselect mode specified.
81 #endif
82 
83 #if ROWSCROLL == 0
84  #define SCROLL _NOROWSCROLL
85 #elif ROWSCROLL == 1
86  #define SCROLL _ROWSCROLL
87 #else
88  #error unsupported rowscroll mode specified.
89 #endif
90 
FUNCTIONNAME(BPP,XSIZE,ROT,FLIP,SCROLL,SELECT,CLIP,DEPTH)91 static void FUNCTIONNAME(BPP,XSIZE,ROT,FLIP,SCROLL,SELECT,CLIP,DEPTH)()
92 {
93 // Create an empty function if unsupported features are requested
94 #if ROT == 0 && XFLIP == 0 && YFLIP == 0 && !(ROWSCROLL == 1 && ROWSELECT == 1) && EIGHTBIT == 1
95 
96 	UINT8 *pTileRow, *pPixel;
97 	INT32 nColour;
98 
99  #if ROWSELECT == 0
100 	INT32 y;
101  #endif
102 
103  #if ROWSELECT == 0
104   	for (y = 0, pTileRow = pTile; y < 8; y++, ADVANCEROW) {
105 
106   #if DOCLIP == 1
107 		if (nTileYPos + y < 0) {
108 
109    #if EIGHTBIT == 0
110 			pTileData++;
111    #else
112 			pTileData += 2;
113    #endif
114 
115 			continue;
116 		}
117 
118 		if (nTileYPos + y >= nCaveYSize) {
119 			return;
120 		}
121   #endif
122 
123  #else
124 		pTileRow = pTile;
125  #endif
126 
127 		pPixel = pTileRow;
128 
129  #if ROWSCROLL == 1
130 		nRowOffset = (nTileXPos - pTileRowInfo[y]) & 0x01FF;
131 		if (nRowOffset >= 0x01F8) {
132 			nRowOffset -= 0x0200;
133 		}
134 		if (nRowOffset >= XSIZE) {
135   #if EIGHTBIT == 0
136 			pTileData++;
137   #else
138 			pTileData += 2;
139   #endif
140 			continue;
141 		}
142 		pPixel += (BPP >> 3) * nRowOffset;
143  #endif
144 
145  #if ROWSCROLL == 1
146   #define XPOS nRowOffset
147  #else
148   #define XPOS nTileXPos
149  #endif
150 
151  #if EIGHTBIT == 0
152   #if DOCLIP == 1 || ROWSCROLL == 1
153 		nColour = BURN_ENDIAN_SWAP_INT32(*pTileData++);
154 
155 		if (XPOS <= (XSIZE - 8)) {
156 			if (XPOS < 0) {
157 				nColour >>= -XPOS * 4;
158 				pPixel += -XPOS * (BPP >> 3);
159 			}
160 
161 			switch (XPOS < 0 ? -XPOS : 0) {
162 				case 0:
163 					PLOTPIXEL(nColour & 0x0F);
164 					ADVANCECOLUMN;
165 					nColour >>= 4;
166 				case 1:
167 					PLOTPIXEL(nColour & 0x0F);
168 					ADVANCECOLUMN;
169 					nColour >>= 4;
170 				case 2:
171 					PLOTPIXEL(nColour & 0x0F);
172 					ADVANCECOLUMN;
173 					nColour >>= 4;
174 				case 3:
175 					PLOTPIXEL(nColour & 0x0F);
176 					ADVANCECOLUMN;
177 					nColour >>= 4;
178 				case 4:
179 					PLOTPIXEL(nColour & 0x0F);
180 					ADVANCECOLUMN;
181 					nColour >>= 4;
182 				case 5:
183 					PLOTPIXEL(nColour & 0x0F);
184 					ADVANCECOLUMN;
185 					nColour >>= 4;
186 				case 6:
187 					PLOTPIXEL(nColour & 0x0F);
188 					ADVANCECOLUMN;
189 					nColour >>= 4;
190 				case 7:
191 					PLOTPIXEL(nColour & 0x0F);
192 			}
193 		} else {
194 
195    #define CLIPPIXEL(a,b) if (XPOS < XSIZE - (a)) { b; }
196 			CLIPPIXEL(0, PLOTPIXEL(nColour & 0xFF));
197 			ADVANCECOLUMN;
198 			nColour >>= 8;
199 			CLIPPIXEL(1, PLOTPIXEL(nColour & 0xFF));
200 			ADVANCECOLUMN;
201 			nColour >>= 8;
202 			CLIPPIXEL(2, PLOTPIXEL(nColour & 0xFF));
203 			ADVANCECOLUMN;
204 			nColour >>= 8;
205 			CLIPPIXEL(3, PLOTPIXEL(nColour & 0xFF));
206 			ADVANCECOLUMN;
207 			nColour >>= 8;
208 			CLIPPIXEL(4, PLOTPIXEL(nColour & 0xFF));
209 			ADVANCECOLUMN;
210 			nColour >>= 8;
211 			CLIPPIXEL(5, PLOTPIXEL(nColour & 0xFF));
212 			ADVANCECOLUMN;
213 			nColour >>= 8;
214 			CLIPPIXEL(6, PLOTPIXEL(nColour & 0xFF));
215    #undef CLIPPIXEL
216 
217 		}
218   #else
219 		nColour = BURN_ENDIAN_SWAP_INT32(*pTileData++);
220 		PLOTPIXEL(nColour & 0x0F);
221 		ADVANCECOLUMN;
222 		nColour >>= 4;
223 		PLOTPIXEL(nColour & 0x0F);
224 		ADVANCECOLUMN;
225 
226 		nColour >>= 4;
227 		PLOTPIXEL(nColour & 0x0F);
228 		ADVANCECOLUMN;
229 		nColour >>= 4;
230 		PLOTPIXEL(nColour & 0x0F);
231 		ADVANCECOLUMN;
232 
233 		nColour >>= 4;
234 		PLOTPIXEL(nColour & 0x0F);
235 		ADVANCECOLUMN;
236 		nColour >>= 4;
237 		PLOTPIXEL(nColour & 0x0F);
238 		ADVANCECOLUMN;
239 
240 		nColour >>= 4;
241 		PLOTPIXEL(nColour & 0x0F);
242 		ADVANCECOLUMN;
243 		nColour >>= 4;
244 		PLOTPIXEL(nColour & 0x0F);
245   #endif
246  #else
247   #if DOCLIP == 1 || ROWSCROLL == 1
248 		nColour = BURN_ENDIAN_SWAP_INT32(pTileData[0]);
249 
250 		if (XPOS <= (XSIZE - 8)) {
251 			if (XPOS < 0) {
252 				if (XPOS < -3) {
253 					nColour = BURN_ENDIAN_SWAP_INT32(pTileData[1]);
254 				}
255 				nColour >>= (-XPOS & 3) * 8;
256 				pPixel += -XPOS * (BPP >> 3);
257 			}
258 
259 			switch (XPOS < 0 ? -XPOS : 0) {
260 				case 0:
261 					PLOTPIXEL(nColour & 0xFF);
262 					ADVANCECOLUMN;
263 					nColour >>= 8;
264 				case 1:
265 					PLOTPIXEL(nColour & 0xFF);
266 					ADVANCECOLUMN;
267 					nColour >>= 8;
268 				case 2:
269 					PLOTPIXEL(nColour & 0xFF);
270 					ADVANCECOLUMN;
271 					nColour >>= 8;
272 				case 3:
273 					PLOTPIXEL(nColour & 0xFF);
274 					ADVANCECOLUMN;
275 					nColour = BURN_ENDIAN_SWAP_INT32(pTileData[1]);
276 				case 4:
277 					PLOTPIXEL(nColour & 0xFF);
278 					ADVANCECOLUMN;
279 					nColour >>= 8;
280 				case 5:
281 					PLOTPIXEL(nColour & 0xFF);
282 					ADVANCECOLUMN;
283 					nColour >>= 8;
284 				case 6:
285 					PLOTPIXEL(nColour & 0xFF);
286 					ADVANCECOLUMN;
287 					nColour >>= 8;
288 				case 7:
289 					PLOTPIXEL(nColour & 0xFF);
290 			}
291 		} else {
292 
293    #define CLIPPIXEL(a,b) if (XPOS < XSIZE - (a)) { b; }
294 			CLIPPIXEL(0, PLOTPIXEL(nColour & 0xFF));
295 			ADVANCECOLUMN;
296 			nColour >>= 8;
297 			CLIPPIXEL(1, PLOTPIXEL(nColour & 0xFF));
298 			ADVANCECOLUMN;
299 			nColour >>= 8;
300 			CLIPPIXEL(2, PLOTPIXEL(nColour & 0xFF));
301 			ADVANCECOLUMN;
302 			nColour >>= 8;
303 			CLIPPIXEL(3, PLOTPIXEL(nColour & 0xFF));
304 			ADVANCECOLUMN;
305 			nColour = BURN_ENDIAN_SWAP_INT32(pTileData[1]);
306 			CLIPPIXEL(4, PLOTPIXEL(nColour & 0xFF));
307 			ADVANCECOLUMN;
308 			nColour >>= 8;
309 			CLIPPIXEL(5, PLOTPIXEL(nColour & 0xFF));
310 			ADVANCECOLUMN;
311 			nColour >>= 8;
312 			CLIPPIXEL(6, PLOTPIXEL(nColour & 0xFF));
313    #undef CLIPPIXEL
314 
315 		}
316 
317 		pTileData += 2;
318 
319   #else
320 		nColour = BURN_ENDIAN_SWAP_INT32(*pTileData++);
321 		PLOTPIXEL(nColour & 0xFF);
322 		ADVANCECOLUMN;
323 		nColour >>= 8;
324 		PLOTPIXEL(nColour & 0xFF);
325 		ADVANCECOLUMN;
326 
327 		nColour >>= 8;
328 		PLOTPIXEL(nColour & 0xFF);
329 		ADVANCECOLUMN;
330 		nColour >>= 8;
331 		PLOTPIXEL(nColour & 0xFF);
332 		ADVANCECOLUMN;
333 
334 		nColour = BURN_ENDIAN_SWAP_INT32(*pTileData++);
335 		PLOTPIXEL(nColour & 0xFF);
336 		ADVANCECOLUMN;
337 		nColour >>= 8;
338 		PLOTPIXEL(nColour & 0xFF);
339 		ADVANCECOLUMN;
340 
341 		nColour >>= 8;
342 		PLOTPIXEL(nColour & 0xFF);
343 		ADVANCECOLUMN;
344 		nColour >>= 8;
345 		PLOTPIXEL(nColour & 0xFF);
346   #endif
347  #endif
348 
349  #undef XPOS
350 
351  #if ROWSELECT == 0
352 	}
353  #endif
354 
355 #endif
356 }
357 
358 #undef FLIP
359 #undef CLIP
360 #undef PLOTPIXEL
361 #undef TESTCLIP
362 #undef TESTCOLOUR
363 #undef ADVANCEROW
364 #undef ADVANCECOLUMN
365 #undef SCROLL
366 #undef SELECT
367 #undef DEPTH
368 #undef FUNCTIONNAME
369 #undef FN
370 
371