diff options
Diffstat (limited to 'slideshow/src/effect/ivug-anim.c')
-rwxr-xr-x | slideshow/src/effect/ivug-anim.c | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/slideshow/src/effect/ivug-anim.c b/slideshow/src/effect/ivug-anim.c new file mode 100755 index 0000000..5c46a87 --- /dev/null +++ b/slideshow/src/effect/ivug-anim.c @@ -0,0 +1,177 @@ +/*
+ * Copyright 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.tizenopensource.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ + +#include <stddef.h> /* for NULL */ +#include <memory.h> +#include <stdlib.h> + +#include "ivug-debug.h" +#include "ivug-anim.h" + +/* + t: current time b: start time c: change in value d: duration +*/ +static double _anim_linear(double t, double b, double c, double d) +{ + if(d != 0.0) + t /= d; + return b + c * (t); +} + +static double _anim_sine(double t, double b, double c, double d) +{ +/* TODO : Consider below table reconstruct. need only 0.0 ~ 1.0 range*/ + static const double const SIN_TABLE[91] = { + 0.0000f, 0.0174f, 0.0349f, 0.0523f, 0.0698f, + 0.0872f, 0.1045f, 0.1219f, 0.1392f, 0.1564f, + 0.1736f, 0.1908f, 0.2079f, 0.2249f, 0.2419f, + 0.2588f, 0.2756f, 0.2924f, 0.3090f, 0.3256f, + 0.3420f, 0.3584f, 0.3746f, 0.3907f, 0.4067f, + 0.4226f, 0.4384f, 0.4540f, 0.4695f, 0.4848f, + 0.5000f, 0.5150f, 0.5299f, 0.5446f, 0.5592f, + 0.5736f, 0.5878f, 0.6018f, 0.6157f, 0.6293f, + 0.6528f, 0.6561f, 0.6691f, 0.6820f, 0.6947f, + 0.7071f, 0.7193f, 0.7314f, 0.7431f, 0.7547f, + 0.7660f, 0.7772f, 0.7880f, 0.7986f, 0.8090f, + 0.8191f, 0.8290f, 0.8387f, 0.8480f, 0.8571f, + 0.8660f, 0.8746f, 0.8829f, 0.8910f, 0.8988f, + 0.9063f, 0.9135f, 0.9205f, 0.9272f, 0.9336f, + 0.9397f, 0.9455f, 0.9511f, 0.9563f, 0.9613f, + 0.9659f, 0.9703f, 0.9744f, 0.9781f, 0.9816f, + 0.9848f, 0.9877f, 0.9903f, 0.9926f, 0.9945f, + 0.9962f, 0.9976f, 0.9986f, 0.9994f, 0.9998f, + 1.0f + }; + + if(d != 0.0) + t /= d; /* normalize */ + + int idx = (int)(90.0 * t); + + return b + c * (SIN_TABLE[idx]); + +} + +static double _anim_ease_inout_quartic(double t, double b, + double c, double d) +{ + if(d != 0.0) + t /= d; + double ts = t * t; + double tc = ts * t; + return b + c * (-2 * tc + 3 * ts); + +} + +static double _anim_ease_inout_quintic(double t, double b, + double c, double d) +{ + if(d != 0.0) + t /= d; + double ts = t * t; + double tc = ts * t; + return b + c * (6 * tc * ts + -15 * ts * ts + 10 * tc); +} + +anim_handle_t *create_animation() +{ + anim_handle_t *anim; + + anim = calloc(1, sizeof(anim_handle_t)); + + if (anim == NULL) { + MSG_IVUG_ERROR("Cannot allocate memory"); + return NULL; + } + + return anim; + +} + +void delete_animation(anim_handle_t *anim) +{ + IV_ASSERT(anim != NULL); + + free(anim); + +} + +bool set_animation_type(anim_handle_t *anim, anim_type_t type) +{ + IV_ASSERT(anim != NULL); + + switch (type) { + case ANIM_TYPE_LINEAR: + anim->transit_func = _anim_linear; + break; + case ANIM_TYPE_QUARTIC_INOUT: + anim->transit_func = _anim_ease_inout_quartic; + break; + + case ANIM_TYPE_QUINTIC_INOUT: + anim->transit_func = _anim_ease_inout_quintic; + break; + + case ANIM_TYPE_SINE: + anim->transit_func = _anim_sine; + break; + default: + MSG_IVUG_ERROR("Invalid transition type=%d", type); + return false; + break; + } + + return true; +} + +bool set_animation(anim_handle_t *anim, int start, int end, double duration) +{ + IV_ASSERT(anim != NULL); + + //MSG_IVUG_HIGH("Set Anim. Start=%d End=%d Dur=%f", start, end, duration); + anim->duration = duration; + anim->t_start = start; + anim->t_varing = end - start; + + return true; +} + +bool update_animation(anim_handle_t *anim, double current, double *value) +{ + //MSG_IVUG_HIGH("update_animation"); + IV_ASSERT(anim != NULL); + IV_ASSERT(anim->transit_func != NULL); + + if (current >= anim->duration) { + *value = anim->t_start + anim->t_varing; + //MSG_IVUG_HIGH("End Start:%f Varing:%f Duration=%f", + //anim->t_start, anim->t_varing, anim->duration); + + //MSG_IVUG_HIGH("End Current=%f Value=%f", current, *value); + + return false; /* End of animation */ + } + + MSG_EFFECT_LOW("Start:%f Varing:%f Duration=%f Current=%f", anim->t_start, anim->t_varing, anim->duration, current); + + *value = anim->transit_func(current, anim->t_start, anim->t_varing, + anim->duration); + + MSG_EFFECT_LOW("Value = %f", *value); + + return true; +} |