1 /*
2  * Copyright (c) 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 FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_GRADIENT_ARITHMETIC_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_GRADIENT_ARITHMETIC_H
18 
19 #include "core/components_ng/animation/animatable_arithmetic.h"
20 #include "core/components_ng/property/gradient_property.h"
21 
22 namespace OHOS::Ace::NG {
23 class GradientArithmetic : public AnimatableArithmetic<GradientArithmetic> {
24 public:
25     GradientArithmetic() = default;
GradientArithmetic(const Gradient & gradient)26     explicit GradientArithmetic(const Gradient& gradient) : gradientValue_(gradient) {}
27 
Add(const GradientArithmetic & value)28     GradientArithmetic Add(const GradientArithmetic& value) const override
29     {
30         Gradient gradient;
31         auto srcColors = gradientValue_.GetColors();
32         auto destColors = value.GetGradient().GetColors();
33         size_t srcColorsLength = srcColors.size();
34         size_t destColorsLength = destColors.size();
35         if (srcColorsLength >= destColorsLength) {
36             size_t i;
37             for (i = 0; i < destColorsLength; i++) {
38                 GradientColor gradientColor;
39                 gradientColor.SetLinearColor(srcColors[i].GetLinearColor() + destColors[i].GetLinearColor());
40                 gradientColor.SetDimension(destColors[i].GetDimension());
41                 gradient.AddColor(gradientColor);
42             }
43 
44             for (; i < srcColorsLength; i++) {
45                 gradient.AddColor(srcColors[i]);
46             }
47         } else {
48             for (size_t i = 0; i < srcColorsLength; i++) {
49                 GradientColor gradientColor;
50                 gradientColor.SetLinearColor(srcColors[i].GetLinearColor() + destColors[i].GetLinearColor());
51                 gradientColor.SetDimension(destColors[i].GetDimension());
52                 gradient.AddColor(gradientColor);
53             }
54         }
55         return GradientArithmetic(gradient);
56     }
57 
Minus(const GradientArithmetic & value)58     GradientArithmetic Minus(const GradientArithmetic& value) const override
59     {
60         Gradient gradient;
61         auto srcColors = gradientValue_.GetColors();
62         auto destColors = value.GetGradient().GetColors();
63         size_t srcColorsLength = srcColors.size();
64         size_t destColorsLength = destColors.size();
65         if (srcColorsLength >= destColorsLength) {
66             size_t i;
67             for (i = 0; i < destColorsLength; i++) {
68                 GradientColor gradientColor;
69                 gradientColor.SetLinearColor(srcColors[i].GetLinearColor() - destColors[i].GetLinearColor());
70                 gradientColor.SetDimension(destColors[i].GetDimension());
71                 gradient.AddColor(gradientColor);
72             }
73             for (; i < srcColorsLength; i++) {
74                 gradient.AddColor(srcColors[i]);
75             }
76         } else {
77             size_t i;
78             for (i = 0; i < srcColorsLength; i++) {
79                 GradientColor gradientColor;
80                 gradientColor.SetLinearColor(srcColors[i].GetLinearColor() - destColors[i].GetLinearColor());
81                 gradientColor.SetDimension(destColors[i].GetDimension());
82                 gradient.AddColor(gradientColor);
83             }
84         }
85         return GradientArithmetic(gradient);
86     }
87 
Multiply(const float scale)88     GradientArithmetic Multiply(const float scale) const override
89     {
90         Gradient gradient;
91         auto srcColors = gradientValue_.GetColors();
92         for (size_t i = 0; i < srcColors.size(); i++) {
93             GradientColor gradientColor;
94             gradientColor.SetLinearColor(srcColors[i].GetLinearColor() * scale);
95             gradientColor.SetDimension(srcColors[i].GetDimension());
96             gradient.AddColor(gradientColor);
97         }
98         return GradientArithmetic(gradient);
99     }
100 
IsEqual(const GradientArithmetic & value)101     bool IsEqual(const GradientArithmetic& value) const override
102     {
103         return gradientValue_ == value.GetGradient();
104     }
105 
GetGradient()106     Gradient GetGradient() const
107     {
108         return gradientValue_;
109     }
110 
111 private:
112     Gradient gradientValue_;
113 };
114 } // namespace OHOS::Ace::NG
115 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_GRADIENT_ARITHMETIC_H
116