From 9f8f70cd3b59cc069a2d7a2886b8d69a8fde411e Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Tue, 24 Sep 2019 15:43:00 -0400 Subject: [PATCH] efl_ui/image: implement efl.player::playback_speed methods Reviewed-by: Cedric BAIL Differential Revision: https://phab.enlightenment.org/D10121 --- src/lib/elementary/efl_ui_image.c | 29 +++++++++++++++++--- src/lib/elementary/efl_ui_image.eo | 1 + src/lib/elementary/efl_ui_image_zoomable.c | 31 +++++++++++++++++++--- src/lib/elementary/efl_ui_image_zoomable.eo | 1 + src/lib/elementary/efl_ui_image_zoomable_private.h | 1 + src/lib/elementary/efl_ui_widget_image.h | 1 + 6 files changed, 57 insertions(+), 7 deletions(-) diff --git a/src/lib/elementary/efl_ui_image.c b/src/lib/elementary/efl_ui_image.c index ba71e49..16f1f73 100644 --- a/src/lib/elementary/efl_ui_image.c +++ b/src/lib/elementary/efl_ui_image.c @@ -141,7 +141,7 @@ _efl_ui_image_animate_cb(void *data) (sd->img, sd->cur_frame, 0); if (sd->frame_duration > 0) - ecore_timer_interval_set(sd->anim_timer, sd->frame_duration); + ecore_timer_interval_set(sd->anim_timer, sd->frame_duration * sd->playback_speed); return ECORE_CALLBACK_RENEW; } @@ -889,6 +889,7 @@ _efl_ui_image_efl_object_constructor(Eo *obj, Efl_Ui_Image_Data *pd) pd->self = obj; /* legacy elm_image starts paused */ pd->paused = elm_widget_is_legacy(obj); + pd->playback_speed = 1; return obj; } @@ -1777,7 +1778,7 @@ _efl_ui_image_animated_set_internal(Eo *obj, Efl_Ui_Image_Data *sd, Eina_Bool an evas_object_image_animated_frame_set(sd->img, sd->cur_frame); if (!sd->paused)//legacy sd->anim_timer = ecore_timer_add - (sd->frame_duration, _efl_ui_image_animate_cb, obj); + (sd->frame_duration * sd->playback_speed, _efl_ui_image_animate_cb, obj); } else { @@ -1826,6 +1827,28 @@ _efl_ui_image_efl_player_playing_get(const Eo *obj, Efl_Ui_Image_Data *sd) } EOLIAN static void +_efl_ui_image_efl_player_playback_speed_set(Eo *obj EINA_UNUSED, Efl_Ui_Image_Data *sd, double factor) +{ + EINA_SAFETY_ON_TRUE_RETURN(factor < 0.0); + EINA_SAFETY_ON_TRUE_RETURN(EINA_DBL_EQ(factor, 0.0)); + if (EINA_DBL_EQ(sd->playback_speed, factor)) return; + sd->playback_speed = factor; + if (sd->edje) + efl_player_playback_speed_set(sd->img, factor); + else if (sd->anim_timer) + { + ecore_timer_interval_set(sd->anim_timer, sd->frame_duration * sd->playback_speed); + ecore_timer_reset(sd->anim_timer); + } +} + +EOLIAN static double +_efl_ui_image_efl_player_playback_speed_get(const Eo *obj EINA_UNUSED, Efl_Ui_Image_Data *sd) +{ + return sd->playback_speed; +} + +EOLIAN static void _efl_ui_image_efl_player_playback_position_set(Eo *obj EINA_UNUSED, Efl_Ui_Image_Data *sd, double sec) { EINA_SAFETY_ON_TRUE_RETURN(sec < 0.0); @@ -1874,7 +1897,7 @@ _efl_ui_image_animated_paused_set_internal(Eo *obj, Efl_Ui_Image_Data *sd, Eina_ if (!paused) { sd->anim_timer = ecore_timer_add - (sd->frame_duration, _efl_ui_image_animate_cb, obj); + (sd->frame_duration * sd->playback_speed, _efl_ui_image_animate_cb, obj); } else { diff --git a/src/lib/elementary/efl_ui_image.eo b/src/lib/elementary/efl_ui_image.eo index 5d32abd..f4a8dbc 100644 --- a/src/lib/elementary/efl_ui_image.eo +++ b/src/lib/elementary/efl_ui_image.eo @@ -102,6 +102,7 @@ class Efl.Ui.Image extends Efl.Ui.Widget implements Efl.Input.Clickable, Efl.Ui. Efl.Player.paused { get; set; } Efl.Player.playback_position { get; set; } Efl.Player.playback_progress { get; } + Efl.Player.playback_speed { get; set; } Efl.Layout.Signal.signal_emit; Efl.Layout.Signal.message_send; Efl.Layout.Signal.signal_callback_add; diff --git a/src/lib/elementary/efl_ui_image_zoomable.c b/src/lib/elementary/efl_ui_image_zoomable.c index 00c71a0..8e8323f 100644 --- a/src/lib/elementary/efl_ui_image_zoomable.c +++ b/src/lib/elementary/efl_ui_image_zoomable.c @@ -1951,12 +1951,13 @@ _efl_ui_image_zoomable_efl_canvas_group_group_member_add(Eo *obj, Efl_Ui_Image_Z } EOLIAN static Eo * -_efl_ui_image_zoomable_efl_object_constructor(Eo *obj, Efl_Ui_Image_Zoomable_Data *_pd EINA_UNUSED) +_efl_ui_image_zoomable_efl_object_constructor(Eo *obj, Efl_Ui_Image_Zoomable_Data *pd) { obj = efl_constructor(efl_super(obj, MY_CLASS)); evas_object_smart_callbacks_descriptions_set(obj, _smart_callbacks); efl_access_object_role_set(obj, EFL_ACCESS_ROLE_IMAGE); legacy_object_focus_handle(obj); + pd->playback_speed = 1; return obj; } @@ -3047,7 +3048,7 @@ _efl_ui_image_zoomable_animate_cb(void *data) (sd->img, sd->cur_frame, 0); if (sd->frame_duration > 0) - ecore_timer_interval_set(sd->anim_timer, sd->frame_duration); + ecore_timer_interval_set(sd->anim_timer, sd->frame_duration * sd->playback_speed); return ECORE_CALLBACK_RENEW; } @@ -3077,7 +3078,7 @@ _efl_ui_image_zoomable_animated_set_internal(Eo *obj EINA_UNUSED, Efl_Ui_Image_Z evas_object_image_animated_frame_set(sd->img, sd->cur_frame); if (!sd->paused)//legacy sd->anim_timer = ecore_timer_add - (sd->frame_duration, _efl_ui_image_zoomable_animate_cb, obj); + (sd->frame_duration * sd->playback_speed, _efl_ui_image_zoomable_animate_cb, obj); } else { @@ -3104,7 +3105,7 @@ _efl_ui_image_zoomable_animated_paused_set_internal(Eo *obj, Efl_Ui_Image_Zoomab if (!paused) { sd->anim_timer = ecore_timer_add - (sd->frame_duration, _efl_ui_image_zoomable_animate_cb, obj); + (sd->frame_duration * sd->playback_speed, _efl_ui_image_zoomable_animate_cb, obj); } else { @@ -3140,6 +3141,28 @@ _efl_ui_image_zoomable_efl_player_paused_get(const Eo *obj EINA_UNUSED, Efl_Ui_I } EOLIAN static void +_efl_ui_image_zoomable_efl_player_playback_speed_set(Eo *obj EINA_UNUSED, Efl_Ui_Image_Zoomable_Data *sd, double factor) +{ + EINA_SAFETY_ON_TRUE_RETURN(factor < 0.0); + EINA_SAFETY_ON_TRUE_RETURN(EINA_DBL_EQ(factor, 0.0)); + if (EINA_DBL_EQ(sd->playback_speed, factor)) return; + sd->playback_speed = factor; + if (sd->edje) + efl_player_playback_speed_set(sd->edje, factor); + else if (sd->anim_timer) + { + ecore_timer_interval_set(sd->anim_timer, sd->frame_duration * sd->playback_speed); + ecore_timer_reset(sd->anim_timer); + } +} + +EOLIAN static double +_efl_ui_image_zoomable_efl_player_playback_speed_get(const Eo *obj EINA_UNUSED, Efl_Ui_Image_Zoomable_Data *sd) +{ + return sd->playback_speed; +} + +EOLIAN static void _efl_ui_image_zoomable_efl_player_playback_position_set(Eo *obj EINA_UNUSED, Efl_Ui_Image_Zoomable_Data *sd, double sec) { EINA_SAFETY_ON_TRUE_RETURN(sec < 0.0); diff --git a/src/lib/elementary/efl_ui_image_zoomable.eo b/src/lib/elementary/efl_ui_image_zoomable.eo index 40dca93..945cfab 100644 --- a/src/lib/elementary/efl_ui_image_zoomable.eo +++ b/src/lib/elementary/efl_ui_image_zoomable.eo @@ -48,6 +48,7 @@ class @beta Efl.Ui.Image_Zoomable extends Efl.Ui.Image implements Efl.Ui.Zoom Efl.Player.paused { get; set; } Efl.Player.playback_position { get; set; } Efl.Player.playback_progress { get; } + Efl.Player.playback_speed { get; set; } Efl.Ui.Zoom.zoom_animation { set; get; } Efl.Ui.Zoom.zoom_level { set; get; } Efl.Ui.Zoom.zoom_mode { set; get; } diff --git a/src/lib/elementary/efl_ui_image_zoomable_private.h b/src/lib/elementary/efl_ui_image_zoomable_private.h index aaf011a..5fbafd5 100644 --- a/src/lib/elementary/efl_ui_image_zoomable_private.h +++ b/src/lib/elementary/efl_ui_image_zoomable_private.h @@ -126,6 +126,7 @@ struct _Efl_Ui_Image_Zoomable_Data Ecore_Timer *anim_timer; double frame_duration; + double playback_speed; int cur_frame; int frame_count; diff --git a/src/lib/elementary/efl_ui_widget_image.h b/src/lib/elementary/efl_ui_widget_image.h index 3089eb8..b04c177 100644 --- a/src/lib/elementary/efl_ui_widget_image.h +++ b/src/lib/elementary/efl_ui_widget_image.h @@ -57,6 +57,7 @@ struct _Efl_Ui_Image_Data double scale; double frame_duration; + double playback_speed; double align_x, align_y; Eina_Size2D load_size; -- 2.7.4