[Concept,14/42] video: truetype: Use common cursor-drawing code

Message ID 20250919201507.4024144-15-sjg@u-boot.org
State New
Headers
Series video: Support a cursor more generally |

Commit Message

Simon Glass Sept. 19, 2025, 8:14 p.m. UTC
  From: Simon Glass <sjg@chromium.org>

Update truetype_set_cursor_visible() to use the existing shared
draw_cursor_vertically() function instead of duplicating cursor-drawing
itself.

This corrects a problem where met is accessed for fixed-width fonts, for
which it doesn't exist.

Co-developed-by: Claude <noreply@anthropic.com>
Signed-off-by: Simon Glass <sjg@chromium.org>
---

 drivers/video/console_truetype.c | 82 +++++---------------------------
 1 file changed, 11 insertions(+), 71 deletions(-)
  

Patch

diff --git a/drivers/video/console_truetype.c b/drivers/video/console_truetype.c
index 43274bb8f66..fb7f70a4b2a 100644
--- a/drivers/video/console_truetype.c
+++ b/drivers/video/console_truetype.c
@@ -1000,10 +1000,8 @@  static int truetype_set_cursor_visible(struct udevice *dev, bool visible,
 	struct udevice *vid = dev->parent;
 	struct video_priv *vid_priv = dev_get_uclass_priv(vid);
 	struct console_tt_priv *priv = dev_get_priv(dev);
-	struct console_tt_metrics *met = priv->cur_met;
-	uint row, width, height, xoff;
-	void *start, *line;
-	uint out, val;
+	void *line;
+	uint height;
 
 	if (xpl_phase() <= PHASE_SPL)
 		return -ENOSYS;
@@ -1022,79 +1020,21 @@  static int truetype_set_cursor_visible(struct udevice *dev, bool visible,
 		x = VID_TO_PIXEL(vc_priv->xcur_frac);
 
 	y = vc_priv->ycur;
-	height = met->font_size;
-	xoff = 0;
 
-	val = vid_priv->colour_bg ? 0 : 255;
-	width = VIDCONSOLE_CURSOR_WIDTH;
+	/* Get font height from current font type */
+	if (priv->cur_fontdata)
+		height = priv->cur_fontdata->height;
+	else
+		height = priv->cur_met->font_size;
 
 	/* Figure out where to write the cursor in the frame buffer */
-	start = vid_priv->fb + y * vid_priv->line_length +
+	line = vid_priv->fb + y * vid_priv->line_length +
 		x * VNBYTES(vid_priv->bpix);
-	line = start;
-
-	/* draw a vertical bar in the correct position */
-	for (row = 0; row < height; row++) {
-		switch (vid_priv->bpix) {
-		case VIDEO_BPP8:
-			if (IS_ENABLED(CONFIG_VIDEO_BPP8)) {
-				u8 *dst = line + xoff;
-				int i;
-
-				out = val;
-				for (i = 0; i < width; i++) {
-					if (vid_priv->colour_fg)
-						*dst++ |= out;
-					else
-						*dst++ &= out;
-				}
-			}
-			break;
-		case VIDEO_BPP16: {
-			u16 *dst = (u16 *)line + xoff;
-			int i;
 
-			if (IS_ENABLED(CONFIG_VIDEO_BPP16)) {
-				for (i = 0; i < width; i++) {
-					out = val >> 3 |
-						(val >> 2) << 5 |
-						(val >> 3) << 11;
-					if (vid_priv->colour_fg)
-						*dst++ |= out;
-					else
-						*dst++ &= out;
-				}
-			}
-			break;
-		}
-		case VIDEO_BPP32: {
-			u32 *dst = (u32 *)line + xoff;
-			int i;
-
-			if (IS_ENABLED(CONFIG_VIDEO_BPP32)) {
-				for (i = 0; i < width; i++) {
-					int out;
-
-					if (vid_priv->format == VIDEO_X2R10G10B10)
-						out = val << 2 | val << 12 | val << 22;
-					else
-						out = val | val << 8 | val << 16;
-					if (vid_priv->colour_fg)
-						*dst++ |= out;
-					else
-						*dst++ &= out;
-				}
-			}
-			break;
-		}
-		default:
-			return -ENOSYS;
-		}
-
-		line += vid_priv->line_length;
-	}
+	/* Use the shared cursor drawing function */
+	draw_cursor_vertically(&line, vid_priv, height, NORMAL_DIRECTION);
 
-	video_damage(dev->parent, x, y, width, height);
+	video_damage(dev->parent, x, y, VIDCONSOLE_CURSOR_WIDTH, height);
 
 	return video_sync(vid, true);
 }