1 /*
2 * Copyright (c) 2021-2022 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 "animation/rs_transition_effect.h"
17
18 #include "animation/rs_render_transition_effect.h"
19 #include "modifier/rs_extended_modifier.h"
20 #include "modifier/rs_property.h"
21 #include "platform/common/rs_log.h"
22
23 namespace OHOS {
24 namespace Rosen {
25 constexpr float DEGREE_TO_RADIAN = M_PI / 180;
26
27 const std::shared_ptr<const RSTransitionEffect> RSTransitionEffect::EMPTY = RSTransitionEffect::Create();
28
29 const std::shared_ptr<const RSTransitionEffect> RSTransitionEffect::OPACITY = RSTransitionEffect::Create()->Opacity(0);
30
31 const std::shared_ptr<const RSTransitionEffect> RSTransitionEffect::SCALE =
32 RSTransitionEffect::Create()->Scale({ 0.f, 0.f, 0.f });
33
Create()34 std::shared_ptr<RSTransitionEffect> RSTransitionEffect::Create()
35 {
36 return std::shared_ptr<RSTransitionEffect>(new RSTransitionEffect());
37 }
38
Asymmetric(const std::shared_ptr<RSTransitionEffect> & transitionIn,const std::shared_ptr<RSTransitionEffect> & transitionOut)39 std::shared_ptr<RSTransitionEffect> RSTransitionEffect::Asymmetric(
40 const std::shared_ptr<RSTransitionEffect>& transitionIn, const std::shared_ptr<RSTransitionEffect>& transitionOut)
41 {
42 return std::shared_ptr<RSTransitionEffect>(new RSTransitionEffect(transitionIn, transitionOut));
43 }
44
RSTransitionEffect(const std::shared_ptr<RSTransitionEffect> & transitionIn,const std::shared_ptr<RSTransitionEffect> & transitionOut)45 RSTransitionEffect::RSTransitionEffect(
46 const std::shared_ptr<RSTransitionEffect>& transitionIn, const std::shared_ptr<RSTransitionEffect>& transitionOut)
47 : transitionInEffects_(transitionIn->transitionInEffects_),
48 transitionOutEffects_(transitionOut->transitionOutEffects_),
49 customTransitionInEffects_(transitionIn->customTransitionInEffects_),
50 customTransitionOutEffects_(transitionOut->customTransitionOutEffects_)
51 {}
52
Opacity(float opacity)53 std::shared_ptr<RSTransitionEffect> RSTransitionEffect::Opacity(float opacity)
54 {
55 if (opacity == 1.0f) {
56 ROSEN_LOGI("RSTransitionEffect::Opacity: Skip empty transition effect");
57 return shared_from_this();
58 }
59 auto opacityEffect = std::make_shared<RSTransitionFade>(opacity);
60 transitionInEffects_.push_back(opacityEffect);
61 transitionOutEffects_.push_back(opacityEffect);
62 return shared_from_this();
63 }
64
Scale(const Vector3f & scale)65 std::shared_ptr<RSTransitionEffect> RSTransitionEffect::Scale(const Vector3f& scale)
66 {
67 if (scale.x_ == 1.0f && scale.y_ == 1.0f && scale.z_ == 1.0f) {
68 ROSEN_LOGI("RSTransitionEffect::Scale: Skip empty transition effect");
69 return shared_from_this();
70 }
71 auto scaleEffect = std::make_shared<RSTransitionScale>(scale.x_, scale.y_, scale.z_);
72 transitionInEffects_.push_back(scaleEffect);
73 transitionOutEffects_.push_back(scaleEffect);
74 return shared_from_this();
75 }
76
Translate(const Vector3f & translate)77 std::shared_ptr<RSTransitionEffect> RSTransitionEffect::Translate(const Vector3f& translate)
78 {
79 if (translate.x_ == 0.0f && translate.y_ == 0.0f && translate.z_ == 0.0f) {
80 ROSEN_LOGI("RSTransitionEffect::Translate: Skip empty transition effect");
81 return shared_from_this();
82 }
83 auto translateEffect = std::make_shared<RSTransitionTranslate>(translate.x_, translate.y_, translate.z_);
84 transitionInEffects_.push_back(translateEffect);
85 transitionOutEffects_.push_back(translateEffect);
86 return shared_from_this();
87 }
88
Rotate(const Vector4f & axisAngle)89 std::shared_ptr<RSTransitionEffect> RSTransitionEffect::Rotate(const Vector4f& axisAngle)
90 {
91 if (axisAngle.w_ == 0.0f) {
92 ROSEN_LOGI("RSTransitionEffect::Rotate: Skip empty transition effect");
93 return shared_from_this();
94 }
95 auto angleRadian = axisAngle.w_ * DEGREE_TO_RADIAN;
96 auto rotateEffect = std::make_shared<RSTransitionRotate>(axisAngle.x_, axisAngle.y_, axisAngle.z_, angleRadian);
97 transitionInEffects_.push_back(rotateEffect);
98 transitionOutEffects_.push_back(rotateEffect);
99 return shared_from_this();
100 }
101
Custom(const std::shared_ptr<RSTransitionModifier> & modifier)102 std::shared_ptr<RSTransitionEffect> RSTransitionEffect::Custom(const std::shared_ptr<RSTransitionModifier>& modifier)
103 {
104 if (modifier == nullptr) {
105 ROSEN_LOGI("RSTransitionEffect::Custom: Skip empty transition effect case modifier is nullptr");
106 return shared_from_this();
107 }
108 auto customEffect = std::make_shared<RSCustomTransitionEffect>(modifier);
109 customTransitionInEffects_.push_back(customEffect);
110 customTransitionOutEffects_.push_back(customEffect);
111 return shared_from_this();
112 }
113
Custom(const std::shared_ptr<RSPropertyBase> & property,const std::shared_ptr<RSPropertyBase> & startValue,const std::shared_ptr<RSPropertyBase> & endValue)114 void RSCustomTransitionEffect::Custom(const std::shared_ptr<RSPropertyBase>& property,
115 const std::shared_ptr<RSPropertyBase>& startValue, const std::shared_ptr<RSPropertyBase>& endValue)
116 {
117 properties_.emplace_back(property, endValue);
118 auto customEffect = std::make_shared<RSTransitionCustom>(property->GetRenderProperty(),
119 startValue->GetRenderProperty(), endValue->GetRenderProperty());
120 customTransitionEffects_.push_back(customEffect);
121 }
122
Active()123 void RSCustomTransitionEffect::Active()
124 {
125 if (modifier_) {
126 modifier_->Active();
127 }
128 }
129
Identity()130 void RSCustomTransitionEffect::Identity()
131 {
132 if (modifier_) {
133 modifier_->Identity();
134 }
135 }
136 } // namespace Rosen
137 } // namespace OHOS
138