summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKim Woelders <kim@woelders.dk>2021-12-25 17:31:46 +0100
committerKim Woelders <kim@woelders.dk>2021-12-26 11:00:14 +0100
commit2bbd3dc7f9b88ea27d58e98a83f2d28a71b0e046 (patch)
treec61a56a373e986b9f4f3d5e3296e472309800fc4
parent3a93e9a92a209c7c0c61aadf7be740ece573e020 (diff)
downloadimlib2-2bbd3dc7f9b88ea27d58e98a83f2d28a71b0e046.tar.gz
Updates for animated image handling
-rw-r--r--src/bin/imlib2_view.c4
-rw-r--r--src/lib/Imlib2.h.in5
-rw-r--r--src/lib/image.h5
-rw-r--r--src/modules/loaders/loader_gif.c4
-rw-r--r--src/modules/loaders/loader_webp.c4
5 files changed, 14 insertions, 8 deletions
diff --git a/src/bin/imlib2_view.c b/src/bin/imlib2_view.c
index 029dfde..6b95536 100644
--- a/src/bin/imlib2_view.c
+++ b/src/bin/imlib2_view.c
@@ -227,7 +227,7 @@ progress(Imlib_Image im, char percent, int update_x, int update_y,
}
else
{
- if (finfo.frame_flags & IMLIB_FRAME_CLEAR)
+ if (finfo.frame_flags & IMLIB_FRAME_DISPOSE_CLEAR)
{
bg_pm_init(0);
}
@@ -266,7 +266,7 @@ progress(Imlib_Image im, char percent, int update_x, int update_y,
update_w, update_h,
up_wx, up_wy, up_ww, up_wh);
- if (finfo.frame_flags & IMLIB_FRAME_CLEAR)
+ if (finfo.frame_flags & IMLIB_FRAME_DISPOSE_CLEAR)
XClearWindow(disp, win);
else
XClearArea(disp, win, up_wx, up_wy, up_ww, up_wh, False);
diff --git a/src/lib/Imlib2.h.in b/src/lib/Imlib2.h.in
index 5e67aeb..b901ca4 100644
--- a/src/lib/Imlib2.h.in
+++ b/src/lib/Imlib2.h.in
@@ -613,8 +613,9 @@ typedef struct {
} Imlib_Frame_Info;
/* frame info flags */
-#define IMLIB_IMAGE_ANIMATED (1 << 0) /* Frames are an animated sequence */
-#define IMLIB_FRAME_CLEAR (1 << 1) /* Clear before rendering frame */
+#define IMLIB_IMAGE_ANIMATED (1 << 0) /* Frames are an animated sequence */
+#define IMLIB_FRAME_DISPOSE_CLEAR (1 << 1) /* Clear before rendering next frame */
+#define IMLIB_FRAME_BLEND (1 << 2) /* Blend current onto previous frame */
EAPI Imlib_Image imlib_load_image_frame(const char *file, int frame);
EAPI void imlib_image_get_frame_info(Imlib_Frame_Info * info);
diff --git a/src/lib/image.h b/src/lib/image.h
index de8e27e..904b1bd 100644
--- a/src/lib/image.h
+++ b/src/lib/image.h
@@ -30,8 +30,9 @@ enum _iflags {
typedef enum _iflags ImlibImageFlags;
/* Must match the ones in Imlib2.h.in */
-#define FF_IMAGE_ANIMATED (1 << 0) /* Frames are an animated sequence */
-#define FF_FRAME_CLEAR (1 << 1) /* Clear before rendering frame */
+#define FF_IMAGE_ANIMATED (1 << 0) /* Frames are an animated sequence */
+#define FF_FRAME_DISPOSE_CLEAR (1 << 1) /* Clear before rendering next frame */
+#define FF_FRAME_BLEND (1 << 2) /* Blend current onto previous frame */
typedef struct {
int left, right, top, bottom;
diff --git a/src/modules/loaders/loader_gif.c b/src/modules/loaders/loader_gif.c
index b3f8657..e8bd582 100644
--- a/src/modules/loaders/loader_gif.c
+++ b/src/modules/loaders/loader_gif.c
@@ -197,8 +197,8 @@ load2(ImlibImage * im, int load_data)
if (bits & 1)
transp = ext[4];
disp = (bits >> 2) & 0x7;
- if (disp == 2)
- im->frame_flags |= FF_FRAME_CLEAR;
+ if (disp == 2 || disp == 3)
+ im->frame_flags |= FF_FRAME_DISPOSE_CLEAR;
D(" Frame %d: disp=%d ui=%d tr=%d, delay=%d transp = #%02x\n", //
gif->ImageCount + 1, disp, (bits >> 1) & 1, bits & 1,
im->frame_delay, transp);
diff --git a/src/modules/loaders/loader_webp.c b/src/modules/loaders/loader_webp.c
index 5a57b20..7243172 100644
--- a/src/modules/loaders/loader_webp.c
+++ b/src/modules/loaders/loader_webp.c
@@ -61,6 +61,10 @@ load2(ImlibImage * im, int load_data)
im->frame_x = iter.x_offset;
im->frame_y = iter.y_offset;
im->frame_delay = iter.duration;
+ if (iter.dispose_method == WEBP_MUX_DISPOSE_BACKGROUND)
+ im->frame_flags |= FF_FRAME_DISPOSE_CLEAR;
+ if (iter.blend_method == WEBP_MUX_BLEND)
+ im->frame_flags |= FF_FRAME_BLEND;
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,