mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2026-06-02 09:46:37 +03:00
expo: Rename scene_dim to scene_obj_bbox
At present we assume that each object is a simple box and that it fills the whole box. This is quite limiting for text objects, which we may want to centre within the box. We need a position within the box where drawing starts. Rename the scene_dim struct to indicate that it is a bounding box. Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
36
boot/scene.c
36
boot/scene.c
@@ -210,8 +210,8 @@ int scene_obj_set_pos(struct scene *scn, uint id, int x, int y)
|
||||
obj = scene_obj_find(scn, id, SCENEOBJT_NONE);
|
||||
if (!obj)
|
||||
return log_msg_ret("find", -ENOENT);
|
||||
obj->dim.x = x;
|
||||
obj->dim.y = y;
|
||||
obj->bbox.x = x;
|
||||
obj->bbox.y = y;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -223,8 +223,8 @@ int scene_obj_set_size(struct scene *scn, uint id, int w, int h)
|
||||
obj = scene_obj_find(scn, id, SCENEOBJT_NONE);
|
||||
if (!obj)
|
||||
return log_msg_ret("find", -ENOENT);
|
||||
obj->dim.w = w;
|
||||
obj->dim.h = h;
|
||||
obj->bbox.w = w;
|
||||
obj->bbox.h = h;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -368,8 +368,8 @@ static int scene_obj_render(struct scene_obj *obj, bool text_mode)
|
||||
struct udevice *cons = text_mode ? NULL : exp->cons;
|
||||
int x, y, ret;
|
||||
|
||||
x = obj->dim.x;
|
||||
y = obj->dim.y;
|
||||
x = obj->bbox.x;
|
||||
y = obj->bbox.y;
|
||||
|
||||
switch (obj->type) {
|
||||
case SCENEOBJT_NONE:
|
||||
@@ -419,8 +419,8 @@ static int scene_obj_render(struct scene_obj *obj, bool text_mode)
|
||||
if (obj->flags & SCENEOF_POINT) {
|
||||
vidconsole_push_colour(cons, fore, back, &old);
|
||||
video_fill_part(dev, x - theme->menu_inset, y,
|
||||
x + obj->dim.w,
|
||||
y + obj->dim.h,
|
||||
x + obj->bbox.w,
|
||||
y + obj->bbox.h,
|
||||
vid_priv->colour_bg);
|
||||
}
|
||||
vidconsole_set_cursor_pos(cons, x, y);
|
||||
@@ -765,8 +765,8 @@ int scene_calc_dims(struct scene *scn, bool do_menus)
|
||||
ret = scene_obj_get_hw(scn, obj->id, &width);
|
||||
if (ret < 0)
|
||||
return log_msg_ret("get", ret);
|
||||
obj->dim.w = width;
|
||||
obj->dim.h = ret;
|
||||
obj->bbox.w = width;
|
||||
obj->bbox.h = ret;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -915,15 +915,15 @@ int scene_bbox_union(struct scene *scn, uint id, int inset,
|
||||
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);
|
||||
bbox->x0 = min(bbox->x0, obj->bbox.x - inset);
|
||||
bbox->y0 = min(bbox->y0, obj->bbox.y);
|
||||
bbox->x1 = max(bbox->x1, obj->bbox.x + obj->bbox.w + inset);
|
||||
bbox->y1 = max(bbox->y1, obj->bbox.y + obj->bbox.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->x0 = obj->bbox.x - inset;
|
||||
bbox->y0 = obj->bbox.y;
|
||||
bbox->x1 = obj->bbox.x + obj->bbox.w + inset;
|
||||
bbox->y1 = obj->bbox.y + obj->bbox.h;
|
||||
bbox->valid = true;
|
||||
}
|
||||
|
||||
|
||||
@@ -102,7 +102,7 @@ static int update_pointers(struct scene_obj_menu *menu, uint id, bool point)
|
||||
label = scene_obj_find(scn, item->label_id, SCENEOBJT_NONE);
|
||||
|
||||
ret = scene_obj_set_pos(scn, menu->pointer_id,
|
||||
menu->obj.dim.x + 200, label->dim.y);
|
||||
menu->obj.bbox.x + 200, label->bbox.y);
|
||||
if (ret < 0)
|
||||
return log_msg_ret("ptr", ret);
|
||||
}
|
||||
@@ -186,8 +186,8 @@ int scene_menu_calc_dims(struct scene_obj_menu *menu)
|
||||
}
|
||||
|
||||
if (bbox.valid) {
|
||||
menu->obj.dim.w = bbox.x1 - bbox.x0;
|
||||
menu->obj.dim.h = bbox.y1 - bbox.y0;
|
||||
menu->obj.bbox.w = bbox.x1 - bbox.x0;
|
||||
menu->obj.bbox.h = bbox.y1 - bbox.y0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -205,12 +205,12 @@ int scene_menu_arrange(struct scene *scn, struct expo_arrange_info *arr,
|
||||
int x, y;
|
||||
int ret;
|
||||
|
||||
x = menu->obj.dim.x;
|
||||
y = menu->obj.dim.y;
|
||||
x = menu->obj.bbox.x;
|
||||
y = menu->obj.bbox.y;
|
||||
if (menu->title_id) {
|
||||
int width;
|
||||
|
||||
ret = scene_obj_set_pos(scn, menu->title_id, menu->obj.dim.x, y);
|
||||
ret = scene_obj_set_pos(scn, menu->title_id, menu->obj.bbox.x, y);
|
||||
if (ret < 0)
|
||||
return log_msg_ret("tit", ret);
|
||||
|
||||
|
||||
@@ -76,11 +76,11 @@ int scene_textline_calc_dims(struct scene_obj_textline *tline)
|
||||
return log_msg_ret("nom", ret);
|
||||
|
||||
if (bbox.valid) {
|
||||
tline->obj.dim.w = bbox.x1 - bbox.x0;
|
||||
tline->obj.dim.h = bbox.y1 - bbox.y0;
|
||||
tline->obj.bbox.w = bbox.x1 - bbox.x0;
|
||||
tline->obj.bbox.h = bbox.y1 - bbox.y0;
|
||||
|
||||
scene_obj_set_size(scn, tline->edit_id, tline->obj.dim.w,
|
||||
tline->obj.dim.h);
|
||||
scene_obj_set_size(scn, tline->edit_id, tline->obj.bbox.w,
|
||||
tline->obj.bbox.h);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -94,16 +94,16 @@ int scene_textline_arrange(struct scene *scn, struct expo_arrange_info *arr,
|
||||
int x, y;
|
||||
int ret;
|
||||
|
||||
x = tline->obj.dim.x;
|
||||
y = tline->obj.dim.y;
|
||||
x = tline->obj.bbox.x;
|
||||
y = tline->obj.bbox.y;
|
||||
if (tline->label_id) {
|
||||
ret = scene_obj_set_pos(scn, tline->label_id, tline->obj.dim.x,
|
||||
ret = scene_obj_set_pos(scn, tline->label_id, tline->obj.bbox.x,
|
||||
y);
|
||||
if (ret < 0)
|
||||
return log_msg_ret("tit", ret);
|
||||
|
||||
ret = scene_obj_set_pos(scn, tline->edit_id,
|
||||
tline->obj.dim.x + 200, y);
|
||||
tline->obj.bbox.x + 200, y);
|
||||
if (ret < 0)
|
||||
return log_msg_ret("tit", ret);
|
||||
|
||||
@@ -197,8 +197,8 @@ int scene_textline_render_deps(struct scene *scn,
|
||||
if (ret)
|
||||
return log_msg_ret("sav", ret);
|
||||
|
||||
vidconsole_set_cursor_visible(cons, true, txt->obj.dim.x,
|
||||
txt->obj.dim.y, scn->cls.num);
|
||||
vidconsole_set_cursor_visible(cons, true, txt->obj.bbox.x,
|
||||
txt->obj.bbox.y, scn->cls.num);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -219,7 +219,7 @@ int scene_textline_open(struct scene *scn, struct scene_obj_textline *tline)
|
||||
if (!txt)
|
||||
return log_msg_ret("cur", -ENOENT);
|
||||
|
||||
vidconsole_set_cursor_pos(cons, txt->obj.dim.x, txt->obj.dim.y);
|
||||
vidconsole_set_cursor_pos(cons, txt->obj.bbox.x, txt->obj.bbox.y);
|
||||
vidconsole_entry_start(cons);
|
||||
cli_cread_init(&scn->cls, abuf_data(&tline->buf), tline->max_chars);
|
||||
scn->cls.insert = true;
|
||||
|
||||
@@ -192,14 +192,14 @@ enum scene_obj_t {
|
||||
};
|
||||
|
||||
/**
|
||||
* struct scene_dim - Dimensions of an object
|
||||
* struct scene_obj_bbox - Dimensions of an object
|
||||
*
|
||||
* @x: x position, in pixels from left side
|
||||
* @y: y position, in pixels from top
|
||||
* @w: width, in pixels
|
||||
* @h: height, in pixels
|
||||
*/
|
||||
struct scene_dim {
|
||||
struct scene_obj_bbox {
|
||||
int x;
|
||||
int y;
|
||||
int w;
|
||||
@@ -232,7 +232,7 @@ enum {
|
||||
* @name: Name of the object (allocated)
|
||||
* @id: ID number of the object
|
||||
* @type: Type of this object
|
||||
* @dim: Dimensions for this object
|
||||
* @bbox: Dimensions for this object
|
||||
* @flags: Flags for this object
|
||||
* @bit_length: Number of bits used for this object in CMOS RAM
|
||||
* @start_bit: Start bit to use for this object in CMOS RAM
|
||||
@@ -243,7 +243,7 @@ struct scene_obj {
|
||||
char *name;
|
||||
uint id;
|
||||
enum scene_obj_t type;
|
||||
struct scene_dim dim;
|
||||
struct scene_obj_bbox bbox;
|
||||
u8 flags;
|
||||
u8 bit_length;
|
||||
u16 start_bit;
|
||||
|
||||
@@ -270,8 +270,8 @@ static int expo_object_attr(struct unit_test_state *uts)
|
||||
ut_assert(id > 0);
|
||||
|
||||
ut_assertok(scene_obj_set_pos(scn, OBJ_LOGO, 123, 456));
|
||||
ut_asserteq(123, img->obj.dim.x);
|
||||
ut_asserteq(456, img->obj.dim.y);
|
||||
ut_asserteq(123, img->obj.bbox.x);
|
||||
ut_asserteq(456, img->obj.bbox.y);
|
||||
|
||||
ut_asserteq(-ENOENT, scene_obj_set_pos(scn, OBJ_TEXT2, 0, 0));
|
||||
|
||||
@@ -360,8 +360,8 @@ static int expo_object_menu(struct unit_test_state *uts)
|
||||
ut_asserteq(0, menu->pointer_id);
|
||||
|
||||
ut_assertok(scene_obj_set_pos(scn, OBJ_MENU, 50, 400));
|
||||
ut_asserteq(50, menu->obj.dim.x);
|
||||
ut_asserteq(400, menu->obj.dim.y);
|
||||
ut_asserteq(50, menu->obj.bbox.x);
|
||||
ut_asserteq(400, menu->obj.bbox.y);
|
||||
|
||||
id = scene_txt_str(scn, "title", OBJ_MENU_TITLE, STR_MENU_TITLE,
|
||||
"Main Menu", &tit);
|
||||
@@ -407,24 +407,24 @@ static int expo_object_menu(struct unit_test_state *uts)
|
||||
ut_asserteq(id, menu->cur_item_id);
|
||||
|
||||
/* the title should be at the top */
|
||||
ut_asserteq(menu->obj.dim.x, tit->obj.dim.x);
|
||||
ut_asserteq(menu->obj.dim.y, tit->obj.dim.y);
|
||||
ut_asserteq(menu->obj.bbox.x, tit->obj.bbox.x);
|
||||
ut_asserteq(menu->obj.bbox.y, tit->obj.bbox.y);
|
||||
|
||||
/* the first item should be next */
|
||||
ut_asserteq(menu->obj.dim.x, name1->obj.dim.x);
|
||||
ut_asserteq(menu->obj.dim.y + 32, name1->obj.dim.y);
|
||||
ut_asserteq(menu->obj.bbox.x, name1->obj.bbox.x);
|
||||
ut_asserteq(menu->obj.bbox.y + 32, name1->obj.bbox.y);
|
||||
|
||||
ut_asserteq(menu->obj.dim.x + 230, key1->obj.dim.x);
|
||||
ut_asserteq(menu->obj.dim.y + 32, key1->obj.dim.y);
|
||||
ut_asserteq(menu->obj.bbox.x + 230, key1->obj.bbox.x);
|
||||
ut_asserteq(menu->obj.bbox.y + 32, key1->obj.bbox.y);
|
||||
|
||||
ut_asserteq(menu->obj.dim.x + 200, ptr->obj.dim.x);
|
||||
ut_asserteq(menu->obj.dim.y + 32, ptr->obj.dim.y);
|
||||
ut_asserteq(menu->obj.bbox.x + 200, ptr->obj.bbox.x);
|
||||
ut_asserteq(menu->obj.bbox.y + 32, ptr->obj.bbox.y);
|
||||
|
||||
ut_asserteq(menu->obj.dim.x + 280, desc1->obj.dim.x);
|
||||
ut_asserteq(menu->obj.dim.y + 32, desc1->obj.dim.y);
|
||||
ut_asserteq(menu->obj.bbox.x + 280, desc1->obj.bbox.x);
|
||||
ut_asserteq(menu->obj.bbox.y + 32, desc1->obj.bbox.y);
|
||||
|
||||
ut_asserteq(-4, prev1->obj.dim.x);
|
||||
ut_asserteq(menu->obj.dim.y + 32, prev1->obj.dim.y);
|
||||
ut_asserteq(-4, prev1->obj.bbox.x);
|
||||
ut_asserteq(menu->obj.bbox.y + 32, prev1->obj.bbox.y);
|
||||
ut_asserteq(true, prev1->obj.flags & SCENEOF_HIDE);
|
||||
|
||||
/* check iterating through scene items */
|
||||
@@ -548,41 +548,41 @@ static int expo_render_image(struct unit_test_state *uts)
|
||||
/* check dimensions of text */
|
||||
obj = scene_obj_find(scn, OBJ_TEXT, SCENEOBJT_NONE);
|
||||
ut_assertnonnull(obj);
|
||||
ut_asserteq(400, obj->dim.x);
|
||||
ut_asserteq(100, obj->dim.y);
|
||||
ut_asserteq(126, obj->dim.w);
|
||||
ut_asserteq(40, obj->dim.h);
|
||||
ut_asserteq(400, obj->bbox.x);
|
||||
ut_asserteq(100, obj->bbox.y);
|
||||
ut_asserteq(126, obj->bbox.w);
|
||||
ut_asserteq(40, obj->bbox.h);
|
||||
|
||||
/* check dimensions of image */
|
||||
obj = scene_obj_find(scn, OBJ_LOGO, SCENEOBJT_NONE);
|
||||
ut_assertnonnull(obj);
|
||||
ut_asserteq(50, obj->dim.x);
|
||||
ut_asserteq(20, obj->dim.y);
|
||||
ut_asserteq(160, obj->dim.w);
|
||||
ut_asserteq(160, obj->dim.h);
|
||||
ut_asserteq(50, obj->bbox.x);
|
||||
ut_asserteq(20, obj->bbox.y);
|
||||
ut_asserteq(160, obj->bbox.w);
|
||||
ut_asserteq(160, obj->bbox.h);
|
||||
|
||||
/* check dimensions of menu labels - both should be the same width */
|
||||
obj = scene_obj_find(scn, ITEM1_LABEL, SCENEOBJT_NONE);
|
||||
ut_assertnonnull(obj);
|
||||
ut_asserteq(50, obj->dim.x);
|
||||
ut_asserteq(436, obj->dim.y);
|
||||
ut_asserteq(29, obj->dim.w);
|
||||
ut_asserteq(18, obj->dim.h);
|
||||
ut_asserteq(50, obj->bbox.x);
|
||||
ut_asserteq(436, obj->bbox.y);
|
||||
ut_asserteq(29, obj->bbox.w);
|
||||
ut_asserteq(18, obj->bbox.h);
|
||||
|
||||
obj = scene_obj_find(scn, ITEM2_LABEL, SCENEOBJT_NONE);
|
||||
ut_assertnonnull(obj);
|
||||
ut_asserteq(50, obj->dim.x);
|
||||
ut_asserteq(454, obj->dim.y);
|
||||
ut_asserteq(29, obj->dim.w);
|
||||
ut_asserteq(18, obj->dim.h);
|
||||
ut_asserteq(50, obj->bbox.x);
|
||||
ut_asserteq(454, obj->bbox.y);
|
||||
ut_asserteq(29, obj->bbox.w);
|
||||
ut_asserteq(18, obj->bbox.h);
|
||||
|
||||
/* check dimensions of menu */
|
||||
obj = scene_obj_find(scn, OBJ_MENU, SCENEOBJT_NONE);
|
||||
ut_assertnonnull(obj);
|
||||
ut_asserteq(50, obj->dim.x);
|
||||
ut_asserteq(400, obj->dim.y);
|
||||
ut_asserteq(160, obj->dim.w);
|
||||
ut_asserteq(160, obj->dim.h);
|
||||
ut_asserteq(50, obj->bbox.x);
|
||||
ut_asserteq(400, obj->bbox.y);
|
||||
ut_asserteq(160, obj->bbox.w);
|
||||
ut_asserteq(160, obj->bbox.h);
|
||||
|
||||
/* render it */
|
||||
expo_set_scene_id(exp, SCENE1);
|
||||
|
||||
Reference in New Issue
Block a user