]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
expo: Support setting the size and bounds of an object
authorSimon Glass <sjg@chromium.org>
Fri, 2 May 2025 14:46:35 +0000 (08:46 -0600)
committerSimon Glass <sjg@chromium.org>
Fri, 30 May 2025 08:49:32 +0000 (09:49 +0100)
Add a function to allow the size of an object to be set independently
of its position.

Also add a function to permit the object's bounding box to be set
independently of its dimensions.

Signed-off-by: Simon Glass <sjg@chromium.org>
boot/scene.c
include/expo.h
test/boot/expo.c

index f1dc2d819228298885ccc4c7b56d20057a2ace3d..ea329252d28ab884485e3e1859e55db537efaeef 100644 (file)
@@ -235,6 +235,35 @@ int scene_obj_set_size(struct scene *scn, uint id, int w, int h)
        return 0;
 }
 
+int scene_obj_set_width(struct scene *scn, uint id, int w)
+{
+       struct scene_obj *obj;
+
+       obj = scene_obj_find(scn, id, SCENEOBJT_NONE);
+       if (!obj)
+               return log_msg_ret("find", -ENOENT);
+       obj->bbox.x1 = obj->bbox.x0 + w;
+
+       return 0;
+}
+
+int scene_obj_set_bbox(struct scene *scn, uint id, int x0, int y0, int x1,
+                      int y1)
+{
+       struct scene_obj *obj;
+
+       obj = scene_obj_find(scn, id, SCENEOBJT_NONE);
+       if (!obj)
+               return log_msg_ret("find", -ENOENT);
+       obj->bbox.x0 = x0;
+       obj->bbox.y0 = y0;
+       obj->bbox.x1 = x1;
+       obj->bbox.y1 = y1;
+       obj->flags |= SCENEOF_SIZE_VALID;
+
+       return 0;
+}
+
 int scene_obj_set_hide(struct scene *scn, uint id, bool hide)
 {
        int ret;
index 6f0547a4b38beaff5cfd4ae6132d4765f710169a..990cb3094eeebb1f273121d32b5bd6c82f6899c4 100644 (file)
@@ -673,6 +673,30 @@ int scene_obj_set_pos(struct scene *scn, uint id, int x, int y);
  */
 int scene_obj_set_size(struct scene *scn, uint id, int w, int h);
 
+/**
+ * scene_obj_set_width() - Set the width of an object
+ *
+ * @scn: Scene to update
+ * @id: ID of object to update
+ * @w: width in pixels
+ * Returns: 0 if OK, -ENOENT if @id is invalid
+ */
+int scene_obj_set_width(struct scene *scn, uint id, int w);
+
+/**
+ * scene_obj_set_bbox() - Set the bounding box of an object
+ *
+ * @scn: Scene to update
+ * @id: ID of object to update
+ * @x0: x position, in pixels from left side
+ * @y0: y position, in pixels from top
+ * @x1: ending x position (right side)
+ * @y1: ending y position (botton side)
+ * Returns: 0 if OK, -ENOENT if @id is invalid
+ */
+int scene_obj_set_bbox(struct scene *scn, uint id, int x0, int y0, int x1,
+                      int y1);
+
 /**
  * scene_obj_set_hide() - Set whether an object is hidden
  *
index 94c13e9b71f52e112663aa7d2b3717640e4af887..2a430d3d482213d078856949a32a9b8c005169c1 100644 (file)
@@ -584,6 +584,17 @@ static int expo_render_image(struct unit_test_state *uts)
        ut_asserteq(50 + 160, obj->bbox.x1);
        ut_asserteq(400 + 160, obj->bbox.y1);
 
+       scene_obj_set_width(scn, OBJ_MENU, 170);
+       ut_asserteq(50 + 170, obj->bbox.x1);
+       scene_obj_set_bbox(scn, OBJ_MENU, 60, 410, 50 + 160, 400 + 160);
+       ut_asserteq(60, obj->bbox.x0);
+       ut_asserteq(410, obj->bbox.y0);
+       ut_asserteq(50 + 160, obj->bbox.x1);
+       ut_asserteq(400 + 160, obj->bbox.y1);
+
+       /* reset back to normal */
+       scene_obj_set_bbox(scn, OBJ_MENU, 50, 400, 50 + 160, 400 + 160);
+
        /* render it */
        expo_set_scene_id(exp, SCENE1);
        ut_assertok(expo_render(exp));