1 /*
2  * Copyright (c) 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 "core/components_ng/render/adapter/rosen_modifier_property.h"
17 
18 #include "base/utils/utils.h"
19 
20 namespace OHOS::Ace::NG {
21 template<typename T>
CreateOrSetModifierValue(std::shared_ptr<Rosen::RSAnimatableProperty<T>> & property,const T & value)22 bool CreateOrSetModifierValue(std::shared_ptr<Rosen::RSAnimatableProperty<T>>& property, const T& value)
23 {
24     if (property == nullptr) {
25         property = std::make_shared<Rosen::RSAnimatableProperty<T>>(value);
26         return true;
27     }
28     property->Set(value);
29     return false;
30 }
31 
AddOrChangeScaleModifier(std::shared_ptr<Rosen::RSNode> & rsNode,std::shared_ptr<Rosen::RSScaleModifier> & modifier,std::shared_ptr<Rosen::RSAnimatableProperty<Rosen::Vector2f>> & property,const Rosen::Vector2f & value)32 void AddOrChangeScaleModifier(std::shared_ptr<Rosen::RSNode>& rsNode,
33     std::shared_ptr<Rosen::RSScaleModifier>& modifier,
34     std::shared_ptr<Rosen::RSAnimatableProperty<Rosen::Vector2f>>& property, const Rosen::Vector2f& value)
35 {
36     bool isCreate = CreateOrSetModifierValue(property, value);
37     if (isCreate) {
38         CHECK_NULL_VOID(rsNode);
39         modifier = std::make_shared<Rosen::RSScaleModifier>(property);
40         rsNode->AddModifier(modifier);
41     }
42 }
43 
AddOrChangeSkewModifier(std::shared_ptr<Rosen::RSNode> & rsNode,std::shared_ptr<Rosen::RSSkewModifier> & modifier,std::shared_ptr<Rosen::RSAnimatableProperty<Rosen::Vector2f>> & property,const Rosen::Vector2f & value)44 void AddOrChangeSkewModifier(std::shared_ptr<Rosen::RSNode>& rsNode,
45     std::shared_ptr<Rosen::RSSkewModifier>& modifier,
46     std::shared_ptr<Rosen::RSAnimatableProperty<Rosen::Vector2f>>& property, const Rosen::Vector2f& value)
47 {
48     bool isCreate = CreateOrSetModifierValue(property, value);
49     if (isCreate) {
50         CHECK_NULL_VOID(rsNode);
51         modifier = std::make_shared<Rosen::RSSkewModifier>(property);
52         rsNode->AddModifier(modifier);
53     }
54 }
55 
AddOrChangePivotModifier(std::shared_ptr<Rosen::RSNode> & rsNode,std::shared_ptr<Rosen::RSPivotModifier> & modifier,std::shared_ptr<Rosen::RSAnimatableProperty<Rosen::Vector2f>> & property,const Rosen::Vector2f & value)56 void AddOrChangePivotModifier(std::shared_ptr<Rosen::RSNode>& rsNode,
57     std::shared_ptr<Rosen::RSPivotModifier>& modifier,
58     std::shared_ptr<Rosen::RSAnimatableProperty<Rosen::Vector2f>>& property, const Rosen::Vector2f& value)
59 {
60     bool isCreate = CreateOrSetModifierValue(property, value);
61     if (isCreate) {
62         CHECK_NULL_VOID(rsNode);
63         modifier = std::make_shared<Rosen::RSPivotModifier>(property);
64         rsNode->AddModifier(modifier);
65     }
66 }
67 
AddOrChangeTranslateZModifier(std::shared_ptr<Rosen::RSNode> & rsNode,std::shared_ptr<Rosen::RSTranslateZModifier> & modifier,std::shared_ptr<Rosen::RSAnimatableProperty<float>> & property,const float value)68 void AddOrChangeTranslateZModifier(std::shared_ptr<Rosen::RSNode>& rsNode,
69     std::shared_ptr<Rosen::RSTranslateZModifier>& modifier,
70     std::shared_ptr<Rosen::RSAnimatableProperty<float>>& property, const float value)
71 {
72     bool isCreate = CreateOrSetModifierValue(property, value);
73     if (isCreate) {
74         CHECK_NULL_VOID(rsNode);
75         modifier = std::make_shared<Rosen::RSTranslateZModifier>(property);
76         rsNode->AddModifier(modifier);
77     }
78 }
79 
AddOrChangePerspectiveModifier(std::shared_ptr<Rosen::RSNode> & rsNode,std::shared_ptr<Rosen::RSPerspModifier> & modifier,std::shared_ptr<Rosen::RSAnimatableProperty<Rosen::Vector2f>> & property,const Rosen::Vector2f & value)80 void AddOrChangePerspectiveModifier(std::shared_ptr<Rosen::RSNode>& rsNode,
81     std::shared_ptr<Rosen::RSPerspModifier>& modifier,
82     std::shared_ptr<Rosen::RSAnimatableProperty<Rosen::Vector2f>>& property, const Rosen::Vector2f& value)
83 {
84     bool isCreate = CreateOrSetModifierValue(property, value);
85     if (isCreate) {
86         CHECK_NULL_VOID(rsNode);
87         modifier = std::make_shared<Rosen::RSPerspModifier>(property);
88         rsNode->AddModifier(modifier);
89     }
90 }
91 
AddOrChangeTranslateModifier(std::shared_ptr<Rosen::RSNode> & rsNode,std::shared_ptr<Rosen::RSTranslateModifier> & modifier,std::shared_ptr<Rosen::RSAnimatableProperty<Rosen::Vector2f>> & property,const Rosen::Vector2f & value)92 void AddOrChangeTranslateModifier(std::shared_ptr<Rosen::RSNode>& rsNode,
93     std::shared_ptr<Rosen::RSTranslateModifier>& modifier,
94     std::shared_ptr<Rosen::RSAnimatableProperty<Rosen::Vector2f>>& property, const Rosen::Vector2f& value)
95 {
96     bool isCreate = CreateOrSetModifierValue(property, value);
97     if (isCreate) {
98         CHECK_NULL_VOID(rsNode);
99         modifier = std::make_shared<Rosen::RSTranslateModifier>(property);
100         rsNode->AddModifier(modifier);
101     }
102 }
103 
AddOrChangeQuaternionModifier(std::shared_ptr<Rosen::RSNode> & rsNode,std::shared_ptr<Rosen::RSQuaternionModifier> & modifier,std::shared_ptr<Rosen::RSAnimatableProperty<Rosen::Quaternion>> & property,const Rosen::Quaternion & value)104 void AddOrChangeQuaternionModifier(std::shared_ptr<Rosen::RSNode>& rsNode,
105     std::shared_ptr<Rosen::RSQuaternionModifier>& modifier,
106     std::shared_ptr<Rosen::RSAnimatableProperty<Rosen::Quaternion>>& property, const Rosen::Quaternion& value)
107 {
108     bool isCreate = CreateOrSetModifierValue(property, value);
109     if (isCreate) {
110         CHECK_NULL_VOID(rsNode);
111         modifier = std::make_shared<Rosen::RSQuaternionModifier>(property);
112         rsNode->AddModifier(modifier);
113     }
114 }
115 
AddOrChangeRadiusModifier(std::shared_ptr<Rosen::RSNode> & rsNode,std::shared_ptr<Rosen::RSBehindWindowFilterRadiusModifier> & modifier,std::shared_ptr<Rosen::RSAnimatableProperty<float>> & property,const float & value)116 void WindowBlurModifier::AddOrChangeRadiusModifier(std::shared_ptr<Rosen::RSNode>& rsNode,
117     std::shared_ptr<Rosen::RSBehindWindowFilterRadiusModifier>& modifier,
118     std::shared_ptr<Rosen::RSAnimatableProperty<float>>& property, const float& value)
119 {
120     bool isCreate = CreateOrSetModifierValue(property, value);
121     if (isCreate) {
122         CHECK_NULL_VOID(rsNode);
123         modifier = std::make_shared<Rosen::RSBehindWindowFilterRadiusModifier>(property);
124         rsNode->AddModifier(modifier);
125     }
126 }
AddOrChangeSaturationModifier(std::shared_ptr<Rosen::RSNode> & rsNode,std::shared_ptr<Rosen::RSBehindWindowFilterSaturationModifier> & modifier,std::shared_ptr<Rosen::RSAnimatableProperty<float>> & property,const float & value)127 void WindowBlurModifier::AddOrChangeSaturationModifier(std::shared_ptr<Rosen::RSNode>& rsNode,
128     std::shared_ptr<Rosen::RSBehindWindowFilterSaturationModifier>& modifier,
129     std::shared_ptr<Rosen::RSAnimatableProperty<float>>& property, const float& value)
130 {
131     bool isCreate = CreateOrSetModifierValue(property, value);
132     if (isCreate) {
133         CHECK_NULL_VOID(rsNode);
134         modifier = std::make_shared<Rosen::RSBehindWindowFilterSaturationModifier>(property);
135         rsNode->AddModifier(modifier);
136     }
137 }
AddOrChangeBrightnessModifier(std::shared_ptr<Rosen::RSNode> & rsNode,std::shared_ptr<Rosen::RSBehindWindowFilterBrightnessModifier> & modifier,std::shared_ptr<Rosen::RSAnimatableProperty<float>> & property,const float & value)138 void WindowBlurModifier::AddOrChangeBrightnessModifier(std::shared_ptr<Rosen::RSNode>& rsNode,
139     std::shared_ptr<Rosen::RSBehindWindowFilterBrightnessModifier>& modifier,
140     std::shared_ptr<Rosen::RSAnimatableProperty<float>>& property, const float& value)
141 {
142     bool isCreate = CreateOrSetModifierValue(property, value);
143     if (isCreate) {
144         CHECK_NULL_VOID(rsNode);
145         modifier = std::make_shared<Rosen::RSBehindWindowFilterBrightnessModifier>(property);
146         rsNode->AddModifier(modifier);
147     }
148 }
AddOrChangeMaskColorModifier(std::shared_ptr<Rosen::RSNode> & rsNode,std::shared_ptr<Rosen::RSBehindWindowFilterMaskColorModifier> & modifier,std::shared_ptr<Rosen::RSAnimatableProperty<Rosen::RSColor>> & property,const Rosen::RSColor & value)149 void WindowBlurModifier::AddOrChangeMaskColorModifier(std::shared_ptr<Rosen::RSNode>& rsNode,
150     std::shared_ptr<Rosen::RSBehindWindowFilterMaskColorModifier>& modifier,
151     std::shared_ptr<Rosen::RSAnimatableProperty<Rosen::RSColor>>& property, const Rosen::RSColor& value)
152 {
153     bool isCreate = CreateOrSetModifierValue(property, value);
154     if (isCreate) {
155         CHECK_NULL_VOID(rsNode);
156         modifier = std::make_shared<Rosen::RSBehindWindowFilterMaskColorModifier>(property);
157         rsNode->AddModifier(modifier);
158     }
159 }
160 } // namespace OHOS::Ace::NG