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 "modifier/rs_property_modifier.h"
17 
18 #include "modifier/rs_modifier_type.h"
19 #include "modifier/rs_render_modifier.h"
20 
21 namespace OHOS {
22 namespace Rosen {
23 
RSEnvForegroundColorModifier(const std::shared_ptr<RSPropertyBase> & property)24 RSEnvForegroundColorModifier::RSEnvForegroundColorModifier(const std::shared_ptr<RSPropertyBase>& property)
25     : RSForegroundModifier(property, RSModifierType::ENV_FOREGROUND_COLOR)
26 {}
GetModifierType() const27 RSModifierType RSEnvForegroundColorModifier::GetModifierType() const
28 {
29     return RSModifierType::ENV_FOREGROUND_COLOR;
30 }
CreateRenderModifier() const31 std::shared_ptr<RSRenderModifier> RSEnvForegroundColorModifier::CreateRenderModifier() const
32 {
33     auto renderProperty = GetRenderProperty();
34     auto renderModifier = std::make_shared<RSEnvForegroundColorRenderModifier>(renderProperty);
35     return renderModifier;
36 }
37 
RSEnvForegroundColorStrategyModifier(const std::shared_ptr<RSPropertyBase> & property)38 RSEnvForegroundColorStrategyModifier::RSEnvForegroundColorStrategyModifier(
39     const std::shared_ptr<RSPropertyBase>& property)
40     : RSForegroundModifier(property, RSModifierType::ENV_FOREGROUND_COLOR_STRATEGY)
41 {}
GetModifierType() const42 RSModifierType RSEnvForegroundColorStrategyModifier::GetModifierType() const
43 {
44     return RSModifierType::ENV_FOREGROUND_COLOR_STRATEGY;
45 }
CreateRenderModifier() const46 std::shared_ptr<RSRenderModifier> RSEnvForegroundColorStrategyModifier::CreateRenderModifier() const
47 {
48     auto renderProperty = GetRenderProperty();
49     auto renderModifier = std::make_shared<RSEnvForegroundColorStrategyRenderModifier>(renderProperty);
50     return renderModifier;
51 }
52 
RSCustomClipToFrameModifier(const std::shared_ptr<RSPropertyBase> & property)53 RSCustomClipToFrameModifier::RSCustomClipToFrameModifier(const std::shared_ptr<RSPropertyBase>& property)
54     : RSForegroundModifier(property, RSModifierType::CUSTOM_CLIP_TO_FRAME)
55 {}
56 
GetModifierType() const57 RSModifierType RSCustomClipToFrameModifier::GetModifierType() const
58 {
59     return RSModifierType::CUSTOM_CLIP_TO_FRAME;
60 }
61 
CreateRenderModifier() const62 std::shared_ptr<RSRenderModifier> RSCustomClipToFrameModifier::CreateRenderModifier() const
63 {
64     auto renderProperty = GetRenderProperty();
65     auto renderModifier = std::make_shared<RSCustomClipToFrameRenderModifier>(renderProperty);
66     return renderModifier;
67 }
68 
RSBehindWindowFilterRadiusModifier(const std::shared_ptr<RSPropertyBase> & property)69 RSBehindWindowFilterRadiusModifier::RSBehindWindowFilterRadiusModifier(const std::shared_ptr<RSPropertyBase>& property)
70     : RSBackgroundModifier(property, RSModifierType::BEHIND_WINDOW_FILTER_RADIUS)
71 {
72     property_->SetThresholdType(ThresholdType::COARSE);
73 }
74 
GetModifierType() const75 RSModifierType RSBehindWindowFilterRadiusModifier::GetModifierType() const
76 {
77     return RSModifierType::BEHIND_WINDOW_FILTER_RADIUS;
78 }
79 
CreateRenderModifier() const80 std::shared_ptr<RSRenderModifier> RSBehindWindowFilterRadiusModifier::CreateRenderModifier() const
81 {
82     auto renderProperty = GetRenderProperty();
83     auto renderModifier = std::make_shared<RSBehindWindowFilterRadiusRenderModifier>(renderProperty);
84     return renderModifier;
85 }
86 
RSBehindWindowFilterSaturationModifier(const std::shared_ptr<RSPropertyBase> & property)87 RSBehindWindowFilterSaturationModifier::RSBehindWindowFilterSaturationModifier(
88     const std::shared_ptr<RSPropertyBase>& property) : RSBackgroundModifier(property,
89     RSModifierType::BEHIND_WINDOW_FILTER_SATURATION)
90 {
91     property_->SetThresholdType(ThresholdType::COARSE);
92 }
93 
GetModifierType() const94 RSModifierType RSBehindWindowFilterSaturationModifier::GetModifierType() const
95 {
96     return RSModifierType::BEHIND_WINDOW_FILTER_SATURATION;
97 }
98 
CreateRenderModifier() const99 std::shared_ptr<RSRenderModifier> RSBehindWindowFilterSaturationModifier::CreateRenderModifier() const
100 {
101     auto renderProperty = GetRenderProperty();
102     auto renderModifier = std::make_shared<RSBehindWindowFilterSaturationRenderModifier>(renderProperty);
103     return renderModifier;
104 }
105 
RSBehindWindowFilterBrightnessModifier(const std::shared_ptr<RSPropertyBase> & property)106 RSBehindWindowFilterBrightnessModifier::RSBehindWindowFilterBrightnessModifier(
107     const std::shared_ptr<RSPropertyBase>& property) : RSBackgroundModifier(property,
108     RSModifierType::BEHIND_WINDOW_FILTER_BRIGHTNESS)
109 {
110     property_->SetThresholdType(ThresholdType::COARSE);
111 }
112 
GetModifierType() const113 RSModifierType RSBehindWindowFilterBrightnessModifier::GetModifierType() const
114 {
115     return RSModifierType::BEHIND_WINDOW_FILTER_BRIGHTNESS;
116 }
117 
CreateRenderModifier() const118 std::shared_ptr<RSRenderModifier> RSBehindWindowFilterBrightnessModifier::CreateRenderModifier() const
119 {
120     auto renderProperty = GetRenderProperty();
121     auto renderModifier = std::make_shared<RSBehindWindowFilterBrightnessRenderModifier>(renderProperty);
122     return renderModifier;
123 }
124 
RSBehindWindowFilterMaskColorModifier(const std::shared_ptr<RSPropertyBase> & property)125 RSBehindWindowFilterMaskColorModifier::RSBehindWindowFilterMaskColorModifier(
126     const std::shared_ptr<RSPropertyBase>& property) : RSBackgroundModifier(property,
127     RSModifierType::BEHIND_WINDOW_FILTER_MASK_COLOR)
128 {
129     property_->SetThresholdType(ThresholdType::COLOR);
130 }
131 
GetModifierType() const132 RSModifierType RSBehindWindowFilterMaskColorModifier::GetModifierType() const
133 {
134     return RSModifierType::BEHIND_WINDOW_FILTER_MASK_COLOR;
135 }
136 
CreateRenderModifier() const137 std::shared_ptr<RSRenderModifier> RSBehindWindowFilterMaskColorModifier::CreateRenderModifier() const
138 {
139     auto renderProperty = GetRenderProperty();
140     auto renderModifier = std::make_shared<RSBehindWindowFilterMaskColorRenderModifier>(renderProperty);
141     return renderModifier;
142 }
143 
Apply(const std::shared_ptr<RSObjAbsGeometry> & geometry)144 void RSBoundsModifier::Apply(const std::shared_ptr<RSObjAbsGeometry>& geometry)
145 {
146     auto value = std::static_pointer_cast<RSProperty<Vector4f>>(property_)->Get();
147     geometry->SetRect(value.x_, value.y_, value.z_, value.w_);
148 }
149 
Apply(const std::shared_ptr<RSObjAbsGeometry> & geometry)150 void RSBoundsSizeModifier::Apply(const std::shared_ptr<RSObjAbsGeometry>& geometry)
151 {
152     auto value = std::static_pointer_cast<RSProperty<Vector2f>>(property_)->Get();
153     geometry->SetSize(value.x_, value.y_);
154 }
155 
Apply(const std::shared_ptr<RSObjAbsGeometry> & geometry)156 void RSBoundsPositionModifier::Apply(const std::shared_ptr<RSObjAbsGeometry>& geometry)
157 {
158     auto value = std::static_pointer_cast<RSProperty<Vector2f>>(property_)->Get();
159     geometry->SetPosition(value.x_, value.y_);
160 }
161 
Apply(const std::shared_ptr<RSObjAbsGeometry> & geometry)162 void RSPivotModifier::Apply(const std::shared_ptr<RSObjAbsGeometry>& geometry)
163 {
164     auto value = std::static_pointer_cast<RSProperty<Vector2f>>(property_)->Get();
165     geometry->SetPivot(value.x_, value.y_);
166 }
167 
Apply(const std::shared_ptr<RSObjAbsGeometry> & geometry)168 void RSPivotZModifier::Apply(const std::shared_ptr<RSObjAbsGeometry>& geometry)
169 {
170     auto value = std::static_pointer_cast<RSProperty<float>>(property_)->Get();
171     geometry->SetPivotZ(value);
172 }
173 
Apply(const std::shared_ptr<RSObjAbsGeometry> & geometry)174 void RSQuaternionModifier::Apply(const std::shared_ptr<RSObjAbsGeometry>& geometry)
175 {
176     auto value = std::static_pointer_cast<RSProperty<Quaternion>>(property_)->Get();
177     geometry->SetQuaternion(value);
178 }
179 
Apply(const std::shared_ptr<RSObjAbsGeometry> & geometry)180 void RSRotationModifier::Apply(const std::shared_ptr<RSObjAbsGeometry>& geometry)
181 {
182     auto value = std::static_pointer_cast<RSProperty<float>>(property_)->Get();
183     value += geometry->GetRotation();
184     geometry->SetRotation(value);
185 }
186 
Apply(const std::shared_ptr<RSObjAbsGeometry> & geometry)187 void RSRotationXModifier::Apply(const std::shared_ptr<RSObjAbsGeometry>& geometry)
188 {
189     auto value = std::static_pointer_cast<RSProperty<float>>(property_)->Get();
190     value += geometry->GetRotationX();
191     geometry->SetRotationX(value);
192 }
193 
Apply(const std::shared_ptr<RSObjAbsGeometry> & geometry)194 void RSRotationYModifier::Apply(const std::shared_ptr<RSObjAbsGeometry>& geometry)
195 {
196     auto value = std::static_pointer_cast<RSProperty<float>>(property_)->Get();
197     value += geometry->GetRotationY();
198     geometry->SetRotationY(value);
199 }
200 
Apply(const std::shared_ptr<RSObjAbsGeometry> & geometry)201 void RSCameraDistanceModifier::Apply(const std::shared_ptr<RSObjAbsGeometry>& geometry)
202 {
203     auto value = std::static_pointer_cast<RSProperty<float>>(property_)->Get();
204     geometry->SetCameraDistance(value);
205 }
206 
Apply(const std::shared_ptr<RSObjAbsGeometry> & geometry)207 void RSScaleModifier::Apply(const std::shared_ptr<RSObjAbsGeometry>& geometry)
208 {
209     auto value = std::static_pointer_cast<RSProperty<Vector2f>>(property_)->Get();
210     value *= Vector2f(geometry->GetScaleX(), geometry->GetScaleY());
211     geometry->SetScale(value.x_, value.y_);
212 }
213 
Apply(const std::shared_ptr<RSObjAbsGeometry> & geometry)214 void RSSkewModifier::Apply(const std::shared_ptr<RSObjAbsGeometry>& geometry)
215 {
216     auto value = std::static_pointer_cast<RSProperty<Vector2f>>(property_)->Get();
217     value += Vector2f(geometry->GetSkewX(), geometry->GetSkewY());
218     geometry->SetSkew(value.x_, value.y_);
219 }
220 
Apply(const std::shared_ptr<RSObjAbsGeometry> & geometry)221 void RSPerspModifier::Apply(const std::shared_ptr<RSObjAbsGeometry>& geometry)
222 {
223     auto value = std::static_pointer_cast<RSProperty<Vector2f>>(property_)->Get();
224     value += Vector2f(geometry->GetPerspX(), geometry->GetPerspY());
225     geometry->SetPersp(value.x_, value.y_);
226 }
227 
Apply(const std::shared_ptr<RSObjAbsGeometry> & geometry)228 void RSTranslateModifier::Apply(const std::shared_ptr<RSObjAbsGeometry>& geometry)
229 {
230     auto value = std::static_pointer_cast<RSProperty<Vector2f>>(property_)->Get();
231     value += Vector2f(geometry->GetTranslateX(), geometry->GetTranslateY());
232     geometry->SetTranslateX(value.x_);
233     geometry->SetTranslateY(value.y_);
234 }
235 
Apply(const std::shared_ptr<RSObjAbsGeometry> & geometry)236 void RSTranslateZModifier::Apply(const std::shared_ptr<RSObjAbsGeometry>& geometry)
237 {
238     auto value = std::static_pointer_cast<RSProperty<float>>(property_)->Get();
239     value += geometry->GetTranslateZ();
240     geometry->SetTranslateZ(value);
241 }
242 
243 #define DECLARE_ANIMATABLE_MODIFIER_CREATE(MODIFIER_NAME)                                          \
244     std::shared_ptr<RSRenderModifier> RS##MODIFIER_NAME##Modifier::CreateRenderModifier() const    \
245     {                                                                                              \
246         auto renderProperty = GetRenderProperty();                                                 \
247         auto renderModifier = std::make_shared<RS##MODIFIER_NAME##RenderModifier>(renderProperty); \
248         return renderModifier;                                                                     \
249     }
250 
251 #define DECLARE_ANIMATABLE_MODIFIER(MODIFIER_NAME, TYPE, MODIFIER_TYPE, DELTA_OP, MODIFIER_TIER, THRESHOLD_TYPE) \
252     RS##MODIFIER_NAME##Modifier::RS##MODIFIER_NAME##Modifier(const std::shared_ptr<RSPropertyBase>& property)    \
253         : RS##MODIFIER_TIER##Modifier(property, RSModifierType::MODIFIER_TYPE)                                   \
254     {                                                                                                            \
255         property_->SetThresholdType(ThresholdType::THRESHOLD_TYPE);                                              \
256     }                                                                                                            \
257     RSModifierType RS##MODIFIER_NAME##Modifier::GetModifierType() const                                          \
258     {                                                                                                            \
259         return RSModifierType::MODIFIER_TYPE;                                                                    \
260     }                                                                                                            \
261     DECLARE_ANIMATABLE_MODIFIER_CREATE(MODIFIER_NAME)
262 
263 #define DECLARE_NOANIMATABLE_MODIFIER_CREATE(MODIFIER_NAME)                                        \
264     std::shared_ptr<RSRenderModifier> RS##MODIFIER_NAME##Modifier::CreateRenderModifier() const    \
265     {                                                                                              \
266         auto renderProperty = GetRenderProperty();                                                 \
267         auto renderModifier = std::make_shared<RS##MODIFIER_NAME##RenderModifier>(renderProperty); \
268         return renderModifier;                                                                     \
269     }
270 
271 #define DECLARE_NOANIMATABLE_MODIFIER(MODIFIER_NAME, TYPE, MODIFIER_TYPE, MODIFIER_TIER)                            \
272     RS##MODIFIER_NAME##Modifier::RS##MODIFIER_NAME##Modifier(const std::shared_ptr<RSPropertyBase>& property)       \
273         : RS##MODIFIER_TIER##Modifier(property, RSModifierType::MODIFIER_TYPE)                                      \
274     {}                                                                                                              \
275     RSModifierType RS##MODIFIER_NAME##Modifier::GetModifierType() const                                             \
276     {                                                                                                               \
277         return RSModifierType::MODIFIER_TYPE;                                                                       \
278     }                                                                                                               \
279     DECLARE_NOANIMATABLE_MODIFIER_CREATE(MODIFIER_NAME)
280 
281 #include "modifier/rs_modifiers_def.in"
282 
283 #undef DECLARE_ANIMATABLE_MODIFIER
284 #undef DECLARE_NOANIMATABLE_MODIFIER
285 } // namespace Rosen
286 } // namespace OHOS
287