From aedaa7ade0ed623d09b18a34023f2e02201e67e6 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Fri, 4 Jun 2021 10:53:24 +0200 Subject: Add slow rect drawing primitive to renderer --- src/main.c | 4 +++- src/renderer.c | 26 ++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/main.c b/src/main.c index 61547c8..ab41915 100644 --- a/src/main.c +++ b/src/main.c @@ -64,12 +64,14 @@ int main(void) { irq_init(); irs_set(IRQ_VBLANK, irs_stub); - txt_drawf("Hello world: %d", 4, 4, 6, 10); // Main loop. PROF_INIT(); while (true) { bios_vblank_wait(); + txt_drawf("Hello world: %d", 4, 4, 6, 10); + draw_rect(30, 30, 45, 45, 1); + draw_rect(35, 35, 60, 40, 2); PROF_SHOW(); PROF(flip_buffer(), flip_cycles); } diff --git a/src/renderer.c b/src/renderer.c index 076d698..4aa583d 100644 --- a/src/renderer.c +++ b/src/renderer.c @@ -44,6 +44,32 @@ draw_pixel(u16 x, u16 y, u8 color) { dirty_tiles[tile_y] |= 1 << tile_x; } +IWRAM_CODE +void +draw_rect(int x0, int y0, int x1, int y1, u8 clr) { + if (x0 > x1) { + int tmp = x0; + x0 = x1; + x1 = tmp; + } + if (y0 > y1) { + int tmp = y0; + y0 = y1; + y1 = tmp; + } + int dx = x1 - x0; + int dy = y1 - y0; + // TODO: SLOW should be vectorized. + for (int i = 0; i <= dx; ++i) { + draw_pixel(x0 + i, y0, clr); + draw_pixel(x0 + i, y1, clr); + } + for (int i = 0; i <= dy; ++i) { + draw_pixel(x0, y0 + i, clr); + draw_pixel(x1, y0 + i, clr); + } +} + IWRAM_CODE void draw_tile(u16 x, u16 y, Tile *tile, bool merge) { -- cgit v1.2.1