zmike pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=a89a2ef1dee61da73cb8d67e8c70450674d02ed5

commit a89a2ef1dee61da73cb8d67e8c70450674d02ed5
Author: Shinwoo Kim <[email protected]>
Date:   Tue Mar 10 09:27:30 2020 -0400

    evas.image: add evas_object_image_animated_frame_get
    
    this adds an api for getting the current frame of an animation
    
    Differential Revision: https://phab.enlightenment.org/D11455
---
 src/lib/evas/Evas_Legacy.h                            | 19 +++++++++++++++++++
 src/lib/evas/canvas/efl_canvas_image.c                |  8 ++++++++
 src/lib/evas/canvas/evas_image_legacy.c               |  7 +++++++
 src/lib/evas/include/evas_private.h                   |  1 +
 src/modules/evas/engines/gl_generic/evas_engine.c     | 16 ++++++++++++++++
 .../evas/engines/software_generic/evas_engine.c       | 13 +++++++++++++
 6 files changed, 64 insertions(+)

diff --git a/src/lib/evas/Evas_Legacy.h b/src/lib/evas/Evas_Legacy.h
index 78ca7df9ec..eb8850d3fc 100644
--- a/src/lib/evas/Evas_Legacy.h
+++ b/src/lib/evas/Evas_Legacy.h
@@ -4930,6 +4930,7 @@ EAPI Eina_Bool evas_object_image_animated_get(const Eo 
*obj);
  * @ref evas_object_image_animated_loop_type_get,
  * @ref evas_object_image_animated_loop_count_get,
  * @ref evas_object_image_animated_frame_duration_get.
+ * @ref evas_object_image_animated_frame_get.
  *
  * @param[in] frame_index The index of current frame.
  *
@@ -4937,6 +4938,24 @@ EAPI Eina_Bool evas_object_image_animated_get(const Eo 
*obj);
  */
 EAPI void evas_object_image_animated_frame_set(Evas_Object *obj, int 
frame_index);
 
+/**
+ * @brief Get the frame to current frame of an image object.
+ *
+ * This returns image object's current frame.
+ *
+ * See also @ref evas_object_image_animated_get,
+ * @ref evas_object_image_animated_frame_count_get,
+ * @ref evas_object_image_animated_loop_type_get,
+ * @ref evas_object_image_animated_loop_count_get,
+ * @ref evas_object_image_animated_frame_duration_get.
+ * @ref evas_object_image_animated_frame_set.
+ *
+ * @param[in] frame_index The index of current frame.
+ *
+ * @since 1.24
+ */
+EAPI int evas_object_image_animated_frame_get(Evas_Object *obj);
+
 /**
  * @brief Get the total number of frames of the image object.
  *
diff --git a/src/lib/evas/canvas/efl_canvas_image.c 
b/src/lib/evas/canvas/efl_canvas_image.c
index d45efcbf73..822c94600e 100644
--- a/src/lib/evas/canvas/efl_canvas_image.c
+++ b/src/lib/evas/canvas/efl_canvas_image.c
@@ -40,6 +40,7 @@ _evas_image_file_load(Eo *eo_obj, Evas_Image_Data *o)
    const Eina_File *f = efl_file_mmap_get(eo_obj);
    const char *key = efl_file_key_get(eo_obj);
    int load_error;
+   int frame_index;
 
    if (!o->skip_head)
      EINA_SAFETY_ON_NULL_RETURN_VAL(f, EINA_FALSE);
@@ -59,6 +60,13 @@ _evas_image_file_load(Eo *eo_obj, Evas_Image_Data *o)
      o->engine_data = ENFN->image_mmap(ENC, o->cur->f, o->cur->key, 
&load_error, &lo);
    else
      o->engine_data = ENFN->image_load(ENC, efl_file_get(eo_obj), o->cur->key, 
&load_error, &lo);
+
+   if (_evas_image_animated_get(eo_obj))
+     {
+        frame_index = ENFN->image_animated_frame_get(ENC, o->engine_data);
+        _evas_image_animated_frame_set(eo_obj, frame_index);
+     }
+
    o->load_error = _evas_load_error_to_efl_gfx_image_load_error(load_error);
    o->buffer_data_set = EINA_FALSE;
    _evas_image_done_set(eo_obj, obj, o);
diff --git a/src/lib/evas/canvas/evas_image_legacy.c 
b/src/lib/evas/canvas/evas_image_legacy.c
index 2702b31f5e..12d53a4a10 100644
--- a/src/lib/evas/canvas/evas_image_legacy.c
+++ b/src/lib/evas/canvas/evas_image_legacy.c
@@ -270,6 +270,13 @@ evas_object_image_animated_frame_set(Evas_Object *obj, int 
frame_index)
    _evas_image_animated_frame_set(obj, frame_index);
 }
 
+EAPI int
+evas_object_image_animated_frame_get(Evas_Object *obj)
+{
+   EVAS_IMAGE_API(obj, 0);
+   return _evas_image_animated_frame_get(obj);
+}
+
 EAPI int
 evas_object_image_animated_frame_count_get(const Evas_Object *obj)
 {
diff --git a/src/lib/evas/include/evas_private.h 
b/src/lib/evas/include/evas_private.h
index f0f209d3e3..3aa70bf3f8 100644
--- a/src/lib/evas/include/evas_private.h
+++ b/src/lib/evas/include/evas_private.h
@@ -1478,6 +1478,7 @@ struct _Evas_Func
    int (*image_animated_loop_count_get)  (void *engine, void *image);
    double (*image_animated_frame_duration_get) (void *engine, void *image, int 
start_frame, int frame_num);
    Eina_Bool (*image_animated_frame_set) (void *engine, void *image, int 
frame_index);
+   int (*image_animated_frame_get)       (void *engine, void *image);
 
    /* max size query */
    void (*image_max_size_get)            (void *engine, int *maxw, int *maxh);
