evas_image_load_func = ie->info.loader;
evas_module_use((Evas_Module*) ie->info.module);
if (evas_image_load_func->frame_duration)
- return evas_image_load_func->frame_duration(ie, ie->file, start, frame_num);
+ {
+ Eina_File *f;
+ double r;
+
+ f = eina_file_open(ie->file, EINA_FALSE);
+ if (!f) return -1;
+
+ r = evas_image_load_func->frame_duration(f, &ie->animated, start, frame_num);
+
+ eina_file_close(f);
+
+ return r;
+ }
return -1;
}
Evas_Image_Animated *animated,
void *pixels,
int *error);
- double (*frame_duration) (Image_Entry *ie, const char *file, const int start, const int frame_num);
+ double (*frame_duration) (Eina_File *f,
+ Evas_Image_Animated *animated,
+ int start, int frame_num);
Eina_Bool do_region;
};
int bg_val;
};
-static double evas_image_load_frame_duration_gif(Image_Entry *ie, const char *file, int start_frame, int frame_num) ;
static Eina_Bool evas_image_load_specific_frame(Eina_File *f, const Evas_Image_Load_Opts *opts, Evas_Image_Property *prop, Evas_Image_Animated *animated, int frame_index, int *error);
#define byte2_to_int(a,b) (((b)<<8)|(a))
}
static double
-evas_image_load_frame_duration_gif(Image_Entry *ie, const char *file, const int start_frame, const int frame_num)
+evas_image_load_frame_duration_gif(Eina_File *f, Evas_Image_Animated *animated,
+ int start_frame, int frame_num)
{
Evas_GIF_Info egi;
- Eina_File *f;
GifFileType *gif = NULL;
GifRecordType rec;
int current_frame = 1;
double duration = -1;
int frame_count = 0;
- frame_count = ie->animated.frame_count;
+ frame_count = animated->frame_count;
- if (!ie->animated.animated) return -1;
+ if (!animated->animated) return -1;
if ((start_frame + frame_num) > frame_count) return -1;
if (frame_num < 0) return -1;
- f = eina_file_open(file, EINA_FALSE);
- if (!f) return -1;
-
egi.map = eina_file_map_all(f, EINA_FILE_SEQUENTIAL);
if (!egi.map) goto on_error;
egi.length = eina_file_size_get(f);
on_error:
if (gif) DGifCloseFile(gif);
if (egi.map) eina_file_map_free(f, egi.map);
- eina_file_close(f);
return duration;
}