[PATCH 1/1] video: fix positioning in TrueType console

Heinrich Schuchardt xypron.glpk at gmx.de
Wed Oct 27 20:10:36 CEST 2021


Dear Anatolij,

somehow you lost track of this patch since March:

https://patchwork.ozlabs.org/project/uboot/patch/20210203161254.970-1-xypron.glpk@gmx.de/

Could you, please, review it and consider it for merging.

Best regards

Heinrich


On 2/3/21 17:12, Heinrich Schuchardt wrote:
> With the patch accurate positioning is possible for mono-typed fonts:
>
> Fix the return value of console_truetype_putc_xy(). The current position
> is passed as parameter x. Some part of x represents a fractional pixel.
> The return value represents how much the character position must be
> advanced. This should only comprise the width of the current character and
> not the preexisting fractional pixel position.
>
> Characters are not square. As all characters of a mono-type font we can
> take the width of any character. 'W' as one of the widest ANSI characters
> provides also a good value for variable width fonts.
>
> The character width must be a float.
>
> Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
> ---
>   drivers/video/console_truetype.c | 27 ++++++++++++++++++++-------
>   include/video_console.h          |  2 +-
>   2 files changed, 21 insertions(+), 8 deletions(-)
>
> --
> 2.30.1
>
> diff --git a/drivers/video/console_truetype.c b/drivers/video/console_truetype.c
> index 318a060926..56939af849 100644
> --- a/drivers/video/console_truetype.c
> +++ b/drivers/video/console_truetype.c
> @@ -211,7 +211,7 @@ static int console_truetype_putc_xy(struct udevice *dev, uint x, uint y,
>   	int width_frac, linenum;
>   	struct pos_info *pos;
>   	u8 *bits, *data;
> -	int advance;
> +	int advance, kern_adv;
>   	void *start, *line, *sync_start, *sync_end;
>   	int row, ret;
>   	int bg_r, bg_g, bg_b;
> @@ -226,8 +226,11 @@ static int console_truetype_putc_xy(struct udevice *dev, uint x, uint y,
>   	 * this character */
>   	xpos = frac(VID_TO_PIXEL((double)x));
>   	if (vc_priv->last_ch) {
> -		xpos += priv->scale * stbtt_GetCodepointKernAdvance(font,
> -							vc_priv->last_ch, ch);
> +		kern_adv = stbtt_GetCodepointKernAdvance(font, vc_priv->last_ch,
> +							 ch);
> +		xpos += priv->scale * kern_adv;
> +	} else {
> +		kern_adv = 0;
>   	}
>
>   	/*
> @@ -238,8 +241,8 @@ static int console_truetype_putc_xy(struct udevice *dev, uint x, uint y,
>   	 */
>   	x_shift = xpos - (double)tt_floor(xpos);
>   	xpos += advance * priv->scale;
> -	width_frac = (int)VID_TO_POS(xpos);
> -	if (x + width_frac >= vc_priv->xsize_frac)
> +	width_frac = VID_TO_POS(priv->scale * (kern_adv + advance));
> +	if (x + (int)VID_TO_POS(xpos) >= vc_priv->xsize_frac)
>   		return -EAGAIN;
>
>   	/* Write the current cursor position into history */
> @@ -591,20 +594,21 @@ static int console_truetype_probe(struct udevice *dev)
>   	struct udevice *vid_dev = dev->parent;
>   	struct video_priv *vid_priv = dev_get_uclass_priv(vid_dev);
>   	stbtt_fontinfo *font = &priv->font;
> -	int ascent;
> +	int advance, ascent, lsb;
>
>   	debug("%s: start\n", __func__);
> +
>   	if (vid_priv->font_size)
>   		priv->font_size = vid_priv->font_size;
>   	else
>   		priv->font_size = CONFIG_CONSOLE_TRUETYPE_SIZE;
> +
>   	priv->font_data = console_truetype_find_font();
>   	if (!priv->font_data) {
>   		debug("%s: Could not find any fonts\n", __func__);
>   		return -EBFONT;
>   	}
>
> -	vc_priv->x_charsize = priv->font_size;
>   	vc_priv->y_charsize = priv->font_size;
>   	vc_priv->xstart_frac = VID_TO_POS(2);
>   	vc_priv->cols = vid_priv->xsize / priv->font_size;
> @@ -618,6 +622,15 @@ static int console_truetype_probe(struct udevice *dev)
>
>   	/* Pre-calculate some things we will need regularly */
>   	priv->scale = stbtt_ScaleForPixelHeight(font, priv->font_size);
> +
> +	/* Assuming that 'W' is the widest character */
> +	stbtt_GetCodepointHMetrics(font, 'W', &advance, &lsb);
> +	advance += stbtt_GetCodepointKernAdvance(font, 'W', 'W');
> +	vc_priv->cols =
> +		(int)VID_TO_POS(vid_priv->xsize - 2) /
> +		(int)VID_TO_POS(advance * priv->scale);
> +	vc_priv->x_charsize = advance * priv->scale;
> +
>   	stbtt_GetFontVMetrics(font, &ascent, 0, 0);
>   	priv->baseline = (int)(ascent * priv->scale);
>   	debug("%s: ready\n", __func__);
> diff --git a/include/video_console.h b/include/video_console.h
> index 8747299d61..cf306e5ca2 100644
> --- a/include/video_console.h
> +++ b/include/video_console.h
> @@ -68,7 +68,7 @@ struct vidconsole_priv {
>   	int ycur;
>   	int rows;
>   	int cols;
> -	int x_charsize;
> +	double x_charsize;
>   	int y_charsize;
>   	int tab_width_frac;
>   	int xsize_frac;
>


More information about the U-Boot mailing list