expo: Make calculation of an object bounding box generic

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>
This commit is contained in:
Simon Glass 2023-10-01 19:13:29 -06:00 committed by Tom Rini
parent 117617c7c1
commit 8bc69b4b24
3 changed files with 87 additions and 36 deletions

View 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;
}

View 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 */

View file

@ -114,40 +114,7 @@ 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,
void scene_menu_calc_bbox(struct scene_obj_menu *menu,
struct vidconsole_bbox *bbox,
struct vidconsole_bbox *label_bbox)
{