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