diff options
author | Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> | 2012-09-12 15:42:44 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2012-09-12 17:22:47 +0200 |
commit | 2dbdd40d57887360b4e857cc4fe7861b091db18b (patch) | |
tree | 4545d834f845f287a3bff82e550e3596974dcae4 /lib | |
parent | 2dfb4028b4eb4843a3dfcf87fd9608ac04bbf622 (diff) | |
download | barebox-2dbdd40d57887360b4e857cc4fe7861b091db18b.tar.gz barebox-2dbdd40d57887360b4e857cc4fe7861b091db18b.tar.xz |
splash/bmp: switch to image_renderer
Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Kconfig | 1 | ||||
-rw-r--r-- | lib/Makefile | 4 | ||||
-rw-r--r-- | lib/bmp.c | 91 | ||||
-rw-r--r-- | lib/bmp_layout.h | 88 |
4 files changed, 147 insertions, 37 deletions
diff --git a/lib/Kconfig b/lib/Kconfig index be3ea1cf5..417c81ee5 100644 --- a/lib/Kconfig +++ b/lib/Kconfig @@ -45,5 +45,6 @@ config IMAGE_RENDERER config BMP bool + depends on IMAGE_RENDERER endmenu diff --git a/lib/Makefile b/lib/Makefile index 237daf1dc..075613580 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -34,5 +34,5 @@ obj-$(CONFIG_UNCOMPRESS) += uncompress.o obj-$(CONFIG_BCH) += bch.o obj-$(CONFIG_BITREV) += bitrev.o obj-$(CONFIG_QSORT) += qsort.o -obj-$(CONFIG_BMP) += bmp.o graphic_utils.o -obj-$(CONFIG_IMAGE_RENDERER) += image_renderer.o +obj-$(CONFIG_BMP) += bmp.o +obj-$(CONFIG_IMAGE_RENDERER) += image_renderer.o graphic_utils.o @@ -1,55 +1,68 @@ #include <common.h> -#include <fs.h> #include <errno.h> #include <malloc.h> #include <fb.h> -#include <bmp_layout.h> +#include "bmp_layout.h" #include <asm/byteorder.h> #include <graphic_utils.h> +#include <init.h> +#include <image_renderer.h> -int bmp_render_file(struct fb_info *info, const char* bmpfile, void* fb, - int startx, int starty, int xres, int yres, void* offscreenbuf) +struct image *bmp_open(char *inbuf, int insize) { - struct bmp_image *bmp; - int sw, sh, width, height; - int bits_per_pixel, fbsize; - int bmpsize; - int ret = 0; - void *adr, *buf; - char *image; + struct image *img = calloc(1, sizeof(struct image)); + struct bmp_image *bmp = (struct bmp_image*)inbuf; - bmp = read_file(bmpfile, &bmpsize); - if (!bmp) { - printf("unable to read %s\n", bmpfile); - return -ENOMEM; + if (!img) { + free(bmp); + return ERR_PTR(-ENOMEM); } - if (bmp->header.signature[0] != 'B' || - bmp->header.signature[1] != 'M') { - printf("No valid bmp file\n"); - ret = -EINVAL; - goto err; - } + img->data = inbuf; + img->height = le32_to_cpu(bmp->header.height);; + img->width = le32_to_cpu(bmp->header.width);; + img->bits_per_pixel = le16_to_cpu(bmp->header.bit_count); + + pr_debug("bmp: %d x %d x %d data@0x%p\n", img->width, img->height, + img->bit_per_pixel, img->data); + + return img; +} + +void bmp_close(struct image *img) +{ + free(img->data); +} - sw = le32_to_cpu(bmp->header.width); - sh = le32_to_cpu(bmp->header.height); +static int bmp_renderer(struct fb_info *info, struct image *img, void* fb, + int startx, int starty, void* offscreenbuf) +{ + struct bmp_image *bmp = img->data; + int width, height; + int bits_per_pixel, fbsize; + void *adr, *buf; + char *image; + int xres, yres; + + xres = info->xres; + yres = info->yres; if (startx < 0) { - startx = (xres - sw) / 2; + startx = (xres - img->width) / 2; if (startx < 0) startx = 0; } if (starty < 0) { - starty = (yres - sh) / 2; + starty = (yres - img->height) / 2; if (starty < 0) starty = 0; } - width = min(sw, xres - startx); - height = min(sh, yres - starty); + width = min(img->width, xres - startx); + height = min(img->height, yres - starty); - bits_per_pixel = le16_to_cpu(bmp->header.bit_count); + bits_per_pixel = img->bits_per_pixel; fbsize = xres * yres * (info->bits_per_pixel >> 3); buf = offscreenbuf ? offscreenbuf : fb; @@ -61,7 +74,7 @@ int bmp_render_file(struct fb_info *info, const char* bmpfile, void* fb, 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); + image += (img->height - y - 1) * img->width * (bits_per_pixel >> 3); adr = buf + ((y + starty) * xres + startx) * (info->bits_per_pixel >> 3); for (x = 0; x < width; x++) { @@ -83,7 +96,7 @@ int bmp_render_file(struct fb_info *info, const char* bmpfile, void* fb, 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); + image += (img->height - y - 1) * img->width * (bits_per_pixel >> 3); adr = buf + ((y + starty) * xres + startx) * (info->bits_per_pixel >> 3); for (x = 0; x < width; x++) { @@ -104,10 +117,18 @@ int bmp_render_file(struct fb_info *info, const char* bmpfile, void* fb, if (offscreenbuf) memcpy(fb, offscreenbuf, fbsize); - free(bmp); - return sh; + return img->height; +} + +static struct image_renderer bmp = { + .type = filetype_bmp, + .open = bmp_open, + .close = bmp_close, + .renderer = bmp_renderer, +}; -err: - free(bmp); - return ret; +static int bmp_init(void) +{ + return image_renderer_register(&bmp); } +fs_initcall(bmp_init); diff --git a/lib/bmp_layout.h b/lib/bmp_layout.h new file mode 100644 index 000000000..b5472dd78 --- /dev/null +++ b/lib/bmp_layout.h @@ -0,0 +1,88 @@ +/* (C) Copyright 2002 + * Detlev Zundel, DENX Software Engineering, dzu@denx.de. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +/************************************************************************/ +/* ** Layout of a bmp file */ +/************************************************************************/ + +#ifndef _BMP_H_ +#define _BMP_H_ + +struct bmp_color_table_entry { + __u8 blue; + __u8 green; + __u8 red; + __u8 reserved; +} __attribute__ ((packed)); + +/* When accessing these fields, remember that they are stored in little + endian format, so use linux macros, e.g. le32_to_cpu(width) */ + +struct bmp_header { + /* Header */ + char signature[2]; + __u32 file_size; + __u32 reserved; + __u32 data_offset; + /* InfoHeader */ + __u32 size; + __u32 width; + __u32 height; + __u16 planes; + __u16 bit_count; + __u32 compression; + __u32 image_size; + __u32 x_pixels_per_m; + __u32 y_pixels_per_m; + __u32 colors_used; + __u32 colors_important; + /* ColorTable */ + +} __attribute__ ((packed)); + +struct bmp_image { + struct bmp_header header; + /* We use a zero sized array just as a placeholder for variable + sized array */ + struct bmp_color_table_entry color_table[0]; +}; + +/* Data in the bmp_image is aligned to this length */ +#define BMP_DATA_ALIGN 4 + +/* Constants for the compression field */ +#define BMP_BI_RGB 0 +#define BMP_BI_RLE8 1 +#define BMP_BI_RLE4 2 + +#ifdef CONFIG_BMP +int bmp_render_file(struct fb_info *info, const char* bmpfile, void* fb, + int startx, int starty, int xres, int yres, void* offscreenbuf); +#else +static inline int bmp_render_file(struct fb_info *info, const char* bmpfile, void* fb, + int startx, int starty, int xres, int yres, void* offscreenbuf) +{ + return -ENOSYS; +} +#endif + +#endif /* _BMP_H_ */ |