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