From edd003a541fd9ed8a574aa3dff53b6a779e91cc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Hru=C5=A1ka?= Date: Sat, 8 Apr 2023 20:52:15 +0200 Subject: [PATCH] fixes for partly off-screen bitmap, remove temporary debug changes --- Core/Src/app_gui.c | 5 +---- Lib/ufb/Src/framebuffer.c | 16 ++++++++-------- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/Core/Src/app_gui.c b/Core/Src/app_gui.c index 85fcfc5..2756ec9 100644 --- a/Core/Src/app_gui.c +++ b/Core/Src/app_gui.c @@ -228,8 +228,6 @@ static void input_sound_effect() static const char* main_menu_opts[] = { "Manual mode", "Calibration", - "Moderately long text", - "Very very long text that slides", NULL }; @@ -337,7 +335,7 @@ static void screen_manual_menu(GuiEvent event) static void screen_menu(GuiEvent event, const char **options, menu_callback_t cb) { bool menu_changed = false; - uint32_t tickNow = xTaskGetTickCount(); + const uint32_t tickNow = xTaskGetTickCount(); struct menu_state *menu = &s_app.page.menu; @@ -352,7 +350,6 @@ static void screen_menu(GuiEvent event, const char **options, menu_callback_t cb menu->len++; opt++; } - menu->pos = menu->len - 1; // FIXME temporary, for debug break; case GUI_EVENT_SCREEN_TICK: diff --git a/Lib/ufb/Src/framebuffer.c b/Lib/ufb/Src/framebuffer.c index 5edbfda..5ea7a2e 100644 --- a/Lib/ufb/Src/framebuffer.c +++ b/Lib/ufb/Src/framebuffer.c @@ -232,19 +232,19 @@ void fb_circle(fbpos_t x0, fbpos_t y0, fbpos_t radius, uint8_t thickness, fbcolo #if IS_AVR void fb_bitmap_ex_P(fbpos_t x, fbpos_t y, fbpos_t w, fbpos_t h, const uint8_t *map, fbcolor_t color) #else -void fb_bitmap_ex(fbpos_t x, fbpos_t y, fbpos_t w, fbpos_t h, const uint8_t *map, fbcolor_t color) +void fb_bitmap_ex(const fbpos_t x, const fbpos_t y, const fbpos_t w0, const fbpos_t h0, const uint8_t *map, fbcolor_t color) #endif { - if (x >= FBW || y >= FBH || x < -w || h < -h) { return; } - const fbpos_t w0 = w; - w = MIN(FBW - x - 1, w); - h = MIN(FBH - y - 1, h); + if (x >= FBW || y >= FBH || x < -w0 || y < -h0) { return; } + const fbpos_t w = MIN(FBW - x, w0); + fbpos_t h = MIN(FBH - y - 1, h0); // h is used as counter for rows const fbpos_t row = y / 8; const fbpos_t rowrem = y % 8; fbsize_t cell = (fbsize_t) x + (fbsize_t) row * FBW; + const fbpos_t xskip = (x >= 0) ? 0 : (-x); if (rowrem + h <= 8) { - for (fbpos_t i = 0; i < w; i++) { + for (fbpos_t i = xskip; i < w; i++) { // all within one cell const uint8_t mask = (pgm_read_byte(&map[i]) & (0xFF >> (8 - h))) << rowrem; draw_mask(cell + i, mask, color); @@ -256,7 +256,7 @@ void fb_bitmap_ex(fbpos_t x, fbpos_t y, fbpos_t w, fbpos_t h, const uint8_t *map // Draw the bitmap slice-by-slice based on how rows of the bitmap intersect with rows of the canvas. // This could be optimized to walk each row of the canvas only once, but the code would get bigger. while (h > 0) { - for (fbpos_t i = 0; i < w; i++) { + for (fbpos_t i = xskip; i < w; i++) { const uint8_t mask = (pgm_read_byte(&map[i + mapc0]) & (0xFF >> rowrem)) << rowrem; draw_mask(cell + i, mask, color); } @@ -264,7 +264,7 @@ void fb_bitmap_ex(fbpos_t x, fbpos_t y, fbpos_t w, fbpos_t h, const uint8_t *map cell += FBW; if (rowrem != 0) { - for (fbpos_t i = 0; i < w; i++) { + for (fbpos_t i = xskip; i < w; i++) { const uint8_t mask = (pgm_read_byte(&map[i + mapc0]) & (0xFF << (8 - rowrem))) >> (8 - rowrem); draw_mask(cell + i, mask, color); }