Added support for splash screen positioning
authorMatthias Weisser <matthias.weisser@graf-syteco.de>
Thu, 9 Jul 2009 14:07:30 +0000 (16:07 +0200)
committerAnatolij Gustschin <agust@denx.de>
Fri, 17 Jul 2009 13:23:41 +0000 (15:23 +0200)
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 <matthias.weisser@graf-syteco.de>
Acked-by: Matthias Fuchs <matthias.fuchs@esd.eu>
Signed-off-by: Anatolij Gustschin <agust@denx.de>
README
common/lcd.c
drivers/video/cfb_console.c

diff --git a/README b/README
index ca415d38b1f7f3c41e54653331a4ba9b4f4a30a1..7e43c21d267f740b30d47edcd5bb1e0c6d58fa71 100644 (file)
--- 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
index 74a5c77693f8b09e5e12d99645faac3188738881..b9a698d5c405756e6951cd69397847d755a6f8dd 100644 (file)
@@ -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);
                }
        }
index bcafb27a7a74859613737b4c2c0dc4d573cac6be..6adce19984e65273521ac5eb1042d08fdac64cf4 100644 (file)
@@ -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 <watchdog.h>
 #include <bmp_layout.h>
+
+#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));
                }
        }