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 static uint32_t count = 0;
56 if (opacity == 1.0f) {
57 // 10% probability to accept
58 ROSEN_LOGI_IF(((count++) % 10) == 0, "RSTransitionEffect::Opacity: Skip empty transition effect");
59 return shared_from_this();
60 }
61 auto opacityEffect = std::make_shared<RSTransitionFade>(opacity);
62 transitionInEffects_.push_back(opacityEffect);
63 transitionOutEffects_.push_back(opacityEffect);
64 return shared_from_this();
65 }
66
Scale(const Vector3f & scale)67 std::shared_ptr<RSTransitionEffect> RSTransitionEffect::Scale(const Vector3f& scale)
68 {
69 if (scale.x_ == 1.0f && scale.y_ == 1.0f && scale.z_ == 1.0f) {
70 ROSEN_LOGI("RSTransitionEffect::Scale: Skip empty transition effect");
71 return shared_from_this();
72 }
73 auto scaleEffect = std::make_shared<RSTransitionScale>(scale.x_, scale.y_, scale.z_);
74 transitionInEffects_.push_back(scaleEffect);
75 transitionOutEffects_.push_back(scaleEffect);
76 return shared_from_this();
77 }
78
Translate(const Vector3f & translate)79 std::shared_ptr<RSTransitionEffect> RSTransitionEffect::Translate(const Vector3f& translate)
80 {
81 if (translate.x_ == 0.0f && translate.y_ == 0.0f && translate.z_ == 0.0f) {
82 ROSEN_LOGI("RSTransitionEffect::Translate: Skip empty transition effect");
83 return shared_from_this();
84 }
85 auto translateEffect = std::make_shared<RSTransitionTranslate>(translate.x_, translate.y_, translate.z_);
86 transitionInEffects_.push_back(translateEffect);
87 transitionOutEffects_.push_back(translateEffect);
88 return shared_from_this();
89 }
90
Rotate(const Vector4f & axisAngle)91 std::shared_ptr<RSTransitionEffect> RSTransitionEffect::Rotate(const Vector4f& axisAngle)
92 {
93 if (axisAngle.w_ == 0.0f) {
94 ROSEN_LOGI("RSTransitionEffect::Rotate: Skip empty transition effect");
95 return shared_from_this();
96 }
97 auto angleRadian = axisAngle.w_ * DEGREE_TO_RADIAN;
98 auto rotateEffect = std::make_shared<RSTransitionRotate>(axisAngle.x_, axisAngle.y_, axisAngle.z_, angleRadian);
99 transitionInEffects_.push_back(rotateEffect);
100 transitionOutEffects_.push_back(rotateEffect);
101 return shared_from_this();
102 }
103
Custom(const std::shared_ptr<RSTransitionModifier> & modifier)104 std::shared_ptr<RSTransitionEffect> RSTransitionEffect::Custom(const std::shared_ptr<RSTransitionModifier>& modifier)
105 {
106 if (modifier == nullptr) {
107 ROSEN_LOGI("RSTransitionEffect::Custom: Skip empty transition effect case modifier is nullptr");
108 return shared_from_this();
109 }
110 auto customEffect = std::make_shared<RSCustomTransitionEffect>(modifier);
111 customTransitionInEffects_.push_back(customEffect);
112 customTransitionOutEffects_.push_back(customEffect);
113 return shared_from_this();
114 }
115
Custom(const std::shared_ptr<RSPropertyBase> & property,const std::shared_ptr<RSPropertyBase> & startValue,const std::shared_ptr<RSPropertyBase> & endValue)116 void RSCustomTransitionEffect::Custom(const std::shared_ptr<RSPropertyBase>& property,
117 const std::shared_ptr<RSPropertyBase>& startValue, const std::shared_ptr<RSPropertyBase>& endValue)
118 {
119 properties_.emplace_back(property, endValue);
120 auto customEffect = std::make_shared<RSTransitionCustom>(property->GetRenderProperty(),
121 startValue->GetRenderProperty(), endValue->GetRenderProperty());
122 customTransitionEffects_.push_back(customEffect);
123 }
124
Active()125 void RSCustomTransitionEffect::Active()
126 {
127 if (modifier_) {
128 modifier_->Active();
129 }
130 }
131
Identity()132 void RSCustomTransitionEffect::Identity()
133 {
134 if (modifier_) {
135 modifier_->Identity();
136 }
137 }
138 } // namespace Rosen
139 } // namespace OHOS
140