Krolyxon
Commit 078136d

Branches

Refs →

nsxiv078136d

Read GIF's repeat information from file.

Author
Aleksander Nitecki
Date
2013-12-30 23:16 +0100
Parent
99dfd14
Commit
078136d2176e89e99505332d57c2297cfa5faad8

+26 −3

3 files changed

  1. M config.def.h +1 −1
  2. M image.c +23 −2
  3. M image.h +2 −0
M config.def.h View
@@ -43,7 +43,7 @@ static const float zoom_levels[] = {
4343 enum {
4444 GIF_DELAY = 100, /* delay time (in ms) */
4545 GIF_AUTOPLAY = 1, /* autoplay when loaded [0/1] */
46− GIF_LOOP = 0 /* endless loop [0/1] */
46+ GIF_LOOP = -1 /* endless loop [0 / 1 / -1=as specified in file] */
4747 };
4848
4949 /* gamma correction: the user-visible ranges [-GAMMA_RANGE, 0] and
M image.c View
@@ -83,6 +83,8 @@ void img_init(img_t *img, win_t *win)
8383 img->alpha = !RENDER_WHITE_ALPHA;
8484 img->multi.cap = img->multi.cnt = 0;
8585 img->multi.animate = false;
86+ img->multi.anim_repeats = -1;
87+ img->multi.repeats_currently_left = 0;
8688
8789 img->cmod = imlib_create_color_modifier();
8890 img->gamma = MIN(MAX(options->gamma, -GAMMA_RANGE), GAMMA_RANGE);
@@ -144,6 +146,8 @@ bool img_load_gif(img_t *img, const fileinfo_t *file)
144146 }
145147 img->multi.cnt = 0;
146148 img->multi.sel = 0;
149+ img->multi.anim_repeats = -1;
150+ img->multi.repeats_currently_left = 0;
147151
148152 #if defined(GIFLIB_MAJOR) && GIFLIB_MAJOR >= 5
149153 gif = DGifOpenFileName(file->path, NULL);
@@ -170,7 +174,7 @@ bool img_load_gif(img_t *img, const fileinfo_t *file)
170174
171175 DGifGetExtension(gif, &ext_code, &ext);
172176 while (ext) {
173− if (ext_code == 0xf9) {
177+ if (ext_code == 0xf9) { /*Graphics Control Extension*/
174178 if (ext[1] & 1)
175179 transp = (int) ext[4];
176180 else
@@ -181,6 +185,16 @@ bool img_load_gif(img_t *img, const fileinfo_t *file)
181185 delay = MAX(delay, MIN_GIF_DELAY);
182186
183187 disposal = (unsigned int) ext[1] >> 2 & 0x7;
188+ } else if (ext_code == 0xff) { /*Application Extension*/
189+ if(ext[0] == 11 && memcmp(ext+1, "NETSCAPE2.0", 11) == 0) {
190+ DGifGetExtensionNext(gif, &ext);
191+
192+ if(ext && ext[0] == 3 && ext[1] == 1) {
193+ img->multi.repeats_currently_left =
194+ img->multi.anim_repeats =
195+ ((unsigned int) ext[3] << 8 | (unsigned int) ext[2]);
196+ }
197+ }
184198 }
185199 ext = NULL;
186200 DGifGetExtensionNext(gif, &ext);
@@ -797,8 +811,15 @@ bool img_frame_animate(img_t *img, bool restart)
797811 return false;
798812
799813 if (img->multi.sel + 1 >= img->multi.cnt) {
800− if (restart || GIF_LOOP) {
814+ if (GIF_LOOP == 1 || (GIF_LOOP == -1 && img->multi.anim_repeats == 0) ) {
815+ img_frame_goto(img, 0);
816+ } else if(restart) {
817+ img_frame_goto(img, 0);
818+ img->multi.repeats_currently_left =
819+ (img->multi.anim_repeats != -1 ? img->multi.anim_repeats : 0);
820+ } else if(GIF_LOOP == -1 && img->multi.repeats_currently_left != 0) {
801821 img_frame_goto(img, 0);
822+ --img->multi.repeats_currently_left;
802823 } else {
803824 img->multi.animate = false;
804825 return false;
M image.h View
@@ -35,6 +35,8 @@ typedef struct {
3535 int cnt;
3636 int sel;
3737 bool animate;
38+ int anim_repeats; // -1=don't repeat, 0=repeat infinitely, N=repeat N times
39+ unsigned int repeats_currently_left;
3840 } multi_img_t;
3941
4042 typedef struct {