mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2026-06-13 15:03:58 +03:00
video: Allow obtaining the nominal size of a string size
At present there is a method for measuring text, but if the actual text string is not known, it cannot be used. For text editor we want to set the size of the entry box to cover the expected text size. Add the concept of a 'norminal' size with a method to calculate that for the vidconsole. If the method is not implemented, fall back to using the font size, which is sufficient for fixed-width fonts. Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
@@ -750,6 +750,36 @@ int truetype_measure(struct udevice *dev, const char *name, uint size,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int truetype_nominal(struct udevice *dev, const char *name, uint size,
|
||||
uint num_chars, struct vidconsole_bbox *bbox)
|
||||
{
|
||||
struct console_tt_metrics *met;
|
||||
stbtt_fontinfo *font;
|
||||
int lsb, advance;
|
||||
int width;
|
||||
int ret;
|
||||
|
||||
ret = get_metrics(dev, name, size, &met);
|
||||
if (ret)
|
||||
return log_msg_ret("sel", ret);
|
||||
|
||||
font = &met->font;
|
||||
width = 0;
|
||||
|
||||
/* First get some basic metrics about this character */
|
||||
stbtt_GetCodepointHMetrics(font, 'W', &advance, &lsb);
|
||||
|
||||
width = advance;
|
||||
|
||||
bbox->valid = true;
|
||||
bbox->x0 = 0;
|
||||
bbox->y0 = 0;
|
||||
bbox->x1 = tt_ceil((double)width * num_chars * met->scale);
|
||||
bbox->y1 = met->font_size;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
const char *console_truetype_get_font_size(struct udevice *dev, uint *sizep)
|
||||
{
|
||||
struct console_tt_priv *priv = dev_get_priv(dev);
|
||||
@@ -802,6 +832,7 @@ struct vidconsole_ops console_truetype_ops = {
|
||||
.get_font_size = console_truetype_get_font_size,
|
||||
.select_font = truetype_select_font,
|
||||
.measure = truetype_measure,
|
||||
.nominal = truetype_nominal,
|
||||
};
|
||||
|
||||
U_BOOT_DRIVER(vidconsole_truetype) = {
|
||||
|
||||
@@ -618,6 +618,28 @@ int vidconsole_measure(struct udevice *dev, const char *name, uint size,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int vidconsole_nominal(struct udevice *dev, const char *name, uint size,
|
||||
uint num_chars, struct vidconsole_bbox *bbox)
|
||||
{
|
||||
struct vidconsole_priv *priv = dev_get_uclass_priv(dev);
|
||||
struct vidconsole_ops *ops = vidconsole_get_ops(dev);
|
||||
int ret;
|
||||
|
||||
if (ops->measure) {
|
||||
ret = ops->nominal(dev, name, size, num_chars, bbox);
|
||||
if (ret != -ENOSYS)
|
||||
return ret;
|
||||
}
|
||||
|
||||
bbox->valid = true;
|
||||
bbox->x0 = 0;
|
||||
bbox->y0 = 0;
|
||||
bbox->x1 = priv->x_charsize * num_chars;
|
||||
bbox->y1 = priv->y_charsize;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void vidconsole_push_colour(struct udevice *dev, enum colour_idx fg,
|
||||
enum colour_idx bg, struct vidconsole_colour *old)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user