diff options
author | Bad Diode <bd@badd10de.dev> | 2023-04-23 17:16:39 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2023-04-23 17:16:39 +0200 |
commit | a4092c4a6b1ad1589552c06b29a72d868ef778f1 (patch) | |
tree | d08027606a4d490a85798cb09a5d7631366426b9 /src/renderer.c | |
parent | ff6e784e7c5ebe223666c6c631305397ad358289 (diff) | |
download | stepper-a4092c4a6b1ad1589552c06b29a72d868ef778f1.tar.gz stepper-a4092c4a6b1ad1589552c06b29a72d868ef778f1.zip |
Fix small font rendering and sprite drawing
Diffstat (limited to 'src/renderer.c')
-rw-r--r-- | src/renderer.c | 73 |
1 files changed, 0 insertions, 73 deletions
diff --git a/src/renderer.c b/src/renderer.c index 07d79d6..65dfd2b 100644 --- a/src/renderer.c +++ b/src/renderer.c | |||
@@ -260,79 +260,6 @@ draw_filled_rect(size_t x0, size_t y0, size_t x1, size_t y1, u8 clr) { | |||
260 | } | 260 | } |
261 | } | 261 | } |
262 | 262 | ||
263 | IWRAM_CODE | ||
264 | void | ||
265 | draw_tile(size_t x, size_t y, Tile *tile, u8 clr, bool merge) { | ||
266 | BOUNDCHECK_SCREEN(x, y); | ||
267 | |||
268 | // Find row position for the given x/y coordinates. | ||
269 | size_t tile_x = x / 8; | ||
270 | size_t tile_y = y / 8; | ||
271 | size_t start_col = x % 8; | ||
272 | size_t start_row = y % 8; | ||
273 | |||
274 | // Get a pointer to the backbuffer and the tile row. | ||
275 | size_t pos = start_row + (tile_x + tile_y * 32) * 8; | ||
276 | u32 *backbuffer = &BACKBUF[pos]; | ||
277 | u32 *row = tile; | ||
278 | |||
279 | // This will blend all colors weirdly if using tiles that contain colors | ||
280 | // higher than 1. | ||
281 | size_t shift_left = start_col * 4; | ||
282 | size_t shift_right = (8 - start_col) * 4; | ||
283 | u32 row_mask_left = merge ? 0 : 0xFFFFFFFF << shift_left; | ||
284 | u32 row_mask_right = merge ? 0 : 0xFFFFFFFF >> shift_right; | ||
285 | |||
286 | // Draw the tiles. There are 4 possible cases: | ||
287 | // 1. The tile is exactly at the tile boundary. | ||
288 | // 2. The tile spans 2 tiles horizontally. | ||
289 | // 3. The tile spans 2 tiles vertically. | ||
290 | // 4. The tile spans 4 tiles. | ||
291 | if (start_col == 0 && start_row == 0) { | ||
292 | for (size_t i = 0; i < (8 - start_row); i++, backbuffer++) { | ||
293 | BOUNDCHECK_SCREEN(x, y + i); | ||
294 | backbuffer[0] = (backbuffer[0] & ~row_mask_left) | row[i] * clr; | ||
295 | } | ||
296 | dirty_tiles[tile_y] |= 1 << tile_x; | ||
297 | } else if (start_row == 0) { | ||
298 | for (size_t i = 0; i < 8; i++, backbuffer++) { | ||
299 | BOUNDCHECK_SCREEN(x, y + i); | ||
300 | backbuffer[0] = (backbuffer[0] & ~row_mask_left) | (row[i] * clr << shift_left); | ||
301 | backbuffer[8] = (backbuffer[8] & ~row_mask_right) | (row[i] * clr >> shift_right); | ||
302 | } | ||
303 | dirty_tiles[tile_y] |= 1 << tile_x; | ||
304 | dirty_tiles[tile_y] |= 1 << (tile_x + 1); | ||
305 | } else if (start_col == 0) { | ||
306 | for (size_t i = 0; i < (8 - start_row); i++, backbuffer++) { | ||
307 | BOUNDCHECK_SCREEN(x, y + i); | ||
308 | backbuffer[0] = (backbuffer[0] & ~row_mask_left) | row[i] * clr; | ||
309 | } | ||
310 | backbuffer += 8 * 31; | ||
311 | for (size_t i = (8 - start_row); i < 8; i++, backbuffer++) { | ||
312 | BOUNDCHECK_SCREEN(x, y + i); | ||
313 | backbuffer[0] = (backbuffer[0] & ~row_mask_left) | row[i] * clr; | ||
314 | } | ||
315 | dirty_tiles[tile_y] |= 1 << tile_x; | ||
316 | dirty_tiles[tile_y + 1] |= 1 << tile_x; | ||
317 | } else { | ||
318 | for (size_t i = 0; i < (8 - start_row); i++, backbuffer++) { | ||
319 | BOUNDCHECK_SCREEN(x, y + i); | ||
320 | backbuffer[0] = (backbuffer[0] & ~row_mask_left) | (row[i] * clr << shift_left); | ||
321 | backbuffer[8] = (backbuffer[8] & ~row_mask_right) | (row[i] * clr >> shift_right); | ||
322 | } | ||
323 | backbuffer += 8 * 31; | ||
324 | for (size_t i = (8 - start_row); i < 8; i++, backbuffer++) { | ||
325 | BOUNDCHECK_SCREEN(x, y + i); | ||
326 | backbuffer[0] = (backbuffer[0] & ~row_mask_left) | (row[i] * clr << shift_left); | ||
327 | backbuffer[8] = (backbuffer[8] & ~row_mask_right) | (row[i] * clr >> shift_right); | ||
328 | } | ||
329 | dirty_tiles[tile_y] |= 1 << tile_x; | ||
330 | dirty_tiles[tile_y] |= 1 << (tile_x + 1); | ||
331 | dirty_tiles[tile_y + 1] |= 1 << tile_x; | ||
332 | dirty_tiles[tile_y + 1] |= 1 << (tile_x + 1); | ||
333 | } | ||
334 | } | ||
335 | |||
336 | void | 263 | void |
337 | clear_screen(void) { | 264 | clear_screen(void) { |
338 | dma_fill(FRONTBUF, 0, KB(20), 3); | 265 | dma_fill(FRONTBUF, 0, KB(20), 3); |