[PATCH 27/40] expo: Calculate text bounding-box correctly

Simon Glass sjg at chromium.org
Thu Jun 1 18:22:51 CEST 2023


Rather than estimating, measure the text accurately, using the new
vidconsole feature. This allows accurate placement of objects.

Signed-off-by: Simon Glass <sjg at chromium.org>
---

 boot/scene.c | 30 ++++++++++++++++++++++--------
 1 file changed, 22 insertions(+), 8 deletions(-)

diff --git a/boot/scene.c b/boot/scene.c
index dd1472d4f9aa..981a18b3ba1c 100644
--- a/boot/scene.c
+++ b/boot/scene.c
@@ -257,16 +257,30 @@ int scene_obj_get_hw(struct scene *scn, uint id, int *widthp)
 	case SCENEOBJT_TEXT: {
 		struct scene_obj_txt *txt = (struct scene_obj_txt *)obj;
 		struct expo *exp = scn->expo;
+		struct vidconsole_bbox bbox;
+		const char *str;
+		int len, ret;
 
+		str = expo_get_str(exp, txt->str_id);
+		if (!str)
+			return log_msg_ret("str", -ENOENT);
+		len = strlen(str);
+
+		/* if there is no console, make it up */
+		if (!exp->cons) {
+			if (widthp)
+				*widthp = 8 * len;
+			return 16;
+		}
+
+		ret = vidconsole_measure(scn->expo->cons, txt->font_name,
+					 txt->font_size, str, &bbox);
+		if (ret)
+			return log_msg_ret("mea", ret);
 		if (widthp)
-			*widthp = 16; /* fake value for now */
-		if (txt->font_size)
-			return txt->font_size;
-		if (exp->display)
-			return video_default_font_height(exp->display);
-
-		/* use a sensible default */
-		return 16;
+			*widthp = bbox.x1;
+
+		return bbox.y1;
 	}
 	}
 
-- 
2.41.0.rc0.172.g3f132b7071-goog



More information about the U-Boot mailing list