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