From 1ca298ced07327749b54321815f76fcddb2f9479 Mon Sep 17 00:00:00 2001 From: Matthias Weisser Date: Thu, 9 Jul 2009 16:07:30 +0200 Subject: [PATCH] Added support for splash screen positioning This patch adds support splash image positioning by adding an additional variable "splashpos" to the environment. Please see README for details. Signed-off-by: Matthias Weisser Acked-by: Matthias Fuchs Signed-off-by: Anatolij Gustschin --- README | 20 +++++++++++++++++++ common/lcd.c | 39 +++++++++++++++++++++++++++++++++++-- drivers/video/cfb_console.c | 36 +++++++++++++++++++++++++++++++++- 3 files changed, 92 insertions(+), 3 deletions(-) diff --git a/README b/README index ca415d38b1..7e43c21d26 100644 --- a/README +++ b/README @@ -1074,6 +1074,26 @@ The following options need to be configured: allows for a "silent" boot where a splash screen is loaded very quickly after power-on. + CONFIG_SPLASH_SCREEN_ALIGN + + If this option is set the splash image can be freely positioned + on the screen. Environment variable "splashpos" specifies the + position as "x,y". If a positive number is given it is used as + number of pixel from left/top. If a negative number is given it + is used as number of pixel from right/bottom. You can also + specify 'm' for centering the image. + + Example: + setenv splashpos m,m + => image at center of screen + + setenv splashpos 30,20 + => image at x = 30 and y = 20 + + setenv splashpos -10,m + => vertically centered image + at x = dspWidth - bmpWidth - 9 + - Gzip compressed BMP image support: CONFIG_VIDEO_BMP_GZIP If this option is set, additionally to standard BMP diff --git a/common/lcd.c b/common/lcd.c index 74a5c77693..b9a698d5c4 100644 --- a/common/lcd.c +++ b/common/lcd.c @@ -620,6 +620,11 @@ void bitmap_plot (int x, int y) * Display the BMP file located at address bmp_image. * Only uncompressed. */ + +#ifdef CONFIG_SPLASH_SCREEN_ALIGN +#define BMP_ALIGN_CENTER 0x7FFF +#endif + int lcd_display_bitmap(ulong bmp_image, int x, int y) { #if !defined(CONFIG_MCC200) @@ -731,6 +736,19 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y) #endif padded_line = (width&0x3) ? ((width&~0x3)+4) : (width); + +#ifdef CONFIG_SPLASH_SCREEN_ALIGN + if (x == BMP_ALIGN_CENTER) + x = max(0, (pwidth - width) / 2); + else if (x < 0) + x = max(0, pwidth - width + x + 1); + + if (y == BMP_ALIGN_CENTER) + y = max(0, (panel_info.vl_row - height) / 2); + else if (y < 0) + y = max(0, panel_info.vl_row - height + y + 1); +#endif /* CONFIG_SPLASH_SCREEN_ALIGN */ + if ((x + width)>pwidth) width = pwidth - x; if ((y + height)>panel_info.vl_row) @@ -809,9 +827,26 @@ static void *lcd_logo (void) static int do_splash = 1; if (do_splash && (s = getenv("splashimage")) != NULL) { - addr = simple_strtoul(s, NULL, 16); + int x = 0, y = 0; do_splash = 0; + addr = simple_strtoul (s, NULL, 16); +#ifdef CONFIG_SPLASH_SCREEN_ALIGN + if ((s = getenv ("splashpos")) != NULL) { + if (s[0] == 'm') + x = BMP_ALIGN_CENTER; + else + x = simple_strtol (s, NULL, 0); + + if ((s = strchr (s + 1, ',')) != NULL) { + if (s[1] == 'm') + y = BMP_ALIGN_CENTER; + else + y = simple_strtol (s + 1, NULL, 0); + } + } +#endif /* CONFIG_SPLASH_SCREEN_ALIGN */ + #ifdef CONFIG_VIDEO_BMP_GZIP bmp_image_t *bmp = (bmp_image_t *)addr; unsigned long len; @@ -822,7 +857,7 @@ static void *lcd_logo (void) } #endif - if (lcd_display_bitmap (addr, 0, 0) == 0) { + if (lcd_display_bitmap (addr, x, y) == 0) { return ((void *)lcd_base); } } diff --git a/drivers/video/cfb_console.c b/drivers/video/cfb_console.c index bcafb27a7a..6adce19984 100644 --- a/drivers/video/cfb_console.c +++ b/drivers/video/cfb_console.c @@ -193,6 +193,11 @@ CONFIG_VIDEO_HW_CURSOR: - Uses the hardware cursor capability of the #if defined(CONFIG_CMD_BMP) || defined(CONFIG_SPLASH_SCREEN) #include #include + +#ifdef CONFIG_SPLASH_SCREEN_ALIGN +#define BMP_ALIGN_CENTER 0x7FFF +#endif + #endif /*****************************************************************************/ @@ -877,6 +882,18 @@ int video_display_bitmap (ulong bmp_image, int x, int y) padded_line = (((width * bpp + 7) / 8) + 3) & ~0x3; +#ifdef CONFIG_SPLASH_SCREEN_ALIGN + if (x == BMP_ALIGN_CENTER) + x = max(0, (VIDEO_VISIBLE_COLS - width) / 2); + else if (x < 0) + x = max(0, VIDEO_VISIBLE_COLS - width + x + 1); + + if (y == BMP_ALIGN_CENTER) + y = max(0, (VIDEO_VISIBLE_ROWS - height) / 2); + else if (y < 0) + y = max(0, VIDEO_VISIBLE_ROWS - height + y + 1); +#endif /* CONFIG_SPLASH_SCREEN_ALIGN */ + if ((x + width) > VIDEO_VISIBLE_COLS) width = VIDEO_VISIBLE_COLS - x; if ((y + height) > VIDEO_VISIBLE_ROWS) @@ -1188,9 +1205,26 @@ static void *video_logo (void) ulong addr; if ((s = getenv ("splashimage")) != NULL) { + int x = 0, y = 0; + addr = simple_strtoul (s, NULL, 16); +#ifdef CONFIG_SPLASH_SCREEN_ALIGN + if ((s = getenv ("splashpos")) != NULL) { + if (s[0] == 'm') + x = BMP_ALIGN_CENTER; + else + x = simple_strtol (s, NULL, 0); + + if ((s = strchr (s + 1, ',')) != NULL) { + if (s[1] == 'm') + y = BMP_ALIGN_CENTER; + else + y = simple_strtol (s + 1, NULL, 0); + } + } +#endif /* CONFIG_SPLASH_SCREEN_ALIGN */ - if (video_display_bitmap (addr, 0, 0) == 0) { + if (video_display_bitmap (addr, x, y) == 0) { return ((void *) (video_fb_address)); } } -- 2.39.5