It is possible that positions, styling or even text have changed since
the scene was initially arranged, so recalculate the dimensions of all
objects before arranging the scene.

Signed-off-by: Simon Glass <s...@chromium.org>
---

 boot/scene.c     | 39 +++++++++++++++++++++++++++++++--------
 test/boot/expo.c |  1 -
 2 files changed, 31 insertions(+), 9 deletions(-)

diff --git a/boot/scene.c b/boot/scene.c
index 9c1eae3d52b..0d8599f955c 100644
--- a/boot/scene.c
+++ b/boot/scene.c
@@ -737,6 +737,31 @@ int scene_calc_arrange(struct scene *scn, struct 
expo_arrange_info *arr)
        return 0;
 }
 
+/**
+ * scene_set_default_bbox() - Set a default for each object's size
+ *
+ * If there is not already a size, use the dims property to set one
+ */
+static int scene_set_default_bbox(struct scene *scn)
+{
+       struct scene_obj *obj;
+
+       list_for_each_entry(obj, &scn->obj_head, sibling) {
+               switch (obj->type) {
+               case SCENEOBJT_IMAGE:
+               case SCENEOBJT_TEXT:
+                       if (!(obj->flags & SCENEOF_SIZE_VALID)) {
+                               scene_obj_set_size(scn, obj->id, obj->dims.x,
+                                                  obj->dims.y);
+                       }
+               default:
+                       break;
+               }
+       }
+
+       return 0;
+}
+
 int scene_arrange(struct scene *scn)
 {
        struct expo_arrange_info arr;
@@ -753,6 +778,12 @@ int scene_arrange(struct scene *scn)
                ysize = priv->ysize;
        }
 
+       ret = scene_calc_dims(scn);
+       if (ret)
+               return log_msg_ret("scd", ret);
+       ret = scene_set_default_bbox(scn);
+       if (ret)
+               return log_msg_ret("sce", ret);
        ret = scene_calc_arrange(scn, &arr);
        if (ret < 0)
                return log_msg_ret("arr", ret);
@@ -1032,14 +1063,6 @@ int scene_calc_dims(struct scene *scn)
                                                return log_msg_ret("get", ret);
                                        obj->dims.x = width;
                                        obj->dims.y = ret;
-                                       if (!(obj->flags & SCENEOF_SIZE_VALID)) 
{
-                                               obj->bbox.x1 = obj->bbox.x0 +
-                                                       width;
-                                               obj->bbox.y1 = obj->bbox.y0 +
-                                                       ret;
-                                               obj->flags |=
-                                                       SCENEOF_SIZE_VALID;
-                                       }
                                }
                                break;
                        }
diff --git a/test/boot/expo.c b/test/boot/expo.c
index bf18199caab..0289350df9c 100644
--- a/test/boot/expo.c
+++ b/test/boot/expo.c
@@ -588,7 +588,6 @@ static int expo_render_image(struct unit_test_state *uts)
        /* render without a scene */
        ut_asserteq(-ECHILD, expo_render(exp));
 
-       ut_assertok(expo_calc_dims(exp));
        ut_assertok(scene_arrange(scn));
 
        /* check dimensions of text */
-- 
2.43.0

Reply via email to