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 <algorithm>
17 #include <cstddef>
18 
19 #include "native_type.h"
20 #include "node/node_transition.h"
21 
22 #include "base/utils/utils.h"
23 
24 #ifdef __cplusplus
25 extern "C" {
26 #endif
27 
OH_ArkUI_CreateOpacityTransitionEffect(float opacity)28 ArkUI_TransitionEffect* OH_ArkUI_CreateOpacityTransitionEffect(float opacity)
29 {
30     ArkUI_TransitionEffect* option = new ArkUI_TransitionEffect { ARKUI_TRANSITION_EFFECT_OPACITY };
31     option->translate = nullptr;
32     option->scale = nullptr;
33     option->rotate = nullptr;
34     option->appear = nullptr;
35     option->disappear = nullptr;
36     option->combine = nullptr;
37     option->animation = nullptr;
38     option->opacity = std::clamp(opacity, 0.0f, 1.0f);
39     return option;
40 }
41 
OH_ArkUI_CreateTranslationTransitionEffect(ArkUI_TranslationOptions * translate)42 ArkUI_TransitionEffect* OH_ArkUI_CreateTranslationTransitionEffect(ArkUI_TranslationOptions* translate)
43 {
44     CHECK_NULL_RETURN(translate, nullptr);
45     ArkUI_TransitionEffect* option = new ArkUI_TransitionEffect { ARKUI_TRANSITION_EFFECT_TRANSLATE };
46     option->scale = nullptr;
47     option->rotate = nullptr;
48     option->appear = nullptr;
49     option->disappear = nullptr;
50     option->combine = nullptr;
51     option->animation = nullptr;
52     option->translate = translate;
53     return option;
54 }
55 
OH_ArkUI_CreateScaleTransitionEffect(ArkUI_ScaleOptions * scale)56 ArkUI_TransitionEffect* OH_ArkUI_CreateScaleTransitionEffect(ArkUI_ScaleOptions* scale)
57 {
58     CHECK_NULL_RETURN(scale, nullptr);
59     ArkUI_TransitionEffect* option = new ArkUI_TransitionEffect { ARKUI_TRANSITION_EFFECT_SCALE };
60     option->translate = nullptr;
61     option->rotate = nullptr;
62     option->appear = nullptr;
63     option->disappear = nullptr;
64     option->combine = nullptr;
65     option->animation = nullptr;
66     option->scale = scale;
67     return option;
68 }
69 
OH_ArkUI_CreateRotationTransitionEffect(ArkUI_RotationOptions * rotate)70 ArkUI_TransitionEffect* OH_ArkUI_CreateRotationTransitionEffect(ArkUI_RotationOptions* rotate)
71 {
72     CHECK_NULL_RETURN(rotate, nullptr);
73     ArkUI_TransitionEffect* option = new ArkUI_TransitionEffect { ARKUI_TRANSITION_EFFECT_ROTATE };
74     option->translate = nullptr;
75     option->scale = nullptr;
76     option->appear = nullptr;
77     option->disappear = nullptr;
78     option->combine = nullptr;
79     option->animation = nullptr;
80     option->rotate = rotate;
81     return option;
82 }
83 
OH_ArkUI_CreateMovementTransitionEffect(ArkUI_TransitionEdge move)84 ArkUI_TransitionEffect* OH_ArkUI_CreateMovementTransitionEffect(ArkUI_TransitionEdge move)
85 {
86     if (move < ARKUI_TRANSITION_EDGE_TOP || move > ARKUI_TRANSITION_EDGE_END) {
87         move = ARKUI_TRANSITION_EDGE_START;
88     }
89     ArkUI_TransitionEffect* option = new ArkUI_TransitionEffect { ARKUI_TRANSITION_EFFECT_MOVE };
90     option->translate = nullptr;
91     option->scale = nullptr;
92     option->rotate = nullptr;
93     option->appear = nullptr;
94     option->disappear = nullptr;
95     option->combine = nullptr;
96     option->animation = nullptr;
97     option->move = move;
98     return option;
99 }
100 
OH_ArkUI_CreateAsymmetricTransitionEffect(ArkUI_TransitionEffect * appear,ArkUI_TransitionEffect * disappear)101 ArkUI_TransitionEffect* OH_ArkUI_CreateAsymmetricTransitionEffect(
102     ArkUI_TransitionEffect* appear, ArkUI_TransitionEffect* disappear)
103 {
104     if (!appear && !disappear) {
105         return nullptr;
106     }
107     ArkUI_TransitionEffect* option = new ArkUI_TransitionEffect { ARKUI_TRANSITION_EFFECT_ASYMMETRIC };
108     option->translate = nullptr;
109     option->scale = nullptr;
110     option->rotate = nullptr;
111     option->combine = nullptr;
112     option->animation = nullptr;
113     option->appear = appear;
114     option->disappear = disappear;
115     return option;
116 }
117 
OH_ArkUI_TransitionEffect_Dispose(ArkUI_TransitionEffect * option)118 void OH_ArkUI_TransitionEffect_Dispose(ArkUI_TransitionEffect* option)
119 {
120     CHECK_NULL_VOID(option);
121     if (option->toEffectOption) {
122         delete option->toEffectOption;
123         option->toEffectOption = nullptr;
124     }
125     delete option;
126 }
127 
OH_ArkUI_TransitionEffect_Combine(ArkUI_TransitionEffect * option,ArkUI_TransitionEffect * combine)128 int32_t OH_ArkUI_TransitionEffect_Combine(ArkUI_TransitionEffect* option, ArkUI_TransitionEffect* combine)
129 {
130     CHECK_NULL_RETURN(option, ARKUI_ERROR_CODE_PARAM_INVALID);
131     auto* currentOption = option;
132     while (currentOption->combine) {
133         currentOption = currentOption->combine;
134     }
135     currentOption->combine = combine;
136     return ARKUI_ERROR_CODE_NO_ERROR;
137 }
138 
OH_ArkUI_TransitionEffect_SetAnimation(ArkUI_TransitionEffect * option,ArkUI_AnimateOption * animation)139 int32_t OH_ArkUI_TransitionEffect_SetAnimation(ArkUI_TransitionEffect* option, ArkUI_AnimateOption* animation)
140 {
141     CHECK_NULL_RETURN(option, ARKUI_ERROR_CODE_PARAM_INVALID);
142     option->animation = animation;
143     return ARKUI_ERROR_CODE_NO_ERROR;
144 }
145 #ifdef __cplusplus
146 };
147 #endif