From: Jiyoun Park <jy0703.park@samsung.com>

Subject: RE: [E-devel] [Patch] Animation gif feature patch

Animated gif suport in evas and api's to handle animated images and
frame flipping. from jy.



SVN revision: 62331
This commit is contained in:
Jiyoun Park 2011-08-11 06:04:08 +00:00 committed by Carsten Haitzler
parent c2d2867a2b
commit dae46003e7
26 changed files with 1242 additions and 195 deletions

View File

@ -744,6 +744,13 @@ typedef enum _Evas_Image_Scale_Hint
EVAS_IMAGE_SCALE_HINT_STATIC = 2 /**< Image is not being re-scaled over time, thus turning scaling cache @b on for its data */ EVAS_IMAGE_SCALE_HINT_STATIC = 2 /**< Image is not being re-scaled over time, thus turning scaling cache @b on for its data */
} Evas_Image_Scale_Hint; /**< How an image's data is to be treated by Evas, with regard to scaling cache */ } Evas_Image_Scale_Hint; /**< How an image's data is to be treated by Evas, with regard to scaling cache */
typedef enum _Evas_Image_Animated_Loop_Hint
{
EVAS_IMAGE_ANIMATED_HINT_NONE = 0,
EVAS_IMAGE_ANIMATED_HINT_LOOP = 1, /**< Image's animation mode is loop like 1->2->3->1->2->3 */
EVAS_IMAGE_ANIMATED_HINT_PINGPONG = 2 /**< Image's animation mode is pingpong like 1->2->3->2->1-> ... */
} Evas_Image_Animated_Loop_Hint;
typedef enum _Evas_Engine_Render_Mode typedef enum _Evas_Engine_Render_Mode
{ {
EVAS_RENDER_MODE_BLOCKING = 0, EVAS_RENDER_MODE_BLOCKING = 0,
@ -7088,6 +7095,121 @@ EAPI Eina_Bool evas_object_image_extension_can_load_get(const char *file);
*/ */
EAPI Eina_Bool evas_object_image_extension_can_load_fast_get(const char *file); EAPI Eina_Bool evas_object_image_extension_can_load_fast_get(const char *file);
/**
* Get the animation of an image object.
*
* @param obj Image object
* @return whether obj support animation
*
* This returns the possibility of animation of image object's image
* currently Evas only support animation of gif file type.
*
* Example:
* @code
* extern Evas_Object *object;
*
*
* if (evas_object_image_animated_get(obj))
* {
* int frame_count;
* int loop_count;
* Evas_Image_Animated_Loop_Hint loop_type;
* double duration;
*
* frame_count = evas_object_image_animated_frame_count_get(obj);
* printf("This image has %d frames\n",frame_count);
*
* duration = evas_object_image_animated_frame_duration_get(obj,1,0);
* printf("Frame 1's duration is %f. You had better set object's frame to 2 after this duration using timer\n");
*
* loop_count = evas_object_image_animated_loop_count_get(obj);
* printf("loop count is %d. You had better run loop %d times\n",loop_count,loop_count);
*
* loop_type = evas_object_image_animated_loop_type_get(obj);
* if (loop_type == EVAS_IMAGE_ANIMATED_HINT_LOOP)
* printf("You had better set frame like 1->2->3->1->2->3...\n");
* else if (loop_type == EVAS_IMAGE_ANIMATED_HINT_PINGPONG)
* printf("You had better set frame like 1->2->3->2->1->2...\n");
* else
* printf("Unknown loop type\n");
*
* evas_object_image_animated_frame_set(obj,1);
* printf("You set image object's frame to 1. You can see frame 1\n");
* }
*
* @endcode
*/
EAPI Eina_Bool evas_object_image_animated_get(const Evas_Object *obj);
/**
* Get the total frame number of image object's file.
*
* @param obj Image object
* @return the number of frame
*
* This returns total frame number of image object's file.
* See @ref evas_object_image_animated_get for more details.
*/
EAPI int evas_object_image_animated_frame_num_get(const Evas_Object *obj);
/**
* Get the loop type of an animated image object.
*
* @param obj Image object
* @return loop type of animated image object
*
* This returns loop type.
* If Evas_Image_Animated_Loop_Hint is EVAS_IMAGE_ANIMATED_HINT_LOOP, It is better to set sequence like 1->2->3->1->2->3
* If Evas_Image_Animated_Loop_Hint is EVAS_IMAGE_ANIMATED_HINT_PINGPONG, It is better to set sequence like 1->2->3->2->1->2
* Default type is EVAS_IMAGE_ANIMATED_HINT_LOOP.
*
* See @ref evas_object_image_animated_get for more details.
*/
EAPI Evas_Image_Animated_Loop_Hint evas_object_image_animated_loop_type_get(const Evas_Object *obj);
/**
* Get the number of loop of an animated image object.
*
* @param obj Image object
* @return the number of loop of an animated image object
*
* This returns loop count of image.
* Default value is 0. It means infinite loop.
* If loop count is 1, you can set each frame only one time.
*
* See @ref evas_object_image_animated_get for more details.
*/
EAPI int evas_object_image_animated_loop_count_get(const Evas_Object *obj);
/**
* Get the duration of frames of an image object.
*
* @param obj Image object
* @param start_frame start frame
* @param fram_num number of frames which want to duration
*
* This returns total duration of frames.
* For example.
* If you set start_frame to 1 and frame_num 0, you can frame 1's duration
* If you set start_frame to 1 and frame_num 1, you can frame1 duration + frame2 duration
*
* See @ref evas_object_image_animated_get for more details.
*
*/
EAPI double evas_object_image_animated_frame_duration_get(const Evas_Object *obj, int start_frame, int fram_num);
/**
* Set the frame to current frame of an image object must render
*
* @param obj The given image object.
* @param frame_num The index of current frame
*
* This set image object's current frame to frame_num.
* If you set frame_num to 5, evas will render frame 5 of image when rendering time
*
* See @ref evas_object_image_animated_get for more details.
*/
EAPI void evas_object_image_animated_frame_set(Evas_Object *obj, int frame_num);
/** /**
* @} * @}
*/ */

View File

@ -1166,7 +1166,7 @@ evas_cache_image_load_data(Image_Entry *im)
#endif #endif
int error = EVAS_LOAD_ERROR_NONE; int error = EVAS_LOAD_ERROR_NONE;
if (im->flags.loaded) return error; if ((im->flags.loaded) && (!im->flags.animated)) return error;
#ifdef BUILD_ASYNC_PRELOAD #ifdef BUILD_ASYNC_PRELOAD
if (im->preload) if (im->preload)
{ {
@ -1190,7 +1190,7 @@ evas_cache_image_load_data(Image_Entry *im)
LKU(wakeup); LKU(wakeup);
} }
if (im->flags.loaded) return error; if ((im->flags.loaded) && (!im->flags.animated)) return error;
LKL(im->lock); LKL(im->lock);
#endif #endif
im->flags.in_progress = EINA_TRUE; im->flags.in_progress = EINA_TRUE;

View File

@ -37,6 +37,7 @@ struct _Evas_Object_Image
Evas_Map *defmap; Evas_Map *defmap;
const char *file; const char *file;
const char *key; const char *key;
int frame;
int cspace; int cspace;
unsigned char smooth_scale : 1; unsigned char smooth_scale : 1;
@ -1858,6 +1859,7 @@ evas_object_image_alpha_mask_set(Evas_Object *obj, Eina_Bool ismask)
} }
#define FRAME_MAX 1024
EAPI Evas_Image_Content_Hint EAPI Evas_Image_Content_Hint
evas_object_image_content_hint_get(const Evas_Object *obj) evas_object_image_content_hint_get(const Evas_Object *obj)
{ {
@ -1873,6 +1875,152 @@ evas_object_image_content_hint_get(const Evas_Object *obj)
return o->content_hint; return o->content_hint;
} }
/* animated feature */
EAPI Eina_Bool
evas_object_image_animated_get(const Evas_Object *obj)
{
Evas_Object_Image *o;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return EINA_FALSE;
MAGIC_CHECK_END();
o = (Evas_Object_Image *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
return EINA_FALSE;
MAGIC_CHECK_END();
if (obj->layer->evas->engine.func->image_animated_get)
return obj->layer->evas->engine.func->image_animated_get(obj->layer->evas->engine.data.output, o->engine_data);
return EINA_FALSE;
}
EAPI int
evas_object_image_animated_frame_count_get(const Evas_Object *obj)
{
Evas_Object_Image *o;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return -1;
MAGIC_CHECK_END();
o = (Evas_Object_Image *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
return -1;
MAGIC_CHECK_END();
if (!evas_object_image_animated_get(obj)) return -1;
if (obj->layer->evas->engine.func->image_animated_frame_count_get)
return obj->layer->evas->engine.func->image_animated_frame_count_get(obj->layer->evas->engine.data.output, o->engine_data);
return -1;
}
EAPI Evas_Image_Animated_Loop_Hint
evas_object_image_animated_loop_type_get(const Evas_Object *obj)
{
Evas_Object_Image *o;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return EVAS_IMAGE_ANIMATED_HINT_NONE;
MAGIC_CHECK_END();
o = (Evas_Object_Image *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
return EVAS_IMAGE_ANIMATED_HINT_NONE;
MAGIC_CHECK_END();
if (!evas_object_image_animated_get(obj)) return EVAS_IMAGE_ANIMATED_HINT_NONE;
if (obj->layer->evas->engine.func->image_animated_loop_type_get)
return obj->layer->evas->engine.func->image_animated_loop_type_get(obj->layer->evas->engine.data.output, o->engine_data);
return EVAS_IMAGE_ANIMATED_HINT_NONE;
}
EAPI int
evas_object_image_animated_loop_count_get(const Evas_Object *obj)
{
Evas_Object_Image *o;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return -1;
MAGIC_CHECK_END();
o = (Evas_Object_Image *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
return -1;
MAGIC_CHECK_END();
if (!evas_object_image_animated_get(obj)) return -1;
if (obj->layer->evas->engine.func->image_animated_loop_count_get)
return obj->layer->evas->engine.func->image_animated_loop_count_get(obj->layer->evas->engine.data.output, o->engine_data);
return -1;
}
EAPI double
evas_object_image_animated_frame_duration_get(const Evas_Object *obj, int start_frame, int frame_num)
{
Evas_Object_Image *o;
int frame_count = 0;
if (start_frame < 1) return -1;
if (frame_num < 0) return -1;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return -1;
MAGIC_CHECK_END();
o = (Evas_Object_Image *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
return -1;
MAGIC_CHECK_END();
if (!evas_object_image_animated_get(obj)) return -1;
if (!obj->layer->evas->engine.func->image_animated_frame_count_get) return -1;
frame_count = obj->layer->evas->engine.func->image_animated_frame_count_get(obj->layer->evas->engine.data.output, o->engine_data);
if ((start_frame + frame_num) > frame_count) return -1;
if (obj->layer->evas->engine.func->image_animated_frame_duration_get)
return obj->layer->evas->engine.func->image_animated_frame_duration_get(obj->layer->evas->engine.data.output, o->engine_data, start_frame, frame_num);
return -1;
}
EAPI void
evas_object_image_animated_frame_set(Evas_Object *obj, int frame_index)
{
Evas_Object_Image *o;
int frame_count = 0;
Eina_Bool animated = EINA_FALSE;
char frame_index_char[4];
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
o = (Evas_Object_Image *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
return;
MAGIC_CHECK_END();
if (!o->cur.file) return;
if (o->cur.frame == frame_index) return;
if (!evas_object_image_animated_get(obj)) return;
frame_count = evas_object_image_animated_frame_count_get(obj);
/* limit the size of frame to FRAME_MAX */
if ((frame_count > FRAME_MAX) || (frame_count < 0) || (frame_index > frame_count))
return;
if (!obj->layer->evas->engine.func->image_animated_frame_set) return;
if (!obj->layer->evas->engine.func->image_animated_frame_set(obj->layer->evas->engine.data.output, o->engine_data, frame_index))
return;
o->prev.frame = o->cur.frame;
o->cur.frame = frame_index;
o->changed = 1;
evas_object_change(obj);
}
EAPI void EAPI void
evas_image_cache_flush(Evas *e) evas_image_cache_flush(Evas *e)
{ {
@ -3000,6 +3148,12 @@ evas_object_image_render_pre(Evas_Object *obj)
evas_object_render_pre_prev_cur_add(&e->clip_changes, obj); evas_object_render_pre_prev_cur_add(&e->clip_changes, obj);
if (!o->pixel_updates) goto done; if (!o->pixel_updates) goto done;
} }
if (o->cur.frame != o->prev.frame)
{
evas_object_render_pre_prev_cur_add(&e->clip_changes, obj);
if (!o->pixel_updates) goto done;
}
} }
/* if it changed geometry - and obviously not visibility or color */ /* if it changed geometry - and obviously not visibility or color */
/* calculate differences since we have a constant color fill */ /* calculate differences since we have a constant color fill */

View File

@ -54,6 +54,7 @@ EAPI void
EAPI int evas_common_load_rgba_image_module_from_file (Image_Entry *im); EAPI int evas_common_load_rgba_image_module_from_file (Image_Entry *im);
EAPI int evas_common_load_rgba_image_data_from_file (Image_Entry *im); EAPI int evas_common_load_rgba_image_data_from_file (Image_Entry *im);
EAPI double evas_common_load_rgba_image_frame_duration_from_file(Image_Entry *im, int start_frame, int frame_num);
void _evas_common_rgba_image_post_surface(Image_Entry *ie); void _evas_common_rgba_image_post_surface(Image_Entry *ie);

View File

@ -309,7 +309,7 @@ evas_common_load_rgba_image_data_from_file(Image_Entry *ie)
Evas_Image_Load_Func *evas_image_load_func = NULL; Evas_Image_Load_Func *evas_image_load_func = NULL;
int ret = EVAS_LOAD_ERROR_NONE; int ret = EVAS_LOAD_ERROR_NONE;
if (ie->flags.loaded) return EVAS_LOAD_ERROR_GENERIC; if ((ie->flags.loaded) && (!ie->flags.animated)) return EVAS_LOAD_ERROR_GENERIC;
#ifdef EVAS_CSERVE #ifdef EVAS_CSERVE
if (ie->data1) if (ie->data1)
@ -346,6 +346,20 @@ evas_common_load_rgba_image_data_from_file(Image_Entry *ie)
return EVAS_LOAD_ERROR_NONE; return EVAS_LOAD_ERROR_NONE;
} }
EAPI double
evas_common_load_rgba_image_frame_duration_from_file(Image_Entry *ie, const int start, const int frame_num)
{
Evas_Image_Load_Func *evas_image_load_func = NULL;
if (!ie->info.module) return -1;
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);
return -1;
}
EAPI Eina_Bool EAPI Eina_Bool
evas_common_extension_can_load_get(const char *file) evas_common_extension_can_load_get(const char *file)
{ {

View File

@ -188,6 +188,20 @@ _evas_common_rgba_image_delete(Image_Entry *ie)
} }
} }
*/ */
if (ie->frames)
{
Eina_List *l;
Image_Entry_Frame *frame;
EINA_LIST_FOREACH(ie->frames, l, frame)
{
if (frame)
{
if (frame->data) free(frame->data);
if (frame->info) free(frame->info);
free (frame);
}
}
}
free(im); free(im);
} }
@ -351,6 +365,7 @@ _evas_common_rgba_image_surface_delete(Image_Entry *ie)
else if (ie->data1) else if (ie->data1)
evas_cserve_image_free(ie); evas_cserve_image_free(ie);
#endif #endif
im->image.data = NULL; im->image.data = NULL;
ie->allocated.w = 0; ie->allocated.w = 0;
ie->allocated.h = 0; ie->allocated.h = 0;

