aboutsummaryrefslogtreecommitdiffstats
path: root/src/renderer.c
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2023-04-23 17:16:39 +0200
committerBad Diode <bd@badd10de.dev>2023-04-23 17:16:39 +0200
commita4092c4a6b1ad1589552c06b29a72d868ef778f1 (patch)
treed08027606a4d490a85798cb09a5d7631366426b9 /src/renderer.c
parentff6e784e7c5ebe223666c6c631305397ad358289 (diff)
downloadstepper-a4092c4a6b1ad1589552c06b29a72d868ef778f1.tar.gz
stepper-a4092c4a6b1ad1589552c06b29a72d868ef778f1.zip
Fix small font rendering and sprite drawing
Diffstat (limited to 'src/renderer.c')
-rw-r--r--src/renderer.c73
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
263IWRAM_CODE
264void
265draw_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
336void 263void
337clear_screen(void) { 264clear_screen(void) {
338 dma_fill(FRONTBUF, 0, KB(20), 3); 265 dma_fill(FRONTBUF, 0, KB(20), 3);