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