From 6d690577ffa6cb51a101c15c5634e719583f1fec Mon Sep 17 00:00:00 2001 From: Igor Murzov Date: Sun, 1 May 2011 04:37:03 +0400 Subject: add support for webp image format --- GNUmakefile | 9 ++++-- fbi.man | 4 +-- rd/read-webp.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 101 insertions(+), 5 deletions(-) create mode 100644 rd/read-webp.c diff --git a/GNUmakefile b/GNUmakefile index 1ef958b..c96e635 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -46,6 +46,7 @@ HAVE_LIBPCD := $(call ac_lib,pcd_open,pcd) HAVE_LIBUNGIF := $(call ac_lib,DGifOpenFileName,ungif) HAVE_LIBPNG := $(call ac_lib,png_read_info,png,-lz) HAVE_LIBTIFF := $(call ac_lib,TIFFOpen,tiff) +HAVE_LIBWEBP := $(call ac_lib,WebPDecodeRGBA,webp) #HAVE_LIBMAGICK := $(call ac_binary,Magick-config) HAVE_LIBSANE := $(call ac_lib,sane_init,sane) HAVE_LIBCURL := $(call ac_lib,curl_easy_init,curl) @@ -73,9 +74,9 @@ endif # conditional stuff includes = ENDIAN_H STRCASESTR NEW_EXIF -libraries = PCD UNGIF PNG TIFF CURL SANE LIRC -ida_libs = PCD UNGIF PNG TIFF CURL SANE -fbi_libs = PCD UNGIF PNG TIFF CURL LIRC +libraries = PCD UNGIF PNG TIFF WEBP CURL SANE LIRC +ida_libs = PCD UNGIF PNG TIFF WEBP CURL SANE +fbi_libs = PCD UNGIF PNG TIFF WEBP CURL LIRC #MAGICK_CFLAGS = $(shell Magick-config --cflags) #MAGICK_LDFLAGS = $(shell Magick-config --ldflags) @@ -84,6 +85,7 @@ fbi_libs = PCD UNGIF PNG TIFF CURL LIRC PNG_LDLIBS := -lpng -lz TIFF_LDLIBS := -ltiff +WEBP_LDLIBS := -lwebp PCD_LDLIBS := -lpcd UNGIF_LDLIBS := -lungif SANE_LDLIBS := -lsane @@ -92,6 +94,7 @@ LIRC_LDLIBS := -llirc_client PNG_OBJS := rd/read-png.o wr/write-png.o TIFF_OBJS := rd/read-tiff.o wr/write-tiff.o +WEBP_OBJS := rd/read-webp.o PCD_OBJS := rd/read-pcd.o UNGIF_OBJS := rd/read-gif.o SANE_OBJS := sane.o diff --git a/fbi.man b/fbi.man index e04af2f..46fc8c6 100644 --- a/fbi.man +++ b/fbi.man @@ -13,8 +13,8 @@ fbi - Linux framebuffer imageviewer .BR fbi displays the specified file(s) on the linux console using the framebuffer device. -\fIPhotoCD\fP, \fIjpeg\fP, \fIppm\fP, \fIgif\fP, \fItiff\fP, \fIxwd\fP, -\fIbmp\fP and \fIpng\fP are supported directly. +\fIPhotoCD\fP, \fIjpeg\fP, \fIppm\fP, \fIgif\fP, \fItiff\fP, \fIxwd\fP, +\fIbmp\fP, \fIpng\fP and \fIwebp\fP are supported directly. For other formats .BR fbi tries to use diff --git a/rd/read-webp.c b/rd/read-webp.c new file mode 100644 index 0000000..0dfe372 --- /dev/null +++ b/rd/read-webp.c @@ -0,0 +1,93 @@ +#include +#include +#include +#include + +#include "readers.h" + + +struct webp_state { + FILE *f; + int width, height; + uint8_t *data; +}; + +static void * +webp_init(FILE *fp, char *filename, unsigned int page, + struct ida_image_info *i, int thumbnail) +{ + uint32_t img_size; + void *img; + struct webp_state *h; + h = malloc(sizeof(*h)); + + h->f = fp; + if(fseek(fp, 0, SEEK_END) != 0) + { + free(h); + return NULL; + } + img_size = ftell(fp); + img = malloc(img_size); + + if(fseek(fp, 0, SEEK_SET) != 0) + { + free(img); + free(h); + return NULL; + } + if(fread(img, img_size, 1, fp) != 1) + { + free(img); + free(h); + return NULL; + } + + h->data = WebPDecodeRGBA(img, img_size, &h->width, &h->height); + + i->width = h->width; + i->height = h->height; + i->dpi = 100; + i->npages = 1; + + free(img); + + return h; +} + + +static void +webp_read(unsigned char *dst, unsigned int line, void *data) +{ + struct webp_state *h = data; + + load_rgba(dst, h->data + line * 4 * h->width, h->width); +} + + +static void +webp_done(void *data) +{ + struct webp_state *h = data; + + free(h->data); + fclose(h->f); + free(h); +} + + +static struct ida_loader webp_loader = { + magic: "WEBPVP8", + moff: 8, + mlen: 7, + name: "libwebp", + init: webp_init, + read: webp_read, + done: webp_done, +}; + + +static void __init init_rd(void) +{ + load_register(&webp_loader); +} -- cgit