MCPcopy Create free account
hub / github.com/diasurgical/devilution / RenderTile

Function RenderTile

Source/render.cpp:149–254  ·  view source on GitHub ↗

* @brief Blit current world CEL to the given buffer * @param pBuff Output buffer */

Source from the content-addressed store, hash-verified

147 * @param pBuff Output buffer
148 */
149void RenderTile(BYTE *pBuff)
150{
151 int i, j;
152 char c, v, tile;
153 BYTE *src, *dst, *tbl;
154 DWORD m, *mask, *pFrameTable;
155
156 dst = pBuff;
157 pFrameTable = (DWORD *)pDungeonCels;
158
159 src = &pDungeonCels[SDL_SwapLE32(pFrameTable[level_cel_block & 0xFFF])];
160 tile = (level_cel_block & 0x7000) >> 12;
161 tbl = &pLightTbl[256 * light_table_index];
162
163 mask = &SolidMask[31];
164
165 if (cel_transparency_active) {
166 if (arch_draw_type == 0) {
167 mask = &WallMask[31];
168 }
169 if (arch_draw_type == 1 && tile != RT_LTRIANGLE) {
170 c = block_lvid[level_piece_id];
171 if (c == 1 || c == 3) {
172 mask = &LeftMask[31];
173 }
174 }
175 if (arch_draw_type == 2 && tile != RT_RTRIANGLE) {
176 c = block_lvid[level_piece_id];
177 if (c == 2 || c == 3) {
178 mask = &RightMask[31];
179 }
180 }
181 }
182
183#ifdef _DEBUG
184 if (GetAsyncKeyState(VK_MENU) & 0x8000) {
185 mask = &SolidMask[31];
186 }
187#endif
188
189 switch (tile) {
190 case RT_SQUARE:
191 for (i = 32; i != 0; i--, dst -= BUFFER_WIDTH + 32, mask--) {
192 RenderLine(&dst, &src, 32, tbl, *mask);
193 }
194 break;
195 case RT_TRANSPARENT:
196 for (i = 32; i != 0; i--, dst -= BUFFER_WIDTH + 32, mask--) {
197 m = *mask;
198 for (j = 32; j != 0; j -= v, v == 32 ? m = 0 : m <<= v) {
199 v = *src++;
200 if (v >= 0) {
201 RenderLine(&dst, &src, v, tbl, m);
202 } else {
203 v = -v;
204 dst += v;
205 }
206 }

Callers

nothing calls this directly

Calls 2

GetAsyncKeyStateFunction · 0.85
RenderLineFunction · 0.85

Tested by

no test coverage detected