• 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_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