mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2026-06-02 09:46:37 +03:00
expo: Implement a box
It is useful to be able to draw a box around elements in the menu. Add support for an unfilled box with a selectable thickness. Note that there is no support for selecting the colour for any expo objects yet. Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
@@ -81,6 +81,7 @@ int cedit_arange(struct expo *exp, struct video_priv *vpriv, uint scene_id)
|
||||
case SCENEOBJT_NONE:
|
||||
case SCENEOBJT_IMAGE:
|
||||
case SCENEOBJT_TEXT:
|
||||
case SCENEOBJT_BOX:
|
||||
break;
|
||||
case SCENEOBJT_MENU:
|
||||
scene_obj_set_pos(scn, obj->id, 50, y);
|
||||
@@ -381,6 +382,7 @@ static int h_write_settings(struct scene_obj *obj, void *vpriv)
|
||||
case SCENEOBJT_NONE:
|
||||
case SCENEOBJT_IMAGE:
|
||||
case SCENEOBJT_TEXT:
|
||||
case SCENEOBJT_BOX:
|
||||
break;
|
||||
case SCENEOBJT_TEXTLINE: {
|
||||
const struct scene_obj_textline *tline;
|
||||
@@ -480,6 +482,7 @@ static int h_read_settings(struct scene_obj *obj, void *vpriv)
|
||||
case SCENEOBJT_NONE:
|
||||
case SCENEOBJT_IMAGE:
|
||||
case SCENEOBJT_TEXT:
|
||||
case SCENEOBJT_BOX:
|
||||
break;
|
||||
case SCENEOBJT_TEXTLINE: {
|
||||
const struct scene_obj_textline *tline;
|
||||
@@ -551,6 +554,7 @@ static int h_write_settings_env(struct scene_obj *obj, void *vpriv)
|
||||
case SCENEOBJT_NONE:
|
||||
case SCENEOBJT_IMAGE:
|
||||
case SCENEOBJT_TEXT:
|
||||
case SCENEOBJT_BOX:
|
||||
break;
|
||||
case SCENEOBJT_MENU:
|
||||
menu = (struct scene_obj_menu *)obj;
|
||||
@@ -634,6 +638,7 @@ static int h_read_settings_env(struct scene_obj *obj, void *vpriv)
|
||||
case SCENEOBJT_NONE:
|
||||
case SCENEOBJT_IMAGE:
|
||||
case SCENEOBJT_TEXT:
|
||||
case SCENEOBJT_BOX:
|
||||
break;
|
||||
case SCENEOBJT_MENU:
|
||||
menu = (struct scene_obj_menu *)obj;
|
||||
|
||||
40
boot/scene.c
40
boot/scene.c
@@ -211,6 +211,26 @@ int scene_txt_str(struct scene *scn, const char *name, uint id, uint str_id,
|
||||
return txt->obj.id;
|
||||
}
|
||||
|
||||
int scene_box(struct scene *scn, const char *name, uint id, uint width,
|
||||
struct scene_obj_box **boxp)
|
||||
{
|
||||
struct scene_obj_box *box;
|
||||
int ret;
|
||||
|
||||
ret = scene_obj_add(scn, name, id, SCENEOBJT_BOX,
|
||||
sizeof(struct scene_obj_box),
|
||||
(struct scene_obj **)&box);
|
||||
if (ret < 0)
|
||||
return log_msg_ret("obj", ret);
|
||||
|
||||
box->width = width;
|
||||
|
||||
if (boxp)
|
||||
*boxp = box;
|
||||
|
||||
return box->obj.id;
|
||||
}
|
||||
|
||||
int scene_txt_set_font(struct scene *scn, uint id, const char *font_name,
|
||||
uint font_size)
|
||||
{
|
||||
@@ -323,6 +343,7 @@ int scene_obj_get_hw(struct scene *scn, uint id, int *widthp)
|
||||
case SCENEOBJT_NONE:
|
||||
case SCENEOBJT_MENU:
|
||||
case SCENEOBJT_TEXTLINE:
|
||||
case SCENEOBJT_BOX:
|
||||
break;
|
||||
case SCENEOBJT_IMAGE: {
|
||||
struct scene_obj_img *img = (struct scene_obj_img *)obj;
|
||||
@@ -490,10 +511,12 @@ static int scene_obj_render(struct scene_obj *obj, bool text_mode)
|
||||
const struct expo_theme *theme = &exp->theme;
|
||||
struct udevice *dev = exp->display;
|
||||
struct udevice *cons = text_mode ? NULL : exp->cons;
|
||||
struct video_priv *vid_priv;
|
||||
int x, y, ret;
|
||||
|
||||
x = obj->bbox.x0;
|
||||
y = obj->bbox.y0;
|
||||
x = obj->bbox.x0;
|
||||
vid_priv = dev_get_uclass_priv(dev);
|
||||
|
||||
switch (obj->type) {
|
||||
case SCENEOBJT_NONE:
|
||||
@@ -544,6 +567,13 @@ static int scene_obj_render(struct scene_obj *obj, bool text_mode)
|
||||
if (obj->flags & SCENEOF_OPEN)
|
||||
scene_render_background(obj, true);
|
||||
break;
|
||||
case SCENEOBJT_BOX: {
|
||||
struct scene_obj_box *box = (struct scene_obj_box *)obj;
|
||||
|
||||
video_draw_box(dev, obj->bbox.x0, obj->bbox.y0, obj->bbox.x1,
|
||||
obj->bbox.y1, box->width, vid_priv->colour_fg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -562,6 +592,7 @@ int scene_calc_arrange(struct scene *scn, struct expo_arrange_info *arr)
|
||||
case SCENEOBJT_NONE:
|
||||
case SCENEOBJT_IMAGE:
|
||||
case SCENEOBJT_TEXT:
|
||||
case SCENEOBJT_BOX:
|
||||
break;
|
||||
case SCENEOBJT_MENU: {
|
||||
struct scene_obj_menu *menu;
|
||||
@@ -607,6 +638,7 @@ int scene_arrange(struct scene *scn)
|
||||
case SCENEOBJT_NONE:
|
||||
case SCENEOBJT_IMAGE:
|
||||
case SCENEOBJT_TEXT:
|
||||
case SCENEOBJT_BOX:
|
||||
break;
|
||||
case SCENEOBJT_MENU: {
|
||||
struct scene_obj_menu *menu;
|
||||
@@ -652,6 +684,7 @@ int scene_render_deps(struct scene *scn, uint id)
|
||||
case SCENEOBJT_NONE:
|
||||
case SCENEOBJT_IMAGE:
|
||||
case SCENEOBJT_TEXT:
|
||||
case SCENEOBJT_BOX:
|
||||
break;
|
||||
case SCENEOBJT_MENU:
|
||||
scene_menu_render_deps(scn,
|
||||
@@ -771,6 +804,7 @@ int scene_send_key(struct scene *scn, int key, struct expo_action *event)
|
||||
case SCENEOBJT_NONE:
|
||||
case SCENEOBJT_IMAGE:
|
||||
case SCENEOBJT_TEXT:
|
||||
case SCENEOBJT_BOX:
|
||||
break;
|
||||
case SCENEOBJT_MENU: {
|
||||
struct scene_obj_menu *menu;
|
||||
@@ -815,6 +849,7 @@ int scene_obj_calc_bbox(struct scene_obj *obj, struct vidconsole_bbox bbox[])
|
||||
case SCENEOBJT_NONE:
|
||||
case SCENEOBJT_IMAGE:
|
||||
case SCENEOBJT_TEXT:
|
||||
case SCENEOBJT_BOX:
|
||||
return -ENOSYS;
|
||||
case SCENEOBJT_MENU: {
|
||||
struct scene_obj_menu *menu = (struct scene_obj_menu *)obj;
|
||||
@@ -844,6 +879,7 @@ int scene_calc_dims(struct scene *scn, bool do_menus)
|
||||
switch (obj->type) {
|
||||
case SCENEOBJT_NONE:
|
||||
case SCENEOBJT_TEXT:
|
||||
case SCENEOBJT_BOX:
|
||||
case SCENEOBJT_IMAGE: {
|
||||
int width;
|
||||
|
||||
@@ -902,6 +938,7 @@ int scene_apply_theme(struct scene *scn, struct expo_theme *theme)
|
||||
case SCENEOBJT_NONE:
|
||||
case SCENEOBJT_IMAGE:
|
||||
case SCENEOBJT_MENU:
|
||||
case SCENEOBJT_BOX:
|
||||
case SCENEOBJT_TEXTLINE:
|
||||
break;
|
||||
case SCENEOBJT_TEXT:
|
||||
@@ -944,6 +981,7 @@ static int scene_obj_open(struct scene *scn, struct scene_obj *obj)
|
||||
case SCENEOBJT_IMAGE:
|
||||
case SCENEOBJT_MENU:
|
||||
case SCENEOBJT_TEXT:
|
||||
case SCENEOBJT_BOX:
|
||||
break;
|
||||
case SCENEOBJT_TEXTLINE:
|
||||
ret = scene_textline_open(scn,
|
||||
|
||||
@@ -65,6 +65,8 @@ item is highlighted.
|
||||
|
||||
A `textline object` contains a label and an editable string.
|
||||
|
||||
A `box object` is a rectangle with a given line width. It is not filled.
|
||||
|
||||
All components have a name. This is mostly for debugging, so it is easy to see
|
||||
what object is referred to, although the name is also used for saving values.
|
||||
Of course the ID numbers can help as well, but they are less easy to
|
||||
|
||||
@@ -179,6 +179,7 @@ struct scene {
|
||||
*
|
||||
* @SCENEOBJT_NONE: Used to indicate that the type does not matter
|
||||
* @SCENEOBJT_IMAGE: Image data to render
|
||||
* @SCENEOBJT_BOX: Rectangular box
|
||||
* @SCENEOBJT_TEXT: Text line to render
|
||||
* @SCENEOBJT_MENU: Menu containing items the user can select
|
||||
* @SCENEOBJT_TEXTLINE: Line of text the user can edit
|
||||
@@ -187,6 +188,7 @@ enum scene_obj_t {
|
||||
SCENEOBJT_NONE = 0,
|
||||
SCENEOBJT_IMAGE,
|
||||
SCENEOBJT_TEXT,
|
||||
SCENEOBJT_BOX,
|
||||
|
||||
/* types from here on can be highlighted */
|
||||
SCENEOBJT_MENU,
|
||||
@@ -406,6 +408,19 @@ struct scene_obj_textline {
|
||||
uint pos;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct scene_obj_box - information about a box in a scene
|
||||
*
|
||||
* A box surrounds a part of the screen with a border
|
||||
*
|
||||
* @obj: Basic object information
|
||||
* @width: Line-width in pixels
|
||||
*/
|
||||
struct scene_obj_box {
|
||||
struct scene_obj obj;
|
||||
uint width;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct expo_arrange_info - Information used when arranging a scene
|
||||
*
|
||||
@@ -670,6 +685,19 @@ int scene_menu(struct scene *scn, const char *name, uint id,
|
||||
int scene_textline(struct scene *scn, const char *name, uint id, uint max_chars,
|
||||
struct scene_obj_textline **tlinep);
|
||||
|
||||
/**
|
||||
* scene_box() - create a box
|
||||
*
|
||||
* @scn: Scene to update
|
||||
* @name: Name to use (this is allocated by this call)
|
||||
* @id: ID to use for the new object (0 to allocate one)
|
||||
* @width: Line-width in pixels
|
||||
* @boxp: If non-NULL, returns the new object
|
||||
* Returns: ID number for the object (typically @id), or -ve on error
|
||||
*/
|
||||
int scene_box(struct scene *scn, const char *name, uint id, uint width,
|
||||
struct scene_obj_box **boxp);
|
||||
|
||||
/**
|
||||
* scene_txt_set_font() - Set the font for an object
|
||||
*
|
||||
|
||||
@@ -28,6 +28,8 @@ enum {
|
||||
OBJ_TEXT3,
|
||||
OBJ_MENU,
|
||||
OBJ_MENU_TITLE,
|
||||
OBJ_BOX,
|
||||
OBJ_BOX2,
|
||||
|
||||
/* strings */
|
||||
STR_SCENE_TITLE,
|
||||
@@ -545,6 +547,14 @@ static int expo_render_image(struct unit_test_state *uts)
|
||||
|
||||
ut_assertok(scene_obj_set_pos(scn, OBJ_MENU, 50, 400));
|
||||
|
||||
id = scene_box(scn, "box", OBJ_BOX, 3, NULL);
|
||||
ut_assert(id > 0);
|
||||
ut_assertok(scene_obj_set_bbox(scn, OBJ_BOX, 40, 390, 1000, 510));
|
||||
|
||||
id = scene_box(scn, "box2", OBJ_BOX2, 1, NULL);
|
||||
ut_assert(id > 0);
|
||||
ut_assertok(scene_obj_set_bbox(scn, OBJ_BOX, 500, 200, 1000, 350));
|
||||
|
||||
scn2 = expo_lookup_scene_id(exp, SCENE1);
|
||||
ut_asserteq_ptr(scn, scn2);
|
||||
scn2 = expo_lookup_scene_id(exp, SCENE2);
|
||||
@@ -655,8 +665,7 @@ static int expo_render_image(struct unit_test_state *uts)
|
||||
ut_asserteq(ITEM2, scene_menu_get_cur_item(scn, OBJ_MENU));
|
||||
ut_assertok(scene_arrange(scn));
|
||||
ut_assertok(expo_render(exp));
|
||||
|
||||
ut_asserteq(14848, video_compress_fb(uts, dev, false));
|
||||
ut_asserteq(14883, video_compress_fb(uts, dev, false));
|
||||
ut_assertok(video_check_copy_fb(uts, dev));
|
||||
|
||||
/* make sure only the preview for the second item is shown */
|
||||
|
||||
Reference in New Issue
Block a user