diff options
author | Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> | 2012-09-12 15:42:42 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2012-09-12 17:21:55 +0200 |
commit | 09a1a28233831c0d17085472e478bca1dba3a7ef (patch) | |
tree | 88909794f2d1fe315783ccdbaa0634aa35e5fbfe | |
parent | 78b7818fba76db92c1af8931b249055ea4f3feeb (diff) | |
download | barebox-09a1a28233831c0d17085472e478bca1dba3a7ef.tar.gz barebox-09a1a28233831c0d17085472e478bca1dba3a7ef.tar.xz |
introduce image_renderer framework
This will allow to support bmp and png
Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r-- | include/image_renderer.h | 85 | ||||
-rw-r--r-- | lib/Kconfig | 5 | ||||
-rw-r--r-- | lib/Makefile | 1 | ||||
-rw-r--r-- | lib/image_renderer.c | 96 |
4 files changed, 187 insertions, 0 deletions
diff --git a/include/image_renderer.h b/include/image_renderer.h new file mode 100644 index 0000000000..31ef1c67bc --- /dev/null +++ b/include/image_renderer.h @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2012 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> + * + * GPL v2 + */ + +#ifndef __IMAGE_RENDER_H__ +#define __IMAGE_RENDER_H__ + +#include <filetype.h> +#include <linux/list.h> +#include <errno.h> +#include <linux/err.h> +#include <fb.h> + +struct image { + void *data; + struct image_renderer *ir; + int height; + int width; + int bits_per_pixel; +}; + +struct image_renderer { + enum filetype type; + struct image *(*open)(char *data, int size); + void (*close)(struct image *img); + int (*renderer)(struct fb_info *info, struct image *img, void* fb, + int startx, int starty, void* offscreenbuf); + + /* + * do not free the data read from the file + * needed by bmp support + */ + int keep_file_data; + + struct list_head list; +}; + +#ifdef CONFIG_IMAGE_RENDERER +int image_renderer_register(struct image_renderer *ir); +void image_render_unregister(struct image_renderer *ir); + +int image_renderer_image(struct fb_info *info, struct image *img, void* fb, + int startx, int starty, void* offscreenbuf); + +struct image *image_renderer_open(const char* file); +void image_renderer_close(struct image *img); + +#else +static inline int image_renderer_register(struct image_renderer *ir) +{ + return -EINVAL; +} +static inline void image_renderer_unregister(struct image_renderer *ir) {} + +static inline struct image *image_renderer_open(const char* file) +{ + return ERR_PTR(-EINVAL); +} + +static inline void image_renderer_close(struct image *img) {} + +int image_renderer_image(struct fb_info *info, struct image *img, void* fb, + int startx, int starty, void* offscreenbuf); +#endif + +static inline int image_renderer_file(struct fb_info *info, const char* file, void* fb, + int startx, int starty, void* offscreenbuf) +{ + struct image* img = image_renderer_open(file); + int ret; + + if (IS_ERR(img)) + return PTR_ERR(img); + + ret = image_renderer_image(info, img, fb, startx, starty, + offscreenbuf); + + image_renderer_close(img); + + return ret; +} + +#endif /* __IMAGE_RENDERER_H__ */ diff --git a/lib/Kconfig b/lib/Kconfig index 93e360b305..be3ea1cf56 100644 --- a/lib/Kconfig +++ b/lib/Kconfig @@ -38,6 +38,11 @@ config BITREV config QSORT bool +config IMAGE_RENDERER + bool + depends on VIDEO + select FILETYPE + config BMP bool diff --git a/lib/Makefile b/lib/Makefile index 997ba104b6..237daf1dc7 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -35,3 +35,4 @@ 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 diff --git a/lib/image_renderer.c b/lib/image_renderer.c new file mode 100644 index 0000000000..b08f6bf2a5 --- /dev/null +++ b/lib/image_renderer.c @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2012 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> + * + * GPL v2 + */ + +#include <common.h> +#include <fb.h> +#include <image_renderer.h> +#include <errno.h> +#include <fs.h> +#include <malloc.h> + +static LIST_HEAD(image_renderers); + +static struct image_renderer *get_renderer(void* buf) +{ + struct image_renderer *ir; + enum filetype type = file_detect_type(buf); + + list_for_each_entry(ir, &image_renderers, list) { + if (ir->type == type) + return ir; + } + + return NULL; +} + +struct image *image_renderer_open(const char* file) +{ + void *data; + int size; + struct image_renderer *ir; + struct image *img; + int ret; + + data = read_file(file, &size); + if (!data) { + printf("unable to read %s\n", file); + return ERR_PTR(-ENOMEM); + } + + ir = get_renderer(data); + if (!ir) { + ret = -ENOENT; + goto out; + } + + img = ir->open(data, size); + if (IS_ERR(img)) { + ret = PTR_ERR(img); + goto out; + } + img->ir = ir; + if (!ir->keep_file_data) + free(data); + + return img; +out: + free(data); + return ERR_PTR(ret); +} + +void image_renderer_close(struct image *img) +{ + if (!img) + return; + + img->ir->close(img); + + free(img); +} + +int image_renderer_image(struct fb_info *info, struct image *img, void* fb, + int startx, int starty, void* offscreenbuf) +{ + return img->ir->renderer(info, img, fb, startx, starty, offscreenbuf); +} + +int image_renderer_register(struct image_renderer *ir) +{ + if (!ir || !ir->type || !ir->renderer || !ir->open || !ir->close) + return -EIO; + + list_add_tail(&ir->list, &image_renderers); + + return 0; +} + +void image_renderer_unregister(struct image_renderer *ir) +{ + if (!ir) + return; + + list_del(&ir->list); +} |