From 65659baf95c0ce454c1f2bb73423957683433e1c 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