]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
expo: Make calculation of an object bounding box generic
authorSimon Glass <sjg@chromium.org>
Mon, 2 Oct 2023 01:13:29 +0000 (19:13 -0600)
committerTom Rini <trini@konsulko.com>
Wed, 11 Oct 2023 19:43:55 +0000 (15:43 -0400)
We want to support this for any object, not just menus. Move the code
around to allow this.

Signed-off-by: Simon Glass <sjg@chromium.org>
boot/scene.c
boot/scene_internal.h
boot/scene_menu.c

index 4d7cabd75f4fbd5832809b6e8db494e683b333f7..e98676b9387a4d7b58a74b4a7db698350817a578 100644 (file)
@@ -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;
+}
index 42efcee092f3c9abacc789bf9550cf63983f0cc7..326508874e6ace30a6f8536eb932a0ff1f588075 100644 (file)
@@ -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 */
index e0dcd0a4e041c0f8a8160b2f75db6eb22445dde9..95c283af4b08b60930befaaa2997e34c9b0b26f3 100644 (file)
@@ -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;