1 // Graphics format: 8 � 8 pixel tiles, 4 bits/pixel.
2 
3 // Create a unique name for each of the functions
4 #define FN(a,b,c,d,e) RenderTile ## a ## _ROT ## b  ## c ## d ## e
5 #define FUNCTIONNAME(a,b,c,d,e) FN(a,b,c,d,e)
6 
7 #if ROT == 0
8 
9  #if XFLIP == 0
10   #define ADVANCECOLUMN pPixel += (BPP >> 3)
11  #elif XFLIP == 1
12   #define ADVANCECOLUMN pPixel -= (BPP >> 3)
13  #else
14   #error illegal XFLIP value
15  #endif
16 
17  #if YFLIP == 0
18   #define ADVANCEROW pTileRow += ((BPP >> 3) * 320)
19  #elif YFLIP == 1
20   #define ADVANCEROW pTileRow -= ((BPP >> 3) * 320)
21  #else
22   #error illegal YFLIP value
23  #endif
24 
25 #elif ROT == 270
26 
27  #if XFLIP == 0
28   #define ADVANCECOLUMN pPixel -= ((BPP >> 3) * 240)
29  #elif XFLIP == 1
30   #define ADVANCECOLUMN pPixel += ((BPP >> 3) * 240)
31  #else
32   #error illegal XFLIP value
33  #endif
34 
35  #if YFLIP == 0
36   #define ADVANCEROW pTileRow += (BPP >> 3)
37  #elif YFLIP == 1
38   #define ADVANCEROW pTileRow -= (BPP >> 3)
39  #else
40   #error illegal YFLIP value
41  #endif
42 
43 #else
44  #error unsupported rotation angle specified
45 #endif
46 
47 #if DOCLIP == 0
48  #define CLIP _NOCLIP
49  #define TESTCLIP(x) (1)
50 #elif DOCLIP == 1
51  #define CLIP _CLIP
52  #define TESTCLIP(x) (nTileXPos >= -(x) && nTileXPos < (320 - (x)))
53 #else
54  #error illegal doclip value.
55 #endif
56 
57 #if ISOPAQUE == 0
58  #define OPACITY _TRANS
59  #define TESTCOLOUR(x) (x)
60 #elif ISOPAQUE == 1
61  #define OPACITY _OPAQUE
62  #define TESTCOLOUR(x) (1)
63 #else
64  #error illegal isopaque value
65 #endif
66 
67 #if BPP == 16
68  #define PLOTPIXEL(a,b) if (TESTCOLOUR(b) && TESTCLIP(a)) {			\
69    	*((UINT16*)pPixel) = (UINT16)pTilePalette[b];	\
70  }
71 #elif BPP == 24
72  #define PLOTPIXEL(a,b) if (TESTCOLOUR(b) && TESTCLIP(a)) {			\
73 	UINT32 nRGB = pTilePalette[b];							\
74 	pPixel[0] = (UINT8)nRGB;								\
75 	pPixel[1] = (UINT8)(nRGB >> 8);							\
76 	pPixel[2] = (UINT8)(nRGB >> 16);						\
77  }
78 #elif BPP == 32
79  #define PLOTPIXEL(a,b) if (TESTCOLOUR(b) && TESTCLIP(a)) {			\
80 	 *((UINT32*)pPixel) = (UINT32)pTilePalette[b];		\
81  }
82 #else
83  #error unsupported bitdepth specified.
84 #endif
85 
86 // For decorating the function name
87 #if XFLIP == 1
88  #if YFLIP == 1
89   #define FLIP _FLIPXY
90  #else
91   #define FLIP _FLIPX
92  #endif
93 #elif YFLIP == 1
94  #define FLIP _FLIPY
95 #else
96  #define FLIP _NOFLIP
97 #endif
98 
FUNCTIONNAME(BPP,ROT,FLIP,CLIP,OPACITY)99 static void FUNCTIONNAME(BPP,ROT,FLIP,CLIP,OPACITY)()
100 {
101 	UINT8 *pTileRow, *pPixel;
102 	INT32 y, nColour;
103 
104  #if ROT == 0
105   #if YFLIP == 0
106 	for (y = 0, pTileRow = pTile; y < 8; y++, ADVANCEROW) {
107   #else
108 	for (y = 7, pTileRow = pTile + ((BPP >> 3) * 320 * 7); y >= 0; y--, ADVANCEROW) {
109   #endif
110  #else
111   #if YFLIP == 0
112 	for (y = 0, pTileRow = pTile; y < 8; y++, ADVANCEROW) {
113   #else
114 	for (y = 7, pTileRow = pTile + ((BPP >> 3) * 7); y >= 0; y--, ADVANCEROW) {
115   #endif
116  #endif
117 
118  #if DOCLIP == 1
119 		if (nTileYPos + y < 0 || nTileYPos + y >= 240) {
120 			pTileData++;
121 			continue;
122 		}
123  #endif
124 
125  #if ROT == 0
126   #if XFLIP == 0
127    #define OFFSET(a) a
128 		pPixel = pTileRow;
129   #else
130    #define OFFSET(a) (7 - a)
131 		pPixel = pTileRow + ((BPP >> 3) * 7);
132   #endif
133  #else
134   #if XFLIP == 0
135    #define OFFSET(a) a
136 		pPixel = pTileRow;
137   #else
138    #define OFFSET(a) (7 - a)
139 		pPixel = pTileRow - ((BPP >> 3) * 240 * 7);
140   #endif
141  #endif
142 
143 		nColour = BURN_ENDIAN_SWAP_INT32(*pTileData++);
144 		PLOTPIXEL(OFFSET(0), nColour & 0x0F);
145 		ADVANCECOLUMN;
146 		nColour >>= 4;
147 		PLOTPIXEL(OFFSET(1), nColour & 0x0F);
148 		ADVANCECOLUMN;
149 
150 		nColour >>= 4;
151 		PLOTPIXEL(OFFSET(2), nColour & 0x0F);
152 		ADVANCECOLUMN;
153 		nColour >>= 4;
154 		PLOTPIXEL(OFFSET(3), nColour & 0x0F);
155 		ADVANCECOLUMN;
156 
157 		nColour >>= 4;
158 		PLOTPIXEL(OFFSET(4), nColour & 0x0F);
159 		ADVANCECOLUMN;
160 		nColour >>= 4;
161 		PLOTPIXEL(OFFSET(5), nColour & 0x0F);
162 		ADVANCECOLUMN;
163 
164 		nColour >>= 4;
165 		PLOTPIXEL(OFFSET(6), nColour & 0x0F);
166 		ADVANCECOLUMN;
167 		nColour >>= 4;
168 		PLOTPIXEL(OFFSET(7), nColour & 0x0F);
169 
170  #undef OFFSET
171 
172 	}
173 }
174 
175 #undef FLIP
176 #undef CLIP
177 #undef PLOTPIXEL
178 #undef TESTCLIP
179 #undef TESTCOLOUR
180 #undef ADVANCEROW
181 #undef ADVANCECOLUMN
182 #undef OPACITY
183 #undef FUNCTIONNAME
184 #undef FN
185 
186