Merge "use modern construct '= default' for special functions." into devel/master
[platform/core/uifw/dali-core.git] / dali / public-api / animation / alpha-function.h
1 #ifndef DALI_ALPHA_FUNCTION_H
2 #define DALI_ALPHA_FUNCTION_H
3
4 /*
5  * Copyright (c) 2020 Samsung Electronics Co., Ltd.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  */
20
21 // INTERNAL INCLUDES
22 #include <dali/public-api/common/constants.h>
23 #include <dali/public-api/common/dali-common.h>
24 #include <dali/public-api/math/compile-time-math.h>
25 #include <dali/public-api/math/math-utils.h>
26 #include <dali/public-api/math/vector2.h>
27 #include <dali/public-api/math/vector4.h>
28
29 namespace Dali
30 {
31 /**
32  * @addtogroup dali_core_animation
33  * @{
34  */
35
36 using AlphaFunctionPrototype = float (*)(float); ///< Prototype of an alpha function @SINCE_1_0.0
37
38 /**
39    * @brief Alpha functions are used in animations to specify the rate of change of the animation parameter over time.
40    *
41    * Understanding an animation as a parametric function over time, the alpha function is applied to the parameter of
42    * the animation before computing the final animation value.
43    * @SINCE_1_0.0
44    */
45 class DALI_CORE_API AlphaFunction
46 {
47 public:
48   /**
49    * @brief Enumeration for built-in alpha functions.
50    * @SINCE_1_0.0
51    */
52   enum BuiltinFunction
53   {
54     DEFAULT,          ///< Linear @SINCE_1_0.0
55     LINEAR,           ///< No transformation @SINCE_1_0.0
56     REVERSE,          ///< Reverse linear @SINCE_1_0.0
57     EASE_IN_SQUARE,   ///< Speeds up and comes to a sudden stop (Square) @SINCE_1_0.0
58     EASE_OUT_SQUARE,  ///< Sudden start and slows to a gradual stop (Square) @SINCE_1_0.0
59     EASE_IN,          ///< Speeds up and comes to a sudden stop (Cubic) @SINCE_1_0.0
60     EASE_OUT,         ///< Sudden start and slows to a gradual stop (Cubic) @SINCE_1_0.0
61     EASE_IN_OUT,      ///< Speeds up and slows to a gradual stop (Cubic) @SINCE_1_0.0
62     EASE_IN_SINE,     ///< Speeds up and comes to a sudden stop (sinusoidal) @SINCE_1_0.0
63     EASE_OUT_SINE,    ///< Sudden start and slows to a gradual stop (sinusoidal) @SINCE_1_0.0
64     EASE_IN_OUT_SINE, ///< Speeds up and slows to a gradual stop (sinusoidal) @SINCE_1_0.0
65     BOUNCE,           ///< Sudden start, loses momentum and returns to start position @SINCE_1_0.0
66     SIN,              ///< Single revolution @SINCE_1_0.0
67     EASE_OUT_BACK,    ///< Sudden start, exceed end position and return to a gradual stop @SINCE_1_0.0
68     COUNT
69   };
70
71   /**
72    * @brief Enumeration for all possible functioning modes for the alpha function.
73    * @SINCE_1_0.0
74    */
75   enum Mode
76   {
77     BUILTIN_FUNCTION, ///< The user has specified a built-in function @SINCE_1_0.0
78     CUSTOM_FUNCTION,  ///< The user has provided a custom function @SINCE_1_0.0
79     BEZIER            ///< The user has provided the control points of a bezier curve @SINCE_1_0.0
80   };
81
82   /**
83    * @brief Default constructor.
84    * Creates an alpha function object with the default built-in alpha function.
85    * @SINCE_1_0.0
86    */
87   AlphaFunction();
88
89   /**
90    * @brief Constructor.
91    * Creates an alpha function object with the built-in alpha function passed as a parameter
92    * to the constructor.
93    * @SINCE_1_0.0
94    * @param[in] function One of the built-in alpha functions
95    */
96   AlphaFunction(BuiltinFunction function);
97
98   /**
99    * @brief Constructor.
100    * Creates an alpha function object using a pointer to an alpha function passed as a parameter
101    * to the constructor.
102    * @SINCE_1_0.0
103    * @param[in] function A pointer to an alpha function
104    */
105   AlphaFunction(AlphaFunctionPrototype function);
106
107   /**
108    * @brief Constructor.
109    *
110    * Creates a bezier alpha function. The bezier will have the first point at (0,0) and
111    * the end point at (1,1).
112    * @SINCE_1_0.0
113    * @param[in] controlPoint0 A Vector2 which will be used as the first control point of the curve
114    * @param[in] controlPoint1 A Vector2 which will be used as the second control point of the curve
115    * @note The x components of the control points will be clamped to the range [0,1] to prevent
116    * non monotonic curves.
117    */
118   AlphaFunction(const Dali::Vector2& controlPoint0, const Dali::Vector2& controlPoint1);
119
120   /**
121    * @brief Returns the control points of the alpha function.
122    * @SINCE_1_0.0
123    * @return Vector4 containing the two control points of the curve
124    * (xy for the first point and zw for the second)
125    */
126   Vector4 GetBezierControlPoints() const;
127
128   /**
129    * @brief Returns the pointer to the custom function.
130    * @SINCE_1_0.0
131    * @return A pointer to a custom alpha function, or @c 0 if not defined
132    */
133   AlphaFunctionPrototype GetCustomFunction() const;
134
135   /**
136    * @brief Returns the built-in function used by the alpha function.
137    * @SINCE_1_0.0
138    * @return One of the built-in alpha functions. In case no built-in function
139    * has been specified, it will return AlphaFunction::DEFAULT
140    */
141   BuiltinFunction GetBuiltinFunction() const;
142
143   /**
144    * @brief Returns the functioning mode of the alpha function
145    * @SINCE_1_0.0
146    * @return The functioning mode of the alpha function
147    */
148   Mode GetMode() const;
149
150 private:
151   Vector4                mBezierControlPoints;             //< Control points for the bezier alpha function
152   AlphaFunctionPrototype mCustom;                          //< Pointer to an alpha function
153   BuiltinFunction        mBuiltin : Log<COUNT>::value + 1; //< Enum indicating the built-in alpha function
154   Mode                   mMode : 2;                        //< Enum indicating the functioning mode of the AlphaFunction
155 };
156
157 /**
158  * @}
159  */
160 } // namespace Dali
161
162 #endif // DALI_ALPHA_FUNCTION_H