mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-17 02:15:02 +00:00
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:
parent
117617c7c1
commit
8bc69b4b24
3 changed files with 87 additions and 36 deletions
45
boot/scene.c
45
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;
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue