[PATCH 25/40] expo: Add width and height to objects

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


At present objects only have a position so it is not possible to determine
the amount of space they take up on the display.

Add width and height properties, using a struct to keep all the dimensions
together.

For now this is not used. Future work will set up these new properties.

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

 boot/scene.c      |  8 ++++----
 boot/scene_menu.c | 12 ++++++------
 include/expo.h    | 21 +++++++++++++++++----
 test/boot/expo.c  | 32 ++++++++++++++++----------------
 4 files changed, 43 insertions(+), 30 deletions(-)

diff --git a/boot/scene.c b/boot/scene.c
index 2ac9bfcdbd52..8033d77fb266 100644
--- a/boot/scene.c
+++ b/boot/scene.c
@@ -201,8 +201,8 @@ int scene_obj_set_pos(struct scene *scn, uint id, int x, int y)
 	obj = scene_obj_find(scn, id, SCENEOBJT_NONE);
 	if (!obj)
 		return log_msg_ret("find", -ENOENT);
-	obj->x = x;
-	obj->y = y;
+	obj->dim.x = x;
+	obj->dim.y = y;
 
 	return 0;
 }
@@ -272,8 +272,8 @@ static int scene_obj_render(struct scene_obj *obj, bool text_mode)
 	struct udevice *cons = text_mode ? NULL : exp->cons;
 	int x, y, ret;
 
