kwo pushed a commit to branch master. http://git.enlightenment.org/legacy/imlib2.git/commit/?id=d4fa61dc500d80de1b6ca7059b8fb25173a3cf70
commit d4fa61dc500d80de1b6ca7059b8fb25173a3cf70 Author: Kim Woelders <[email protected]> Date: Tue Nov 2 19:52:00 2021 +0100 WEBP loader: Enable loading animated images (first frame by default) --- configure.ac | 2 +- src/modules/loaders/loader_webp.c | 73 ++++++++++++++++++++------------------- 2 files changed, 38 insertions(+), 37 deletions(-) diff --git a/configure.ac b/configure.ac index cdf3391..2eb8217 100644 --- a/configure.ac +++ b/configure.ac @@ -214,7 +214,7 @@ AC_ARG_WITH([webp], AC_MSG_RESULT($webp_loader) if test "$webp_loader" != no ; then - PKG_CHECK_MODULES(WEBP, libwebp, [ webp_ok="yes" ], [ webp_ok="no" ]) + PKG_CHECK_MODULES(WEBP, libwebpdemux, [ webp_ok="yes" ], [ webp_ok="no" ]) else webp_ok="no" fi diff --git a/src/modules/loaders/loader_webp.c b/src/modules/loaders/loader_webp.c index bf9d515..8079b79 100644 --- a/src/modules/loaders/loader_webp.c +++ b/src/modules/loaders/loader_webp.c @@ -2,43 +2,20 @@ #include <sys/mman.h> #include <webp/decode.h> +#include <webp/demux.h> #include <webp/encode.h> -#if 0 /* Unused */ -static const char * -webp_strerror(VP8StatusCode code) -{ - switch (code) - { - case VP8_STATUS_OK: - return "No Error"; - case VP8_STATUS_OUT_OF_MEMORY: - return "Out of memory"; - case VP8_STATUS_INVALID_PARAM: - return "Invalid API parameter"; - case VP8_STATUS_BITSTREAM_ERROR: - return "Bitstream Error"; - case VP8_STATUS_UNSUPPORTED_FEATURE: - return "Unsupported Feature"; - case VP8_STATUS_SUSPENDED: - return "Suspended"; - case VP8_STATUS_USER_ABORT: - return "User abort"; - case VP8_STATUS_NOT_ENOUGH_DATA: - return "Not enough data/truncated file"; - default: - return "Unknown error"; - } -} -#endif +#define DBG_PFX "LDR-webp" int load2(ImlibImage * im, int load_data) { int rc; void *fdata; - WebPBitstreamFeatures features; - VP8StatusCode vp8return; + WebPData webp_data; + WebPDemuxer *demux; + WebPIterator iter; + int frame; rc = LOAD_FAIL; @@ -47,19 +24,40 @@ load2(ImlibImage * im, int load_data) fdata = mmap(0, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0); if (fdata == MAP_FAILED) + return rc; + + webp_data.bytes = fdata; + webp_data.size = im->fsize; + + /* Init (includes signature check) */ + demux = WebPDemux(&webp_data); + if (!demux) goto quit; - vp8return = WebPGetFeatures(fdata, im->fsize, &features); - if (vp8return != VP8_STATUS_OK) + /* Key may select frame other than first */ + frame = 1; + if (im->key) + { + frame = atoi(im->key); + if (frame > iter.num_frames) + frame = 0; /* Select last */ + } + + if (!WebPDemuxGetFrame(demux, frame, &iter)) goto quit; - im->w = features.width; - im->h = features.height; + D("Frame=%d/%d X,Y=%d,%d WxH=%dx%d\n", iter.frame_num, iter.num_frames, + iter.x_offset, iter.y_offset, iter.width, iter.height); + + WebPDemuxReleaseIterator(&iter); + + im->w = iter.width; + im->h = iter.height; if (!IMAGE_DIMENSIONS_OK(im->w, im->h)) goto quit; - UPDATE_FLAG(im->flags, F_HAS_ALPHA, features.has_alpha); + UPDATE_FLAG(im->flags, F_HAS_ALPHA, iter.has_alpha); if (!load_data) { @@ -72,8 +70,9 @@ load2(ImlibImage * im, int load_data) if (!__imlib_AllocateData(im)) goto quit; - if (WebPDecodeBGRAInto(fdata, im->fsize, (uint8_t *) im->data, - sizeof(DATA32) * im->w * im->h, im->w * 4) == NULL) + if (WebPDecodeBGRAInto + (iter.fragment.bytes, iter.fragment.size, (uint8_t *) im->data, + sizeof(DATA32) * im->w * im->h, im->w * 4) == NULL) goto quit; if (im->lc) @@ -84,6 +83,8 @@ load2(ImlibImage * im, int load_data) quit: if (rc <= 0) __imlib_FreeData(im); + if (demux) + WebPDemuxDelete(demux); if (fdata != MAP_FAILED) munmap(fdata, im->fsize); --
