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