-	x = obj->x;
-	y = obj->y;
+	x = obj->dim.x;
+	y = obj->dim.y;
 
 	switch (obj->type) {
 	case SCENEOBJT_NONE:
diff --git a/boot/scene_menu.c b/boot/scene_menu.c
index 8b04d4403139..eed7565f6a61 100644
--- a/boot/scene_menu.c
+++ b/boot/scene_menu.c
@@ -49,9 +49,9 @@ int scene_menu_arrange(struct scene *scn, struct scene_obj_menu *menu)
 	int y, cur_y;
 	int ret;
 
-	y = menu->obj.y;
+	y = menu->obj.dim.y;
 	if (menu->title_id) {
-		ret = scene_obj_set_pos(scn, menu->title_id, menu->obj.x, y);
+		ret = scene_obj_set_pos(scn, menu->title_id, menu->obj.dim.x, y);
 		if (ret < 0)
 			return log_msg_ret("tit", ret);
 
@@ -89,18 +89,18 @@ int scene_menu_arrange(struct scene *scn, struct scene_obj_menu *menu)
 		 * pointer, then the key and the description
 		 */
 		if (item->label_id) {
-			ret = scene_obj_set_pos(scn, item->label_id, menu->obj.x,
+			ret = scene_obj_set_pos(scn, item->label_id, menu->obj.dim.x,
 						y);
 			if (ret < 0)
 				return log_msg_ret("nam", ret);
 		}
 
-		ret = scene_obj_set_pos(scn, item->key_id, menu->obj.x + 230,
+		ret = scene_obj_set_pos(scn, item->key_id, menu->obj.dim.x + 230,
 					y);
 		if (ret < 0)
 			return log_msg_ret("key", ret);
 
-		ret = scene_obj_set_pos(scn, item->desc_id, menu->obj.x + 280,
+		ret = scene_obj_set_pos(scn, item->desc_id, menu->obj.dim.x + 280,
 					y);
 		if (ret < 0)
 			return log_msg_ret("des", ret);
@@ -134,7 +134,7 @@ int scene_menu_arrange(struct scene *scn, struct scene_obj_menu *menu)
 		 * points to
 		 */
 		ret = scene_obj_set_pos(scn, menu->pointer_id,
-					menu->obj.x + 200, cur_y);
+					menu->obj.dim.x + 200, cur_y);
 		if (ret < 0)
 			return log_msg_ret("ptr", ret);
 	}
diff --git a/include/expo.h b/include/expo.h
index b8f5327f2664..5135954ba139 100644
--- a/include/expo.h
+++ b/include/expo.h
@@ -122,6 +122,21 @@ enum scene_obj_t {
 	SCENEOBJT_MENU,
 };
 
+/**
+ * struct scene_dim - Dimensions of an object
+ *
+ * @x: x position, in pixels from left side
+ * @y: y position, in pixels from top
+ * @w: width, in pixels
+ * @h: height, in pixels
+ */
+struct scene_dim {
+	int x;
+	int y;
+	int w;
+	int h;
+};
+
 /**
  * struct scene_obj - information about an object in a scene
  *
@@ -129,8 +144,7 @@ enum scene_obj_t {
  * @name: Name of the object (allocated)
  * @id: ID number of the object
  * @type: Type of this object
- * @x: x position, in pixels from left side
- * @y: y position, in pixels from top
+ * @dim: Dimensions for this object
  * @hide: true if the object should be hidden
  * @sibling: Node to link this object to its siblings
  */
@@ -139,8 +153,7 @@ struct scene_obj {
 	char *name;
 	uint id;
 	enum scene_obj_t type;
-	int x;
-	int y;
+	struct scene_dim dim;
 	bool hide;
 	struct list_head sibling;
 };
diff --git a/test/boot/expo.c b/test/boot/expo.c
index 70750d307ffa..10cb7b246f3f 100644
--- a/test/boot/expo.c
+++ b/test/boot/expo.c
@@ -250,8 +250,8 @@ static int expo_object_attr(struct unit_test_state *uts)
 	ut_assert(id > 0);
 
 	ut_assertok(scene_obj_set_pos(scn, OBJ_LOGO, 123, 456));
-	ut_asserteq(123, img->obj.x);
-	ut_asserteq(456, img->obj.y);
+	ut_asserteq(123, img->obj.dim.x);
+	ut_asserteq(456, img->obj.dim.y);
 
 	ut_asserteq(-ENOENT, scene_obj_set_pos(scn, OBJ_TEXT2, 0, 0));
 
@@ -307,8 +307,8 @@ static int expo_object_menu(struct unit_test_state *uts)
 	ut_asserteq(0, menu->pointer_id);
 
 	ut_assertok(scene_obj_set_pos(scn, OBJ_MENU, 50, 400));
-	ut_asserteq(50, menu->obj.x);
-	ut_asserteq(400, menu->obj.y);
+	ut_asserteq(50, menu->obj.dim.x);
+	ut_asserteq(400, menu->obj.dim.y);
 
 	id = scene_txt_str(scn, "title", OBJ_MENU_TITLE, STR_MENU_TITLE,
 			   "Main Menu", &tit);
@@ -354,24 +354,24 @@ static int expo_object_menu(struct unit_test_state *uts)
 	ut_asserteq(id, menu->cur_item_id);
 
 	/* the title should be at the top */
-	ut_asserteq(menu->obj.x, tit->obj.x);
-	ut_asserteq(menu->obj.y, tit->obj.y);
+	ut_asserteq(menu->obj.dim.x, tit->obj.dim.x);
+	ut_asserteq(menu->obj.dim.y, tit->obj.dim.y);
 
 	/* the first item should be next */
-	ut_asserteq(menu->obj.x, name1->obj.x);
-	ut_asserteq(menu->obj.y + 32, name1->obj.y);
+	ut_asserteq(menu->obj.dim.x, name1->obj.dim.x);
+	ut_asserteq(menu->obj.dim.y + 32, name1->obj.dim.y);
 
-	ut_asserteq(menu->obj.x + 230, key1->obj.x);
-	ut_asserteq(menu->obj.y + 32, key1->obj.y);
+	ut_asserteq(menu->obj.dim.x + 230, key1->obj.dim.x);
+	ut_asserteq(menu->obj.dim.y + 32, key1->obj.dim.y);
 
-	ut_asserteq(menu->obj.x + 200, ptr->obj.x);
-	ut_asserteq(menu->obj.y + 32, ptr->obj.y);
+	ut_asserteq(menu->obj.dim.x + 200, ptr->obj.dim.x);
+	ut_asserteq(menu->obj.dim.y + 32, ptr->obj.dim.y);
 
-	ut_asserteq(menu->obj.x + 280, desc1->obj.x);
-	ut_asserteq(menu->obj.y + 32, desc1->obj.y);
+	ut_asserteq(menu->obj.dim.x + 280, desc1->obj.dim.x);
+	ut_asserteq(menu->obj.dim.y + 32, desc1->obj.dim.y);
 
-	ut_asserteq(-4, prev1->obj.x);
-	ut_asserteq(menu->obj.y + 32, prev1->obj.y);
+	ut_asserteq(-4, prev1->obj.dim.x);
+	ut_asserteq(menu->obj.dim.y + 32, prev1->obj.dim.y);
 	ut_asserteq(false, prev1->obj.hide);
 
 	expo_destroy(exp);
-- 
2.41.0.rc0.172.g3f132b7071-goog



More information about the U-Boot mailing list