
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(-) 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); } -- 2.43.0