Quellcode durchsuchen

Regard gif disposal method; fix bug #18

master
Bert Münnich vor 13 Jahren
Ursprung
Commit
4864f04455
2 geänderte Dateien mit 8 neuen und 6 gelöschten Zeilen
  1. +1
    -1
      Makefile
  2. +7
    -5
      image.c

+ 1
- 1
Makefile Datei anzeigen

@@ -1,4 +1,4 @@
VERSION = git-20110929 VERSION = git-20111011


CC = gcc CC = gcc
CFLAGS = -Wall -pedantic -O2 CFLAGS = -Wall -pedantic -O2


+ 7
- 5
image.c Datei anzeigen

@@ -137,6 +137,7 @@ bool img_load_gif(img_t *img, const fileinfo_t *file) {
int intoffset[] = { 0, 4, 2, 1 }; int intoffset[] = { 0, 4, 2, 1 };
int intjump[] = { 8, 8, 4, 2 }; int intjump[] = { 8, 8, 4, 2 };
int transp = -1; int transp = -1;
unsigned int disposal = 0, prev_disposal = 0;
unsigned int delay = 0; unsigned int delay = 0;
bool err = false; bool err = false;


@@ -178,8 +179,7 @@ bool img_load_gif(img_t *img, const fileinfo_t *file) {
if (delay) if (delay)
delay = MAX(delay, MIN_GIF_DELAY); delay = MAX(delay, MIN_GIF_DELAY);


/* TODO: handle disposal method, section 23.c.iv of disposal = (unsigned int) ext[1] >> 2 & 0x7;
http://www.w3.org/Graphics/GIF/spec-gif89a.txt */
} }
ext = NULL; ext = NULL;
DGifGetExtensionNext(gif, &ext); 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 || if (i < y || i >= y + h || j < x || j >= x + w ||
rows[i-y][j-x] == transp) rows[i-y][j-x] == transp)
{ {
if (prev_frame != NULL) if (prev_disposal != 2 && prev_frame != NULL)
*ptr = prev_frame[i * sw + j]; *ptr = prev_frame[i * sw + j];
else else
*ptr = bgpixel; *ptr = bgpixel;
@@ -246,12 +246,14 @@ bool img_load_gif(img_t *img, const fileinfo_t *file) {
} }


imlib_context_set_image(im); imlib_context_set_image(im);
prev_frame = imlib_image_get_data_for_reading_only();

imlib_image_set_format("gif"); imlib_image_set_format("gif");
if (transp >= 0) if (transp >= 0)
imlib_image_set_has_alpha(1); 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) { if (img->multi.cnt == img->multi.cap) {
img->multi.cap *= 2; img->multi.cap *= 2;
img->multi.frames = (img_frame_t*) img->multi.frames = (img_frame_t*)


||||||
x
 
000:0
Laden…
Abbrechen
Speichern