1 /* 2 * Copyright 2018 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef SkSGGradient_DEFINED 9 #define SkSGGradient_DEFINED 10 11 #include "include/core/SkColor.h" 12 #include "include/core/SkPoint.h" 13 #include "include/core/SkRefCnt.h" 14 #include "include/core/SkScalar.h" 15 #include "include/core/SkTileMode.h" 16 #include "modules/sksg/include/SkSGNode.h" 17 #include "modules/sksg/include/SkSGRenderEffect.h" 18 19 #include <vector> 20 21 class SkShader; 22 23 namespace sksg { 24 25 /** 26 * Gradient base class. 27 */ 28 class Gradient : public Shader { 29 public: 30 struct ColorStop { 31 SkScalar fPosition; 32 SkColor4f fColor; 33 34 bool operator==(const ColorStop& other) const { 35 return fPosition == other.fPosition && fColor == other.fColor; 36 } 37 }; 38 39 SG_ATTRIBUTE(ColorStops, std::vector<ColorStop>, fColorStops) 40 SG_ATTRIBUTE(TileMode , SkTileMode , fTileMode ) 41 42 protected: 43 sk_sp<SkShader> onRevalidateShader() final; 44 45 virtual sk_sp<SkShader> onMakeShader(const std::vector<SkColor4f>& colors, 46 const std::vector<SkScalar >& positions) const = 0; 47 48 protected: 49 Gradient() = default; 50 51 private: 52 std::vector<ColorStop> fColorStops; 53 SkTileMode fTileMode = SkTileMode::kClamp; 54 55 using INHERITED = Shader; 56 }; 57 58 class LinearGradient final : public Gradient { 59 public: Make()60 static sk_sp<LinearGradient> Make() { 61 return sk_sp<LinearGradient>(new LinearGradient()); 62 } 63 64 SG_ATTRIBUTE(StartPoint, SkPoint, fStartPoint) 65 SG_ATTRIBUTE(EndPoint , SkPoint, fEndPoint ) 66 67 protected: 68 sk_sp<SkShader> onMakeShader(const std::vector<SkColor4f>&, 69 const std::vector<SkScalar >&) const override; 70 71 private: 72 LinearGradient() = default; 73 74 SkPoint fStartPoint = SkPoint::Make(0, 0), 75 fEndPoint = SkPoint::Make(0, 0); 76 77 using INHERITED = Gradient; 78 }; 79 80 class RadialGradient final : public Gradient { 81 public: Make()82 static sk_sp<RadialGradient> Make() { 83 return sk_sp<RadialGradient>(new RadialGradient()); 84 } 85 86 SG_ATTRIBUTE(StartCenter, SkPoint , fStartCenter) 87 SG_ATTRIBUTE(EndCenter , SkPoint , fEndCenter ) 88 SG_ATTRIBUTE(StartRadius, SkScalar, fStartRadius) 89 SG_ATTRIBUTE(EndRadius , SkScalar, fEndRadius ) 90 91 protected: 92 sk_sp<SkShader> onMakeShader(const std::vector<SkColor4f>&, 93 const std::vector<SkScalar >&) const override; 94 95 private: 96 RadialGradient() = default; 97 98 SkPoint fStartCenter = SkPoint::Make(0, 0), 99 fEndCenter = SkPoint::Make(0, 0); 100 SkScalar fStartRadius = 0, 101 fEndRadius = 0; 102 103 using INHERITED = Gradient; 104 }; 105 106 } // namespace sksg 107 108 #endif // SkSGGradient_DEFINED 109