• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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