[U-Boot-Users] [PATCH] add splashimage positioning support

This patch adds positioning support the video console's splashimage. The new feature must be enabled via CONFIG_SPLASH_SCREEN_ALIGN
Please see README for more details.
Signed-off-by: Matthias Fuchs matthias.fuchs@esd-electronics.com
--- commit a2d4f0317552af68f86e8981aaef6c324bfbc157 tree 7229d0a193964b252f60ad1eff4c7af4ab71d94a parent 98c440bee623ecdd5322852732b883e696fb2140 author Matthias Fuchs matthias.fuchs@esd-electronics.com Wed, 04 Jul 2007 12:09:27 +0200 committer Matthias Fuchs matthias.fuchs@esd-electronics.com Wed, 04 Jul 2007 12:09:27 +0200
README | 15 ++++++++ drivers/cfb_console.c | 92 ++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 98 insertions(+), 9 deletions(-)
diff --git a/README b/README index bb5b46e..205b370 100644 --- a/README +++ b/README @@ -1047,6 +1047,21 @@ The following options need to be configu allows for a "silent" boot where a splash screen is loaded very quickly after power-on.
+ When CONFIG_SPLASH_SCREEN_ALIGN is additionally defined, + it is possible to align a small splashimage on a huge + display. This option extends the splashimage variable + syntax with an x and y position suffix. Beside absolute + positioning the characters 'l' (left), 'r' (right), + 't' (top), 'b' (bottom) and 'c' (center) are supported: + + splashimage=<address>[,<xpos>[,<pos>]] + + Example: + splashimage=fff00000,c,c + + This aligns our bitmap at address 0xfff00000 + vertically and horizontally. + - Gzip compressed BMP image support: CONFIG_VIDEO_BMP_GZIP
If this option is set, additionally to standard BMP diff --git a/drivers/cfb_console.c b/drivers/cfb_console.c index 9727aeb..9753b07 100644 --- a/drivers/cfb_console.c +++ b/drivers/cfb_console.c @@ -183,6 +183,15 @@ CONFIG_VIDEO_HW_CURSOR: - Uses the #if (CONFIG_COMMANDS & CFG_CMD_BMP) || defined(CONFIG_SPLASH_SCREEN) #include <watchdog.h> #include <bmp_layout.h> + +#ifdef CONFIG_SPLASH_SCREEN_ALIGN +#define BMP_ALIGN_CENTER -1 +#define BMP_ALIGN_RIGHT -2 +#define BMP_ALIGN_BOTTOM -3 +#define BMP_ALIGN_LEFT 0 +#define BMP_ALIGN_TOP 0 +#endif + #endif /* (CONFIG_COMMANDS & CFG_CMD_BMP) || CONFIG_SPLASH_SCREEN */
/*****************************************************************************/ @@ -755,6 +764,8 @@ void video_puts (const char *s) int video_display_bitmap (ulong bmp_image, int x, int y) { ushort xcount, ycount; + int xc = x; + int yc = y; uchar *fb; bmp_image_t *bmp = (bmp_image_t *) bmp_image; uchar *bmap; @@ -825,15 +836,35 @@ int video_display_bitmap (ulong bmp_imag
padded_line = (((width * bpp + 7) / 8) + 3) & ~0x3;
- if ((x + width) > VIDEO_VISIBLE_COLS) - width = VIDEO_VISIBLE_COLS - x; - if ((y + height) > VIDEO_VISIBLE_ROWS) - height = VIDEO_VISIBLE_ROWS - y; +#ifdef CONFIG_SPLASH_SCREEN_ALIGN + switch(xc) { + case BMP_ALIGN_CENTER: + xc = (VIDEO_VISIBLE_COLS - width) >> 1; + break; + case BMP_ALIGN_RIGHT: + xc = VIDEO_VISIBLE_COLS - width; + break; + } + + switch(yc) { + case BMP_ALIGN_CENTER: + yc = (VIDEO_VISIBLE_ROWS - height) >> 1; + break; + case BMP_ALIGN_BOTTOM: + yc = VIDEO_VISIBLE_ROWS - height; + break; + } +#endif + + if ((xc + width) > VIDEO_VISIBLE_COLS) + width = VIDEO_VISIBLE_COLS - xc; + if ((yc + height) > VIDEO_VISIBLE_ROWS) + height = VIDEO_VISIBLE_ROWS - yc;
bmap = (uchar *) bmp + le32_to_cpu (bmp->header.data_offset); fb = (uchar *) (video_fb_address + - ((y + height - 1) * VIDEO_COLS * VIDEO_PIXEL_SIZE) + - x * VIDEO_PIXEL_SIZE); + ((yc + height - 1) * VIDEO_COLS * VIDEO_PIXEL_SIZE) + + xc * VIDEO_PIXEL_SIZE);
/* We handle only 8bpp or 24 bpp bitmap */ switch (le16_to_cpu (bmp->header.bit_count)) { @@ -1106,11 +1137,54 @@ static void *video_logo (void) #ifdef CONFIG_SPLASH_SCREEN char *s; ulong addr; - + char *c; + int x = 0; + int y = 0; if ((s = getenv ("splashimage")) != NULL) { - addr = simple_strtoul (s, NULL, 16); + addr = simple_strtoul (s, &c, 16); + +#ifdef CONFIG_SPLASH_SCREEN_ALIGN + if ((c != NULL) && (*c == ',')) { + c++; + switch(*c) { + case 'c': + x = BMP_ALIGN_CENTER; + c++; + break; + case 'r': + x = BMP_ALIGN_RIGHT; + c++; + break; + case 'l': + x = BMP_ALIGN_LEFT; + c++; + break; + default: + x = (int)simple_strtoul(c, &c, 10); + } + if ((c != NULL) && (*c == ',')) { + c++; + switch(*c) { + case 'c': + y = BMP_ALIGN_CENTER; + c++; + break; + case 'b': + y = BMP_ALIGN_BOTTOM; + c++; + break; + case 't': + y = BMP_ALIGN_TOP; + c++; + break; + default: + y = (int)simple_strtoul(c, NULL, 10); + } + } + } +#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)); } }
participants (1)
-
Matthias Fuchs