aboutsummaryrefslogtreecommitdiff
path: root/image.c
diff options
context:
space:
mode:
Diffstat (limited to 'image.c')
-rw-r--r--image.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/image.c b/image.c
index 9e73993..3363d56 100644
--- a/image.c
+++ b/image.c
@@ -137,6 +137,7 @@ bool img_load_gif(img_t *img, const fileinfo_t *file) {
int intoffset[] = { 0, 4, 2, 1 };
int intjump[] = { 8, 8, 4, 2 };
int transp = -1;
+ unsigned int disposal = 0, prev_disposal = 0;
unsigned int delay = 0;
bool err = false;
@@ -178,8 +179,7 @@ bool img_load_gif(img_t *img, const fileinfo_t *file) {
if (delay)
delay = MAX(delay, MIN_GIF_DELAY);
- /* TODO: handle disposal method, section 23.c.iv of
- http://www.w3.org/Graphics/GIF/spec-gif89a.txt */
+ disposal = (unsigned int) ext[1] >> 2 & 0x7;
}
ext = NULL;
DGifGetExtensionNext(gif, &ext);
@@ -219,7 +219,7 @@ bool img_load_gif(img_t *img, const fileinfo_t *file) {
if (i < y || i >= y + h || j < x || j >= x + w ||
rows[i-y][j-x] == transp)
{
- if (prev_frame != NULL)
+ if (prev_disposal != 2 && prev_frame != NULL)
*ptr = prev_frame[i * sw + j];
else
*ptr = bgpixel;
@@ -246,12 +246,14 @@ bool img_load_gif(img_t *img, const fileinfo_t *file) {
}
imlib_context_set_image(im);
- prev_frame = imlib_image_get_data_for_reading_only();
-
imlib_image_set_format("gif");
if (transp >= 0)
imlib_image_set_has_alpha(1);
+ if (disposal != 3)
+ prev_frame = imlib_image_get_data_for_reading_only();
+ prev_disposal = disposal;
+
if (img->multi.cnt == img->multi.cap) {
img->multi.cap *= 2;
img->multi.frames = (img_frame_t*)