]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
video: Allow obtaining the nominal size of a string size
authorSimon Glass <sjg@chromium.org>
Mon, 2 Oct 2023 01:13:18 +0000 (19:13 -0600)
committerTom Rini <trini@konsulko.com>
Wed, 11 Oct 2023 19:43:55 +0000 (15:43 -0400)
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>
drivers/video/console_truetype.c
drivers/video/vidconsole-uclass.c
include/video_console.h

index 0f9bb49e44f70341f7900c475e4fc6e8a7ae0b6d..8ed79c37676c34a463e72eb1cfff4db416f2357a 100644 (file)
@@ -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) = {
index b5b3b6625902744d2dd853de24716d9e5015c5e8..23b1b81731bc5c079349d2c4f2bba144ee8d61c4 100644 (file)
@@ -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)
 {
index 2694e44f6ecf395f1aa257229722a98353f9d8fd..5234c85efd6f30467c4bb4f63ce3089de5c16ba5 100644 (file)
@@ -224,6 +224,21 @@ struct vidconsole_ops {
         */
        int (*measure)(struct udevice *dev, const char *name, uint size,
                       const char *text, struct vidconsole_bbox *bbox);
+
+       /**
+        * nominal() - Measure the expected width of a line of text
+        *
+        * Uses an average font width and nominal height
+        *
+        * @dev: Console device to use
+        * @name: Font name, NULL for default
+        * @size: Font size, ignored if @name is NULL
+        * @num_chars: Number of characters to use
+        * @bbox: Returns nounding box of @num_chars characters
+        * Returns: 0 if OK, -ve on error
+        */
+       int (*nominal)(struct udevice *dev, const char *name, uint size,
+                      uint num_chars, struct vidconsole_bbox *bbox);
 };
 
 /* Get a pointer to the driver operations for a video console device */
@@ -263,6 +278,21 @@ int vidconsole_select_font(struct udevice *dev, const char *name, uint size);
 int vidconsole_measure(struct udevice *dev, const char *name, uint size,
                       const char *text, struct vidconsole_bbox *bbox);
 
+/**
+ * vidconsole_nominal() - Measure the expected width of a line of text
+ *
+ * Uses an average font width and nominal height
+ *
+ * @dev: Console device to use
+ * @name: Font name, NULL for default
+ * @size: Font size, ignored if @name is NULL
+ * @num_chars: Number of characters to use
+ * @bbox: Returns nounding box of @num_chars characters
+ * Returns: 0 if OK, -ve on error
+ */
+int vidconsole_nominal(struct udevice *dev, const char *name, uint size,
+                      uint num_chars, struct vidconsole_bbox *bbox);
+
 /**
  * vidconsole_push_colour() - Temporarily change the font colour
  *