From db8aca661a09a19bd21675c86de7f9c1a0726a53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Deuc=D0=B5?= <shurd@sasktel.net> Date: Mon, 24 Apr 2023 14:18:03 -0400 Subject: [PATCH] Push update_pixels down and force a redraw on font change. update_pixels should only be set when at least one pixel has actually been changed... setting it when pixels have not been changed causes unneeded screen updates. Previously, a font change asserted (incorrectly) that the pixels in the screen had been modified, so the change would occur at the end of the next blink cycle when alt fonts are checked. Now it requests a full redraw from vmem when a font is changed, which will trigger a redraw the next time the blinker thread triggers (~5ms). --- src/conio/bitmap_con.c | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/src/conio/bitmap_con.c b/src/conio/bitmap_con.c index 3dcc807e99..651866f201 100644 --- a/src/conio/bitmap_con.c +++ b/src/conio/bitmap_con.c @@ -1470,12 +1470,21 @@ int bitmap_setpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, uint32_ pos = pixels->width*(y-sy+y_off)+x_off; if (mask == NULL) { for (x = sx; x <= ex; x++) { - screena.rect->data[PIXEL_OFFSET(screena, x, y)] = pixels->pixels[pos]; + if (screena.rect->data[PIXEL_OFFSET(screena, x, y)] != pixels->pixels[pos]) { + screena.rect->data[PIXEL_OFFSET(screena, x, y)] = pixels->pixels[pos]; + screena.update_pixels = 1; + } if (pixels->pixelsb) { - screenb.rect->data[PIXEL_OFFSET(screenb, x, y)] = pixels->pixelsb[pos]; + if (screenb.rect->data[PIXEL_OFFSET(screenb, x, y)] != pixels->pixelsb[pos]) { + screenb.rect->data[PIXEL_OFFSET(screenb, x, y)] = pixels->pixelsb[pos]; + screenb.update_pixels = 1; + } } else { - screenb.rect->data[PIXEL_OFFSET(screenb, x, y)] = pixels->pixels[pos]; + if (screenb.rect->data[PIXEL_OFFSET(screenb, x, y)] != pixels->pixels[pos]) { + screenb.rect->data[PIXEL_OFFSET(screenb, x, y)] = pixels->pixels[pos]; + screenb.update_pixels = 1; + } } pos++; } @@ -1487,12 +1496,21 @@ int bitmap_setpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, uint32_ mask_bit = mpos % 8; mask_bit = 0x80 >> mask_bit; if (mask->bits[mask_byte] & mask_bit) { - screena.rect->data[PIXEL_OFFSET(screena, x, y)] = pixels->pixels[pos]; + if (screena.rect->data[PIXEL_OFFSET(screena, x, y)] != pixels->pixels[pos]) { + screena.rect->data[PIXEL_OFFSET(screena, x, y)] = pixels->pixels[pos]; + screena.update_pixels = 1; + } if (pixels->pixelsb) { - screenb.rect->data[PIXEL_OFFSET(screenb, x, y)] = pixels->pixelsb[pos]; + if (screenb.rect->data[PIXEL_OFFSET(screenb, x, y)] != pixels->pixelsb[pos]) { + screenb.rect->data[PIXEL_OFFSET(screenb, x, y)] = pixels->pixelsb[pos]; + screenb.update_pixels = 1; + } } else { - screenb.rect->data[PIXEL_OFFSET(screenb, x, y)] = pixels->pixels[pos]; + if (screenb.rect->data[PIXEL_OFFSET(screenb, x, y)] != pixels->pixels[pos]) { + screenb.rect->data[PIXEL_OFFSET(screenb, x, y)] = pixels->pixels[pos]; + screenb.update_pixels = 1; + } } } pos++; @@ -1500,8 +1518,6 @@ int bitmap_setpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, uint32_ } } } - screena.update_pixels = 1; - screenb.update_pixels = 1; pthread_mutex_unlock(&screenb.screenlock); pthread_mutex_unlock(&screena.screenlock); pthread_mutex_unlock(&blinker_lock); @@ -1626,8 +1642,7 @@ void bitmap_replace_font(uint8_t id, char *name, void *data, size_t size) free(name); free(data); } - screena.update_pixels = 1; - screenb.update_pixels = 1; + request_redraw(); pthread_mutex_unlock(&screenb.screenlock); pthread_mutex_unlock(&screena.screenlock); pthread_mutex_unlock(&blinker_lock); -- GitLab