| @@ -83,6 +83,8 @@ void img_init(img_t *img, win_t *win) |
| 83 | 83 | | img->alpha = !RENDER_WHITE_ALPHA; |
| 84 | 84 | | img->multi.cap = img->multi.cnt = 0; |
| 85 | 85 | | img->multi.animate = false; |
| 86 | + | img->multi.anim_repeats = -1; |
| 87 | + | img->multi.repeats_currently_left = 0; |
| 86 | 88 | | |
| 87 | 89 | | img->cmod = imlib_create_color_modifier(); |
| 88 | 90 | | 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) |
| 144 | 146 | | } |
| 145 | 147 | | img->multi.cnt = 0; |
| 146 | 148 | | img->multi.sel = 0; |
| 149 | + | img->multi.anim_repeats = -1; |
| 150 | + | img->multi.repeats_currently_left = 0; |
| 147 | 151 | | |
| 148 | 152 | | #if defined(GIFLIB_MAJOR) && GIFLIB_MAJOR >= 5 |
| 149 | 153 | | gif = DGifOpenFileName(file->path, NULL); |
| @@ -170,7 +174,7 @@ bool img_load_gif(img_t *img, const fileinfo_t *file) |
| 170 | 174 | | |
| 171 | 175 | | DGifGetExtension(gif, &ext_code, &ext); |
| 172 | 176 | | while (ext) { |
| 173 | | − | if (ext_code == 0xf9) { |
| 177 | + | if (ext_code == 0xf9) { /*Graphics Control Extension*/ |
| 174 | 178 | | if (ext[1] & 1) |
| 175 | 179 | | transp = (int) ext[4]; |
| 176 | 180 | | else |
| @@ -181,6 +185,16 @@ bool img_load_gif(img_t *img, const fileinfo_t *file) |
| 181 | 185 | | delay = MAX(delay, MIN_GIF_DELAY); |
| 182 | 186 | | |
| 183 | 187 | | 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 | + | } |
| 184 | 198 | | } |
| 185 | 199 | | ext = NULL; |
| 186 | 200 | | DGifGetExtensionNext(gif, &ext); |
| @@ -797,8 +811,15 @@ bool img_frame_animate(img_t *img, bool restart) |
| 797 | 811 | | return false; |
| 798 | 812 | | |
| 799 | 813 | | 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) { |
| 801 | 821 | | img_frame_goto(img, 0); |
| 822 | + | --img->multi.repeats_currently_left; |
| 802 | 823 | | } else { |
| 803 | 824 | | img->multi.animate = false; |
| 804 | 825 | | return false; |