View File

@ -728,7 +728,7 @@ evas_common_rgba_image_scalecache_do(Image_Entry *ie, RGBA_Image *dst,
didpop = 1; didpop = 1;
} }
} }
if (sci->im) if (sci->im && !ie->flags.animated)
{ {
if (!didpop) if (!didpop)
{ {

View File

@ -357,6 +357,7 @@ typedef unsigned char DATA8;
typedef struct _Image_Entry Image_Entry; typedef struct _Image_Entry Image_Entry;
typedef struct _Image_Entry_Flags Image_Entry_Flags; typedef struct _Image_Entry_Flags Image_Entry_Flags;
typedef struct _Image_Entry_Frame Image_Entry_Frame;
typedef struct _Image_Timestamp Image_Timestamp; typedef struct _Image_Timestamp Image_Timestamp;
typedef struct _Engine_Image_Entry Engine_Image_Entry; typedef struct _Engine_Image_Entry Engine_Image_Entry;
typedef struct _Evas_Cache_Target Evas_Cache_Target; typedef struct _Evas_Cache_Target Evas_Cache_Target;
@ -511,6 +512,15 @@ struct _Image_Entry_Flags
Eina_Bool delete_me : 1; Eina_Bool delete_me : 1;
Eina_Bool pending : 1; Eina_Bool pending : 1;
#endif #endif
Eina_Bool animated : 1;
};
struct _Image_Entry_Frame
{
int index;
DATA32 *data; /* frame decoding data */
void *info; /* special image type info */
Eina_Bool loaded : 1;
}; };
struct _Evas_Cache_Target struct _Evas_Cache_Target
@ -593,6 +603,13 @@ struct _Image_Entry
int connect_num; int connect_num;
int channel; int channel;
int load_error; int load_error;
/* for animation feature */
int frame_count;
Evas_Image_Animated_Loop_Hint loop_hint;
int loop_count;
int cur_frame;
Eina_List *frames;
}; };
struct _Engine_Image_Entry struct _Engine_Image_Entry

