We want to support this for any object, not just menus. Move the code
around to allow this.

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

 boot/scene.c          | 45 +++++++++++++++++++++++++++++++++++++++++++
 boot/scene_internal.h | 39 +++++++++++++++++++++++++++++++++++++
 boot/scene_menu.c     | 39 +++----------------------------------
 3 files changed, 87 insertions(+), 36 deletions(-)

diff --git a/boot/scene.c b/boot/scene.c
index 4d7cabd75f4..e98676b9387 100644
--- a/boot/scene.c
+++ b/boot/scene.c
@@ -608,6 +608,25 @@ int scene_send_key(struct scene *scn, int key, struct 
expo_action *event)
        return 0;
 }
 
+int scene_obj_calc_bbox(struct scene_obj *obj, struct vidconsole_bbox *bbox,
+                       struct vidconsole_bbox *label_bbox)
+{
+       switch (obj->type) {
+       case SCENEOBJT_NONE:
+       case SCENEOBJT_IMAGE:
+       case SCENEOBJT_TEXT:
+               return -ENOSYS;
+       case SCENEOBJT_MENU: {
+               struct scene_obj_menu *menu = (struct scene_obj_menu *)obj;
+
+               scene_menu_calc_bbox(menu, bbox, label_bbox);
+               break;
+       }
+       }
+
+       return 0;
+}
+
 int scene_calc_dims(struct scene *scn, bool do_menus)
 {
        struct scene_obj *obj;
@@ -719,3 +738,29 @@ int scene_iter_objs(struct scene *scn, 
expo_scene_obj_iterator iter,
 
        return 0;
 }
+
+int scene_bbox_union(struct scene *scn, uint id, int inset,
+                    struct vidconsole_bbox *bbox)
+{
+       struct scene_obj *obj;
+
+       if (!id)
+               return 0;
+       obj = scene_obj_find(scn, id, SCENEOBJT_NONE);
+       if (!obj)
+               return log_msg_ret("obj", -ENOENT);
+       if (bbox->valid) {
+               bbox->x0 = min(bbox->x0, obj->dim.x - inset);
+               bbox->y0 = min(bbox->y0, obj->dim.y);
+               bbox->x1 = max(bbox->x1, obj->dim.x + obj->dim.w + inset);
+               bbox->y1 = max(bbox->y1, obj->dim.y + obj->dim.h);
+       } else {
+               bbox->x0 = obj->dim.x - inset;
+               bbox->y0 = obj->dim.y;
+               bbox->x1 = obj->dim.x + obj->dim.w + inset;
+               bbox->y1 = obj->dim.y + obj->dim.h;
+               bbox->valid = true;
+       }
+
+       return 0;
+}
diff --git a/boot/scene_internal.h b/boot/scene_internal.h
index 42efcee092f..326508874e6 100644
--- a/boot/scene_internal.h
+++ b/boot/scene_internal.h
@@ -9,6 +9,8 @@
 #ifndef __SCENE_INTERNAL_H
 #define __SCENE_INTERNAL_H
 
+struct vidconsole_bbox;
+
 typedef int (*expo_scene_obj_iterator)(struct scene_obj *obj, void *priv);
 
 /**
@@ -246,4 +248,41 @@ struct scene_menitem *scene_menuitem_find(const struct 
scene_obj_menu *menu,
 struct scene_menitem *scene_menuitem_find_seq(const struct scene_obj_menu 
*menu,
                                              uint seq);
 
+/**
+ * scene_bbox_union() - update bouding box with the demensions of an object
+ *
+ * Updates @bbox so that it encompasses the bounding box of object @id
+ *
+ * @snd: Scene containing object
+ * @id: Object id
+ * @inset: Amount of inset to use for width
+ * @bbox: Bounding box to update
+ * Return: 0 if OK, -ve on error
+ */
+int scene_bbox_union(struct scene *scn, uint id, int inset,
+                    struct vidconsole_bbox *bbox);
+
+/**
+ * scene_menu_calc_bbox() - Calculate bounding boxes for the menu
+ *
+ * @menu: Menu to process
+ * @bbox: Returns bounding box of menu including prompts
+ * @label_bbox: Returns bounding box of labels
+ * Return: 0 if OK, -ve on error
+ */
+void scene_menu_calc_bbox(struct scene_obj_menu *menu,
+                         struct vidconsole_bbox *bbox,
+                         struct vidconsole_bbox *label_bbox);
+
+/**
+ * scene_obj_calc_bbox() - Calculate bounding boxes for an object
+ *
+ * @obj: Object to process
+ * @bbox: Returns bounding box of object including prompts
+ * @label_bbox: Returns bounding box of labels (active area)
+ * Return: 0 if OK, -ve on error
+ */
+int scene_obj_calc_bbox(struct scene_obj *obj, struct vidconsole_bbox *bbox,
+                       struct vidconsole_bbox *label_bbox);
+
 #endif /* __SCENE_INTERNAL_H */
diff --git a/boot/scene_menu.c b/boot/scene_menu.c
index e0dcd0a4e04..95c283af4b0 100644
--- a/boot/scene_menu.c
+++ b/boot/scene_menu.c
@@ -114,42 +114,9 @@ static void menu_point_to_item(struct scene_obj_menu 
*menu, uint item_id)
        update_pointers(menu, item_id, true);
 }
 
-static int scene_bbox_union(struct scene *scn, uint id, int inset,
-                           struct vidconsole_bbox *bbox)
-{
-       struct scene_obj *obj;
-
-       if (!id)
-               return 0;
-       obj = scene_obj_find(scn, id, SCENEOBJT_NONE);
-       if (!obj)
-               return log_msg_ret("obj", -ENOENT);
-       if (bbox->valid) {
-               bbox->x0 = min(bbox->x0, obj->dim.x - inset);
-               bbox->y0 = min(bbox->y0, obj->dim.y);
-               bbox->x1 = max(bbox->x1, obj->dim.x + obj->dim.w + inset);
-               bbox->y1 = max(bbox->y1, obj->dim.y + obj->dim.h);
-       } else {
-               bbox->x0 = obj->dim.x - inset;
-               bbox->y0 = obj->dim.y;
-               bbox->x1 = obj->dim.x + obj->dim.w + inset;
-               bbox->y1 = obj->dim.y + obj->dim.h;
-               bbox->valid = true;
-       }
-
-       return 0;
-}
-
-/**
- * scene_menu_calc_bbox() - Calculate bounding boxes for the menu
- *
- * @menu: Menu to process
- * @bbox: Returns bounding box of menu including prompts
- * @label_bbox: Returns bounding box of labels
- */
-static void scene_menu_calc_bbox(struct scene_obj_menu *menu,
-                                struct vidconsole_bbox *bbox,
-                                struct vidconsole_bbox *label_bbox)
+void scene_menu_calc_bbox(struct scene_obj_menu *menu,
+                         struct vidconsole_bbox *bbox,
+                         struct vidconsole_bbox *label_bbox)
 {
        const struct expo_theme *theme = &menu->obj.scene->expo->theme;
        const struct scene_menitem *item;
-- 
2.42.0.459.ge4e396fd5e-goog

Reply via email to