1 /* 2 * Copyright (c) 2021 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_DECLARATION_SVG_SVG_FE_COMPOSITE_DECLARATION_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_DECLARATION_SVG_SVG_FE_COMPOSITE_DECLARATION_H 18 19 #include "core/components/declaration/svg/svg_fe_declaration.h" 20 21 namespace OHOS::Ace { 22 23 enum class FeOperatorType { 24 FE_ARITHMETIC, 25 FE_ATOP, 26 FE_IN, 27 FE_LIGHTER, 28 FE_OUT, 29 FE_OVER, 30 FE_XOR 31 }; 32 33 struct SvgFeCompositeAttribute : SvgFeAttribute { 34 FeIn in2; 35 FeOperatorType operatorType = FeOperatorType::FE_OVER; 36 double k1 = 0.0; 37 double k2 = 0.0; 38 double k3 = 0.0; 39 double k4 = 0.0; 40 }; 41 42 class SvgFeCompositeDeclaration : public SvgFeDeclaration { 43 DECLARE_ACE_TYPE(SvgFeCompositeDeclaration, SvgFeDeclaration); 44 45 public: 46 SvgFeCompositeDeclaration() = default; 47 ~SvgFeCompositeDeclaration() override = default; 48 void InitializeStyle() override; 49 SetK1(double k1)50 void SetK1(double k1) 51 { 52 auto& attribute = MaybeResetAttribute<SvgFeCompositeAttribute>(AttributeTag::SPECIALIZED_ATTR); 53 attribute.k1 = k1; 54 } 55 SetK2(double k2)56 void SetK2(double k2) 57 { 58 auto& attribute = MaybeResetAttribute<SvgFeCompositeAttribute>(AttributeTag::SPECIALIZED_ATTR); 59 attribute.k2 = k2; 60 } 61 SetK3(double k3)62 void SetK3(double k3) 63 { 64 auto& attribute = MaybeResetAttribute<SvgFeCompositeAttribute>(AttributeTag::SPECIALIZED_ATTR); 65 attribute.k3 = k3; 66 } 67 SetK4(double k4)68 void SetK4(double k4) 69 { 70 auto& attribute = MaybeResetAttribute<SvgFeCompositeAttribute>(AttributeTag::SPECIALIZED_ATTR); 71 attribute.k4 = k4; 72 } 73 SetIn2(const std::string & In2)74 void SetIn2(const std::string& In2) 75 { 76 static const LinearMapNode<FeInType> IN_TABLE[] = { 77 { "BackgroundAlpha", FeInType::BACKGROUND_ALPHA }, 78 { "BackgroundImage", FeInType::BACKGROUND_IMAGE }, 79 { "FillPaint", FeInType::FILL_PAINT }, 80 { "SourceAlpha", FeInType::SOURCE_ALPHA }, 81 { "SourceGraphic", FeInType::SOURCE_GRAPHIC }, 82 { "StrokePaint", FeInType::STROKE_PAINT }, 83 }; 84 int64_t inIndex = BinarySearchFindIndex(IN_TABLE, ArraySize(IN_TABLE), In2.c_str()); 85 auto& attribute = MaybeResetAttribute<SvgFeCompositeAttribute>(AttributeTag::SPECIALIZED_ATTR); 86 if (inIndex != -1) { 87 attribute.in2.in = IN_TABLE[inIndex].value; 88 } else { 89 attribute.in2.id = In2; 90 } 91 } 92 SetOperatorType(const std::string & type)93 void SetOperatorType(const std::string& type) 94 { 95 static const LinearMapNode<FeOperatorType> FE_OPERATOR_TABLE[] = { 96 { "arithmetic", FeOperatorType::FE_ARITHMETIC }, 97 { "atop", FeOperatorType::FE_ATOP }, 98 { "in", FeOperatorType::FE_IN }, 99 { "lighter", FeOperatorType::FE_LIGHTER }, 100 { "out", FeOperatorType::FE_OUT }, 101 { "over", FeOperatorType::FE_OVER }, 102 { "xor", FeOperatorType::FE_XOR }, 103 }; 104 int64_t inIndex = BinarySearchFindIndex(FE_OPERATOR_TABLE, ArraySize(FE_OPERATOR_TABLE), type.c_str()); 105 if (inIndex != -1) { 106 auto& attribute = MaybeResetAttribute<SvgFeCompositeAttribute>(AttributeTag::SPECIALIZED_ATTR); 107 attribute.operatorType = FE_OPERATOR_TABLE[inIndex].value; 108 } 109 } 110 GetK1()111 double GetK1() const 112 { 113 auto& attribute = static_cast<SvgFeCompositeAttribute&>(GetAttribute(AttributeTag::SPECIALIZED_ATTR)); 114 return attribute.k1; 115 } 116 GetK2()117 double GetK2() const 118 { 119 auto& attribute = static_cast<SvgFeCompositeAttribute&>(GetAttribute(AttributeTag::SPECIALIZED_ATTR)); 120 return attribute.k2; 121 } 122 GetK3()123 double GetK3() const 124 { 125 auto& attribute = static_cast<SvgFeCompositeAttribute&>(GetAttribute(AttributeTag::SPECIALIZED_ATTR)); 126 return attribute.k3; 127 } 128 GetK4()129 double GetK4() const 130 { 131 auto& attribute = static_cast<SvgFeCompositeAttribute&>(GetAttribute(AttributeTag::SPECIALIZED_ATTR)); 132 return attribute.k4; 133 } 134 GetIn2()135 const FeIn& GetIn2() const 136 { 137 auto& attribute = static_cast<SvgFeCompositeAttribute&>(GetAttribute(AttributeTag::SPECIALIZED_ATTR)); 138 return attribute.in2; 139 } 140 GetOperatorType()141 const FeOperatorType& GetOperatorType() const 142 { 143 auto& attribute = static_cast<SvgFeCompositeAttribute&>(GetAttribute(AttributeTag::SPECIALIZED_ATTR)); 144 return attribute.operatorType; 145 } 146 147 protected: 148 void InitSpecialized() override; 149 bool SetSpecializedValue(const std::pair<std::string, std::string>& attr) override; 150 }; 151 152 } // namespace OHOS::Ace 153 154 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_DECLARATION_SVG_SVG_FE_COMPOSITE_DECLARATION_H 155