[PATCH 02/19] expo: Use a different logo for the second menu-item

Simon Glass sjg at chromium.org
Mon May 5 17:42:40 CEST 2025


When testing menu items it is easier to check that the correct preview
is shown if the preview images are different. Make a copy of the image
and modify the palette for the second menu item, so this is obvious.

Signed-off-by: Simon Glass <sjg at chromium.org>
---

 boot/bootflow_menu.c         |  2 +-
 drivers/video/video-uclass.c |  6 +++++-
 include/video.h              |  3 ++-
 test/boot/expo.c             | 29 ++++++++++++++++++++++-------
 4 files changed, 30 insertions(+), 10 deletions(-)

diff --git a/boot/bootflow_menu.c b/boot/bootflow_menu.c
index 4a442e16850..5d77a0eaea8 100644
--- a/boot/bootflow_menu.c
+++ b/boot/bootflow_menu.c
@@ -67,7 +67,7 @@ int bootflow_menu_new(struct expo **expp)
 				  SCENEOB_DISPLAY_MAX, 30);
 	ret |= scene_obj_set_halign(scn, OBJ_MENU_TITLE, SCENEOA_CENTRE);
 
-	logo = video_get_u_boot_logo();
+	logo = video_get_u_boot_logo(NULL);
 	if (logo) {
 		ret |= scene_img(scn, "ulogo", OBJ_U_BOOT_LOGO, logo, NULL);
 		ret |= scene_obj_set_pos(scn, OBJ_U_BOOT_LOGO, 1165, 100);
diff --git a/drivers/video/video-uclass.c b/drivers/video/video-uclass.c
index 780b2bc6125..c02fd9bb958 100644
--- a/drivers/video/video-uclass.c
+++ b/drivers/video/video-uclass.c
@@ -582,11 +582,15 @@ int video_get_ysize(struct udevice *dev)
 	extern u8 __splash_ ## _name ## _end[]
 
 #define SPLASH_START(_name)	__splash_ ## _name ## _begin
+#define SPLASH_END(_name)	__splash_ ## _name ## _end
 
 SPLASH_DECL(u_boot_logo);
 
-void *video_get_u_boot_logo(void)
+void *video_get_u_boot_logo(int *sizep)
 {
+	if (sizep)
+		*sizep = SPLASH_END(u_boot_logo) - SPLASH_START(u_boot_logo);
+
 	return SPLASH_START(u_boot_logo);
 }
 
diff --git a/include/video.h b/include/video.h
index 9ea6b676463..2fbf8a9598a 100644
--- a/include/video.h
+++ b/include/video.h
@@ -418,9 +418,10 @@ bool video_is_active(void);
 /**
  * video_get_u_boot_logo() - Get a pointer to the U-Boot logo
  *
+ * @sizep: If non-null, returns the size of the logic in bytes
  * Returns: Pointer to logo
  */
-void *video_get_u_boot_logo(void);
+void *video_get_u_boot_logo(int *sizep);
 
 /*
  * bmp_display() - Display BMP (bitmap) data located in memory
diff --git a/test/boot/expo.c b/test/boot/expo.c
index ddfb739f9cf..64b6c154b15 100644
--- a/test/boot/expo.c
+++ b/test/boot/expo.c
@@ -463,13 +463,15 @@ BOOTSTD_TEST(expo_object_menu, UTF_DM | UTF_SCAN_FDT);
 static int expo_render_image(struct unit_test_state *uts)
 {
 	struct scene_obj_menu *menu;
+	struct abuf buf, logo_copy;
 	struct scene *scn, *scn2;
 	struct abuf orig, *text;
 	struct expo_action act;
 	struct scene_obj *obj;
 	struct udevice *dev;
 	struct expo *exp;
-	int id;
+	int id, size;
+	void *logo;
 
 	ut_assertok(uclass_first_device_err(UCLASS_VIDEO, &dev));
 
@@ -478,7 +480,8 @@ static int expo_render_image(struct unit_test_state *uts)
 	ut_assert(id > 0);
 	ut_assertok(expo_set_display(exp, dev));
 
-	id = scene_img(scn, "logo", OBJ_LOGO, video_get_u_boot_logo(), NULL);
+	id = scene_img(scn, "logo", OBJ_LOGO, video_get_u_boot_logo(NULL),
+		       NULL);
 	ut_assert(id > 0);
 	ut_assertok(scene_obj_set_pos(scn, OBJ_LOGO, 50, 20));
 
@@ -526,8 +529,18 @@ static int expo_render_image(struct unit_test_state *uts)
 	id = scene_txt_str(scn, "item1-key", ITEM1_KEY, STR_ITEM1_KEY, "1",
 			   NULL);
 	ut_assert(id > 0);
-	id = scene_img(scn, "item1-preview", ITEM1_PREVIEW,
-		       video_get_u_boot_logo(), NULL);
+
+	/*
+	 * hack the logo to change the palette and use that for item2 so we can
+	 * tell them apart
+	 */
+	logo = video_get_u_boot_logo(&size);
+	abuf_init_const(&buf, logo, size);
+	ut_assert(abuf_copy(&buf, &logo_copy));
+	memset(logo_copy.data + 0x70, '\x45', 0x20);
+
+	id = scene_img(scn, "item1-preview", ITEM1_PREVIEW, logo_copy.data,
+		       NULL);
 	id = scene_menuitem(scn, OBJ_MENU, "item1", ITEM1, ITEM1_KEY,
 			    ITEM1_LABEL, ITEM1_DESC, ITEM1_PREVIEW, 0, NULL);
 	ut_assert(id > 0);
@@ -542,7 +555,7 @@ static int expo_render_image(struct unit_test_state *uts)
 			   NULL);
 	ut_assert(id > 0);
 	id = scene_img(scn, "item2-preview", ITEM2_PREVIEW,
-		       video_get_u_boot_logo(), NULL);
+		       video_get_u_boot_logo(NULL), NULL);
 	ut_assert(id > 0);
 
 	id = scene_menuitem(scn, OBJ_MENU, "item2", ITEM2, ITEM2_KEY,
@@ -670,8 +683,7 @@ static int expo_render_image(struct unit_test_state *uts)
 	ut_assertok(scene_arrange(scn));
 	ut_asserteq(OBJ_MENU, scn->highlight_id);
 	ut_assertok(expo_render(exp));
-
-	ut_asserteq(19704, video_compress_fb(uts, dev, false));
+	ut_asserteq(20433, video_compress_fb(uts, dev, false));
 
 	/* move down */
 	ut_assertok(expo_send_key(exp, BKEY_DOWN));
@@ -762,6 +774,9 @@ static int expo_render_image(struct unit_test_state *uts)
 
 	ut_assert_console_end();
 
+	abuf_uninit(&buf);
+	abuf_uninit(&logo_copy);
+
 	expo_destroy(exp);
 
 	return 0;
-- 
2.43.0



More information about the U-Boot mailing list