From: Simon Glass <simon.glass@canonical.com>
Add textedit support to scene_calc_dims() by calling
scene_txted_calc_dims(), thus enabling proper dimension-calculation for
textedit objects. This is needed for word-wrapping.
Update expo_render_textedit() with the new expected value, now that
word-wrapping is working.
Co-developed-by: Claude Opus 4.5 <noreply@anthropic.com>
Signed-off-by: Simon Glass <simon.glass@canonical.com>
---
boot/scene.c | 24 ++++++++++++++++--------
boot/scene_internal.h | 39 +++++++++++++++++++++++++--------------
test/boot/expo.c | 2 +-
3 files changed, 42 insertions(+), 23 deletions(-)
@@ -773,7 +773,6 @@ int scene_calc_arrange(struct scene *scn, struct expo_arrange_info *arr)
case SCENEOBJT_IMAGE:
case SCENEOBJT_TEXT:
case SCENEOBJT_BOX:
- case SCENEOBJT_TEXTEDIT:
break;
case SCENEOBJT_MENU: {
struct scene_obj_menu *menu;
@@ -782,14 +781,11 @@ int scene_calc_arrange(struct scene *scn, struct expo_arrange_info *arr)
label_id = menu->title_id;
break;
}
- case SCENEOBJT_TEXTLINE: {
- struct scene_obj_textline *tline;
-
- tline = (struct scene_obj_textline *)obj,
- label_id = tline->tin.label_id;
+ case SCENEOBJT_TEXTLINE:
+ case SCENEOBJT_TEXTEDIT:
+ label_id = scene_obj_txtin(obj)->label_id;
break;
}
- }
if (label_id) {
int ret;
@@ -1517,7 +1513,6 @@ int scene_calc_dims(struct scene *scn)
case SCENEOBJT_NONE:
case SCENEOBJT_TEXT:
case SCENEOBJT_BOX:
- case SCENEOBJT_TEXTEDIT:
case SCENEOBJT_IMAGE: {
int width;
@@ -1533,6 +1528,19 @@ int scene_calc_dims(struct scene *scn)
}
case SCENEOBJT_MENU:
break;
+ case SCENEOBJT_TEXTEDIT: {
+ struct scene_obj_txtedit *ted;
+
+ ted = (struct scene_obj_txtedit *)obj;
+ if (!scn->expo->cons || do_menus)
+ continue;
+
+ ret = scene_txted_calc_dims(ted, scn->expo->cons);
+ if (ret)
+ return log_msg_ret("ted", ret);
+
+ break;
+ }
case SCENEOBJT_TEXTLINE: {
struct scene_obj_textline *tline;
@@ -29,20 +29,6 @@ enum scene_obj_t;
typedef int (*expo_scene_obj_iterator)(struct scene_obj *obj, void *priv);
-/**
- * scene_obj_txtin() - Get text-input info from a scene object
- *
- * This works for both textline and textedit objects since they have
- * struct scene_txtin at the same offset (immediately after struct scene_obj).
- *
- * @obj: Object to get text-input info from
- * Return: pointer to the text-input info
- */
-static inline struct scene_txtin *scene_obj_txtin(struct scene_obj *obj)
-{
- return (struct scene_txtin *)(obj + 1);
-}
-
/**
* enum scene_bbox_t - Parts of an object which can have a bounding box
*
@@ -64,6 +50,20 @@ enum scene_bbox_t {
SCENEBB_count,
};
+/**
+ * scene_obj_txtin() - Get text-input info from a scene object
+ *
+ * This works for both textline and textedit objects since they have
+ * struct scene_txtin at the same offset (immediately after struct scene_obj).
+ *
+ * @obj: Object to get text-input info from
+ * Return: pointer to the text-input info
+ */
+static inline struct scene_txtin *scene_obj_txtin(struct scene_obj *obj)
+{
+ return (struct scene_txtin *)(obj + 1);
+}
+
/**
* expo_lookup_scene_id() - Look up a scene ID
*
@@ -501,6 +501,17 @@ int scene_dims_union(struct scene *scn, uint id, struct scene_obj_dims *dims);
int scene_textline_calc_dims(struct scene_obj_textline *tline,
struct udevice *cons);
+/**
+ * scene_txted_calc_dims() - Calculate the dimensions of a textedit
+ *
+ * Updates the width and height of the textedit based on its contents
+ *
+ * @ted: Textedit to update
+ * @cons: UCLASS_VIDEO_CONSOLE device (cannot be NULL)
+ * Returns 0 if OK, -ve on error
+ */
+int scene_txted_calc_dims(struct scene_obj_txtedit *ted, struct udevice *cons);
+
/**
* scene_menu_calc_bbox() - Calculate bounding boxes for the menu
*
@@ -1533,7 +1533,7 @@ static int expo_render_textedit(struct unit_test_state *uts)
expo_set_scene_id(exp, SCENE1);
ut_assertok(scene_arrange(scn));
ut_assertok(expo_render(exp));
- ut_asserteq(19493, video_compress_fb(uts, dev, false));
+ ut_asserteq(19860, video_compress_fb(uts, dev, false));
abuf_uninit(&buf);
abuf_uninit(&logo_copy);