"Das U-Boot" Source Tree
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

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>

Simon Glass 0635004e d25c62fd

+85 -3
+5
boot/cedit.c
··· 81 81 case SCENEOBJT_NONE: 82 82 case SCENEOBJT_IMAGE: 83 83 case SCENEOBJT_TEXT: 84 + case SCENEOBJT_BOX: 84 85 break; 85 86 case SCENEOBJT_MENU: 86 87 scene_obj_set_pos(scn, obj->id, 50, y); ··· 381 382 case SCENEOBJT_NONE: 382 383 case SCENEOBJT_IMAGE: 383 384 case SCENEOBJT_TEXT: 385 + case SCENEOBJT_BOX: 384 386 break; 385 387 case SCENEOBJT_TEXTLINE: { 386 388 const struct scene_obj_textline *tline; ··· 480 482 case SCENEOBJT_NONE: 481 483 case SCENEOBJT_IMAGE: 482 484 case SCENEOBJT_TEXT: 485 + case SCENEOBJT_BOX: 483 486 break; 484 487 case SCENEOBJT_TEXTLINE: { 485 488 const struct scene_obj_textline *tline; ··· 551 554 case SCENEOBJT_NONE: 552 555 case SCENEOBJT_IMAGE: 553 556 case SCENEOBJT_TEXT: 557 + case SCENEOBJT_BOX: 554 558 break; 555 559 case SCENEOBJT_MENU: 556 560 menu = (struct scene_obj_menu *)obj; ··· 634 638 case SCENEOBJT_NONE: 635 639 case SCENEOBJT_IMAGE: 636 640 case SCENEOBJT_TEXT: 641 + case SCENEOBJT_BOX: 637 642 break; 638 643 case SCENEOBJT_MENU: 639 644 menu = (struct scene_obj_menu *)obj;
+39 -1
boot/scene.c
··· 211 211 return txt->obj.id; 212 212 } 213 213 214 + int scene_box(struct scene *scn, const char *name, uint id, uint width, 215 + struct scene_obj_box **boxp) 216 + { 217 + struct scene_obj_box *box; 218 + int ret; 219 + 220 + ret = scene_obj_add(scn, name, id, SCENEOBJT_BOX, 221 + sizeof(struct scene_obj_box), 222 + (struct scene_obj **)&box); 223 + if (ret < 0) 224 + return log_msg_ret("obj", ret); 225 + 226 + box->width = width; 227 + 228 + if (boxp) 229 + *boxp = box; 230 + 231 + return box->obj.id; 232 + } 233 + 214 234 int scene_txt_set_font(struct scene *scn, uint id, const char *font_name, 215 235 uint font_size) 216 236 { ··· 323 343 case SCENEOBJT_NONE: 324 344 case SCENEOBJT_MENU: 325 345 case SCENEOBJT_TEXTLINE: 346 + case SCENEOBJT_BOX: 326 347 break; 327 348 case SCENEOBJT_IMAGE: { 328 349 struct scene_obj_img *img = (struct scene_obj_img *)obj; ··· 490 511 const struct expo_theme *theme = &exp->theme; 491 512 struct udevice *dev = exp->display; 492 513 struct udevice *cons = text_mode ? NULL : exp->cons; 514 + struct video_priv *vid_priv; 493 515 int x, y, ret; 494 516 495 - x = obj->bbox.x0; 496 517 y = obj->bbox.y0; 518 + x = obj->bbox.x0; 519 + vid_priv = dev_get_uclass_priv(dev); 497 520 498 521 switch (obj->type) { 499 522 case SCENEOBJT_NONE: ··· 544 567 if (obj->flags & SCENEOF_OPEN) 545 568 scene_render_background(obj, true); 546 569 break; 570 + case SCENEOBJT_BOX: { 571 + struct scene_obj_box *box = (struct scene_obj_box *)obj; 572 + 573 + video_draw_box(dev, obj->bbox.x0, obj->bbox.y0, obj->bbox.x1, 574 + obj->bbox.y1, box->width, vid_priv->colour_fg); 575 + break; 576 + } 547 577 } 548 578 549 579 return 0; ··· 562 592 case SCENEOBJT_NONE: 563 593 case SCENEOBJT_IMAGE: 564 594 case SCENEOBJT_TEXT: 595 + case SCENEOBJT_BOX: 565 596 break; 566 597 case SCENEOBJT_MENU: { 567 598 struct scene_obj_menu *menu; ··· 607 638 case SCENEOBJT_NONE: 608 639 case SCENEOBJT_IMAGE: 609 640 case SCENEOBJT_TEXT: 641 + case SCENEOBJT_BOX: 610 642 break; 611 643 case SCENEOBJT_MENU: { 612 644 struct scene_obj_menu *menu; ··· 652 684 case SCENEOBJT_NONE: 653 685 case SCENEOBJT_IMAGE: 654 686 case SCENEOBJT_TEXT: 687 + case SCENEOBJT_BOX: 655 688 break; 656 689 case SCENEOBJT_MENU: 657 690 scene_menu_render_deps(scn, ··· 771 804 case SCENEOBJT_NONE: 772 805 case SCENEOBJT_IMAGE: 773 806 case SCENEOBJT_TEXT: 807 + case SCENEOBJT_BOX: 774 808 break; 775 809 case SCENEOBJT_MENU: { 776 810 struct scene_obj_menu *menu; ··· 815 849 case SCENEOBJT_NONE: 816 850 case SCENEOBJT_IMAGE: 817 851 case SCENEOBJT_TEXT: 852 + case SCENEOBJT_BOX: 818 853 return -ENOSYS; 819 854 case SCENEOBJT_MENU: { 820 855 struct scene_obj_menu *menu = (struct scene_obj_menu *)obj; ··· 844 879 switch (obj->type) { 845 880 case SCENEOBJT_NONE: 846 881 case SCENEOBJT_TEXT: 882 + case SCENEOBJT_BOX: 847 883 case SCENEOBJT_IMAGE: { 848 884 int width; 849 885 ··· 902 938 case SCENEOBJT_NONE: 903 939 case SCENEOBJT_IMAGE: 904 940 case SCENEOBJT_MENU: 941 + case SCENEOBJT_BOX: 905 942 case SCENEOBJT_TEXTLINE: 906 943 break; 907 944 case SCENEOBJT_TEXT: ··· 944 981 case SCENEOBJT_IMAGE: 945 982 case SCENEOBJT_MENU: 946 983 case SCENEOBJT_TEXT: 984 + case SCENEOBJT_BOX: 947 985 break; 948 986 case SCENEOBJT_TEXTLINE: 949 987 ret = scene_textline_open(scn,
+2
doc/develop/expo.rst
··· 65 65 66 66 A `textline object` contains a label and an editable string. 67 67 68 + A `box object` is a rectangle with a given line width. It is not filled. 69 + 68 70 All components have a name. This is mostly for debugging, so it is easy to see 69 71 what object is referred to, although the name is also used for saving values. 70 72 Of course the ID numbers can help as well, but they are less easy to
+28
include/expo.h
··· 179 179 * 180 180 * @SCENEOBJT_NONE: Used to indicate that the type does not matter 181 181 * @SCENEOBJT_IMAGE: Image data to render 182 + * @SCENEOBJT_BOX: Rectangular box 182 183 * @SCENEOBJT_TEXT: Text line to render 183 184 * @SCENEOBJT_MENU: Menu containing items the user can select 184 185 * @SCENEOBJT_TEXTLINE: Line of text the user can edit ··· 187 188 SCENEOBJT_NONE = 0, 188 189 SCENEOBJT_IMAGE, 189 190 SCENEOBJT_TEXT, 191 + SCENEOBJT_BOX, 190 192 191 193 /* types from here on can be highlighted */ 192 194 SCENEOBJT_MENU, ··· 404 406 uint max_chars; 405 407 struct abuf buf; 406 408 uint pos; 409 + }; 410 + 411 + /** 412 + * struct scene_obj_box - information about a box in a scene 413 + * 414 + * A box surrounds a part of the screen with a border 415 + * 416 + * @obj: Basic object information 417 + * @width: Line-width in pixels 418 + */ 419 + struct scene_obj_box { 420 + struct scene_obj obj; 421 + uint width; 407 422 }; 408 423 409 424 /** ··· 669 684 */ 670 685 int scene_textline(struct scene *scn, const char *name, uint id, uint max_chars, 671 686 struct scene_obj_textline **tlinep); 687 + 688 + /** 689 + * scene_box() - create a box 690 + * 691 + * @scn: Scene to update 692 + * @name: Name to use (this is allocated by this call) 693 + * @id: ID to use for the new object (0 to allocate one) 694 + * @width: Line-width in pixels 695 + * @boxp: If non-NULL, returns the new object 696 + * Returns: ID number for the object (typically @id), or -ve on error 697 + */ 698 + int scene_box(struct scene *scn, const char *name, uint id, uint width, 699 + struct scene_obj_box **boxp); 672 700 673 701 /** 674 702 * scene_txt_set_font() - Set the font for an object
+11 -2
test/boot/expo.c
··· 28 28 OBJ_TEXT3, 29 29 OBJ_MENU, 30 30 OBJ_MENU_TITLE, 31 + OBJ_BOX, 32 + OBJ_BOX2, 31 33 32 34 /* strings */ 33 35 STR_SCENE_TITLE, ··· 545 547 546 548 ut_assertok(scene_obj_set_pos(scn, OBJ_MENU, 50, 400)); 547 549 550 + id = scene_box(scn, "box", OBJ_BOX, 3, NULL); 551 + ut_assert(id > 0); 552 + ut_assertok(scene_obj_set_bbox(scn, OBJ_BOX, 40, 390, 1000, 510)); 553 + 554 + id = scene_box(scn, "box2", OBJ_BOX2, 1, NULL); 555 + ut_assert(id > 0); 556 + ut_assertok(scene_obj_set_bbox(scn, OBJ_BOX, 500, 200, 1000, 350)); 557 + 548 558 scn2 = expo_lookup_scene_id(exp, SCENE1); 549 559 ut_asserteq_ptr(scn, scn2); 550 560 scn2 = expo_lookup_scene_id(exp, SCENE2); ··· 655 665 ut_asserteq(ITEM2, scene_menu_get_cur_item(scn, OBJ_MENU)); 656 666 ut_assertok(scene_arrange(scn)); 657 667 ut_assertok(expo_render(exp)); 658 - 659 - ut_asserteq(14848, video_compress_fb(uts, dev, false)); 668 + ut_asserteq(14883, video_compress_fb(uts, dev, false)); 660 669 ut_assertok(video_check_copy_fb(uts, dev)); 661 670 662 671 /* make sure only the preview for the second item is shown */