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_GRADIENT_DECLARATION_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_DECLARATION_SVG_SVG_GRADIENT_DECLARATION_H
18 
19 #include "core/components/declaration/common/declaration.h"
20 
21 namespace OHOS::Ace {
22 
23 struct SvgGradientAttribute : Attribute {
24     Gradient gradient = Gradient();
25 };
26 
27 class SvgGradientDeclaration : public Declaration {
28     DECLARE_ACE_TYPE(SvgGradientDeclaration, Declaration);
29 
30 public:
31     SvgGradientDeclaration() = default;
32     ~SvgGradientDeclaration() override = default;
33     void InitializeStyle() override;
34     bool SetSpecializedAttr(const std::pair<std::string, std::string>& attr) override;
35     bool SetSpecializedStyle(const std::pair<std::string, std::string>& style) override;
36 
SetTransform(const std::string & gradientTransform)37     void SetTransform(const std::string& gradientTransform)
38     {
39         auto& attribute = MaybeResetAttribute<SvgGradientAttribute>(AttributeTag::SPECIALIZED_ATTR);
40         attribute.gradient.SetGradientTransform(gradientTransform);
41     }
42 
SetSpreadMethod(SpreadMethod spreadMethod)43     void SetSpreadMethod(SpreadMethod spreadMethod)
44     {
45         auto& attribute = MaybeResetAttribute<SvgGradientAttribute>(AttributeTag::SPECIALIZED_ATTR);
46         attribute.gradient.SetSpreadMethod(spreadMethod);
47     }
48 
SetX1(const Dimension & x1)49     void SetX1(const Dimension& x1)
50     {
51         auto& attribute = MaybeResetAttribute<SvgGradientAttribute>(AttributeTag::SPECIALIZED_ATTR);
52         attribute.gradient.GetLinearGradient().x1 = x1;
53     }
54 
SetY1(const Dimension & y1)55     void SetY1(const Dimension& y1)
56     {
57         auto& attribute = MaybeResetAttribute<SvgGradientAttribute>(AttributeTag::SPECIALIZED_ATTR);
58         attribute.gradient.GetLinearGradient().y1 = y1;
59     }
60 
SetX2(const Dimension & x2)61     void SetX2(const Dimension& x2)
62     {
63         auto& attribute = MaybeResetAttribute<SvgGradientAttribute>(AttributeTag::SPECIALIZED_ATTR);
64         attribute.gradient.GetLinearGradient().x2 = x2;
65     }
66 
SetY2(const Dimension & y2)67     void SetY2(const Dimension& y2)
68     {
69         auto& attribute = MaybeResetAttribute<SvgGradientAttribute>(AttributeTag::SPECIALIZED_ATTR);
70         attribute.gradient.GetLinearGradient().y2 = y2;
71     }
72 
SetR(const Dimension & r)73     void SetR(const Dimension& r)
74     {
75         auto& attribute = MaybeResetAttribute<SvgGradientAttribute>(AttributeTag::SPECIALIZED_ATTR);
76         attribute.gradient.GetRadialGradient().radialHorizontalSize = r;
77         attribute.gradient.GetRadialGradient().radialVerticalSize = r;
78     }
79 
SetCx(const Dimension & cx)80     void SetCx(const Dimension& cx)
81     {
82         auto& attribute = MaybeResetAttribute<SvgGradientAttribute>(AttributeTag::SPECIALIZED_ATTR);
83         attribute.gradient.GetRadialGradient().radialCenterX = cx;
84     }
85 
SetCy(const Dimension & cy)86     void SetCy(const Dimension& cy)
87     {
88         auto& attribute = MaybeResetAttribute<SvgGradientAttribute>(AttributeTag::SPECIALIZED_ATTR);
89         attribute.gradient.GetRadialGradient().radialCenterY = cy;
90     }
91 
SetFx(const Dimension & fx)92     void SetFx(const Dimension& fx)
93     {
94         auto& attribute = MaybeResetAttribute<SvgGradientAttribute>(AttributeTag::SPECIALIZED_ATTR);
95         attribute.gradient.GetRadialGradient().fRadialCenterX = fx;
96     }
97 
SetFy(const Dimension & fy)98     void SetFy(const Dimension& fy)
99     {
100         auto& attribute = MaybeResetAttribute<SvgGradientAttribute>(AttributeTag::SPECIALIZED_ATTR);
101         attribute.gradient.GetRadialGradient().fRadialCenterY = fy;
102     }
103 
GetTransform()104     const std::string& GetTransform() const
105     {
106         auto& attribute = static_cast<SvgGradientAttribute&>(GetAttribute(AttributeTag::SPECIALIZED_ATTR));
107         return attribute.gradient.GetGradientTransform();
108     }
109 
GetSpreadMethod()110     SpreadMethod GetSpreadMethod() const
111     {
112         auto& attribute = static_cast<SvgGradientAttribute&>(GetAttribute(AttributeTag::SPECIALIZED_ATTR));
113         return attribute.gradient.GetSpreadMethod();
114     }
115 
GetGradient()116     const Gradient& GetGradient() const
117     {
118         auto& attribute = static_cast<SvgGradientAttribute&>(GetAttribute(AttributeTag::SPECIALIZED_ATTR));
119         return attribute.gradient;
120     }
121 
SetGradientType(GradientType gradientType)122     void SetGradientType(GradientType gradientType)
123     {
124         auto& attribute = static_cast<SvgGradientAttribute&>(GetAttribute(AttributeTag::SPECIALIZED_ATTR));
125         return attribute.gradient.SetType(gradientType);
126     }
127 
AddGradientColor(const GradientColor & gradientColor)128     void AddGradientColor(const GradientColor& gradientColor)
129     {
130         auto& attribute = static_cast<SvgGradientAttribute&>(GetAttribute(AttributeTag::SPECIALIZED_ATTR));
131         attribute.gradient.AddColor(gradientColor);
132     }
133 
134 protected:
135     void InitSpecialized() override;
136 
137 private:
138     bool SetSpecializedValue(const std::pair<std::string, std::string>& attr);
139 };
140 
141 } // namespace OHOS::Ace
142 
143 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_DECLARATION_SVG_SVG_GRADIENT_DECLARATION_H
144