diff options
author | Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> | 2012-09-12 15:42:40 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2012-09-12 17:21:10 +0200 |
commit | 6ce5bc4624456e26fe2c534b6ef3ec32b42685a4 (patch) | |
tree | 32446aa30d86df81a3c9e906387921e7f8e618fc /commands | |
parent | a87361dfc30a49b5dd6cbd7e13cda40af223bfd5 (diff) | |
download | barebox-6ce5bc4624456e26fe2c534b6ef3ec32b42685a4.tar.gz barebox-6ce5bc4624456e26fe2c534b6ef3ec32b42685a4.tar.xz |
bmp: Move bmp rendering to lib/bmp.c
So we can add other format support
Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'commands')
-rw-r--r-- | commands/Kconfig | 1 | ||||
-rw-r--r-- | commands/splash.c | 124 |
2 files changed, 12 insertions, 113 deletions
diff --git a/commands/Kconfig b/commands/Kconfig index c4623fa3d5..9107a3e7e4 100644 --- a/commands/Kconfig +++ b/commands/Kconfig @@ -538,6 +538,7 @@ config CMD_LSMOD config CMD_SPLASH bool depends on VIDEO + select BMP prompt "splash" help show bmp files on framebuffer devices diff --git a/commands/splash.c b/commands/splash.c index 6526b2035c..ad737784e0 100644 --- a/commands/splash.c +++ b/commands/splash.c @@ -8,43 +8,18 @@ #include <fcntl.h> #include <fb.h> #include <bmp_layout.h> -#include <asm/byteorder.h> - -static inline void set_pixel(struct fb_info *info, void *adr, int r, int g, int b) -{ - u32 px; - - px = (r >> (8 - info->red.length)) << info->red.offset | - (g >> (8 - info->green.length)) << info->green.offset | - (b >> (8 - info->blue.length)) << info->blue.offset; - - switch (info->bits_per_pixel) { - case 8: - break; - case 16: - *(u16 *)adr = px; - break; - case 32: - *(u32 *)adr = px; - break; - } -} static int do_splash(int argc, char *argv[]) { int ret, opt, fd; char *fbdev = "/dev/fb0"; - void *fb, *offscreenbuf = NULL; + void *fb; struct fb_info info; - struct bmp_image *bmp; char *bmpfile; - int bmpsize; - char *image; - int sw, sh, width, height, startx = -1, starty = -1; - int bits_per_pixel, fbsize; + int startx = -1, starty = -1; int xres, yres; int offscreen = 0; - void *adr, *buf; + void *offscreenbuf = NULL; while((opt = getopt(argc, argv, "f:x:y:o")) > 0) { switch(opt) { @@ -88,105 +63,28 @@ static int do_splash(int argc, char *argv[]) xres = info.xres; yres = info.yres; - bmp = read_file(bmpfile, &bmpsize); - if (!bmp) { - printf("unable to read %s\n", bmpfile); - goto failed_memmap; - } - - if (bmp->header.signature[0] != 'B' || - bmp->header.signature[1] != 'M') { - printf("No valid bmp file\n"); - } - - sw = le32_to_cpu(bmp->header.width); - sh = le32_to_cpu(bmp->header.height); - - if (startx < 0) { - startx = (xres - sw) / 2; - if (startx < 0) - startx = 0; - } - - if (starty < 0) { - starty = (yres - sh) / 2; - if (starty < 0) - starty = 0; - } - - width = min(sw, xres - startx); - height = min(sh, yres - starty); - - bits_per_pixel = le16_to_cpu(bmp->header.bit_count); - fbsize = xres * yres * (info.bits_per_pixel >> 3); - if (offscreen) { + int fbsize; /* Don't fail if malloc fails, just continue rendering directly * on the framebuffer */ + + fbsize = xres * yres * (info.bits_per_pixel >> 3); offscreenbuf = malloc(fbsize); if (offscreenbuf) memcpy(offscreenbuf, fb, fbsize); } - buf = offscreenbuf ? offscreenbuf : fb; - - if (bits_per_pixel == 8) { - int x, y; - struct bmp_color_table_entry *color_table = bmp->color_table; - - for (y = 0; y < height; y++) { - image = (char *)bmp + - le32_to_cpu(bmp->header.data_offset); - image += (sh - y - 1) * sw * (bits_per_pixel >> 3); - adr = buf + ((y + starty) * xres + startx) * - (info.bits_per_pixel >> 3); - for (x = 0; x < width; x++) { - int pixel; + if (bmp_render_file(&info, bmpfile, fb, startx, starty, xres, yres, + offscreenbuf) < 0) + ret = 1; - pixel = *image; - - set_pixel(&info, adr, color_table[pixel].red, - color_table[pixel].green, - color_table[pixel].blue); - adr += info.bits_per_pixel >> 3; - - image += bits_per_pixel >> 3; - } - } - } else if (bits_per_pixel == 24) { - int x, y; - - for (y = 0; y < height; y++) { - image = (char *)bmp + - le32_to_cpu(bmp->header.data_offset); - image += (sh - y - 1) * sw * (bits_per_pixel >> 3); - adr = buf + ((y + starty) * xres + startx) * - (info.bits_per_pixel >> 3); - for (x = 0; x < width; x++) { - char *pixel; - - pixel = image; - - set_pixel(&info, adr, pixel[2], pixel[1], - pixel[0]); - adr += info.bits_per_pixel >> 3; - - image += bits_per_pixel >> 3; - } - } - } else - printf("bmp: illegal bits per pixel value: %d\n", bits_per_pixel); - - if (offscreenbuf) { - memcpy(fb, offscreenbuf, fbsize); + if (offscreenbuf) free(offscreenbuf); - } - free(bmp); close(fd); - return 0; + return ret; failed_memmap: close(fd); |