View File

@ -818,6 +818,14 @@ struct _Evas_Func
void *(*gl_api_get) (void *data); void *(*gl_api_get) (void *data);
int (*image_load_error_get) (void *data, void *image); int (*image_load_error_get) (void *data, void *image);
int (*font_run_end_get) (void *data, Evas_Font_Set *font, Evas_Font_Instance **script_fi, Evas_Font_Instance **cur_fi, Evas_Script_Type script, const Eina_Unicode *text, int run_len); int (*font_run_end_get) (void *data, Evas_Font_Set *font, Evas_Font_Instance **script_fi, Evas_Font_Instance **cur_fi, Evas_Script_Type script, const Eina_Unicode *text, int run_len);
/* animated feature */
Eina_Bool (*image_animated_get) (void *data, void *image);
int (*image_animated_frame_count_get) (void *data, void *image);
Evas_Image_Animated_Loop_Hint (*image_animated_loop_type_get) (void *data, void *image);
int (*image_animated_loop_count_get) (void *data, void *image);
double (*image_animated_frame_duration_get) (void *data, void *image, int start_frame, int frame_num);
Eina_Bool (*image_animated_frame_set) (void *data, void *image, int frame_index);
}; };
struct _Evas_Image_Load_Func struct _Evas_Image_Load_Func
@ -825,6 +833,7 @@ struct _Evas_Image_Load_Func
Eina_Bool threadable; Eina_Bool threadable;
Eina_Bool (*file_head) (Image_Entry *ie, const char *file, const char *key, int *error); Eina_Bool (*file_head) (Image_Entry *ie, const char *file, const char *key, int *error);
Eina_Bool (*file_data) (Image_Entry *ie, const char *file, const char *key, int *error); Eina_Bool (*file_data) (Image_Entry *ie, const char *file, const char *key, int *error);
double (*frame_duration) (Image_Entry *ie, const char *file, const int start, const int frame_num);
}; };
struct _Evas_Image_Save_Func struct _Evas_Image_Save_Func

