[PATCH 04/52] video: Begin support for measuring multiple lines of text
Simon Glass
sjg at chromium.org
Wed Mar 19 15:54:09 CET 2025
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 <sjg at 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
More information about the U-Boot
mailing list