• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2023 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 #ifndef RENDER_SERVICE_CLIENT_CORE_ANIMATION_RS_RENDER_MODIFIER_H
17 #define RENDER_SERVICE_CLIENT_CORE_ANIMATION_RS_RENDER_MODIFIER_H
18 
19 #include <memory>
20 
21 #include "parcel.h"
22 #include "rs_modifier_type.h"
23 
24 #include "common/rs_color.h"
25 #include "common/rs_macros.h"
26 #include "modifier/rs_modifier_type.h"
27 #include "modifier/rs_render_property.h"
28 
29 #include "recording/draw_cmd_list.h"
30 #include "utils/matrix.h"
31 
32 namespace OHOS {
33 namespace Rosen {
34 class RSProperties;
35 class RSPaintFilterCanvas;
36 class RSRenderNode;
37 class RSRenderParticleVector;
38 
39 class RSModifierContext {
40 public:
RSModifierContext(RSProperties & property)41     RSModifierContext(RSProperties& property) : properties_(property), canvas_(nullptr) {}
RSModifierContext(RSProperties & property,RSPaintFilterCanvas * canvas)42     RSModifierContext(RSProperties& property, RSPaintFilterCanvas* canvas) : properties_(property), canvas_(canvas) {}
43     RSProperties& properties_;
44     RSPaintFilterCanvas* canvas_;
45 };
46 
47 class RSB_EXPORT RSRenderModifier {
48 public:
49     RSRenderModifier() = default;
50     RSRenderModifier(const RSRenderModifier&) = delete;
51     RSRenderModifier(const RSRenderModifier&&) = delete;
52     RSRenderModifier& operator=(const RSRenderModifier&) = delete;
53     RSRenderModifier& operator=(const RSRenderModifier&&) = delete;
54     virtual ~RSRenderModifier() = default;
55 
56     virtual void Apply(RSModifierContext& context) const = 0;
57 
58     virtual PropertyId GetPropertyId() = 0;
59     virtual std::shared_ptr<RSRenderPropertyBase> GetProperty() = 0;
Dump(std::string & out)60     void Dump(std::string& out)
61     {
62         GetProperty()->Dump(out);
63     }
64 
GetType()65     virtual RSModifierType GetType()
66     {
67         return RSModifierType::INVALID;
68     }
69 
GetModifierTypeString()70     virtual std::string GetModifierTypeString()
71     {
72         auto modifierTypeString = std::make_shared<RSModifierTypeString>();
73         return modifierTypeString->GetModifierTypeString(GetType());
74     }
75 
76     virtual void Update(const std::shared_ptr<RSRenderPropertyBase>& prop, bool isDelta) = 0;
77 
78     virtual bool Marshalling(Parcel& parcel) = 0;
79     [[nodiscard]] static RSRenderModifier* Unmarshalling(Parcel& parcel);
80 
GetPropertyDrawCmdList()81     virtual std::shared_ptr<Drawing::DrawCmdList> GetPropertyDrawCmdList() const
82     {
83         return nullptr;
84     }
GetDrawCmdListId()85     virtual uint64_t GetDrawCmdListId() const
86     {
87         return 0;
88     }
SetSingleFrameModifier(bool value)89     virtual void SetSingleFrameModifier(bool value) { (void)value; }
GetSingleFrameModifier()90     virtual bool GetSingleFrameModifier() const
91     {
92         return false;
93     }
94 };
95 
96 class RSB_EXPORT RSGeometryTransRenderModifier : public RSRenderModifier {
97 public:
RSGeometryTransRenderModifier(const std::shared_ptr<RSRenderProperty<Drawing::Matrix>> & property)98     RSGeometryTransRenderModifier(const std::shared_ptr<RSRenderProperty<Drawing::Matrix>>& property)
99         : property_(property ? property : std::make_shared<RSRenderProperty<Drawing::Matrix>>()) {}
100     ~RSGeometryTransRenderModifier() override = default;
101     void Apply(RSModifierContext& context) const override;
102     void Update(const std::shared_ptr<RSRenderPropertyBase>& prop, bool isDelta) override;
103     bool Marshalling(Parcel& parcel) override;
GetPropertyId()104     PropertyId GetPropertyId() override
105     {
106         return property_->GetId();
107     }
108 
GetProperty()109     std::shared_ptr<RSRenderPropertyBase> GetProperty() override
110     {
111         return property_;
112     }
113 
SetType(RSModifierType type)114     void SetType(RSModifierType type)
115     {
116         drawStyle_ = type;
117     }
118 
GetType()119     RSModifierType GetType() override
120     {
121         return drawStyle_;
122     }
123 
124 protected:
125     RSModifierType drawStyle_ = RSModifierType::GEOMETRYTRANS;
126     std::shared_ptr<RSRenderProperty<Drawing::Matrix>> property_;
127 };
128 
129 class RSB_EXPORT RSDrawCmdListRenderModifier : public RSRenderModifier {
130 public:
RSDrawCmdListRenderModifier(const std::shared_ptr<RSRenderProperty<Drawing::DrawCmdListPtr>> & property)131     RSDrawCmdListRenderModifier(const std::shared_ptr<RSRenderProperty<Drawing::DrawCmdListPtr>>& property)
132         : property_(property ? property : std::make_shared<RSRenderProperty<Drawing::DrawCmdListPtr>>())
133     {}
134     ~RSDrawCmdListRenderModifier() override = default;
135     void Apply(RSModifierContext& context) const override;
136     void Update(const std::shared_ptr<RSRenderPropertyBase>& prop, bool isDelta) override;
137     bool Marshalling(Parcel& parcel) override;
138 
GetPropertyId()139     PropertyId GetPropertyId() override
140     {
141         return property_->GetId();
142     }
143 
GetProperty()144     std::shared_ptr<RSRenderPropertyBase> GetProperty() override
145     {
146         return property_;
147     }
148 
GetType()149     RSModifierType GetType() override
150     {
151         return drawStyle_;
152     }
SetType(RSModifierType type)153     void SetType(RSModifierType type)
154     {
155         drawStyle_ = type;
156         if (property_) {
157             property_->SetModifierType(type);
158         }
159     }
160 
GetPropertyDrawCmdList()161     std::shared_ptr<Drawing::DrawCmdList> GetPropertyDrawCmdList() const override
162     {
163         return property_->Get();
164     }
GetDrawCmdListId()165     uint64_t GetDrawCmdListId() const override
166     {
167         Drawing::DrawCmdListPtr drawCmd = property_->Get();
168         return reinterpret_cast<uint64_t>(drawCmd.get());
169     }
SetSingleFrameModifier(bool value)170     void SetSingleFrameModifier(bool value) override
171     {
172         isSingleFrameModifier_ = value;
173     }
GetSingleFrameModifier()174     bool GetSingleFrameModifier() const override
175     {
176         return isSingleFrameModifier_;
177     }
178 
179 protected:
180     RSModifierType drawStyle_ = RSModifierType::EXTENDED;
181     std::shared_ptr<RSRenderProperty<Drawing::DrawCmdListPtr>> property_;
182     bool isSingleFrameModifier_ = false;
183 };
184 
185 class RSAnimatableRenderModifier : public RSRenderModifier {
186 public:
RSAnimatableRenderModifier(const std::shared_ptr<RSRenderPropertyBase> & property)187     RSAnimatableRenderModifier(const std::shared_ptr<RSRenderPropertyBase>& property)
188         : property_(property ? property : std::make_shared<RSRenderPropertyBase>())
189     {}
190 
191     ~RSAnimatableRenderModifier() override = default;
192 
GetPropertyId()193     PropertyId GetPropertyId() override
194     {
195         return property_->GetId();
196     }
197 
GetProperty()198     std::shared_ptr<RSRenderPropertyBase> GetProperty() override
199     {
200         return property_;
201     }
202 
203 protected:
204     std::shared_ptr<RSRenderPropertyBase> property_;
205 
206     friend class RSRenderPropertyAnimation;
207 };
208 
209 class RSGeometryRenderModifier : public RSAnimatableRenderModifier {
210 public:
RSGeometryRenderModifier(const std::shared_ptr<RSRenderPropertyBase> & property)211     RSGeometryRenderModifier(const std::shared_ptr<RSRenderPropertyBase>& property)
212         : RSAnimatableRenderModifier(property)
213     {}
214 
215     ~RSGeometryRenderModifier() override = default;
216 };
217 
218 class RSBackgroundRenderModifier : public RSAnimatableRenderModifier {
219 public:
RSBackgroundRenderModifier(const std::shared_ptr<RSRenderPropertyBase> & property)220     RSBackgroundRenderModifier(const std::shared_ptr<RSRenderPropertyBase>& property)
221         : RSAnimatableRenderModifier(property)
222     {}
223 
224     ~RSBackgroundRenderModifier() override = default;
225 };
226 
227 class RSContentRenderModifier : public RSAnimatableRenderModifier {
228 public:
RSContentRenderModifier(const std::shared_ptr<RSRenderPropertyBase> & property)229     RSContentRenderModifier(const std::shared_ptr<RSRenderPropertyBase>& property)
230         : RSAnimatableRenderModifier(property)
231     {}
232 
233     ~RSContentRenderModifier() override = default;
234 };
235 
236 class RSForegroundRenderModifier : public RSAnimatableRenderModifier {
237 public:
RSForegroundRenderModifier(const std::shared_ptr<RSRenderPropertyBase> & property)238     RSForegroundRenderModifier(const std::shared_ptr<RSRenderPropertyBase>& property)
239         : RSAnimatableRenderModifier(property)
240     {}
241 
242     ~RSForegroundRenderModifier() override = default;
243 };
244 
245 class RSOverlayRenderModifier : public RSAnimatableRenderModifier {
246 public:
RSOverlayRenderModifier(const std::shared_ptr<RSRenderPropertyBase> & property)247     RSOverlayRenderModifier(const std::shared_ptr<RSRenderPropertyBase>& property)
248         : RSAnimatableRenderModifier(property)
249     {}
250 
251     ~RSOverlayRenderModifier() override = default;
252 };
253 
254 class RSAppearanceRenderModifier : public RSAnimatableRenderModifier {
255 public:
RSAppearanceRenderModifier(const std::shared_ptr<RSRenderPropertyBase> & property)256     RSAppearanceRenderModifier(const std::shared_ptr<RSRenderPropertyBase>& property)
257         : RSAnimatableRenderModifier(property)
258     {}
259 
260     ~RSAppearanceRenderModifier() override = default;
261 };
262 
263 
264 class RSB_EXPORT RSEnvForegroundColorRenderModifier : public RSForegroundRenderModifier {
265 public:
RSEnvForegroundColorRenderModifier(const std::shared_ptr<RSRenderPropertyBase> & property)266     RSEnvForegroundColorRenderModifier(const std::shared_ptr<RSRenderPropertyBase>& property)
267         : RSForegroundRenderModifier(property)
268     {
269         property->SetModifierType(RSModifierType::ENV_FOREGROUND_COLOR);
270     }
271     ~RSEnvForegroundColorRenderModifier() override = default;
272     void Apply(RSModifierContext& context) const override;
273     void Update(const std::shared_ptr<RSRenderPropertyBase>& prop, bool isDelta) override;
274     bool Marshalling(Parcel& parcel) override;
GetType()275     RSModifierType GetType() override
276     {
277         return RSModifierType::ENV_FOREGROUND_COLOR;
278     }
279 };
280 
281 class RSB_EXPORT RSEnvForegroundColorStrategyRenderModifier : public RSForegroundRenderModifier {
282 public:
RSEnvForegroundColorStrategyRenderModifier(const std::shared_ptr<RSRenderPropertyBase> & property)283     RSEnvForegroundColorStrategyRenderModifier(const std::shared_ptr<RSRenderPropertyBase>& property)
284         : RSForegroundRenderModifier(property)
285     {
286         property->SetModifierType(RSModifierType::ENV_FOREGROUND_COLOR_STRATEGY);
287     }
288     ~RSEnvForegroundColorStrategyRenderModifier() override = default;
289     void Apply(RSModifierContext& context) const override;
290     void Update(const std::shared_ptr<RSRenderPropertyBase>& prop, bool isDelta) override;
291     bool Marshalling(Parcel& parcel) override;
GetType()292     RSModifierType GetType() override
293     {
294         return RSModifierType::ENV_FOREGROUND_COLOR_STRATEGY;
295     }
296     Color GetInvertBackgroundColor(RSModifierContext& context) const;
297     Color CalculateInvertColor(Color backgroundColor) const;
298 };
299 
300 // declare RenderModifiers like RSBoundsRenderModifier
301 #define DECLARE_ANIMATABLE_MODIFIER(MODIFIER_NAME, TYPE, MODIFIER_TYPE, DELTA_OP, MODIFIER_TIER, THRESHOLD_TYPE) \
302     class RSB_EXPORT RS##MODIFIER_NAME##RenderModifier : public RS##MODIFIER_TIER##RenderModifier {              \
303     public:                                                                                                      \
304         RS##MODIFIER_NAME##RenderModifier(const std::shared_ptr<RSRenderPropertyBase>& property)                 \
305             : RS##MODIFIER_TIER##RenderModifier(property)                                                        \
306         {                                                                                                        \
307             property->SetModifierType(RSModifierType::MODIFIER_TYPE);                                            \
308         }                                                                                                        \
309         virtual ~RS##MODIFIER_NAME##RenderModifier() = default;                                                  \
310         void Apply(RSModifierContext& context) const override;                                                   \
311         void Update(const std::shared_ptr<RSRenderPropertyBase>& prop, bool isDelta) override;                   \
312         bool Marshalling(Parcel& parcel) override;                                                               \
313         RSModifierType GetType() override { return (RSModifierType::MODIFIER_TYPE); }                            \
314     };
315 
316 #define DECLARE_NOANIMATABLE_MODIFIER(MODIFIER_NAME, TYPE, MODIFIER_TYPE, MODIFIER_TIER) \
317     DECLARE_ANIMATABLE_MODIFIER(MODIFIER_NAME, TYPE, MODIFIER_TYPE, Add, MODIFIER_TIER, ZERO)
318 
319 DECLARE_NOANIMATABLE_MODIFIER(Particles, RSRenderParticleVector, PARTICLE, Foreground)
320 
321 #include "modifier/rs_modifiers_def.in"
322 
323 #undef DECLARE_ANIMATABLE_MODIFIER
324 #undef DECLARE_NOANIMATABLE_MODIFIER
325 } // namespace Rosen
326 } // namespace OHOS
327 
328 #endif // RENDER_SERVICE_CLIENT_CORE_ANIMATION_RS_RENDER_MODIFIER_H
329