View File

@ -2902,6 +2902,74 @@ eng_image_load_error_get(void *data __UNUSED__, void *image)
return im->im->cache_entry.load_error; return im->im->cache_entry.load_error;
} }
static Eina_Bool
eng_image_animated_get(void *data __UNUSED__, void *image)
{
Image_Entry *im;
if (!image) return EINA_FALSE;
im = image;
return im->flags.animated;
}
static int
eng_image_animated_frame_count_get(void *data __UNUSED__, void *image)
{
Image_Entry *im;
if (!image) return -1;
im = image;
if (!im->flags.animated) return -1;
return im->frame_count;
}
static Evas_Image_Animated_Loop_Hint
eng_image_animated_loop_type_get(void *data __UNUSED__, void *image)
{
Image_Entry *im;
if (!image) return EVAS_IMAGE_ANIMATED_HINT_NONE;
im = image;
if (!im->flags.animated) return EVAS_IMAGE_ANIMATED_HINT_NONE;
return im->loop_hint;
}
static int
eng_image_animated_loop_count_get(void *data __UNUSED__, void *image)
{
Image_Entry *im;
if (!image) return -1;
im = image;
if (!im->flags.animated) return -1;
return im->loop_count;
}
static double
eng_image_animated_frame_duration_get(void *data __UNUSED__, void *image, int start_frame, int frame_num)
{
Image_Entry *im;
if (!image) return -1;
im = image;
if (!im->flags.animated) return -1;
return evas_common_load_rgba_image_frame_duration_from_file(im, start_frame, frame_num);
}
static Eina_Bool
eng_image_animated_frame_set(void *data __UNUSED__, void *image, int frame_index)
{
Image_Entry *im;
if (!image) return EINA_FALSE;
im = image;
if (!im->flags.animated) return EINA_FALSE;
if (im->cur_frame == frame_index) return EINA_FALSE;
im->cur_frame = frame_index;
return EINA_TRUE;
}
static int static int
module_open(Evas_Module *em) module_open(Evas_Module *em)
{ {
@ -3010,6 +3078,14 @@ module_open(Evas_Module *em)
ORD(image_load_error_get); ORD(image_load_error_get);
/* now advertise out own api */
ORD(image_animated_get);
ORD(image_animated_frame_count_get);
ORD(image_animated_loop_type_get);
ORD(image_animated_loop_count_get);
ORD(image_animated_frame_duration_get);
ORD(image_animated_frame_set);
/* now advertise out own api */ /* now advertise out own api */
em->functions = (void *)(&func); em->functions = (void *)(&func);
return 1; return 1;

View File

@ -653,6 +653,73 @@ eng_image_scale_hint_get(void *data __UNUSED__, void *image)
return im->scale_hint; return im->scale_hint;
} }
static Eina_Bool
eng_image_animated_get(void *data __UNUSED__, void *image)
{
Image_Entry *im;
if (!image) return EINA_FALSE;
im = image;
return im->flags.animated;
}
static int
eng_image_animated_frame_count_get(void *data __UNUSED__, void *image)
{
Image_Entry *im;
if (!image) return -1;
im = image;
if (!im->flags.animated) return -1;
return im->frame_count;
}
static Evas_Image_Animated_Loop_Hint
eng_image_animated_loop_type_get(void *data __UNUSED__, void *image)
{
Image_Entry *im;
if (!image) return EVAS_IMAGE_ANIMATED_HINT_NONE;
im = image;
if (!im->flags.animated) return EVAS_IMAGE_ANIMATED_HINT_NONE;
return im->loop_hint;
}
static int
eng_image_animated_loop_count_get(void *data __UNUSED__, void *image)
{
Image_Entry *im;
if (!image) return -1;
im = image;
if (!im->flags.animated) return -1;
return im->loop_count;
}
static double
eng_image_animated_frame_duration_get(void *data __UNUSED__, void *image, int start_frame, int frame_num)
{
Image_Entry *im;
if (!image) return -1;
im = image;
if (!im->flags.animated) return -1;
return evas_common_load_rgba_image_frame_duration_from_file(im, start_frame, frame_num);
}
static Eina_Bool
eng_image_animated_frame_set(void *data __UNUSED__, void *image, int frame_index)
{
Image_Entry *im;
if (!image) return EINA_FALSE;
im = image;
if (!im->flags.animated) return EINA_FALSE;
if (im->cur_frame == frame_index) return EINA_FALSE;
im->cur_frame = frame_index;
return EINA_TRUE;
}
static void static void
eng_image_cache_flush(void *data __UNUSED__) eng_image_cache_flush(void *data __UNUSED__)
{ {
@ -1099,7 +1166,13 @@ static Evas_Func func =
NULL, // FIXME: need software mesa for gl rendering <- gl_native_surface_get NULL, // FIXME: need software mesa for gl rendering <- gl_native_surface_get
NULL, // FIXME: need software mesa for gl rendering <- gl_api_get NULL, // FIXME: need software mesa for gl rendering <- gl_api_get
eng_image_load_error_get, eng_image_load_error_get,
eng_font_run_font_end_get eng_font_run_font_end_get,
eng_image_animated_get,
eng_image_animated_frame_count_get,
eng_image_animated_loop_type_get,
eng_image_animated_loop_count_get,
eng_image_animated_frame_duration_get,
eng_image_animated_frame_set
/* FUTURE software generic calls go here */ /* FUTURE software generic calls go here */
}; };

