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