mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-22 04:44:46 +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;
|
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)
|
int scene_calc_dims(struct scene *scn, bool do_menus)
|
||||||
{
|
{
|
||||||
struct scene_obj *obj;
|
struct scene_obj *obj;
|
||||||
|
@ -719,3 +738,29 @@ int scene_iter_objs(struct scene *scn, expo_scene_obj_iterator iter,
|
||||||
|
|
||||||
return 0;
|
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
|
#ifndef __SCENE_INTERNAL_H
|
||||||
#define __SCENE_INTERNAL_H
|
#define __SCENE_INTERNAL_H
|
||||||
|
|
||||||
|
struct vidconsole_bbox;
|
||||||
|
|
||||||
typedef int (*expo_scene_obj_iterator)(struct scene_obj *obj, void *priv);
|
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,
|
struct scene_menitem *scene_menuitem_find_seq(const struct scene_obj_menu *menu,
|
||||||
uint seq);
|
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 */
|
#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);
|
update_pointers(menu, item_id, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int scene_bbox_union(struct scene *scn, uint id, int inset,
|
void scene_menu_calc_bbox(struct scene_obj_menu *menu,
|
||||||
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 *bbox,
|
||||||
struct vidconsole_bbox *label_bbox)
|
struct vidconsole_bbox *label_bbox)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Reference in a new issue