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