1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include <cstddef>
17 #include <cstdint>
18 
19 #include "animate_impl.h"
20 #include "native_type.h"
21 #include "node/node_model.h"
22 
23 #include "base/error/error_code.h"
24 #include "base/utils/utils.h"
25 #ifdef __cplusplus
26 extern "C" {
27 #endif
28 
OH_ArkUI_AnimateOption_Create()29 ArkUI_AnimateOption* OH_ArkUI_AnimateOption_Create()
30 {
31     ArkUI_AnimateOption* option = new ArkUI_AnimateOption;
32     //duration default 1000
33     option->duration = 1000;
34     //tempo default 1.0
35     option->tempo = 1.0f;
36     option->curve = ArkUI_AnimationCurve::ARKUI_CURVE_EASE_IN_OUT;
37     //delay default 0
38     option->delay = 0;
39     //iterations default 1
40     option->iterations = 1;
41     option->playMode = ArkUI_AnimationPlayMode::ARKUI_ANIMATION_PLAY_MODE_NORMAL;
42     option->expectedFrameRateRange = nullptr;
43     option->iCurve = nullptr;
44     return option;
45 }
46 
OH_ArkUI_AnimateOption_Dispose(ArkUI_AnimateOption * option)47 void OH_ArkUI_AnimateOption_Dispose(ArkUI_AnimateOption* option)
48 {
49     if (option == nullptr) {
50         return;
51     }
52     if (option->expectedFrameRateRange != nullptr) {
53         delete option->expectedFrameRateRange;
54         option->expectedFrameRateRange = nullptr;
55     }
56     delete option;
57 }
58 
OH_ArkUI_AnimateOption_GetDuration(ArkUI_AnimateOption * option)59 uint32_t OH_ArkUI_AnimateOption_GetDuration(ArkUI_AnimateOption* option)
60 {
61     CHECK_NULL_RETURN(option, 0);
62     return option->duration;
63 }
64 
OH_ArkUI_AnimateOption_GetTempo(ArkUI_AnimateOption * option)65 float OH_ArkUI_AnimateOption_GetTempo(ArkUI_AnimateOption* option)
66 {
67     CHECK_NULL_RETURN(option, 0.0f);
68     return option->tempo;
69 }
70 
OH_ArkUI_AnimateOption_GetCurve(ArkUI_AnimateOption * option)71 ArkUI_AnimationCurve OH_ArkUI_AnimateOption_GetCurve(ArkUI_AnimateOption* option)
72 {
73     CHECK_NULL_RETURN(option, static_cast<ArkUI_AnimationCurve>(-1));
74     return option->curve;
75 }
76 
OH_ArkUI_AnimateOption_GetDelay(ArkUI_AnimateOption * option)77 int32_t OH_ArkUI_AnimateOption_GetDelay(ArkUI_AnimateOption* option)
78 {
79     CHECK_NULL_RETURN(option, 0);
80     return option->delay;
81 }
82 
OH_ArkUI_AnimateOption_GetIterations(ArkUI_AnimateOption * option)83 int32_t OH_ArkUI_AnimateOption_GetIterations(ArkUI_AnimateOption* option)
84 {
85     CHECK_NULL_RETURN(option, 0);
86     return option->iterations;
87 }
88 
OH_ArkUI_AnimateOption_GetPlayMode(ArkUI_AnimateOption * option)89 ArkUI_AnimationPlayMode OH_ArkUI_AnimateOption_GetPlayMode(ArkUI_AnimateOption* option)
90 {
91     CHECK_NULL_RETURN(option, static_cast<ArkUI_AnimationPlayMode>(-1));
92     return option->playMode;
93 }
94 
OH_ArkUI_AnimateOption_GetExpectedFrameRateRange(ArkUI_AnimateOption * option)95 ArkUI_ExpectedFrameRateRange* OH_ArkUI_AnimateOption_GetExpectedFrameRateRange(ArkUI_AnimateOption* option)
96 {
97     CHECK_NULL_RETURN(option, nullptr);
98     return option->expectedFrameRateRange;
99 }
100 
OH_ArkUI_AnimateOption_SetDuration(ArkUI_AnimateOption * option,int32_t value)101 void OH_ArkUI_AnimateOption_SetDuration(ArkUI_AnimateOption* option, int32_t value)
102 {
103     CHECK_NULL_VOID(option);
104     // 设置小于0的值时按0处理
105     if (value < 0) {
106         value = 0;
107     }
108     option->duration = static_cast<uint32_t>(value);
109 }
110 
OH_ArkUI_AnimateOption_SetTempo(ArkUI_AnimateOption * option,float value)111 void OH_ArkUI_AnimateOption_SetTempo(ArkUI_AnimateOption* option, float value)
112 {
113     CHECK_NULL_VOID(option);
114     // 小于0的值时按值为1处理
115     if (value < 0) {
116         value = 1;
117     }
118     option->tempo = value;
119 }
120 
OH_ArkUI_AnimateOption_SetCurve(ArkUI_AnimateOption * option,ArkUI_AnimationCurve value)121 void OH_ArkUI_AnimateOption_SetCurve(ArkUI_AnimateOption* option, ArkUI_AnimationCurve value)
122 {
123     CHECK_NULL_VOID(option);
124     if (value >= ARKUI_CURVE_LINEAR && value <= ARKUI_CURVE_FRICTION) {
125         option->curve = value;
126     }
127 }
128 
OH_ArkUI_AnimateOption_SetDelay(ArkUI_AnimateOption * option,int32_t value)129 void OH_ArkUI_AnimateOption_SetDelay(ArkUI_AnimateOption* option, int32_t value)
130 {
131     CHECK_NULL_VOID(option);
132     option->delay = value;
133 }
134 
OH_ArkUI_AnimateOption_SetIterations(ArkUI_AnimateOption * option,int32_t value)135 void OH_ArkUI_AnimateOption_SetIterations(ArkUI_AnimateOption* option, int32_t value)
136 {
137     CHECK_NULL_VOID(option);
138     //取值范围:[-1, +∞)
139     if (value < -1) {
140         return;
141     }
142     option->iterations = value;
143 }
144 
OH_ArkUI_AnimateOption_SetPlayMode(ArkUI_AnimateOption * option,ArkUI_AnimationPlayMode value)145 void OH_ArkUI_AnimateOption_SetPlayMode(ArkUI_AnimateOption* option, ArkUI_AnimationPlayMode value)
146 {
147     CHECK_NULL_VOID(option);
148     if (value >= ARKUI_ANIMATION_PLAY_MODE_NORMAL && value <= ARKUI_ANIMATION_PLAY_MODE_ALTERNATE_REVERSE) {
149         option->playMode = value;
150     }
151 }
152 
OH_ArkUI_AnimateOption_SetExpectedFrameRateRange(ArkUI_AnimateOption * option,ArkUI_ExpectedFrameRateRange * value)153 void OH_ArkUI_AnimateOption_SetExpectedFrameRateRange(ArkUI_AnimateOption* option, ArkUI_ExpectedFrameRateRange* value)
154 {
155     CHECK_NULL_VOID(option);
156     CHECK_NULL_VOID(value);
157     option->expectedFrameRateRange = new ArkUI_ExpectedFrameRateRange { value->min, value->max, value->expected };
158 }
159 
OH_ArkUI_AnimateOption_SetICurve(ArkUI_AnimateOption * option,ArkUI_CurveHandle value)160 void OH_ArkUI_AnimateOption_SetICurve(ArkUI_AnimateOption* option, ArkUI_CurveHandle value)
161 {
162     CHECK_NULL_VOID(option);
163     CHECK_NULL_VOID(value);
164     option->iCurve = value;
165 }
166 
OH_ArkUI_AnimateOption_GetICurve(ArkUI_AnimateOption * option)167 ArkUI_CurveHandle OH_ArkUI_AnimateOption_GetICurve(ArkUI_AnimateOption* option)
168 {
169     CHECK_NULL_RETURN(option, nullptr);
170     return option->iCurve;
171 }
172 
OH_ArkUI_KeyframeAnimateOption_Create(int32_t size)173 ArkUI_KeyframeAnimateOption* OH_ArkUI_KeyframeAnimateOption_Create(int32_t size)
174 {
175     if (size < 0) {
176         return nullptr;
177     }
178 
179     ArkUI_KeyframeAnimateOption* animateOption = new ArkUI_KeyframeAnimateOption;
180     animateOption->keyframes.resize(size);
181     animateOption->delay = 0;
182     animateOption->iterations = 1;
183     animateOption->onFinish = nullptr;
184     animateOption->userData = nullptr;
185 
186     for (int32_t i = 0; i < size; ++i) {
187         //duration default 1000
188         animateOption->keyframes[i].duration = 1000;
189         animateOption->keyframes[i].curve = nullptr;
190         animateOption->keyframes[i].event = nullptr;
191         animateOption->keyframes[i].userData = nullptr;
192     }
193     return animateOption;
194 }
195 
OH_ArkUI_KeyframeAnimateOption_Dispose(ArkUI_KeyframeAnimateOption * option)196 void OH_ArkUI_KeyframeAnimateOption_Dispose(ArkUI_KeyframeAnimateOption* option)
197 {
198     CHECK_NULL_VOID(option);
199     delete option;
200 }
201 
OH_ArkUI_KeyframeAnimateOption_SetDelay(ArkUI_KeyframeAnimateOption * option,int32_t value)202 int32_t OH_ArkUI_KeyframeAnimateOption_SetDelay(ArkUI_KeyframeAnimateOption* option, int32_t value)
203 {
204     CHECK_NULL_RETURN(option, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
205     option->delay = value;
206     return OHOS::Ace::ERROR_CODE_NO_ERROR;
207 }
208 
OH_ArkUI_KeyframeAnimateOption_SetIterations(ArkUI_KeyframeAnimateOption * option,int32_t value)209 int32_t OH_ArkUI_KeyframeAnimateOption_SetIterations(ArkUI_KeyframeAnimateOption* option, int32_t value)
210 {
211     CHECK_NULL_RETURN(option, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
212     //取值范围:[-1, +∞)
213     if (value < -1) {
214         return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
215     }
216     option->iterations = value;
217     return OHOS::Ace::ERROR_CODE_NO_ERROR;
218 }
219 
OH_ArkUI_KeyframeAnimateOption_RegisterOnFinishCallback(ArkUI_KeyframeAnimateOption * option,void * userData,void (* onFinish)(void * userData))220 int32_t OH_ArkUI_KeyframeAnimateOption_RegisterOnFinishCallback(
221     ArkUI_KeyframeAnimateOption* option, void* userData, void (*onFinish)(void* userData))
222 {
223     CHECK_NULL_RETURN(option, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
224     option->onFinish = onFinish;
225     option->userData = userData;
226     return OHOS::Ace::ERROR_CODE_NO_ERROR;
227 }
228 
OH_ArkUI_KeyframeAnimateOption_SetDuration(ArkUI_KeyframeAnimateOption * option,int32_t value,int32_t index)229 int32_t OH_ArkUI_KeyframeAnimateOption_SetDuration(ArkUI_KeyframeAnimateOption* option, int32_t value, int32_t index)
230 {
231     if (option == nullptr || index < 0 || index >= static_cast<int32_t>(option->keyframes.size())) {
232         return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
233     }
234     if (value < 0) {
235         value = 0;
236     }
237     option->keyframes[index].duration = value;
238     return OHOS::Ace::ERROR_CODE_NO_ERROR;
239 }
240 
OH_ArkUI_KeyframeAnimateOption_SetCurve(ArkUI_KeyframeAnimateOption * option,ArkUI_CurveHandle value,int32_t index)241 int32_t OH_ArkUI_KeyframeAnimateOption_SetCurve(
242     ArkUI_KeyframeAnimateOption* option, ArkUI_CurveHandle value, int32_t index)
243 {
244     if (option == nullptr || index < 0 || index >= static_cast<int32_t>(option->keyframes.size())) {
245         return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
246     }
247     if (!value || !value->curve) {
248         option->keyframes[index].curve = nullptr;
249         return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
250     }
251     if (value->type == ARKUI_CURVE_TYPE_SPRING_MOTION || value->type == ARKUI_CURVE_TYPE_RESPONSIVE_SPRING_MOTION ||
252         value->type == ARKUI_CURVE_TYPE_INTERPOLATING_SPRING) {
253         return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
254     }
255     option->keyframes[index].curve = value;
256     return OHOS::Ace::ERROR_CODE_NO_ERROR;
257 }
258 
OH_ArkUI_KeyframeAnimateOption_RegisterOnEventCallback(ArkUI_KeyframeAnimateOption * option,void * userData,void (* event)(void * userData),int32_t index)259 int32_t OH_ArkUI_KeyframeAnimateOption_RegisterOnEventCallback(
260     ArkUI_KeyframeAnimateOption* option, void* userData, void (*event)(void* userData), int32_t index)
261 {
262     if (option == nullptr || index < 0 || index >= static_cast<int32_t>(option->keyframes.size())) {
263         return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
264     }
265     option->keyframes[index].event = event;
266     option->keyframes[index].userData = userData;
267     return OHOS::Ace::ERROR_CODE_NO_ERROR;
268 }
269 
OH_ArkUI_KeyframeAnimateOption_GetDelay(ArkUI_KeyframeAnimateOption * option)270 int32_t OH_ArkUI_KeyframeAnimateOption_GetDelay(ArkUI_KeyframeAnimateOption* option)
271 {
272     CHECK_NULL_RETURN(option, 0);
273     return option->delay;
274 }
275 
OH_ArkUI_KeyframeAnimateOption_GetIterations(ArkUI_KeyframeAnimateOption * option)276 int32_t OH_ArkUI_KeyframeAnimateOption_GetIterations(ArkUI_KeyframeAnimateOption* option)
277 {
278     CHECK_NULL_RETURN(option, 1);
279     return option->iterations;
280 }
281 
OH_ArkUI_KeyframeAnimateOption_GetDuration(ArkUI_KeyframeAnimateOption * option,int32_t index)282 int32_t OH_ArkUI_KeyframeAnimateOption_GetDuration(ArkUI_KeyframeAnimateOption* option, int32_t index)
283 {
284     if (option == nullptr || index < 0 || index >= static_cast<int32_t>(option->keyframes.size())) {
285         return 0;
286     }
287     return option->keyframes[index].duration;
288 }
289 
OH_ArkUI_KeyframeAnimateOption_GetCurve(ArkUI_KeyframeAnimateOption * option,int32_t index)290 ArkUI_CurveHandle OH_ArkUI_KeyframeAnimateOption_GetCurve(ArkUI_KeyframeAnimateOption* option, int32_t index)
291 {
292     if (option == nullptr || index < 0 || index >= static_cast<int32_t>(option->keyframes.size())) {
293         return nullptr;
294     }
295     return option->keyframes[index].curve;
296 }
297 
OH_ArkUI_AnimatorOption_Create(int32_t keyframeSize)298 ArkUI_AnimatorOption* OH_ArkUI_AnimatorOption_Create(int32_t keyframeSize)
299 {
300     if (keyframeSize < 0) {
301         return nullptr;
302     }
303 
304     ArkUI_AnimatorOption* option = new ArkUI_AnimatorOption;
305     option->keyframes.resize(keyframeSize);
306     for (int32_t i = 0; i < keyframeSize; i++) {
307         option->keyframes[i].curve = nullptr;
308     }
309     option->duration = 0;
310     option->delay = 0;
311     option->iterations = 1;
312     option->fill = ARKUI_ANIMATION_FILL_MODE_FORWARDS;
313     option->direction = ARKUI_ANIMATION_DIRECTION_NORMAL;
314     option->begin = 0.0f;
315     option->end = 1.0f;
316     option->easing = nullptr;
317     option->onFrame = nullptr;
318     option->frameUserData = nullptr;
319     option->onFinish = nullptr;
320     option->finishUserData = nullptr;
321     option->onCancel = nullptr;
322     option->cancelUserData = nullptr;
323     option->onRepeat = nullptr;
324     option->repeatUserData = nullptr;
325     option->expectedFrameRateRange = nullptr;
326     return option;
327 }
328 
OH_ArkUI_AnimatorOption_Dispose(ArkUI_AnimatorOption * option)329 void OH_ArkUI_AnimatorOption_Dispose(ArkUI_AnimatorOption* option)
330 {
331     CHECK_NULL_VOID(option);
332     if (option->expectedFrameRateRange) {
333         delete option->expectedFrameRateRange;
334         option->expectedFrameRateRange = nullptr;
335     }
336     delete option;
337 }
338 
OH_ArkUI_AnimatorOption_SetDuration(ArkUI_AnimatorOption * option,int32_t value)339 int32_t OH_ArkUI_AnimatorOption_SetDuration(ArkUI_AnimatorOption* option, int32_t value)
340 {
341     CHECK_NULL_RETURN(option, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
342     if (value < 0) {
343         return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
344     }
345     option->duration = value;
346     return OHOS::Ace::ERROR_CODE_NO_ERROR;
347 }
348 
OH_ArkUI_AnimatorOption_SetDelay(ArkUI_AnimatorOption * option,int32_t value)349 int32_t OH_ArkUI_AnimatorOption_SetDelay(ArkUI_AnimatorOption* option, int32_t value)
350 {
351     CHECK_NULL_RETURN(option, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
352     option->delay = value;
353     return OHOS::Ace::ERROR_CODE_NO_ERROR;
354 }
355 
OH_ArkUI_AnimatorOption_SetIterations(ArkUI_AnimatorOption * option,int32_t value)356 int32_t OH_ArkUI_AnimatorOption_SetIterations(ArkUI_AnimatorOption* option, int32_t value)
357 {
358     CHECK_NULL_RETURN(option, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
359     if (value < -1) {
360         value = 1;
361     }
362     option->iterations = value;
363     return OHOS::Ace::ERROR_CODE_NO_ERROR;
364 }
365 
OH_ArkUI_AnimatorOption_SetFill(ArkUI_AnimatorOption * option,ArkUI_AnimationFillMode value)366 int32_t OH_ArkUI_AnimatorOption_SetFill(ArkUI_AnimatorOption* option, ArkUI_AnimationFillMode value)
367 {
368     CHECK_NULL_RETURN(option, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
369     if (value > ARKUI_ANIMATION_FILL_MODE_BOTH || value < ARKUI_ANIMATION_FILL_MODE_NONE) {
370         return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
371     }
372     option->fill = value;
373     return OHOS::Ace::ERROR_CODE_NO_ERROR;
374 }
375 
OH_ArkUI_AnimatorOption_SetDirection(ArkUI_AnimatorOption * option,ArkUI_AnimationDirection value)376 int32_t OH_ArkUI_AnimatorOption_SetDirection(ArkUI_AnimatorOption* option, ArkUI_AnimationDirection value)
377 {
378     CHECK_NULL_RETURN(option, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
379     if (value > ARKUI_ANIMATION_DIRECTION_ALTERNATE_REVERSE || value < ARKUI_ANIMATION_DIRECTION_NORMAL) {
380         return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
381     }
382     option->direction = value;
383     return OHOS::Ace::ERROR_CODE_NO_ERROR;
384 }
385 
OH_ArkUI_AnimatorOption_SetCurve(ArkUI_AnimatorOption * option,ArkUI_CurveHandle value)386 int32_t OH_ArkUI_AnimatorOption_SetCurve(ArkUI_AnimatorOption* option, ArkUI_CurveHandle value)
387 {
388     CHECK_NULL_RETURN(option, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
389     if (value) {
390         if (value->type == ARKUI_CURVE_TYPE_SPRING || value->type == ARKUI_CURVE_TYPE_SPRING_MOTION ||
391             value->type == ARKUI_CURVE_TYPE_RESPONSIVE_SPRING_MOTION ||
392             value->type == ARKUI_CURVE_TYPE_INTERPOLATING_SPRING || value->type == ARKUI_CURVE_TYPE_CUSTOM) {
393             option->easing = nullptr;
394             return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
395         }
396     }
397 
398     option->easing = value;
399     return OHOS::Ace::ERROR_CODE_NO_ERROR;
400 }
401 
OH_ArkUI_AnimatorOption_SetBegin(ArkUI_AnimatorOption * option,float value)402 int32_t OH_ArkUI_AnimatorOption_SetBegin(ArkUI_AnimatorOption* option, float value)
403 {
404     CHECK_NULL_RETURN(option, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
405     if (option->keyframes.size() > 0) {
406         return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
407     }
408     option->begin = value;
409     return OHOS::Ace::ERROR_CODE_NO_ERROR;
410 }
411 
OH_ArkUI_AnimatorOption_SetEnd(ArkUI_AnimatorOption * option,float value)412 int32_t OH_ArkUI_AnimatorOption_SetEnd(ArkUI_AnimatorOption* option, float value)
413 {
414     CHECK_NULL_RETURN(option, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
415     if (option->keyframes.size() > 0) {
416         return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
417     }
418     option->end = value;
419     return OHOS::Ace::ERROR_CODE_NO_ERROR;
420 }
421 
OH_ArkUI_AnimatorOption_SetExpectedFrameRateRange(ArkUI_AnimatorOption * option,ArkUI_ExpectedFrameRateRange * value)422 int32_t OH_ArkUI_AnimatorOption_SetExpectedFrameRateRange(
423     ArkUI_AnimatorOption* option, ArkUI_ExpectedFrameRateRange* value)
424 {
425     CHECK_NULL_RETURN(option, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
426     CHECK_NULL_RETURN(value, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
427     option->expectedFrameRateRange = new ArkUI_ExpectedFrameRateRange { value->min, value->max, value->expected };
428     return OHOS::Ace::ERROR_CODE_NO_ERROR;
429 }
430 
OH_ArkUI_AnimatorOption_SetKeyframe(ArkUI_AnimatorOption * option,float time,float value,int32_t index)431 int32_t OH_ArkUI_AnimatorOption_SetKeyframe(ArkUI_AnimatorOption* option, float time, float value, int32_t index)
432 {
433     CHECK_NULL_RETURN(option, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
434     if (time < 0 || time > 1) {
435         return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
436     }
437     if (index >= 0 && static_cast<size_t>(index) < option->keyframes.size()) {
438         option->keyframes[index].keyTime = time;
439         option->keyframes[index].keyValue = value;
440         return OHOS::Ace::ERROR_CODE_NO_ERROR;
441     }
442     return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
443 }
444 
OH_ArkUI_AnimatorOption_SetKeyframeCurve(ArkUI_AnimatorOption * option,ArkUI_CurveHandle value,int32_t index)445 int32_t OH_ArkUI_AnimatorOption_SetKeyframeCurve(ArkUI_AnimatorOption* option, ArkUI_CurveHandle value, int32_t index)
446 {
447     CHECK_NULL_RETURN(option, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
448     if (value) {
449         if (value->type == ARKUI_CURVE_TYPE_SPRING || value->type == ARKUI_CURVE_TYPE_SPRING_MOTION ||
450             value->type == ARKUI_CURVE_TYPE_RESPONSIVE_SPRING_MOTION ||
451             value->type == ARKUI_CURVE_TYPE_INTERPOLATING_SPRING || value->type == ARKUI_CURVE_TYPE_CUSTOM) {
452             option->keyframes[index].curve = nullptr;
453             return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
454         }
455     }
456 
457     if (index >= 0 && static_cast<size_t>(index) < option->keyframes.size()) {
458         option->keyframes[index].curve = value;
459         return OHOS::Ace::ERROR_CODE_NO_ERROR;
460     }
461     return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
462 }
463 
OH_ArkUI_AnimatorOption_GetDuration(ArkUI_AnimatorOption * option)464 int32_t OH_ArkUI_AnimatorOption_GetDuration(ArkUI_AnimatorOption* option)
465 {
466     if (option != nullptr) {
467         return option->duration;
468     }
469     return -1;
470 }
471 
OH_ArkUI_AnimatorOption_GetDelay(ArkUI_AnimatorOption * option)472 int32_t OH_ArkUI_AnimatorOption_GetDelay(ArkUI_AnimatorOption* option)
473 {
474     if (option != nullptr) {
475         return option->delay;
476     }
477     return -1;
478 }
479 
OH_ArkUI_AnimatorOption_GetIterations(ArkUI_AnimatorOption * option)480 int32_t OH_ArkUI_AnimatorOption_GetIterations(ArkUI_AnimatorOption* option)
481 {
482     if (option != nullptr) {
483         return option->iterations;
484     }
485     return -1;
486 }
487 
OH_ArkUI_AnimatorOption_GetFill(ArkUI_AnimatorOption * option)488 ArkUI_AnimationFillMode OH_ArkUI_AnimatorOption_GetFill(ArkUI_AnimatorOption* option)
489 {
490     if (option != nullptr) {
491         return option->fill;
492     }
493     return static_cast<ArkUI_AnimationFillMode>(-1);
494 }
495 
OH_ArkUI_AnimatorOption_GetDirection(ArkUI_AnimatorOption * option)496 ArkUI_AnimationDirection OH_ArkUI_AnimatorOption_GetDirection(ArkUI_AnimatorOption* option)
497 {
498     if (option != nullptr) {
499         return option->direction;
500     }
501     return static_cast<ArkUI_AnimationDirection>(-1);
502 }
503 
OH_ArkUI_AnimatorOption_GetCurve(ArkUI_AnimatorOption * option)504 ArkUI_CurveHandle OH_ArkUI_AnimatorOption_GetCurve(ArkUI_AnimatorOption* option)
505 {
506     if (option != nullptr) {
507         return option->easing;
508     }
509     return nullptr;
510 }
511 
OH_ArkUI_AnimatorOption_GetBegin(ArkUI_AnimatorOption * option)512 float OH_ArkUI_AnimatorOption_GetBegin(ArkUI_AnimatorOption* option)
513 {
514     if (option != nullptr) {
515         return option->begin;
516     }
517     return 0.0f;
518 }
519 
OH_ArkUI_AnimatorOption_GetEnd(ArkUI_AnimatorOption * option)520 float OH_ArkUI_AnimatorOption_GetEnd(ArkUI_AnimatorOption* option)
521 {
522     if (option != nullptr) {
523         return option->end;
524     }
525     return 1.0f;
526 }
527 
OH_ArkUI_AnimatorOption_GetExpectedFrameRateRange(ArkUI_AnimatorOption * option)528 ArkUI_ExpectedFrameRateRange* OH_ArkUI_AnimatorOption_GetExpectedFrameRateRange(ArkUI_AnimatorOption* option)
529 {
530     if (option != nullptr) {
531         return option->expectedFrameRateRange;
532     }
533     return nullptr;
534 }
535 
OH_ArkUI_AnimatorOption_GetKeyframeTime(ArkUI_AnimatorOption * option,int32_t index)536 float OH_ArkUI_AnimatorOption_GetKeyframeTime(ArkUI_AnimatorOption* option, int32_t index)
537 {
538     if (option != nullptr && index >= 0 && static_cast<size_t>(index) < option->keyframes.size()) {
539         return option->keyframes[index].keyTime;
540     }
541     return -1.0f;
542 }
543 
OH_ArkUI_AnimatorOption_GetKeyframeValue(ArkUI_AnimatorOption * option,int32_t index)544 float OH_ArkUI_AnimatorOption_GetKeyframeValue(ArkUI_AnimatorOption* option, int32_t index)
545 {
546     if (option != nullptr && index >= 0 && static_cast<size_t>(index) < option->keyframes.size()) {
547         return option->keyframes[index].keyValue;
548     }
549     return -1.0f;
550 }
551 
OH_ArkUI_AnimatorOption_GetKeyframeCurve(ArkUI_AnimatorOption * option,int32_t index)552 ArkUI_CurveHandle OH_ArkUI_AnimatorOption_GetKeyframeCurve(ArkUI_AnimatorOption* option, int32_t index)
553 {
554     if (option != nullptr && index >= 0 && static_cast<size_t>(index) < option->keyframes.size()) {
555         return option->keyframes[index].curve;
556     }
557     return nullptr;
558 }
559 
OH_ArkUI_AnimatorEvent_GetUserData(ArkUI_AnimatorEvent * event)560 void* OH_ArkUI_AnimatorEvent_GetUserData(ArkUI_AnimatorEvent* event)
561 {
562     CHECK_NULL_RETURN(event, nullptr);
563     return event->userData;
564 }
565 
OH_ArkUI_AnimatorOnFrameEvent_GetUserData(ArkUI_AnimatorOnFrameEvent * event)566 void* OH_ArkUI_AnimatorOnFrameEvent_GetUserData(ArkUI_AnimatorOnFrameEvent* event)
567 {
568     CHECK_NULL_RETURN(event, nullptr);
569     return event->userData;
570 }
571 
OH_ArkUI_AnimatorOnFrameEvent_GetValue(ArkUI_AnimatorOnFrameEvent * event)572 float OH_ArkUI_AnimatorOnFrameEvent_GetValue(ArkUI_AnimatorOnFrameEvent* event)
573 {
574     CHECK_NULL_RETURN(event, 0.0f);
575     return event->progress;
576 }
577 
OH_ArkUI_AnimatorOption_RegisterOnFrameCallback(ArkUI_AnimatorOption * option,void * userData,void (* callback)(ArkUI_AnimatorOnFrameEvent * event))578 int32_t OH_ArkUI_AnimatorOption_RegisterOnFrameCallback(
579     ArkUI_AnimatorOption* option, void* userData, void (*callback)(ArkUI_AnimatorOnFrameEvent* event))
580 {
581     const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
582     if (!impl || !option || !callback) {
583         return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
584     }
585     option->onFrame = callback;
586     option->frameUserData = userData;
587     return OHOS::Ace::ERROR_CODE_NO_ERROR;
588 }
589 
OH_ArkUI_AnimatorOption_RegisterOnFinishCallback(ArkUI_AnimatorOption * option,void * userData,void (* callback)(ArkUI_AnimatorEvent * event))590 int32_t OH_ArkUI_AnimatorOption_RegisterOnFinishCallback(
591     ArkUI_AnimatorOption* option, void* userData, void (*callback)(ArkUI_AnimatorEvent* event))
592 {
593     const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
594     if (!impl || !option || !callback) {
595         return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
596     }
597 
598     option->onFinish = callback;
599     option->finishUserData = userData;
600     return OHOS::Ace::ERROR_CODE_NO_ERROR;
601 }
602 
OH_ArkUI_AnimatorOption_RegisterOnCancelCallback(ArkUI_AnimatorOption * option,void * userData,void (* callback)(ArkUI_AnimatorEvent * event))603 int32_t OH_ArkUI_AnimatorOption_RegisterOnCancelCallback(
604     ArkUI_AnimatorOption* option, void* userData, void (*callback)(ArkUI_AnimatorEvent* event))
605 {
606     const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
607     if (!impl || !option || !callback) {
608         return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
609     }
610 
611     option->onCancel = callback;
612     option->cancelUserData = userData;
613     return OHOS::Ace::ERROR_CODE_NO_ERROR;
614 }
615 
OH_ArkUI_AnimatorOption_RegisterOnRepeatCallback(ArkUI_AnimatorOption * option,void * userData,void (* callback)(ArkUI_AnimatorEvent * event))616 int32_t OH_ArkUI_AnimatorOption_RegisterOnRepeatCallback(
617     ArkUI_AnimatorOption* option, void* userData, void (*callback)(ArkUI_AnimatorEvent* event))
618 {
619     const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
620     if (!impl || !option || !callback) {
621         return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
622     }
623 
624     option->onRepeat = callback;
625     option->repeatUserData = userData;
626     return OHOS::Ace::ERROR_CODE_NO_ERROR;
627 }
628 
OH_ArkUI_Animator_ResetAnimatorOption(ArkUI_AnimatorHandle animator,ArkUI_AnimatorOption * option)629 int32_t OH_ArkUI_Animator_ResetAnimatorOption(ArkUI_AnimatorHandle animator, ArkUI_AnimatorOption* option)
630 {
631     return OHOS::Ace::AnimateModel::AnimatorReset(animator, option);
632 }
633 
OH_ArkUI_Animator_Play(ArkUI_AnimatorHandle animator)634 int32_t OH_ArkUI_Animator_Play(ArkUI_AnimatorHandle animator)
635 {
636     return OHOS::Ace::AnimateModel::AnimatorPlay(animator);
637 }
638 
OH_ArkUI_Animator_Finish(ArkUI_AnimatorHandle animator)639 int32_t OH_ArkUI_Animator_Finish(ArkUI_AnimatorHandle animator)
640 {
641     return OHOS::Ace::AnimateModel::AnimatorFinish(animator);
642 }
643 
OH_ArkUI_Animator_Pause(ArkUI_AnimatorHandle animator)644 int32_t OH_ArkUI_Animator_Pause(ArkUI_AnimatorHandle animator)
645 {
646     return OHOS::Ace::AnimateModel::AnimatorPause(animator);
647 }
648 
OH_ArkUI_Animator_Cancel(ArkUI_AnimatorHandle animator)649 int32_t OH_ArkUI_Animator_Cancel(ArkUI_AnimatorHandle animator)
650 {
651     return OHOS::Ace::AnimateModel::AnimatorCancel(animator);
652 }
653 
OH_ArkUI_Animator_Reverse(ArkUI_AnimatorHandle animator)654 int32_t OH_ArkUI_Animator_Reverse(ArkUI_AnimatorHandle animator)
655 {
656     return OHOS::Ace::AnimateModel::AnimatorReverse(animator);
657 }
658 
OH_ArkUI_Curve_CreateCurveByType(ArkUI_AnimationCurve curve)659 ArkUI_CurveHandle OH_ArkUI_Curve_CreateCurveByType(ArkUI_AnimationCurve curve)
660 {
661     return OHOS::Ace::AnimateModel::InitCurve(curve);
662 }
663 
OH_ArkUI_Curve_CreateStepsCurve(int32_t count,bool end)664 ArkUI_CurveHandle OH_ArkUI_Curve_CreateStepsCurve(int32_t count, bool end)
665 {
666     return OHOS::Ace::AnimateModel::StepsCurve(count, end);
667 }
668 
OH_ArkUI_Curve_CreateCubicBezierCurve(float x1,float y1,float x2,float y2)669 ArkUI_CurveHandle OH_ArkUI_Curve_CreateCubicBezierCurve(float x1, float y1, float x2, float y2)
670 {
671     return OHOS::Ace::AnimateModel::CubicBezierCurve(x1, y1, x2, y2);
672 }
673 
OH_ArkUI_Curve_CreateSpringCurve(float velocity,float mass,float stiffness,float damping)674 ArkUI_CurveHandle OH_ArkUI_Curve_CreateSpringCurve(float velocity, float mass, float stiffness, float damping)
675 {
676     return OHOS::Ace::AnimateModel::SpringCurve(velocity, mass, stiffness, damping);
677 }
678 
OH_ArkUI_Curve_CreateSpringMotion(float response,float dampingFraction,float overlapDuration)679 ArkUI_CurveHandle OH_ArkUI_Curve_CreateSpringMotion(float response, float dampingFraction, float overlapDuration)
680 {
681     return OHOS::Ace::AnimateModel::SpringMotion(response, dampingFraction, overlapDuration);
682 }
683 
OH_ArkUI_Curve_CreateResponsiveSpringMotion(float response,float dampingFraction,float overlapDuration)684 ArkUI_CurveHandle OH_ArkUI_Curve_CreateResponsiveSpringMotion(
685     float response, float dampingFraction, float overlapDuration)
686 {
687     return OHOS::Ace::AnimateModel::ResponsiveSpringMotion(response, dampingFraction, overlapDuration);
688 }
689 
OH_ArkUI_Curve_CreateInterpolatingSpring(float velocity,float mass,float stiffness,float damping)690 ArkUI_CurveHandle OH_ArkUI_Curve_CreateInterpolatingSpring(float velocity, float mass, float stiffness, float damping)
691 {
692     return OHOS::Ace::AnimateModel::InterpolatingSpring(velocity, mass, stiffness, damping);
693 }
694 
OH_ArkUI_Curve_CreateCustomCurve(void * userData,float (* interpolate)(float fraction,void * userdata))695 ArkUI_CurveHandle OH_ArkUI_Curve_CreateCustomCurve(void* userData, float (*interpolate)(float fraction, void* userdata))
696 {
697     return OHOS::Ace::AnimateModel::CustomCurve(userData, interpolate);
698 }
699 
OH_ArkUI_Curve_DisposeCurve(ArkUI_CurveHandle curveHandle)700 void OH_ArkUI_Curve_DisposeCurve(ArkUI_CurveHandle curveHandle)
701 {
702     return OHOS::Ace::AnimateModel::DisposeCurve(curveHandle);
703 }
704 
705 #ifdef __cplusplus
706 };
707 #endif