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