From 4864f0445549d5d4da9afcc696312d6cb0886d40 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bert=20M=C3=BCnnich?= <ber.t@gmx.com>
Date: Tue, 11 Oct 2011 20:28:58 +0200
Subject: [PATCH] Regard gif disposal method; fix bug #18

---
 Makefile |  2 +-
 image.c  | 12 +++++++-----
 2 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/Makefile b/Makefile
index dd65786..413c10b 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-VERSION = git-20110929
+VERSION = git-20111011
 
 CC      = gcc
 CFLAGS  = -Wall -pedantic -O2
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*)