xref: /aosp_15_r20/external/skia/include/effects/SkGradientShader.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2006 The Android Open Source Project
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 SkGradientShader_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define SkGradientShader_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColorSpace.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPoint.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkShader.h" // IWYU pragma: keep
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTileMode.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAPI.h"
19*c8dee2aaSAndroid Build Coastguard Worker 
20*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint>
21*c8dee2aaSAndroid Build Coastguard Worker #include <utility>
22*c8dee2aaSAndroid Build Coastguard Worker 
23*c8dee2aaSAndroid Build Coastguard Worker class SkMatrix;
24*c8dee2aaSAndroid Build Coastguard Worker 
25*c8dee2aaSAndroid Build Coastguard Worker /** \class SkGradientShader
26*c8dee2aaSAndroid Build Coastguard Worker 
27*c8dee2aaSAndroid Build Coastguard Worker     SkGradientShader hosts factories for creating subclasses of SkShader that
28*c8dee2aaSAndroid Build Coastguard Worker     render linear and radial gradients. In general, degenerate cases should not
29*c8dee2aaSAndroid Build Coastguard Worker     produce surprising results, but there are several types of degeneracies:
30*c8dee2aaSAndroid Build Coastguard Worker 
31*c8dee2aaSAndroid Build Coastguard Worker      * A linear gradient made from the same two points.
32*c8dee2aaSAndroid Build Coastguard Worker      * A radial gradient with a radius of zero.
33*c8dee2aaSAndroid Build Coastguard Worker      * A sweep gradient where the start and end angle are the same.
34*c8dee2aaSAndroid Build Coastguard Worker      * A two point conical gradient where the two centers and the two radii are
35*c8dee2aaSAndroid Build Coastguard Worker        the same.
36*c8dee2aaSAndroid Build Coastguard Worker 
37*c8dee2aaSAndroid Build Coastguard Worker     For any degenerate gradient with a decal tile mode, it will draw empty since the interpolating
38*c8dee2aaSAndroid Build Coastguard Worker     region is zero area and the outer region is discarded by the decal mode.
39*c8dee2aaSAndroid Build Coastguard Worker 
40*c8dee2aaSAndroid Build Coastguard Worker     For any degenerate gradient with a repeat or mirror tile mode, it will draw a solid color that
41*c8dee2aaSAndroid Build Coastguard Worker     is the average gradient color, since infinitely many repetitions of the gradients will fill the
42*c8dee2aaSAndroid Build Coastguard Worker     shape.
43*c8dee2aaSAndroid Build Coastguard Worker 
44*c8dee2aaSAndroid Build Coastguard Worker     For a clamped gradient, every type is well-defined at the limit except for linear gradients. The
45*c8dee2aaSAndroid Build Coastguard Worker     radial gradient with zero radius becomes the last color. The sweep gradient draws the sector
46*c8dee2aaSAndroid Build Coastguard Worker     from 0 to the provided angle with the first color, with a hardstop switching to the last color.
47*c8dee2aaSAndroid Build Coastguard Worker     When the provided angle is 0, this is just the solid last color again. Similarly, the two point
48*c8dee2aaSAndroid Build Coastguard Worker     conical gradient becomes a circle filled with the first color, sized to the provided radius,
49*c8dee2aaSAndroid Build Coastguard Worker     with a hardstop switching to the last color. When the two radii are both zero, this is just the
50*c8dee2aaSAndroid Build Coastguard Worker     solid last color.
51*c8dee2aaSAndroid Build Coastguard Worker 
52*c8dee2aaSAndroid Build Coastguard Worker     As a linear gradient approaches the degenerate case, its shader will approach the appearance of
53*c8dee2aaSAndroid Build Coastguard Worker     two half planes, each filled by the first and last colors of the gradient. The planes will be
54*c8dee2aaSAndroid Build Coastguard Worker     oriented perpendicular to the vector between the two defining points of the gradient. However,
55*c8dee2aaSAndroid Build Coastguard Worker     once they become the same point, Skia cannot reconstruct what that expected orientation is. To
56*c8dee2aaSAndroid Build Coastguard Worker     provide a stable and predictable color in this case, Skia just uses the last color as a solid
57*c8dee2aaSAndroid Build Coastguard Worker     fill to be similar to many of the other degenerate gradients' behaviors in clamp mode.
58*c8dee2aaSAndroid Build Coastguard Worker */
59*c8dee2aaSAndroid Build Coastguard Worker class SK_API SkGradientShader {
60*c8dee2aaSAndroid Build Coastguard Worker public:
61*c8dee2aaSAndroid Build Coastguard Worker     enum Flags {
62*c8dee2aaSAndroid Build Coastguard Worker         /** By default gradients will interpolate their colors in unpremul space
63*c8dee2aaSAndroid Build Coastguard Worker          *  and then premultiply each of the results. By setting this flag, the
64*c8dee2aaSAndroid Build Coastguard Worker          *  gradients will premultiply their colors first, and then interpolate
65*c8dee2aaSAndroid Build Coastguard Worker          *  between them.
66*c8dee2aaSAndroid Build Coastguard Worker          *  example: https://fiddle.skia.org/c/@GradientShader_MakeLinear
67*c8dee2aaSAndroid Build Coastguard Worker          */
68*c8dee2aaSAndroid Build Coastguard Worker         kInterpolateColorsInPremul_Flag = 1 << 0,
69*c8dee2aaSAndroid Build Coastguard Worker     };
70*c8dee2aaSAndroid Build Coastguard Worker 
71*c8dee2aaSAndroid Build Coastguard Worker     struct Interpolation {
72*c8dee2aaSAndroid Build Coastguard Worker         enum class InPremul : bool { kNo = false, kYes = true };
73*c8dee2aaSAndroid Build Coastguard Worker 
74*c8dee2aaSAndroid Build Coastguard Worker         enum class ColorSpace : uint8_t {
75*c8dee2aaSAndroid Build Coastguard Worker             // Default Skia behavior: interpolate in the color space of the destination surface
76*c8dee2aaSAndroid Build Coastguard Worker             kDestination,
77*c8dee2aaSAndroid Build Coastguard Worker 
78*c8dee2aaSAndroid Build Coastguard Worker             // https://www.w3.org/TR/css-color-4/#interpolation-space
79*c8dee2aaSAndroid Build Coastguard Worker             kSRGBLinear,
80*c8dee2aaSAndroid Build Coastguard Worker             kLab,
81*c8dee2aaSAndroid Build Coastguard Worker             kOKLab,
82*c8dee2aaSAndroid Build Coastguard Worker             // This is the same as kOKLab, except it has a simplified version of the CSS gamut
83*c8dee2aaSAndroid Build Coastguard Worker             // mapping algorithm (https://www.w3.org/TR/css-color-4/#css-gamut-mapping)
84*c8dee2aaSAndroid Build Coastguard Worker             // into Rec2020 space applied to it.
85*c8dee2aaSAndroid Build Coastguard Worker             // Warning: This space is experimental and should not be used in production.
86*c8dee2aaSAndroid Build Coastguard Worker             kOKLabGamutMap,
87*c8dee2aaSAndroid Build Coastguard Worker             kLCH,
88*c8dee2aaSAndroid Build Coastguard Worker             kOKLCH,
89*c8dee2aaSAndroid Build Coastguard Worker             // This is the same as kOKLCH, except it has the same gamut mapping applied to it
90*c8dee2aaSAndroid Build Coastguard Worker             // as kOKLabGamutMap does.
91*c8dee2aaSAndroid Build Coastguard Worker             // Warning: This space is experimental and should not be used in production.
92*c8dee2aaSAndroid Build Coastguard Worker             kOKLCHGamutMap,
93*c8dee2aaSAndroid Build Coastguard Worker             kSRGB,
94*c8dee2aaSAndroid Build Coastguard Worker             kHSL,
95*c8dee2aaSAndroid Build Coastguard Worker             kHWB,
96*c8dee2aaSAndroid Build Coastguard Worker 
97*c8dee2aaSAndroid Build Coastguard Worker             kLastColorSpace = kHWB,
98*c8dee2aaSAndroid Build Coastguard Worker         };
99*c8dee2aaSAndroid Build Coastguard Worker         static constexpr int kColorSpaceCount = static_cast<int>(ColorSpace::kLastColorSpace) + 1;
100*c8dee2aaSAndroid Build Coastguard Worker 
101*c8dee2aaSAndroid Build Coastguard Worker         enum class HueMethod : uint8_t {
102*c8dee2aaSAndroid Build Coastguard Worker             // https://www.w3.org/TR/css-color-4/#hue-interpolation
103*c8dee2aaSAndroid Build Coastguard Worker             kShorter,
104*c8dee2aaSAndroid Build Coastguard Worker             kLonger,
105*c8dee2aaSAndroid Build Coastguard Worker             kIncreasing,
106*c8dee2aaSAndroid Build Coastguard Worker             kDecreasing,
107*c8dee2aaSAndroid Build Coastguard Worker 
108*c8dee2aaSAndroid Build Coastguard Worker             kLastHueMethod = kDecreasing,
109*c8dee2aaSAndroid Build Coastguard Worker         };
110*c8dee2aaSAndroid Build Coastguard Worker         static constexpr int kHueMethodCount = static_cast<int>(HueMethod::kLastHueMethod) + 1;
111*c8dee2aaSAndroid Build Coastguard Worker 
112*c8dee2aaSAndroid Build Coastguard Worker         InPremul   fInPremul = InPremul::kNo;
113*c8dee2aaSAndroid Build Coastguard Worker         ColorSpace fColorSpace = ColorSpace::kDestination;
114*c8dee2aaSAndroid Build Coastguard Worker         HueMethod  fHueMethod  = HueMethod::kShorter;  // Only relevant for LCH, OKLCH, HSL, or HWB
115*c8dee2aaSAndroid Build Coastguard Worker 
FromFlagsInterpolation116*c8dee2aaSAndroid Build Coastguard Worker         static Interpolation FromFlags(uint32_t flags) {
117*c8dee2aaSAndroid Build Coastguard Worker             return {flags & kInterpolateColorsInPremul_Flag ? InPremul::kYes : InPremul::kNo,
118*c8dee2aaSAndroid Build Coastguard Worker                     ColorSpace::kDestination,
119*c8dee2aaSAndroid Build Coastguard Worker                     HueMethod::kShorter};
120*c8dee2aaSAndroid Build Coastguard Worker         }
121*c8dee2aaSAndroid Build Coastguard Worker     };
122*c8dee2aaSAndroid Build Coastguard Worker 
123*c8dee2aaSAndroid Build Coastguard Worker     /** Returns a shader that generates a linear gradient between the two specified points.
124*c8dee2aaSAndroid Build Coastguard Worker         <p />
125*c8dee2aaSAndroid Build Coastguard Worker         @param  pts     The start and end points for the gradient.
126*c8dee2aaSAndroid Build Coastguard Worker         @param  colors  The array[count] of colors, to be distributed between the two points
127*c8dee2aaSAndroid Build Coastguard Worker         @param  pos     May be NULL. array[count] of SkScalars, or NULL, of the relative position of
128*c8dee2aaSAndroid Build Coastguard Worker                         each corresponding color in the colors array. If this is NULL,
129*c8dee2aaSAndroid Build Coastguard Worker                         the the colors are distributed evenly between the start and end point.
130*c8dee2aaSAndroid Build Coastguard Worker                         If this is not null, the values must lie between 0.0 and 1.0, and be
131*c8dee2aaSAndroid Build Coastguard Worker                         strictly increasing. If the first value is not 0.0, then an additional
132*c8dee2aaSAndroid Build Coastguard Worker                         color stop is added at position 0.0, with the same color as colors[0].
133*c8dee2aaSAndroid Build Coastguard Worker                         If the the last value is not 1.0, then an additional color stop is added
134*c8dee2aaSAndroid Build Coastguard Worker                         at position 1.0, with the same color as colors[count - 1].
135*c8dee2aaSAndroid Build Coastguard Worker         @param  count   Must be >=2. The number of colors (and pos if not NULL) entries.
136*c8dee2aaSAndroid Build Coastguard Worker         @param  mode    The tiling mode
137*c8dee2aaSAndroid Build Coastguard Worker 
138*c8dee2aaSAndroid Build Coastguard Worker         example: https://fiddle.skia.org/c/@GradientShader_MakeLinear
139*c8dee2aaSAndroid Build Coastguard Worker     */
140*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<SkShader> MakeLinear(const SkPoint pts[2],
141*c8dee2aaSAndroid Build Coastguard Worker                                       const SkColor colors[], const SkScalar pos[], int count,
142*c8dee2aaSAndroid Build Coastguard Worker                                       SkTileMode mode,
143*c8dee2aaSAndroid Build Coastguard Worker                                       uint32_t flags = 0, const SkMatrix* localMatrix = nullptr);
144*c8dee2aaSAndroid Build Coastguard Worker 
145*c8dee2aaSAndroid Build Coastguard Worker     /** Returns a shader that generates a linear gradient between the two specified points.
146*c8dee2aaSAndroid Build Coastguard Worker         <p />
147*c8dee2aaSAndroid Build Coastguard Worker         @param  pts     The start and end points for the gradient.
148*c8dee2aaSAndroid Build Coastguard Worker         @param  colors  The array[count] of colors, to be distributed between the two points
149*c8dee2aaSAndroid Build Coastguard Worker         @param  pos     May be NULL. array[count] of SkScalars, or NULL, of the relative position of
150*c8dee2aaSAndroid Build Coastguard Worker                         each corresponding color in the colors array. If this is NULL,
151*c8dee2aaSAndroid Build Coastguard Worker                         the the colors are distributed evenly between the start and end point.
152*c8dee2aaSAndroid Build Coastguard Worker                         If this is not null, the values must lie between 0.0 and 1.0, and be
153*c8dee2aaSAndroid Build Coastguard Worker                         strictly increasing. If the first value is not 0.0, then an additional
154*c8dee2aaSAndroid Build Coastguard Worker                         color stop is added at position 0.0, with the same color as colors[0].
155*c8dee2aaSAndroid Build Coastguard Worker                         If the the last value is not 1.0, then an additional color stop is added
156*c8dee2aaSAndroid Build Coastguard Worker                         at position 1.0, with the same color as colors[count - 1].
157*c8dee2aaSAndroid Build Coastguard Worker         @param  count   Must be >=2. The number of colors (and pos if not NULL) entries.
158*c8dee2aaSAndroid Build Coastguard Worker         @param  mode    The tiling mode
159*c8dee2aaSAndroid Build Coastguard Worker 
160*c8dee2aaSAndroid Build Coastguard Worker         example: https://fiddle.skia.org/c/@GradientShader_MakeLinear
161*c8dee2aaSAndroid Build Coastguard Worker     */
162*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<SkShader> MakeLinear(const SkPoint pts[2],
163*c8dee2aaSAndroid Build Coastguard Worker                                       const SkColor4f colors[], sk_sp<SkColorSpace> colorSpace,
164*c8dee2aaSAndroid Build Coastguard Worker                                       const SkScalar pos[], int count, SkTileMode mode,
165*c8dee2aaSAndroid Build Coastguard Worker                                       const Interpolation& interpolation,
166*c8dee2aaSAndroid Build Coastguard Worker                                       const SkMatrix* localMatrix);
167*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<SkShader> MakeLinear(const SkPoint pts[2],
168*c8dee2aaSAndroid Build Coastguard Worker                                       const SkColor4f colors[], sk_sp<SkColorSpace> colorSpace,
169*c8dee2aaSAndroid Build Coastguard Worker                                       const SkScalar pos[], int count, SkTileMode mode,
170*c8dee2aaSAndroid Build Coastguard Worker                                       uint32_t flags = 0, const SkMatrix* localMatrix = nullptr) {
171*c8dee2aaSAndroid Build Coastguard Worker         return MakeLinear(pts, colors, std::move(colorSpace), pos, count, mode,
172*c8dee2aaSAndroid Build Coastguard Worker                           Interpolation::FromFlags(flags), localMatrix);
173*c8dee2aaSAndroid Build Coastguard Worker     }
174*c8dee2aaSAndroid Build Coastguard Worker 
175*c8dee2aaSAndroid Build Coastguard Worker     /** Returns a shader that generates a radial gradient given the center and radius.
176*c8dee2aaSAndroid Build Coastguard Worker         <p />
177*c8dee2aaSAndroid Build Coastguard Worker         @param  center  The center of the circle for this gradient
178*c8dee2aaSAndroid Build Coastguard Worker         @param  radius  Must be positive. The radius of the circle for this gradient
179*c8dee2aaSAndroid Build Coastguard Worker         @param  colors  The array[count] of colors, to be distributed between the center and edge of the circle
180*c8dee2aaSAndroid Build Coastguard Worker         @param  pos     May be NULL. The array[count] of SkScalars, or NULL, of the relative position of
181*c8dee2aaSAndroid Build Coastguard Worker                         each corresponding color in the colors array. If this is NULL,
182*c8dee2aaSAndroid Build Coastguard Worker                         the the colors are distributed evenly between the center and edge of the circle.
183*c8dee2aaSAndroid Build Coastguard Worker                         If this is not null, the values must lie between 0.0 and 1.0, and be
184*c8dee2aaSAndroid Build Coastguard Worker                         strictly increasing. If the first value is not 0.0, then an additional
185*c8dee2aaSAndroid Build Coastguard Worker                         color stop is added at position 0.0, with the same color as colors[0].
186*c8dee2aaSAndroid Build Coastguard Worker                         If the the last value is not 1.0, then an additional color stop is added
187*c8dee2aaSAndroid Build Coastguard Worker                         at position 1.0, with the same color as colors[count - 1].
188*c8dee2aaSAndroid Build Coastguard Worker         @param  count   Must be >= 2. The number of colors (and pos if not NULL) entries
189*c8dee2aaSAndroid Build Coastguard Worker         @param  mode    The tiling mode
190*c8dee2aaSAndroid Build Coastguard Worker     */
191*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<SkShader> MakeRadial(const SkPoint& center, SkScalar radius,
192*c8dee2aaSAndroid Build Coastguard Worker                                       const SkColor colors[], const SkScalar pos[], int count,
193*c8dee2aaSAndroid Build Coastguard Worker                                       SkTileMode mode,
194*c8dee2aaSAndroid Build Coastguard Worker                                       uint32_t flags = 0, const SkMatrix* localMatrix = nullptr);
195*c8dee2aaSAndroid Build Coastguard Worker 
196*c8dee2aaSAndroid Build Coastguard Worker     /** Returns a shader that generates a radial gradient given the center and radius.
197*c8dee2aaSAndroid Build Coastguard Worker         <p />
198*c8dee2aaSAndroid Build Coastguard Worker         @param  center  The center of the circle for this gradient
199*c8dee2aaSAndroid Build Coastguard Worker         @param  radius  Must be positive. The radius of the circle for this gradient
200*c8dee2aaSAndroid Build Coastguard Worker         @param  colors  The array[count] of colors, to be distributed between the center and edge of the circle
201*c8dee2aaSAndroid Build Coastguard Worker         @param  pos     May be NULL. The array[count] of SkScalars, or NULL, of the relative position of
202*c8dee2aaSAndroid Build Coastguard Worker                         each corresponding color in the colors array. If this is NULL,
203*c8dee2aaSAndroid Build Coastguard Worker                         the the colors are distributed evenly between the center and edge of the circle.
204*c8dee2aaSAndroid Build Coastguard Worker                         If this is not null, the values must lie between 0.0 and 1.0, and be
205*c8dee2aaSAndroid Build Coastguard Worker                         strictly increasing. If the first value is not 0.0, then an additional
206*c8dee2aaSAndroid Build Coastguard Worker                         color stop is added at position 0.0, with the same color as colors[0].
207*c8dee2aaSAndroid Build Coastguard Worker                         If the the last value is not 1.0, then an additional color stop is added
208*c8dee2aaSAndroid Build Coastguard Worker                         at position 1.0, with the same color as colors[count - 1].
209*c8dee2aaSAndroid Build Coastguard Worker         @param  count   Must be >= 2. The number of colors (and pos if not NULL) entries
210*c8dee2aaSAndroid Build Coastguard Worker         @param  mode    The tiling mode
211*c8dee2aaSAndroid Build Coastguard Worker     */
212*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<SkShader> MakeRadial(const SkPoint& center, SkScalar radius,
213*c8dee2aaSAndroid Build Coastguard Worker                                       const SkColor4f colors[], sk_sp<SkColorSpace> colorSpace,
214*c8dee2aaSAndroid Build Coastguard Worker                                       const SkScalar pos[], int count, SkTileMode mode,
215*c8dee2aaSAndroid Build Coastguard Worker                                       const Interpolation& interpolation,
216*c8dee2aaSAndroid Build Coastguard Worker                                       const SkMatrix* localMatrix);
217*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<SkShader> MakeRadial(const SkPoint& center, SkScalar radius,
218*c8dee2aaSAndroid Build Coastguard Worker                                       const SkColor4f colors[], sk_sp<SkColorSpace> colorSpace,
219*c8dee2aaSAndroid Build Coastguard Worker                                       const SkScalar pos[], int count, SkTileMode mode,
220*c8dee2aaSAndroid Build Coastguard Worker                                       uint32_t flags = 0, const SkMatrix* localMatrix = nullptr) {
221*c8dee2aaSAndroid Build Coastguard Worker         return MakeRadial(center, radius, colors, std::move(colorSpace), pos, count, mode,
222*c8dee2aaSAndroid Build Coastguard Worker                           Interpolation::FromFlags(flags), localMatrix);
223*c8dee2aaSAndroid Build Coastguard Worker     }
224*c8dee2aaSAndroid Build Coastguard Worker 
225*c8dee2aaSAndroid Build Coastguard Worker     /**
226*c8dee2aaSAndroid Build Coastguard Worker      *  Returns a shader that generates a conical gradient given two circles, or
227*c8dee2aaSAndroid Build Coastguard Worker      *  returns NULL if the inputs are invalid. The gradient interprets the
228*c8dee2aaSAndroid Build Coastguard Worker      *  two circles according to the following HTML spec.
229*c8dee2aaSAndroid Build Coastguard Worker      *  http://dev.w3.org/html5/2dcontext/#dom-context-2d-createradialgradient
230*c8dee2aaSAndroid Build Coastguard Worker      */
231*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<SkShader> MakeTwoPointConical(const SkPoint& start, SkScalar startRadius,
232*c8dee2aaSAndroid Build Coastguard Worker                                                const SkPoint& end, SkScalar endRadius,
233*c8dee2aaSAndroid Build Coastguard Worker                                                const SkColor colors[], const SkScalar pos[],
234*c8dee2aaSAndroid Build Coastguard Worker                                                int count, SkTileMode mode,
235*c8dee2aaSAndroid Build Coastguard Worker                                                uint32_t flags = 0,
236*c8dee2aaSAndroid Build Coastguard Worker                                                const SkMatrix* localMatrix = nullptr);
237*c8dee2aaSAndroid Build Coastguard Worker 
238*c8dee2aaSAndroid Build Coastguard Worker     /**
239*c8dee2aaSAndroid Build Coastguard Worker      *  Returns a shader that generates a conical gradient given two circles, or
240*c8dee2aaSAndroid Build Coastguard Worker      *  returns NULL if the inputs are invalid. The gradient interprets the
241*c8dee2aaSAndroid Build Coastguard Worker      *  two circles according to the following HTML spec.
242*c8dee2aaSAndroid Build Coastguard Worker      *  http://dev.w3.org/html5/2dcontext/#dom-context-2d-createradialgradient
243*c8dee2aaSAndroid Build Coastguard Worker      */
244*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<SkShader> MakeTwoPointConical(const SkPoint& start, SkScalar startRadius,
245*c8dee2aaSAndroid Build Coastguard Worker                                                const SkPoint& end, SkScalar endRadius,
246*c8dee2aaSAndroid Build Coastguard Worker                                                const SkColor4f colors[],
247*c8dee2aaSAndroid Build Coastguard Worker                                                sk_sp<SkColorSpace> colorSpace, const SkScalar pos[],
248*c8dee2aaSAndroid Build Coastguard Worker                                                int count, SkTileMode mode,
249*c8dee2aaSAndroid Build Coastguard Worker                                                const Interpolation& interpolation,
250*c8dee2aaSAndroid Build Coastguard Worker                                                const SkMatrix* localMatrix);
251*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<SkShader> MakeTwoPointConical(const SkPoint& start, SkScalar startRadius,
252*c8dee2aaSAndroid Build Coastguard Worker                                                const SkPoint& end, SkScalar endRadius,
253*c8dee2aaSAndroid Build Coastguard Worker                                                const SkColor4f colors[],
254*c8dee2aaSAndroid Build Coastguard Worker                                                sk_sp<SkColorSpace> colorSpace, const SkScalar pos[],
255*c8dee2aaSAndroid Build Coastguard Worker                                                int count, SkTileMode mode,
256*c8dee2aaSAndroid Build Coastguard Worker                                                uint32_t flags = 0,
257*c8dee2aaSAndroid Build Coastguard Worker                                                const SkMatrix* localMatrix = nullptr) {
258*c8dee2aaSAndroid Build Coastguard Worker         return MakeTwoPointConical(start, startRadius, end, endRadius, colors,
259*c8dee2aaSAndroid Build Coastguard Worker                                    std::move(colorSpace), pos, count, mode,
260*c8dee2aaSAndroid Build Coastguard Worker                                    Interpolation::FromFlags(flags), localMatrix);
261*c8dee2aaSAndroid Build Coastguard Worker     }
262*c8dee2aaSAndroid Build Coastguard Worker 
263*c8dee2aaSAndroid Build Coastguard Worker     /** Returns a shader that generates a sweep gradient given a center.
264*c8dee2aaSAndroid Build Coastguard Worker 
265*c8dee2aaSAndroid Build Coastguard Worker         The shader accepts negative angles and angles larger than 360, draws
266*c8dee2aaSAndroid Build Coastguard Worker         between 0 and 360 degrees, similar to the CSS conic-gradient
267*c8dee2aaSAndroid Build Coastguard Worker         semantics. 0 degrees means horizontal positive x axis. The start angle
268*c8dee2aaSAndroid Build Coastguard Worker         must be less than the end angle, otherwise a null pointer is
269*c8dee2aaSAndroid Build Coastguard Worker         returned. If color stops do not contain 0 and 1 but are within this
270*c8dee2aaSAndroid Build Coastguard Worker         range, the respective outer color stop is repeated for 0 and 1. Color
271*c8dee2aaSAndroid Build Coastguard Worker         stops less than 0 are clamped to 0, and greater than 1 are clamped to 1.
272*c8dee2aaSAndroid Build Coastguard Worker         <p />
273*c8dee2aaSAndroid Build Coastguard Worker         @param  cx         The X coordinate of the center of the sweep
274*c8dee2aaSAndroid Build Coastguard Worker         @param  cx         The Y coordinate of the center of the sweep
275*c8dee2aaSAndroid Build Coastguard Worker         @param  colors     The array[count] of colors, to be distributed around the center, within
276*c8dee2aaSAndroid Build Coastguard Worker                            the gradient angle range.
277*c8dee2aaSAndroid Build Coastguard Worker         @param  pos        May be NULL. The array[count] of SkScalars, or NULL, of the relative
278*c8dee2aaSAndroid Build Coastguard Worker                            position of each corresponding color in the colors array. If this is
279*c8dee2aaSAndroid Build Coastguard Worker                            NULL, then the colors are distributed evenly within the angular range.
280*c8dee2aaSAndroid Build Coastguard Worker                            If this is not null, the values must lie between 0.0 and 1.0, and be
281*c8dee2aaSAndroid Build Coastguard Worker                            strictly increasing. If the first value is not 0.0, then an additional
282*c8dee2aaSAndroid Build Coastguard Worker                            color stop is added at position 0.0, with the same color as colors[0].
283*c8dee2aaSAndroid Build Coastguard Worker                            If the the last value is not 1.0, then an additional color stop is added
284*c8dee2aaSAndroid Build Coastguard Worker                            at position 1.0, with the same color as colors[count - 1].
285*c8dee2aaSAndroid Build Coastguard Worker         @param  count      Must be >= 2. The number of colors (and pos if not NULL) entries
286*c8dee2aaSAndroid Build Coastguard Worker         @param  mode       Tiling mode: controls drawing outside of the gradient angular range.
287*c8dee2aaSAndroid Build Coastguard Worker         @param  startAngle Start of the angular range, corresponding to pos == 0.
288*c8dee2aaSAndroid Build Coastguard Worker         @param  endAngle   End of the angular range, corresponding to pos == 1.
289*c8dee2aaSAndroid Build Coastguard Worker     */
290*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<SkShader> MakeSweep(SkScalar cx, SkScalar cy,
291*c8dee2aaSAndroid Build Coastguard Worker                                      const SkColor colors[], const SkScalar pos[], int count,
292*c8dee2aaSAndroid Build Coastguard Worker                                      SkTileMode mode,
293*c8dee2aaSAndroid Build Coastguard Worker                                      SkScalar startAngle, SkScalar endAngle,
294*c8dee2aaSAndroid Build Coastguard Worker                                      uint32_t flags, const SkMatrix* localMatrix);
295*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<SkShader> MakeSweep(SkScalar cx, SkScalar cy,
296*c8dee2aaSAndroid Build Coastguard Worker                                      const SkColor colors[], const SkScalar pos[], int count,
297*c8dee2aaSAndroid Build Coastguard Worker                                      uint32_t flags = 0, const SkMatrix* localMatrix = nullptr) {
298*c8dee2aaSAndroid Build Coastguard Worker         return MakeSweep(cx, cy, colors, pos, count, SkTileMode::kClamp, 0, 360, flags,
299*c8dee2aaSAndroid Build Coastguard Worker                          localMatrix);
300*c8dee2aaSAndroid Build Coastguard Worker     }
301*c8dee2aaSAndroid Build Coastguard Worker 
302*c8dee2aaSAndroid Build Coastguard Worker     /** Returns a shader that generates a sweep gradient given a center.
303*c8dee2aaSAndroid Build Coastguard Worker 
304*c8dee2aaSAndroid Build Coastguard Worker         The shader accepts negative angles and angles larger than 360, draws
305*c8dee2aaSAndroid Build Coastguard Worker         between 0 and 360 degrees, similar to the CSS conic-gradient
306*c8dee2aaSAndroid Build Coastguard Worker         semantics. 0 degrees means horizontal positive x axis. The start angle
307*c8dee2aaSAndroid Build Coastguard Worker         must be less than the end angle, otherwise a null pointer is
308*c8dee2aaSAndroid Build Coastguard Worker         returned. If color stops do not contain 0 and 1 but are within this
309*c8dee2aaSAndroid Build Coastguard Worker         range, the respective outer color stop is repeated for 0 and 1. Color
310*c8dee2aaSAndroid Build Coastguard Worker         stops less than 0 are clamped to 0, and greater than 1 are clamped to 1.
311*c8dee2aaSAndroid Build Coastguard Worker         <p />
312*c8dee2aaSAndroid Build Coastguard Worker         @param  cx         The X coordinate of the center of the sweep
313*c8dee2aaSAndroid Build Coastguard Worker         @param  cx         The Y coordinate of the center of the sweep
314*c8dee2aaSAndroid Build Coastguard Worker         @param  colors     The array[count] of colors, to be distributed around the center, within
315*c8dee2aaSAndroid Build Coastguard Worker                            the gradient angle range.
316*c8dee2aaSAndroid Build Coastguard Worker         @param  pos        May be NULL. The array[count] of SkScalars, or NULL, of the relative
317*c8dee2aaSAndroid Build Coastguard Worker                            position of each corresponding color in the colors array. If this is
318*c8dee2aaSAndroid Build Coastguard Worker                            NULL, then the colors are distributed evenly within the angular range.
319*c8dee2aaSAndroid Build Coastguard Worker                            If this is not null, the values must lie between 0.0 and 1.0, and be
320*c8dee2aaSAndroid Build Coastguard Worker                            strictly increasing. If the first value is not 0.0, then an additional
321*c8dee2aaSAndroid Build Coastguard Worker                            color stop is added at position 0.0, with the same color as colors[0].
322*c8dee2aaSAndroid Build Coastguard Worker                            If the the last value is not 1.0, then an additional color stop is added
323*c8dee2aaSAndroid Build Coastguard Worker                            at position 1.0, with the same color as colors[count - 1].
324*c8dee2aaSAndroid Build Coastguard Worker         @param  count      Must be >= 2. The number of colors (and pos if not NULL) entries
325*c8dee2aaSAndroid Build Coastguard Worker         @param  mode       Tiling mode: controls drawing outside of the gradient angular range.
326*c8dee2aaSAndroid Build Coastguard Worker         @param  startAngle Start of the angular range, corresponding to pos == 0.
327*c8dee2aaSAndroid Build Coastguard Worker         @param  endAngle   End of the angular range, corresponding to pos == 1.
328*c8dee2aaSAndroid Build Coastguard Worker     */
329*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<SkShader> MakeSweep(SkScalar cx, SkScalar cy,
330*c8dee2aaSAndroid Build Coastguard Worker                                      const SkColor4f colors[], sk_sp<SkColorSpace> colorSpace,
331*c8dee2aaSAndroid Build Coastguard Worker                                      const SkScalar pos[], int count,
332*c8dee2aaSAndroid Build Coastguard Worker                                      SkTileMode mode,
333*c8dee2aaSAndroid Build Coastguard Worker                                      SkScalar startAngle, SkScalar endAngle,
334*c8dee2aaSAndroid Build Coastguard Worker                                      const Interpolation& interpolation,
335*c8dee2aaSAndroid Build Coastguard Worker                                      const SkMatrix* localMatrix);
MakeSweep(SkScalar cx,SkScalar cy,const SkColor4f colors[],sk_sp<SkColorSpace> colorSpace,const SkScalar pos[],int count,SkTileMode mode,SkScalar startAngle,SkScalar endAngle,uint32_t flags,const SkMatrix * localMatrix)336*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<SkShader> MakeSweep(SkScalar cx, SkScalar cy,
337*c8dee2aaSAndroid Build Coastguard Worker                                      const SkColor4f colors[], sk_sp<SkColorSpace> colorSpace,
338*c8dee2aaSAndroid Build Coastguard Worker                                      const SkScalar pos[], int count,
339*c8dee2aaSAndroid Build Coastguard Worker                                      SkTileMode mode,
340*c8dee2aaSAndroid Build Coastguard Worker                                      SkScalar startAngle, SkScalar endAngle,
341*c8dee2aaSAndroid Build Coastguard Worker                                      uint32_t flags, const SkMatrix* localMatrix) {
342*c8dee2aaSAndroid Build Coastguard Worker         return MakeSweep(cx, cy, colors, std::move(colorSpace), pos, count, mode, startAngle,
343*c8dee2aaSAndroid Build Coastguard Worker                          endAngle, Interpolation::FromFlags(flags), localMatrix);
344*c8dee2aaSAndroid Build Coastguard Worker     }
345*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<SkShader> MakeSweep(SkScalar cx, SkScalar cy,
346*c8dee2aaSAndroid Build Coastguard Worker                                      const SkColor4f colors[], sk_sp<SkColorSpace> colorSpace,
347*c8dee2aaSAndroid Build Coastguard Worker                                      const SkScalar pos[], int count,
348*c8dee2aaSAndroid Build Coastguard Worker                                      uint32_t flags = 0, const SkMatrix* localMatrix = nullptr) {
349*c8dee2aaSAndroid Build Coastguard Worker         return MakeSweep(cx, cy, colors, std::move(colorSpace), pos, count, SkTileMode::kClamp,
350*c8dee2aaSAndroid Build Coastguard Worker                          0, 360, flags, localMatrix);
351*c8dee2aaSAndroid Build Coastguard Worker     }
352*c8dee2aaSAndroid Build Coastguard Worker };
353*c8dee2aaSAndroid Build Coastguard Worker 
354*c8dee2aaSAndroid Build Coastguard Worker #endif
355