View File

@ -18,7 +18,8 @@ static Evas_Image_Load_Func evas_image_load_bmp_func =
{ {
EINA_TRUE, EINA_TRUE,
evas_image_load_file_head_bmp, evas_image_load_file_head_bmp,
evas_image_load_file_data_bmp evas_image_load_file_data_bmp,
NULL
}; };
static int static int

View File

@ -15,7 +15,8 @@ static Evas_Image_Load_Func evas_image_load_edb_func =
{ {
EINA_TRUE, EINA_TRUE,
evas_image_load_file_head_edb, evas_image_load_file_head_edb,
evas_image_load_file_data_edb evas_image_load_file_data_edb,
NULL
}; };
static Eina_Bool static Eina_Bool

View File

@ -15,7 +15,8 @@ Evas_Image_Load_Func evas_image_load_eet_func =
{ {
EINA_TRUE, EINA_TRUE,
evas_image_load_file_head_eet, evas_image_load_file_head_eet,
evas_image_load_file_data_eet evas_image_load_file_data_eet,
NULL
}; };

View File

@ -23,7 +23,8 @@ Evas_Image_Load_Func evas_image_load_generic_func =
{ {
EINA_TRUE, EINA_TRUE,
evas_image_load_file_head_generic, evas_image_load_file_head_generic,
evas_image_load_file_data_generic evas_image_load_file_data_generic,
NULL
}; };
static Eina_Bool static Eina_Bool

