Update the vidconsole API so that measure() can measure multiple lines
of text. This will make it easier to implement multi-line fields in
expo.

Tidy up the function comments while we are here.

Signed-off-by: Simon Glass <s...@chromium.org>
---

 boot/scene.c                      |  2 +-
 drivers/video/console_truetype.c  |  3 +-
 drivers/video/vidconsole-uclass.c |  7 +++--
 include/video_console.h           | 50 +++++++++++++++++++++++--------
 test/dm/video.c                   |  5 +++-
 5 files changed, 49 insertions(+), 18 deletions(-)

diff --git a/boot/scene.c b/boot/scene.c
index 15e7a8b3387..d3ae5816bef 100644
--- a/boot/scene.c
+++ b/boot/scene.c
@@ -298,7 +298,7 @@ int scene_obj_get_hw(struct scene *scn, uint id, int 
*widthp)
                }
 
                ret = vidconsole_measure(scn->expo->cons, txt->font_name,
-                                        txt->font_size, str, &bbox);
+                                        txt->font_size, str, &bbox, NULL);
                if (ret)
                        return log_msg_ret("mea", ret);
                if (widthp)
diff --git a/drivers/video/console_truetype.c b/drivers/video/console_truetype.c
index 980baee83cf..7b9033818d3 100644
--- a/drivers/video/console_truetype.c
+++ b/drivers/video/console_truetype.c
@@ -733,7 +733,8 @@ static int truetype_select_font(struct udevice *dev, const 
char *name,
 }
 
 static int truetype_measure(struct udevice *dev, const char *name, uint size,
-                           const char *text, struct vidconsole_bbox *bbox)
+                           const char *text, struct vidconsole_bbox *bbox,
+                           struct alist *lines)
 {
        struct console_tt_metrics *met;
        stbtt_fontinfo *font;
diff --git a/drivers/video/vidconsole-uclass.c 
b/drivers/video/vidconsole-uclass.c
index a1dfd35b7b8..4ca41dc331e 100644
--- a/drivers/video/vidconsole-uclass.c
+++ b/drivers/video/vidconsole-uclass.c
@@ -608,14 +608,17 @@ 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)
+                      const char *text, struct vidconsole_bbox *bbox,
+                      struct alist *lines)
 {
        struct vidconsole_priv *priv = dev_get_uclass_priv(dev);
        struct vidconsole_ops *ops = vidconsole_get_ops(dev);
        int ret;
 
        if (ops->measure) {
-               ret = ops->measure(dev, name, size, text, bbox);
+               if (lines)
+                       alist_empty(lines);
+               ret = ops->measure(dev, name, size, text, bbox, lines);
                if (ret != -ENOSYS)
                        return ret;
        }
diff --git a/include/video_console.h b/include/video_console.h
index 13197fa4518..ee9ce3c0e37 100644
--- a/include/video_console.h
+++ b/include/video_console.h
@@ -6,6 +6,7 @@
 #ifndef __video_console_h
 #define __video_console_h
 
+#include <alist.h>
 #include <video.h>
 
 struct abuf;
@@ -119,6 +120,19 @@ struct vidconsole_bbox {
        int y1;
 };
 
+/**
+ * vidconsole_mline - Holds information about a line of measured text
+ *
+ * @bbox: Bounding box of the line, assuming it starts at 0,0
+ * @start: String index of the first character in the line
+ * @len: Number of characters in the line
+ */
+struct vidconsole_mline {
+       struct vidconsole_bbox bbox;
+       int start;
+       int len;
+};
+
 /**
  * struct vidconsole_ops - Video console operations
  *
@@ -228,18 +242,23 @@ struct vidconsole_ops {
        int (*select_font)(struct udevice *dev, const char *name, uint size);
 
        /**
-        * measure() - Measure the bounds of some text
+        * measure() - Measure the bounding box of some text
         *
-        * @dev:        Device to adjust
+        * @dev:        Console device to use
         * @name:       Font name to use (NULL to use default)
         * @size:       Font size to use (0 to use default)
         * @text:       Text to measure
         * @bbox:       Returns bounding box of text, assuming it is positioned
         *              at 0,0
+        * @lines:      If non-NULL, this must be an alist of
+        *              struct vidconsole_mline inited by caller. A separate
+        *              record is added for each line of text
+        *
         * Returns: 0 on success, -ENOENT if no such font
         */
        int (*measure)(struct udevice *dev, const char *name, uint size,
-                      const char *text, struct vidconsole_bbox *bbox);
+                      const char *text, struct vidconsole_bbox *bbox,
+                      struct alist *lines);
 
        /**
         * nominal() - Measure the expected width of a line of text
@@ -320,19 +339,24 @@ int vidconsole_get_font(struct udevice *dev, int seq,
  */
 int vidconsole_select_font(struct udevice *dev, const char *name, uint size);
 
-/*
- * vidconsole_measure() - Measuring the bounding box of some text
+/**
+ * vidconsole_measure() - Measure the bounding box of some text
  *
- * @dev: Console device to use
- * @name: Font name, NULL for default
- * @size: Font size, ignored if @name is NULL
- * @text: Text to measure
- * @bbox: Returns nounding box of text
- * Returns: 0 if OK, -ve on error
+ * @dev:       Device to adjust
+ * @name:      Font name to use (NULL to use default)
+ * @size:      Font size to use (0 to use default)
+ * @text:      Text to measure
+ * @bbox:      Returns bounding box of text, assuming it is positioned
+ *             at 0,0
+ * @lines:     If non-NULL, this must be an alist of
+ *             struct vidconsole_mline inited by caller. The list is emptied
+ *             and then a separate record is added for each line of text
+ *
+ * Returns: 0 on success, -ENOENT if no such font
  */
 int vidconsole_measure(struct udevice *dev, const char *name, uint size,
-                      const char *text, struct vidconsole_bbox *bbox);
-
+                      const char *text, struct vidconsole_bbox *bbox,
+                      struct alist *lines);
 /**
  * vidconsole_nominal() - Measure the expected width of a line of text
  *
diff --git a/test/dm/video.c b/test/dm/video.c
index 6ce1a756e25..cfc831b6931 100644
--- a/test/dm/video.c
+++ b/test/dm/video.c
@@ -788,6 +788,7 @@ static int dm_test_font_measure(struct unit_test_state *uts)
        struct vidconsole_bbox bbox;
        struct video_priv *priv;
        struct udevice *dev, *con;
+       struct alist lines;
 
        ut_assertok(uclass_get_device(UCLASS_VIDEO, 0, &dev));
        priv = dev_get_uclass_priv(dev);
@@ -797,11 +798,13 @@ static int dm_test_font_measure(struct unit_test_state 
*uts)
        /* this is using the Nimbus font with size of 18 pixels */
        ut_assertok(uclass_get_device(UCLASS_VIDEO_CONSOLE, 0, &con));
        vidconsole_position_cursor(con, 0, 0);
-       ut_assertok(vidconsole_measure(con, NULL, 0, test_string, &bbox));
+       ut_assertok(vidconsole_measure(con, NULL, 0, test_string, &bbox,
+                                      &lines));
        ut_asserteq(0, bbox.x0);
        ut_asserteq(0, bbox.y0);
        ut_asserteq(0x47a, bbox.x1);
        ut_asserteq(0x12, bbox.y1);
+       ut_asserteq(0, lines.count);
 
        return 0;
 }
-- 
2.43.0

Reply via email to