diff options
author | Bert Münnich <ber.t@gmx.com> | 2011-10-11 20:28:58 +0200 |
---|---|---|
committer | Bert Münnich <ber.t@gmx.com> | 2011-10-11 20:28:58 +0200 |
commit | 4864f0445549d5d4da9afcc696312d6cb0886d40 (patch) | |
tree | 9860bfc597917644a61ee007fd92e4462b379626 | |
parent | 71e61b13b287091480794bdb7ca2c395d2d6a42e (diff) |
Regard gif disposal method; fix bug #18
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | image.c | 12 |
2 files changed, 8 insertions, 6 deletions
@@ -1,4 +1,4 @@ -VERSION = git-20110929 +VERSION = git-20111011 CC = gcc CFLAGS = -Wall -pedantic -O2 @@ -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*) |