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>
diff --git a/boot/scene.c b/boot/scene.c
index 72a8e27..f971db9 100644
--- a/boot/scene.c
+++ b/boot/scene.c
@@ -211,6 +211,26 @@
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 @@
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 @@
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,7 +567,14 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
switch (obj->type) {
case SCENEOBJT_NONE:
case SCENEOBJT_TEXT:
+ case SCENEOBJT_BOX:
case SCENEOBJT_IMAGE: {
int width;
@@ -902,6 +938,7 @@
case SCENEOBJT_NONE:
case SCENEOBJT_IMAGE:
case SCENEOBJT_MENU:
+ case SCENEOBJT_BOX:
case SCENEOBJT_TEXTLINE:
break;
case SCENEOBJT_TEXT:
@@ -944,6 +981,7 @@
case SCENEOBJT_IMAGE:
case SCENEOBJT_MENU:
case SCENEOBJT_TEXT:
+ case SCENEOBJT_BOX:
break;
case SCENEOBJT_TEXTLINE:
ret = scene_textline_open(scn,