diff --git a/src/modules/evas/engines/gl_generic/evas_engine.c 
b/src/modules/evas/engines/gl_generic/evas_engine.c
index 3f4c36c73b..e73c486073 100644
--- a/src/modules/evas/engines/gl_generic/evas_engine.c
+++ b/src/modules/evas/engines/gl_generic/evas_engine.c
@@ -2158,6 +2158,21 @@ eng_image_animated_frame_set(void *engine EINA_UNUSED, 
void *image, int frame_in
    return EINA_TRUE;
 }
 
+static int 
+eng_image_animated_frame_get(void *engine EINA_UNUSED, void *image)
+{
+   Evas_GL_Image *gim = image;
+   Image_Entry *im;
+
+   if (!gim) return EINA_FALSE;
+   im = (Image_Entry *)gim->im;
+   if (!im) return EINA_FALSE;
+
+   if (!im->animated.animated) return EINA_FALSE;
+
+   return im->animated.cur_frame;
+}
+
 static Eina_Bool
 eng_image_can_region_get(void *engine EINA_UNUSED, void *image)
 {
@@ -3308,6 +3323,7 @@ module_open(Evas_Module *em)
    ORD(image_animated_loop_count_get);
    ORD(image_animated_frame_duration_get);
    ORD(image_animated_frame_set);
+   ORD(image_animated_frame_get);
 
    ORD(image_max_size_get);
 
diff --git a/src/modules/evas/engines/software_generic/evas_engine.c 
b/src/modules/evas/engines/software_generic/evas_engine.c
index 674e698bc2..a56708fc98 100644
--- a/src/modules/evas/engines/software_generic/evas_engine.c
+++ b/src/modules/evas/engines/software_generic/evas_engine.c
@@ -2915,6 +2915,18 @@ eng_image_animated_frame_set(void *data EINA_UNUSED, 
void *image, int frame_inde
    return EINA_TRUE;
 }
 
+static int 
+eng_image_animated_frame_get(void *data EINA_UNUSED, void *image)
+{
+   Image_Entry *im;
+
+   if (!image) return EINA_FALSE;
+   im = image;
+   if (!im->animated.animated) return EINA_FALSE;
+
+   return im->animated.cur_frame;
+}
+
 static void
 _draw_thread_multi_font_draw(void *data)
 {
@@ -4777,6 +4789,7 @@ static Evas_Func func =
      eng_image_animated_loop_count_get,
      eng_image_animated_frame_duration_get,
      eng_image_animated_frame_set,
+     eng_image_animated_frame_get,
      NULL, // image_max_size_get
      eng_multi_font_draw,
      eng_pixel_alpha_get,

-- 


Reply via email to