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 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_RENDER_ADAPTER_MODIFIER_ADAPTER_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_RENDER_ADAPTER_MODIFIER_ADAPTER_H 18 19 #include <functional> 20 #include <memory> 21 #include <vector> 22 23 #include "include/core/SkCanvas.h" 24 #include "modifier/rs_property.h" 25 #include "render_service_client/core/modifier/rs_extended_modifier.h" 26 #include "render_service_client/core/modifier/rs_modifier.h" 27 #include "render_service_client/core/ui/rs_node.h" 28 29 #include "base/memory/ace_type.h" 30 #include "base/memory/referenced.h" 31 #include "base/utils/utils.h" 32 #include "core/components_ng/base/modifier.h" 33 #include "core/components_ng/render/drawing.h" 34 35 namespace OHOS::Ace::NG { 36 37 using RSModifier = Rosen::RSModifier; 38 using RSNode = Rosen::RSNode; 39 using RSAnimationTimingProtocol = Rosen::RSAnimationTimingProtocol; 40 using RSAnimationTimingCurve = Rosen::RSAnimationTimingCurve; 41 template<typename T> 42 using RSAnimatableProperty = Rosen::RSAnimatableProperty<T>; 43 template<typename T> 44 using RSProperty = Rosen::RSProperty<T>; 45 template<typename T> 46 using RSAnimatableArithmetic = Rosen::RSAnimatableArithmetic<T>; 47 using RSContentStyleModifier = Rosen::RSContentStyleModifier; 48 using RSOverlayStyleModifier = Rosen::RSOverlayStyleModifier; 49 using RSForegroundStyleModifier = Rosen::RSForegroundStyleModifier; 50 using RSNodeModifier = Rosen::RSNodeModifier; 51 using RSDrawingContext = Rosen::RSDrawingContext; 52 using RSPropertyBase = Rosen::RSPropertyBase; 53 54 class ContentModifierAdapter : public RSContentStyleModifier { 55 public: 56 ContentModifierAdapter() = default; ContentModifierAdapter(const RefPtr<Modifier> & modifier)57 explicit ContentModifierAdapter(const RefPtr<Modifier>& modifier) 58 : modifier_(AceType::DynamicCast<ContentModifier>(modifier)) 59 {} 60 ~ContentModifierAdapter() override = default; 61 62 void Draw(RSDrawingContext& context) const override; 63 64 void AttachProperties(); 65 66 private: 67 WeakPtr<ContentModifier> modifier_; 68 bool hasAttached_ = false; 69 70 ACE_DISALLOW_COPY_AND_MOVE(ContentModifierAdapter); 71 }; 72 73 std::shared_ptr<RSModifier> ConvertContentModifier(const RefPtr<Modifier>& modifier); 74 std::shared_ptr<RSModifier> ConvertOverlayModifier(const RefPtr<Modifier>& modifier); 75 std::shared_ptr<RSModifier> ConvertForegroundModifier(const RefPtr<Modifier>& modifier); 76 77 class OverlayModifierAdapter : public RSOverlayStyleModifier { 78 public: 79 OverlayModifierAdapter() = default; OverlayModifierAdapter(const RefPtr<Modifier> & modifier)80 explicit OverlayModifierAdapter(const RefPtr<Modifier>& modifier) 81 : modifier_(AceType::DynamicCast<OverlayModifier>(modifier)) 82 {} 83 ~OverlayModifierAdapter() override = default; 84 85 void Draw(RSDrawingContext& context) const override; 86 87 void AttachProperties(); 88 89 private: 90 WeakPtr<OverlayModifier> modifier_; 91 bool hasAttached_ = false; 92 93 ACE_DISALLOW_COPY_AND_MOVE(OverlayModifierAdapter); 94 }; 95 96 class ForegroundModifierAdapter : public RSForegroundStyleModifier { 97 public: 98 ForegroundModifierAdapter() = default; ForegroundModifierAdapter(const RefPtr<Modifier> & modifier)99 explicit ForegroundModifierAdapter(const RefPtr<Modifier>& modifier) 100 : modifier_(AceType::DynamicCast<ForegroundModifier>(modifier)) 101 {} 102 ~ForegroundModifierAdapter() override = default; 103 104 void Draw(RSDrawingContext& context) const override; 105 106 void AttachProperties(); 107 108 private: 109 WeakPtr<ForegroundModifier> modifier_; 110 bool hasAttached_ = false; 111 112 ACE_DISALLOW_COPY_AND_MOVE(ForegroundModifierAdapter); 113 }; 114 115 class RSNodeModifierImpl : public RSNodeModifier, public ModifierImpl { 116 public: 117 RSNodeModifierImpl() = default; 118 virtual ~RSNodeModifierImpl() = default; 119 Modify(RSNode & target)120 void Modify(RSNode& target) const override {} 121 122 void AddProperty(const RefPtr<PropertyBase>& property); 123 GetProperty()124 std::shared_ptr<RSPropertyBase> GetProperty() const 125 { 126 return attachedProperty_; 127 } 128 129 private: 130 std::shared_ptr<RSPropertyBase> attachedProperty_; 131 132 ACE_DISALLOW_COPY_AND_MOVE(RSNodeModifierImpl); 133 }; 134 135 } // namespace OHOS::Ace::NG 136 137 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_RENDER_ADAPTER_MODIFIER_ADAPTER_H 138