WEBP loader: Enable loading animated images (first frame by default)

This commit is contained in:
Kim Woelders 2021-11-02 19:52:00 +01:00
parent d9e2854f23
commit d4fa61dc50
2 changed files with 38 additions and 37 deletions

View File

@ -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

View File

@ -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);