Fork for IVI: mesa fixing
[profile/ivi/uifw.git] / src / ui / animations / FUiAnim_VisualElementAnimationKeyFrame.cpp
1 //
2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
4 //
5 // Licensed under the Flora License, Version 1.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 //     http://floralicense.org/license/
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an AS IS BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17
18 /**
19  * @file        FUiAnim_VisualElementAnimationKeyFrame.cpp
20  * @brief       This file contains implementation of _VisualElementAnimationKeyFrame class
21  *
22  * This file contains implementation _VisualElementAnimationKeyFrame class.
23  */
24
25 #include <FBaseSysLog.h>
26 #include <FBaseFloat.h>
27
28 #include "FUi_Math.h"
29 #include "FUiAnim_VariantEx.h"
30 #include "FUiAnim_VisualElementAnimationKeyFrame.h"
31
32 namespace Tizen { namespace Ui { namespace Animations
33 {
34
35 class _KeyFrameComparer
36         : public Tizen::Base::Collection::IComparer
37 {
38 public:
39         _KeyFrameComparer(void)
40         {
41         }
42
43         virtual ~_KeyFrameComparer(void)
44         {
45         }
46
47         virtual result Compare(const Tizen::Base::Object& obj1, const Tizen::Base::Object& obj2, int& cmp) const
48         {
49                 const _VisualElementAnimationKeyFrameInfo* pInfo1 = dynamic_cast <const _VisualElementAnimationKeyFrameInfo*>(&obj1);
50                 const _VisualElementAnimationKeyFrameInfo* pInfo2 = dynamic_cast <const _VisualElementAnimationKeyFrameInfo*>(&obj2);
51
52                 SysTryReturnResult(NID_BASE, (pInfo1 != null && pInfo2 != null), E_INVALID_ARG, "Invalid argument(s) is used. Both of the obj1 and obj2 MUST be _VisualElementAnimationKeyFrameInfo.");
53
54                 cmp = Tizen::Base::Float::Compare(pInfo1->GetTime(), pInfo2->GetTime());
55
56                 return E_SUCCESS;
57         }
58 };
59
60 _VisualElementAnimationKeyFrameInfo::_VisualElementAnimationKeyFrameInfo(float time, const Variant& value, const IVisualElementAnimationTimingFunction* pTimingFunction)
61         : __time(time)
62         , __value(value)
63         , __valueEx(value)
64         , __pTimingFunction(pTimingFunction)
65 {
66 }
67
68 _VisualElementAnimationKeyFrameInfo::~_VisualElementAnimationKeyFrameInfo(void)
69 {
70 }
71
72 bool
73 _VisualElementAnimationKeyFrameInfo::Equals(const Tizen::Base::Object& obj) const
74 {
75         const _VisualElementAnimationKeyFrameInfo* pKeyFrameInfo = dynamic_cast< const _VisualElementAnimationKeyFrameInfo* >(&obj);
76
77         if (pKeyFrameInfo == null)
78         {
79                 return false;
80         }
81
82         return (
83                                 (_FloatCompare(__time, pKeyFrameInfo->__time))
84                                 && (__valueEx == pKeyFrameInfo->__valueEx)
85                                 && (__pTimingFunction == pKeyFrameInfo->__pTimingFunction)
86                         );
87 }
88
89 float
90 _VisualElementAnimationKeyFrameInfo::GetTime(void) const
91 {
92         return __time;
93 }
94
95 Variant
96 _VisualElementAnimationKeyFrameInfo::GetValue(void) const
97 {
98         return __value;
99 }
100
101 _VariantEx
102 _VisualElementAnimationKeyFrameInfo::GetValueEx(void) const
103 {
104         return __valueEx;
105 }
106
107 const IVisualElementAnimationTimingFunction*
108 _VisualElementAnimationKeyFrameInfo::GetTimingFunction(void) const
109 {
110         return __pTimingFunction;
111 }
112
113 _VisualElementAnimationKeyFrame::_VisualElementAnimationKeyFrame(void)
114 {
115         __keyFrameList.Construct();
116 }
117
118 _VisualElementAnimationKeyFrame::~_VisualElementAnimationKeyFrame(void)
119 {
120         __keyFrameList.RemoveAll(true);
121 }
122
123 bool
124 _VisualElementAnimationKeyFrame::Equals(const Tizen::Base::Object& obj) const
125 {
126         const _VisualElementAnimationKeyFrame* pKeyFrame = dynamic_cast< const _VisualElementAnimationKeyFrame* >(&obj);
127
128         if (pKeyFrame == null)
129         {
130                 return false;
131         }
132
133         return __keyFrameList.Equals(pKeyFrame->__keyFrameList);
134 }
135
136 _VisualElementAnimationKeyFrame*
137 _VisualElementAnimationKeyFrame::CloneN(void) const
138 {
139         int i = 0;
140         int count = __keyFrameList.GetCount();
141         SysAssertf(count > 0, "The count of key frames is 0.");
142
143         _VisualElementAnimationKeyFrame* pCloned = new (std::nothrow) _VisualElementAnimationKeyFrame();
144         SysTryReturn(NID_UI_ANIM, pCloned, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
145
146         const _VisualElementAnimationKeyFrameInfo* pInfo = null;
147
148         for (i = 0; i < count; i++)
149         {
150                 pInfo = static_cast< const _VisualElementAnimationKeyFrameInfo* >(__keyFrameList.GetAt(i));
151                 SysAssertf(pInfo != null, "Key frame is null. index = %d", i);
152
153                 if (pCloned->AddKeyFrame(pInfo->GetTime(), pInfo->GetValue(), pInfo->GetTimingFunction()) != E_SUCCESS)
154                 {
155                         delete pCloned;
156                         return null;
157                 }
158         }
159
160         return pCloned;
161 }
162
163 int
164 _VisualElementAnimationKeyFrame::GetCount(void) const
165 {
166         return __keyFrameList.GetCount();
167 }
168
169 result
170 _VisualElementAnimationKeyFrame::AddKeyFrame(float time, const Variant& value, const IVisualElementAnimationTimingFunction* pTimingFunction)
171 {
172         _VisualElementAnimationKeyFrameInfo* pInfo = new (std::nothrow) _VisualElementAnimationKeyFrameInfo(time, value, pTimingFunction);
173         SysTryReturnResult(NID_UI_ANIM, pInfo, E_OUT_OF_MEMORY, "Memory allocation failed.");
174
175         int index = GetKeyFrameIndex(time);
176
177         if (index >= 0)
178         {
179                 __keyFrameList.SetAt(*pInfo, index, true);
180         }
181         else
182         {
183                 __keyFrameList.Add(*pInfo);
184         }
185
186         _KeyFrameComparer comparer;
187
188         __keyFrameList.Sort(comparer);
189
190         return E_SUCCESS;
191 }
192
193 result
194 _VisualElementAnimationKeyFrame::RemoveKeyFrame(float time)
195 {
196         int index = GetKeyFrameIndex(time);
197         SysTryReturnResult(NID_UI_ANIM, index >= 0, E_OBJ_NOT_FOUND, "Key frame is not found. time = %f", time);
198
199         return __keyFrameList.RemoveAt(index, true);
200 }
201
202 void
203 _VisualElementAnimationKeyFrame::RemoveAllKeyFrames(void)
204 {
205         __keyFrameList.RemoveAll(true);
206 }
207
208 _VisualElementAnimationKeyFrameInfo*
209 _VisualElementAnimationKeyFrame::GetKeyFrameInfoAt(int index) const
210 {
211         SysTryReturn(NID_UI_ANIM, index >= 0, null, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] Key frame is not found. index = %d");
212
213         return static_cast< _VisualElementAnimationKeyFrameInfo* >(const_cast< Tizen::Base::Object* >(__keyFrameList.GetAt(index)));
214 }
215
216 int
217 _VisualElementAnimationKeyFrame::GetKeyFrameIndex(float time) const
218 {
219         int i = 0;
220         int index = -1;
221         int count = 0;
222
223         count = __keyFrameList.GetCount();
224
225         const _VisualElementAnimationKeyFrameInfo* pInfo = null;
226         for (i = 0; i < count ; i++)
227         {
228                 pInfo = static_cast< const _VisualElementAnimationKeyFrameInfo* >(__keyFrameList.GetAt(i));
229                 SysAssertf(pInfo != null, "Key frame is null.");
230
231                 if (_FloatCompare(time, pInfo->GetTime()))
232                 {
233                         index = i;
234                         break;
235                 }
236         }
237
238         return index;
239 }
240
241 }}}   // Tizen::Ui::Animations
242