summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKim Woelders <kim@woelders.dk>2021-12-12 16:51:17 +0100
committerKim Woelders <kim@woelders.dk>2021-12-19 14:58:43 +0100
commitb2ac97d93a2539a53a780d112ce2c1153efa1d53 (patch)
tree77c0f8f27d739ff27a053b09a4edd20f746b6de1
parent549ff77b856179cd034164debd8b9f64d69f5126 (diff)
downloadimlib2-b2ac97d93a2539a53a780d112ce2c1153efa1d53.tar.gz
WEBP loader: Multiframe support
-rw-r--r--src/modules/loaders/loader_webp.c32
1 files changed, 22 insertions, 10 deletions
diff --git a/src/modules/loaders/loader_webp.c b/src/modules/loaders/loader_webp.c
index c114715..5a57b20 100644
--- a/src/modules/loaders/loader_webp.c
+++ b/src/modules/loaders/loader_webp.c
@@ -34,26 +34,38 @@ load2(ImlibImage * im, int load_data)
if (!demux)
goto quit;
- /* Key may select frame other than first */
frame = 1;
- if (im->key)
+ if (im->frame_num > 0)
{
- frame = atoi(im->key);
- iter.num_frames = WebPDemuxGetI(demux, WEBP_FF_FRAME_COUNT);
- if (frame > iter.num_frames)
- frame = 0; /* Select last */
+ frame = im->frame_num;
+ im->frame_count = WebPDemuxGetI(demux, WEBP_FF_FRAME_COUNT);
+ if (im->frame_count > 1)
+ im->frame_flags |= FF_IMAGE_ANIMATED;
+ im->canvas_w = WebPDemuxGetI(demux, WEBP_FF_CANVAS_WIDTH);
+ im->canvas_h = WebPDemuxGetI(demux, WEBP_FF_CANVAS_HEIGHT);
+
+ D("Canvas WxH=%dx%d frames=%d\n",
+ im->canvas_w, im->canvas_h, im->frame_count);
+
+ if (frame > 1 && frame > im->frame_count)
+ goto quit;
}
if (!WebPDemuxGetFrame(demux, frame, &iter))
goto quit;
- 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;
+ im->frame_x = iter.x_offset;
+ im->frame_y = iter.y_offset;
+ im->frame_delay = iter.duration;
+
+ D("Canvas WxH=%dx%d frame=%d/%d X,Y=%d,%d WxH=%dx%d alpha=%d T=%d dm=%d co=%d bl=%d\n", //
+ im->canvas_w, im->canvas_h, iter.frame_num, im->frame_count,
+ im->frame_x, im->frame_y, im->w, im->h, iter.has_alpha,
+ im->frame_delay, iter.dispose_method, iter.complete, iter.blend_method);
if (!IMAGE_DIMENSIONS_OK(im->w, im->h))
goto quit;
@@ -77,7 +89,7 @@ load2(ImlibImage * im, int load_data)
goto quit;
if (im->lc)
- __imlib_LoadProgressRows(im, 0, im->h);
+ __imlib_LoadProgress(im, im->frame_x, im->frame_y, im->w, im->h);
rc = LOAD_SUCCESS;