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 "node_transition.h"
17
18
19#include "base/utils/utils.h"
20
21namespace OHOS::Ace::TransitionModel {
22
23ArkUITransitionEffectOption* CreateEffectOption()
24{
25    ArkUITransitionEffectOption* effectOption = new ArkUITransitionEffectOption;
26    effectOption->appear = nullptr;
27    effectOption->disappear = nullptr;
28    effectOption->combine = nullptr;
29    return effectOption;
30}
31
32ArkUITransitionEffectOption* ConvertToEffectOption(ArkUI_TransitionEffect* effectOption)
33{
34    CHECK_NULL_RETURN(effectOption, nullptr);
35    auto* toEffectOption = CreateEffectOption();
36    toEffectOption->type = effectOption->type;
37    switch (effectOption->type) {
38        case ARKUI_TRANSITION_EFFECT_OPACITY: {
39            toEffectOption->opacity = effectOption->opacity;
40            break;
41        }
42        case ARKUI_TRANSITION_EFFECT_TRANSLATE: {
43            if (!effectOption->translate) {
44                delete toEffectOption;
45                toEffectOption = nullptr;
46                return nullptr;
47            }
48            toEffectOption->translate.x = effectOption->translate->x;
49            toEffectOption->translate.y = effectOption->translate->y;
50            toEffectOption->translate.z = effectOption->translate->z;
51            break;
52        }
53        case ARKUI_TRANSITION_EFFECT_SCALE: {
54            if (!effectOption->scale) {
55                delete toEffectOption;
56                toEffectOption = nullptr;
57                return nullptr;
58            }
59            toEffectOption->scale.x = effectOption->scale->x;
60            toEffectOption->scale.y = effectOption->scale->y;
61            toEffectOption->scale.z = effectOption->scale->z;
62            toEffectOption->scale.centerX = effectOption->scale->centerX;
63            toEffectOption->scale.centerY = effectOption->scale->centerY;
64            break;
65        }
66        case ARKUI_TRANSITION_EFFECT_ROTATE: {
67            if (!effectOption->rotate) {
68                delete toEffectOption;
69                toEffectOption = nullptr;
70                return nullptr;
71            }
72            toEffectOption->rotate.x = effectOption->rotate->x;
73            toEffectOption->rotate.y = effectOption->rotate->y;
74            toEffectOption->rotate.z = effectOption->rotate->z;
75            toEffectOption->rotate.angle = effectOption->rotate->angle;
76            toEffectOption->rotate.centerX = effectOption->rotate->centerX;
77            toEffectOption->rotate.centerY = effectOption->rotate->centerY;
78            toEffectOption->rotate.centerZ = effectOption->rotate->centerZ;
79            toEffectOption->rotate.perspective = effectOption->rotate->perspective;
80            break;
81        }
82        case ARKUI_TRANSITION_EFFECT_MOVE: {
83            toEffectOption->move = effectOption->move;
84            break;
85        }
86        case ARKUI_TRANSITION_EFFECT_ASYMMETRIC: {
87            if (effectOption->appear) {
88                auto* appear = ConvertToEffectOption(effectOption->appear);
89                toEffectOption->appear = appear;
90            }
91            if (effectOption->disappear) {
92                auto* disappear = ConvertToEffectOption(effectOption->disappear);
93                toEffectOption->disappear = disappear;
94            }
95            break;
96        }
97    }
98
99    if (effectOption->animation) {
100        toEffectOption->hasAnimation = true;
101        toEffectOption->animation.duration = effectOption->animation->duration;
102        toEffectOption->animation.tempo = effectOption->animation->tempo;
103        toEffectOption->animation.curve = effectOption->animation->curve;
104        if (effectOption->animation->iCurve) {
105            toEffectOption->animation.iCurve = effectOption->animation->iCurve->curve;
106            toEffectOption->animation.curveType = effectOption->animation->iCurve->type;
107        } else {
108            toEffectOption->animation.iCurve = nullptr;
109        }
110        toEffectOption->animation.delay = effectOption->animation->delay;
111        toEffectOption->animation.iterations = effectOption->animation->iterations;
112        toEffectOption->animation.playMode = effectOption->animation->playMode;
113        if (effectOption->animation->expectedFrameRateRange) {
114            toEffectOption->animation.expectedFrameRateRange =
115                reinterpret_cast<ArkUIExpectedFrameRateRange*>(effectOption->animation->expectedFrameRateRange);
116        } else {
117            toEffectOption->animation.expectedFrameRateRange = nullptr;
118        }
119    } else {
120        toEffectOption->hasAnimation = false;
121    }
122
123    if (effectOption->combine) {
124        toEffectOption->combine = ConvertToEffectOption(effectOption->combine);
125    }
126    effectOption->toEffectOption = toEffectOption;
127    return toEffectOption;
128}
129} // namespace OHOS::Ace::TransitionModel
130