From 5b160c23330663e38d1c7fa387d64e83a372638d Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Tue, 8 Jun 2021 13:34:41 +0200 Subject: Fix bug on tile rendering --- src/renderer.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/renderer.c b/src/renderer.c index 4318610..afc9904 100644 --- a/src/renderer.c +++ b/src/renderer.c @@ -294,7 +294,8 @@ draw_tile(size_t x, size_t y, Tile *tile, bool merge) { // higher than 1. size_t shift_left = start_col * 4; size_t shift_right = (8 - start_col) * 4; - u32 row_mask = merge ? 0 : 0xFFFFFFFF << shift_left; + u32 row_mask_left = merge ? 0 : 0xFFFFFFFF << shift_left; + u32 row_mask_right = merge ? 0 : 0xFFFFFFFF >> shift_right; // Draw the tiles. There are 4 possible cases: // 1. The tile is exactly at the tile boundary. @@ -304,40 +305,40 @@ draw_tile(size_t x, size_t y, Tile *tile, bool merge) { if (start_col == 0 && start_row == 0) { for (size_t i = 0; i < (8 - start_row); i++, backbuffer++) { BOUNDCHECK_SCREEN(x, y + i); - backbuffer[0] = (backbuffer[0] & ~row_mask) | row[i]; + backbuffer[0] = (backbuffer[0] & ~row_mask_left) | row[i]; } dirty_tiles[tile_y] |= 1 << tile_x; } else if (start_row == 0) { for (size_t i = 0; i < 8; i++, backbuffer++) { BOUNDCHECK_SCREEN(x, y + i); - backbuffer[0] = (backbuffer[0] & ~row_mask) | (row[i] << shift_left); - backbuffer[8] = (backbuffer[8] & row_mask) | (row[i] >> shift_right); + backbuffer[0] = (backbuffer[0] & ~row_mask_left) | (row[i] << shift_left); + backbuffer[8] = (backbuffer[8] & ~row_mask_right) | (row[i] >> shift_right); } dirty_tiles[tile_y] |= 1 << tile_x; dirty_tiles[tile_y] |= 1 << (tile_x + 1); } else if (start_col == 0) { for (size_t i = 0; i < (8 - start_row); i++, backbuffer++) { BOUNDCHECK_SCREEN(x, y + i); - backbuffer[0] = (backbuffer[0] & ~row_mask) | row[i]; + backbuffer[0] = (backbuffer[0] & ~row_mask_left) | row[i]; } backbuffer += 8 * 31; for (size_t i = (8 - start_row); i < 8; i++, backbuffer++) { BOUNDCHECK_SCREEN(x, y + i); - backbuffer[0] = (backbuffer[0] & ~row_mask) | row[i]; + backbuffer[0] = (backbuffer[0] & ~row_mask_left) | row[i]; } dirty_tiles[tile_y] |= 1 << tile_x; dirty_tiles[tile_y + 1] |= 1 << tile_x; } else { for (size_t i = 0; i < (8 - start_row); i++, backbuffer++) { BOUNDCHECK_SCREEN(x, y + i); - backbuffer[0] = (backbuffer[0] & ~row_mask) | (row[i] << shift_left); - backbuffer[8] = (backbuffer[8] & row_mask) | (row[i] >> shift_right); + backbuffer[0] = (backbuffer[0] & ~row_mask_left) | (row[i] << shift_left); + backbuffer[8] = (backbuffer[8] & ~row_mask_right) | (row[i] >> shift_right); } backbuffer += 8 * 31; for (size_t i = (8 - start_row); i < 8; i++, backbuffer++) { BOUNDCHECK_SCREEN(x, y + i); - backbuffer[0] = (backbuffer[0] & ~row_mask) | (row[i] << shift_left); - backbuffer[8] = (backbuffer[8] & row_mask) | (row[i] >> shift_right); + backbuffer[0] = (backbuffer[0] & ~row_mask_left) | (row[i] << shift_left); + backbuffer[8] = (backbuffer[8] & ~row_mask_right) | (row[i] >> shift_right); } dirty_tiles[tile_y] |= 1 << tile_x; dirty_tiles[tile_y] |= 1 << (tile_x + 1); -- cgit v1.2.1