File diff suppressed because it is too large Load Diff

View File

@ -18,7 +18,8 @@ static Evas_Image_Load_Func evas_image_load_ico_func =
{ {
EINA_TRUE, EINA_TRUE,
evas_image_load_file_head_ico, evas_image_load_file_head_ico,
evas_image_load_file_data_ico evas_image_load_file_data_ico,
NULL
}; };
static int static int

View File

@ -45,7 +45,8 @@ static Evas_Image_Load_Func evas_image_load_jpeg_func =
{ {
EINA_TRUE, EINA_TRUE,
evas_image_load_file_head_jpeg, evas_image_load_file_head_jpeg,
evas_image_load_file_data_jpeg evas_image_load_file_data_jpeg,
NULL
}; };

View File

@ -18,7 +18,8 @@ static Eina_Bool evas_image_load_file_data_pmaps(Image_Entry *ie, const char *fi
Evas_Image_Load_Func evas_image_load_pmaps_func = { Evas_Image_Load_Func evas_image_load_pmaps_func = {
EINA_TRUE, EINA_TRUE,
evas_image_load_file_head_pmaps, evas_image_load_file_head_pmaps,
evas_image_load_file_data_pmaps evas_image_load_file_data_pmaps,
NULL
}; };
/* The buffer to load pmaps images */ /* The buffer to load pmaps images */

View File

@ -34,7 +34,8 @@ static Evas_Image_Load_Func evas_image_load_png_func =
{ {
EINA_TRUE, EINA_TRUE,
evas_image_load_file_head_png, evas_image_load_file_head_png,
evas_image_load_file_data_png evas_image_load_file_data_png,
NULL
}; };
static Eina_Bool static Eina_Bool

View File

@ -940,7 +940,8 @@ get_compressed_channels_length(PSD_Header *head,
static const Evas_Image_Load_Func evas_image_load_psd_func = { static const Evas_Image_Load_Func evas_image_load_psd_func = {
EINA_TRUE, EINA_TRUE,
evas_image_load_file_head_psd, evas_image_load_file_head_psd,
evas_image_load_file_data_psd evas_image_load_file_data_psd,
NULL
}; };
static int static int

View File

@ -12,7 +12,8 @@ Evas_Image_Load_Func evas_image_load_svg_func =
{ {
EINA_FALSE, EINA_FALSE,
evas_image_load_file_head_svg, evas_image_load_file_head_svg,
evas_image_load_file_data_svg evas_image_load_file_data_svg,
NULL
}; };
static int rsvg_initialized = 0; static int rsvg_initialized = 0;

View File

@ -61,7 +61,8 @@ static Evas_Image_Load_Func evas_image_load_tga_func =
{ {
EINA_TRUE, EINA_TRUE,
evas_image_load_file_head_tga, evas_image_load_file_head_tga,
evas_image_load_file_data_tga evas_image_load_file_data_tga,
NULL
}; };
static Eina_Bool static Eina_Bool

View File

@ -33,7 +33,8 @@ static Evas_Image_Load_Func evas_image_load_tiff_func =
{ {
EINA_TRUE, EINA_TRUE,
evas_image_load_file_head_tiff, evas_image_load_file_head_tiff,
evas_image_load_file_data_tiff evas_image_load_file_data_tiff,
NULL
}; };
typedef struct TIFFRGBAImage_Extra TIFFRGBAImage_Extra; typedef struct TIFFRGBAImage_Extra TIFFRGBAImage_Extra;

View File

@ -18,7 +18,8 @@ static Evas_Image_Load_Func evas_image_load_wbmp_func =
{ {
EINA_TRUE, EINA_TRUE,
evas_image_load_file_head_wbmp, evas_image_load_file_head_wbmp,
evas_image_load_file_data_wbmp evas_image_load_file_data_wbmp,
NULL
}; };

View File

@ -23,7 +23,8 @@ static Evas_Image_Load_Func evas_image_load_xpm_func =
{ {
EINA_FALSE, EINA_FALSE,
evas_image_load_file_head_xpm, evas_image_load_file_head_xpm,
evas_image_load_file_data_xpm evas_image_load_file_data_xpm,
NULL
}; };
// TODO: REWRITE THIS WITH THREAD SAFE VERSION NOT USING THIS HANDLE!!!! // TODO: REWRITE THIS WITH THREAD SAFE VERSION NOT USING THIS HANDLE!!!!