Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Classes | Public Types | Static Public Member Functions | List of all members
SkGradientShader Class Reference

#include <SkGradientShader.h>

Classes

struct  Interpolation
 

Public Types

enum  Flags { kInterpolateColorsInPremul_Flag = 1 << 0 }
 

Static Public Member Functions

static sk_sp< SkShaderMakeLinear (const SkPoint pts[2], const SkColor colors[], const SkScalar pos[], int count, SkTileMode mode, uint32_t flags=0, const SkMatrix *localMatrix=nullptr)
 
static sk_sp< SkShaderMakeLinear (const SkPoint pts[2], const SkColor4f colors[], sk_sp< SkColorSpace > colorSpace, const SkScalar pos[], int count, SkTileMode mode, const Interpolation &interpolation, const SkMatrix *localMatrix)
 
static sk_sp< SkShaderMakeLinear (const SkPoint pts[2], const SkColor4f colors[], sk_sp< SkColorSpace > colorSpace, const SkScalar pos[], int count, SkTileMode mode, uint32_t flags=0, const SkMatrix *localMatrix=nullptr)
 
static sk_sp< SkShaderMakeRadial (const SkPoint &center, SkScalar radius, const SkColor colors[], const SkScalar pos[], int count, SkTileMode mode, uint32_t flags=0, const SkMatrix *localMatrix=nullptr)
 
static sk_sp< SkShaderMakeRadial (const SkPoint &center, SkScalar radius, const SkColor4f colors[], sk_sp< SkColorSpace > colorSpace, const SkScalar pos[], int count, SkTileMode mode, const Interpolation &interpolation, const SkMatrix *localMatrix)
 
static sk_sp< SkShaderMakeRadial (const SkPoint &center, SkScalar radius, const SkColor4f colors[], sk_sp< SkColorSpace > colorSpace, const SkScalar pos[], int count, SkTileMode mode, uint32_t flags=0, const SkMatrix *localMatrix=nullptr)
 
static sk_sp< SkShaderMakeTwoPointConical (const SkPoint &start, SkScalar startRadius, const SkPoint &end, SkScalar endRadius, const SkColor colors[], const SkScalar pos[], int count, SkTileMode mode, uint32_t flags=0, const SkMatrix *localMatrix=nullptr)
 
static sk_sp< SkShaderMakeTwoPointConical (const SkPoint &start, SkScalar startRadius, const SkPoint &end, SkScalar endRadius, const SkColor4f colors[], sk_sp< SkColorSpace > colorSpace, const SkScalar pos[], int count, SkTileMode mode, const Interpolation &interpolation, const SkMatrix *localMatrix)
 
static sk_sp< SkShaderMakeTwoPointConical (const SkPoint &start, SkScalar startRadius, const SkPoint &end, SkScalar endRadius, const SkColor4f colors[], sk_sp< SkColorSpace > colorSpace, const SkScalar pos[], int count, SkTileMode mode, uint32_t flags=0, const SkMatrix *localMatrix=nullptr)
 
static sk_sp< SkShaderMakeSweep (SkScalar cx, SkScalar cy, const SkColor colors[], const SkScalar pos[], int count, SkTileMode mode, SkScalar startAngle, SkScalar endAngle, uint32_t flags, const SkMatrix *localMatrix)
 
static sk_sp< SkShaderMakeSweep (SkScalar cx, SkScalar cy, const SkColor colors[], const SkScalar pos[], int count, uint32_t flags=0, const SkMatrix *localMatrix=nullptr)
 
static sk_sp< SkShaderMakeSweep (SkScalar cx, SkScalar cy, const SkColor4f colors[], sk_sp< SkColorSpace > colorSpace, const SkScalar pos[], int count, SkTileMode mode, SkScalar startAngle, SkScalar endAngle, const Interpolation &interpolation, const SkMatrix *localMatrix)
 
static sk_sp< SkShaderMakeSweep (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)
 
static sk_sp< SkShaderMakeSweep (SkScalar cx, SkScalar cy, const SkColor4f colors[], sk_sp< SkColorSpace > colorSpace, const SkScalar pos[], int count, uint32_t flags=0, const SkMatrix *localMatrix=nullptr)
 

Detailed Description

SkGradientShader hosts factories for creating subclasses of SkShader that render linear and radial gradients. In general, degenerate cases should not produce surprising results, but there are several types of degeneracies:

A linear gradient made from the same two points. A radial gradient with a radius of zero. A sweep gradient where the start and end angle are the same. A two point conical gradient where the two centers and the two radii are the same.

For any degenerate gradient with a decal tile mode, it will draw empty since the interpolating region is zero area and the outer region is discarded by the decal mode.

For any degenerate gradient with a repeat or mirror tile mode, it will draw a solid color that is the average gradient color, since infinitely many repetitions of the gradients will fill the shape.

For a clamped gradient, every type is well-defined at the limit except for linear gradients. The radial gradient with zero radius becomes the last color. The sweep gradient draws the sector from 0 to the provided angle with the first color, with a hardstop switching to the last color. When the provided angle is 0, this is just the solid last color again. Similarly, the two point conical gradient becomes a circle filled with the first color, sized to the provided radius, with a hardstop switching to the last color. When the two radii are both zero, this is just the solid last color.

As a linear gradient approaches the degenerate case, its shader will approach the appearance of two half planes, each filled by the first and last colors of the gradient. The planes will be oriented perpendicular to the vector between the two defining points of the gradient. However, once they become the same point, Skia cannot reconstruct what that expected orientation is. To provide a stable and predictable color in this case, Skia just uses the last color as a solid fill to be similar to many of the other degenerate gradients' behaviors in clamp mode.

Definition at line 59 of file SkGradientShader.h.

Member Enumeration Documentation

◆ Flags

Enumerator
kInterpolateColorsInPremul_Flag 

By default gradients will interpolate their colors in unpremul space and then premultiply each of the results. By setting this flag, the gradients will premultiply their colors first, and then interpolate between them. example: https://fiddle.skia.org/c/@GradientShader_MakeLinear

Definition at line 61 of file SkGradientShader.h.

61 {
62 /** By default gradients will interpolate their colors in unpremul space
63 * and then premultiply each of the results. By setting this flag, the
64 * gradients will premultiply their colors first, and then interpolate
65 * between them.
66 * example: https://fiddle.skia.org/c/@GradientShader_MakeLinear
67 */
69 };

Member Function Documentation

◆ MakeLinear() [1/3]

sk_sp< SkShader > SkGradientShader::MakeLinear ( const SkPoint  pts[2],
const SkColor  colors[],
const SkScalar  pos[],
int  count,
SkTileMode  mode,
uint32_t  flags = 0,
const SkMatrix localMatrix = nullptr 
)
static

Returns a shader that generates a linear gradient between the two specified points.

Parameters
ptsThe start and end points for the gradient.
colorsThe array[count] of colors, to be distributed between the two points
posMay be NULL. array[count] of SkScalars, or NULL, of the relative position of each corresponding color in the colors array. If this is NULL, the the colors are distributed evenly between the start and end point. If this is not null, the values must lie between 0.0 and 1.0, and be strictly increasing. If the first value is not 0.0, then an additional color stop is added at position 0.0, with the same color as colors[0]. If the the last value is not 1.0, then an additional color stop is added at position 1.0, with the same color as colors[count - 1].
countMust be >=2. The number of colors (and pos if not NULL) entries.
modeThe tiling mode

example: https://fiddle.skia.org/c/@GradientShader_MakeLinear

Definition at line 131 of file SkLinearGradient.cpp.

137 {
138 SkColorConverter converter(colors, colorCount);
139 return MakeLinear(pts, converter.fColors4f.begin(), nullptr, pos, colorCount, mode, flags,
140 localMatrix);
141}
SkPoint pos
static sk_sp< SkShader > MakeLinear()
FlutterSemanticsFlag flags

◆ MakeLinear() [2/3]

sk_sp< SkShader > SkGradientShader::MakeLinear ( const SkPoint  pts[2],
const SkColor4f  colors[],
sk_sp< SkColorSpace colorSpace,
const SkScalar  pos[],
int  count,
SkTileMode  mode,
const Interpolation interpolation,
const SkMatrix localMatrix 
)
static

Returns a shader that generates a linear gradient between the two specified points.

Parameters
ptsThe start and end points for the gradient.
colorsThe array[count] of colors, to be distributed between the two points
posMay be NULL. array[count] of SkScalars, or NULL, of the relative position of each corresponding color in the colors array. If this is NULL, the the colors are distributed evenly between the start and end point. If this is not null, the values must lie between 0.0 and 1.0, and be strictly increasing. If the first value is not 0.0, then an additional color stop is added at position 0.0, with the same color as colors[0]. If the the last value is not 1.0, then an additional color stop is added at position 1.0, with the same color as colors[count - 1].
countMust be >=2. The number of colors (and pos if not NULL) entries.
modeThe tiling mode

example: https://fiddle.skia.org/c/@GradientShader_MakeLinear

Definition at line 95 of file SkLinearGradient.cpp.

102 {
103 if (!pts || !SkIsFinite((pts[1] - pts[0]).length())) {
104 return nullptr;
105 }
106 if (!SkGradientBaseShader::ValidGradient(colors, colorCount, mode, interpolation)) {
107 return nullptr;
108 }
109 if (1 == colorCount) {
110 return SkShaders::Color(colors[0], std::move(colorSpace));
111 }
112 if (localMatrix && !localMatrix->invert(nullptr)) {
113 return nullptr;
114 }
115
116 if (SkScalarNearlyZero((pts[1] - pts[0]).length(),
118 // Degenerate gradient, the only tricky complication is when in clamp mode, the limit of
119 // the gradient approaches two half planes of solid color (first and last). However, they
120 // are divided by the line perpendicular to the start and end point, which becomes undefined
121 // once start and end are exactly the same, so just use the end color for a stable solution.
123 colors, pos, colorCount, std::move(colorSpace), mode);
124 }
125
127 colors, std::move(colorSpace), pos, colorCount, mode, interpolation);
128 return SkLocalMatrixShader::MakeWrapped<SkLinearGradient>(localMatrix, pts, desc);
129}
static bool SkIsFinite(T x, Pack... values)
static bool SkScalarNearlyZero(SkScalar x, SkScalar tolerance=SK_ScalarNearlyZero)
Definition SkScalar.h:101
static constexpr SkScalar kDegenerateThreshold
static bool ValidGradient(const SkColor4f colors[], int count, SkTileMode tileMode, const Interpolation &interpolation)
static sk_sp< SkShader > MakeDegenerateGradient(const SkColor4f colors[], const SkScalar pos[], int colorCount, sk_sp< SkColorSpace > colorSpace, SkTileMode mode)
bool invert(SkMatrix *inverse) const
Definition SkMatrix.h:1206
size_t length

◆ MakeLinear() [3/3]

static sk_sp< SkShader > SkGradientShader::MakeLinear ( const SkPoint  pts[2],
const SkColor4f  colors[],
sk_sp< SkColorSpace colorSpace,
const SkScalar  pos[],
int  count,
SkTileMode  mode,
uint32_t  flags = 0,
const SkMatrix localMatrix = nullptr 
)
inlinestatic

Definition at line 167 of file SkGradientShader.h.

170 {
171 return MakeLinear(pts, colors, std::move(colorSpace), pos, count, mode,
172 Interpolation::FromFlags(flags), localMatrix);
173 }
int count
static Interpolation FromFlags(uint32_t flags)

◆ MakeRadial() [1/3]

sk_sp< SkShader > SkGradientShader::MakeRadial ( const SkPoint center,
SkScalar  radius,
const SkColor  colors[],
const SkScalar  pos[],
int  count,
SkTileMode  mode,
uint32_t  flags = 0,
const SkMatrix localMatrix = nullptr 
)
static

Returns a shader that generates a radial gradient given the center and radius.

Parameters
centerThe center of the circle for this gradient
radiusMust be positive. The radius of the circle for this gradient
colorsThe array[count] of colors, to be distributed between the center and edge of the circle
posMay be NULL. The array[count] of SkScalars, or NULL, of the relative position of each corresponding color in the colors array. If this is NULL, the the colors are distributed evenly between the center and edge of the circle. If this is not null, the values must lie between 0.0 and 1.0, and be strictly increasing. If the first value is not 0.0, then an additional color stop is added at position 0.0, with the same color as colors[0]. If the the last value is not 1.0, then an additional color stop is added at position 1.0, with the same color as colors[count - 1].
countMust be >= 2. The number of colors (and pos if not NULL) entries
modeThe tiling mode

Definition at line 122 of file SkRadialGradient.cpp.

128 {
129 SkColorConverter converter(colors, colorCount);
130 return MakeRadial(center, radius, converter.fColors4f.begin(), nullptr, pos, colorCount, mode,
131 flags, localMatrix);
132}
static SkScalar center(float pos0, float pos1)
static sk_sp< SkShader > MakeRadial()

◆ MakeRadial() [2/3]

sk_sp< SkShader > SkGradientShader::MakeRadial ( const SkPoint center,
SkScalar  radius,
const SkColor4f  colors[],
sk_sp< SkColorSpace colorSpace,
const SkScalar  pos[],
int  count,
SkTileMode  mode,
const Interpolation interpolation,
const SkMatrix localMatrix 
)
static

Returns a shader that generates a radial gradient given the center and radius.

Parameters
centerThe center of the circle for this gradient
radiusMust be positive. The radius of the circle for this gradient
colorsThe array[count] of colors, to be distributed between the center and edge of the circle
posMay be NULL. The array[count] of SkScalars, or NULL, of the relative position of each corresponding color in the colors array. If this is NULL, the the colors are distributed evenly between the center and edge of the circle. If this is not null, the values must lie between 0.0 and 1.0, and be strictly increasing. If the first value is not 0.0, then an additional color stop is added at position 0.0, with the same color as colors[0]. If the the last value is not 1.0, then an additional color stop is added at position 1.0, with the same color as colors[count - 1].
countMust be >= 2. The number of colors (and pos if not NULL) entries
modeThe tiling mode

Definition at line 90 of file SkRadialGradient.cpp.

97 {
98 if (radius < 0) {
99 return nullptr;
100 }
101 if (!SkGradientBaseShader::ValidGradient(colors, colorCount, mode, interpolation)) {
102 return nullptr;
103 }
104 if (1 == colorCount) {
105 return SkShaders::Color(colors[0], std::move(colorSpace));
106 }
107 if (localMatrix && !localMatrix->invert(nullptr)) {
108 return nullptr;
109 }
110
112 // Degenerate gradient optimization, and no special logic needed for clamped radial gradient
114 colors, pos, colorCount, std::move(colorSpace), mode);
115 }
116
118 colors, std::move(colorSpace), pos, colorCount, mode, interpolation);
119 return SkLocalMatrixShader::MakeWrapped<SkRadialGradient>(localMatrix, center, radius, desc);
120}

◆ MakeRadial() [3/3]

static sk_sp< SkShader > SkGradientShader::MakeRadial ( const SkPoint center,
SkScalar  radius,
const SkColor4f  colors[],
sk_sp< SkColorSpace colorSpace,
const SkScalar  pos[],
int  count,
SkTileMode  mode,
uint32_t  flags = 0,
const SkMatrix localMatrix = nullptr 
)
inlinestatic

Definition at line 217 of file SkGradientShader.h.

220 {
221 return MakeRadial(center, radius, colors, std::move(colorSpace), pos, count, mode,
222 Interpolation::FromFlags(flags), localMatrix);
223 }

◆ MakeSweep() [1/5]

sk_sp< SkShader > SkGradientShader::MakeSweep ( SkScalar  cx,
SkScalar  cy,
const SkColor  colors[],
const SkScalar  pos[],
int  count,
SkTileMode  mode,
SkScalar  startAngle,
SkScalar  endAngle,
uint32_t  flags,
const SkMatrix localMatrix 
)
static

Returns a shader that generates a sweep gradient given a center.

The shader accepts negative angles and angles larger than 360, draws between 0 and 360 degrees, similar to the CSS conic-gradient semantics. 0 degrees means horizontal positive x axis. The start angle must be less than the end angle, otherwise a null pointer is returned. If color stops do not contain 0 and 1 but are within this range, the respective outer color stop is repeated for 0 and 1. Color stops less than 0 are clamped to 0, and greater than 1 are clamped to 1.

Parameters
cxThe X coordinate of the center of the sweep
cxThe Y coordinate of the center of the sweep
colorsThe array[count] of colors, to be distributed around the center, within the gradient angle range.
posMay be NULL. The array[count] of SkScalars, or NULL, of the relative position of each corresponding color in the colors array. If this is NULL, then the colors are distributed evenly within the angular range. If this is not null, the values must lie between 0.0 and 1.0, and be strictly increasing. If the first value is not 0.0, then an additional color stop is added at position 0.0, with the same color as colors[0]. If the the last value is not 1.0, then an additional color stop is added at position 1.0, with the same color as colors[count - 1].
countMust be >= 2. The number of colors (and pos if not NULL) entries
modeTiling mode: controls drawing outside of the gradient angular range.
startAngleStart of the angular range, corresponding to pos == 0.
endAngleEnd of the angular range, corresponding to pos == 1.

Definition at line 158 of file SkSweepGradient.cpp.

166 {
167 SkColorConverter converter(colors, colorCount);
168 return MakeSweep(cx, cy, converter.fColors4f.begin(), nullptr, pos, colorCount,
169 mode, startAngle, endAngle, flags, localMatrix);
170}
static sk_sp< SkShader > MakeSweep(SkScalar cx, SkScalar cy, const SkColor colors[], const SkScalar pos[], int count, SkTileMode mode, SkScalar startAngle, SkScalar endAngle, uint32_t flags, const SkMatrix *localMatrix)

◆ MakeSweep() [2/5]

static sk_sp< SkShader > SkGradientShader::MakeSweep ( SkScalar  cx,
SkScalar  cy,
const SkColor  colors[],
const SkScalar  pos[],
int  count,
uint32_t  flags = 0,
const SkMatrix localMatrix = nullptr 
)
inlinestatic

Definition at line 295 of file SkGradientShader.h.

297 {
298 return MakeSweep(cx, cy, colors, pos, count, SkTileMode::kClamp, 0, 360, flags,
299 localMatrix);
300 }

◆ MakeSweep() [3/5]

sk_sp< SkShader > SkGradientShader::MakeSweep ( SkScalar  cx,
SkScalar  cy,
const SkColor4f  colors[],
sk_sp< SkColorSpace colorSpace,
const SkScalar  pos[],
int  count,
SkTileMode  mode,
SkScalar  startAngle,
SkScalar  endAngle,
const Interpolation interpolation,
const SkMatrix localMatrix 
)
static

Returns a shader that generates a sweep gradient given a center.

The shader accepts negative angles and angles larger than 360, draws between 0 and 360 degrees, similar to the CSS conic-gradient semantics. 0 degrees means horizontal positive x axis. The start angle must be less than the end angle, otherwise a null pointer is returned. If color stops do not contain 0 and 1 but are within this range, the respective outer color stop is repeated for 0 and 1. Color stops less than 0 are clamped to 0, and greater than 1 are clamped to 1.

Parameters
cxThe X coordinate of the center of the sweep
cxThe Y coordinate of the center of the sweep
colorsThe array[count] of colors, to be distributed around the center, within the gradient angle range.
posMay be NULL. The array[count] of SkScalars, or NULL, of the relative position of each corresponding color in the colors array. If this is NULL, then the colors are distributed evenly within the angular range. If this is not null, the values must lie between 0.0 and 1.0, and be strictly increasing. If the first value is not 0.0, then an additional color stop is added at position 0.0, with the same color as colors[0]. If the the last value is not 1.0, then an additional color stop is added at position 1.0, with the same color as colors[count - 1].
countMust be >= 2. The number of colors (and pos if not NULL) entries
modeTiling mode: controls drawing outside of the gradient angular range.
startAngleStart of the angular range, corresponding to pos == 0.
endAngleEnd of the angular range, corresponding to pos == 1.

Definition at line 101 of file SkSweepGradient.cpp.

110 {
111 if (!SkGradientBaseShader::ValidGradient(colors, colorCount, mode, interpolation)) {
112 return nullptr;
113 }
114 if (1 == colorCount) {
115 return SkShaders::Color(colors[0], std::move(colorSpace));
116 }
117 if (!SkIsFinite(startAngle, endAngle) || startAngle > endAngle) {
118 return nullptr;
119 }
120 if (localMatrix && !localMatrix->invert(nullptr)) {
121 return nullptr;
122 }
123
125 // Degenerate gradient, which should follow default degenerate behavior unless it is
126 // clamped and the angle is greater than 0.
128 // In this case, the first color is repeated from 0 to the angle, then a hardstop
129 // switches to the last color (all other colors are compressed to the infinitely thin
130 // interpolation region).
131 static constexpr SkScalar clampPos[3] = {0, 1, 1};
132 SkColor4f reColors[3] = {colors[0], colors[0], colors[colorCount - 1]};
133 return MakeSweep(cx, cy, reColors, std::move(colorSpace), clampPos, 3, mode, 0,
134 endAngle, interpolation, localMatrix);
135 } else {
137 colors, pos, colorCount, std::move(colorSpace), mode);
138 }
139 }
140
141 if (startAngle <= 0 && endAngle >= 360) {
142 // If the t-range includes [0,1], then we can always use clamping (presumably faster).
144 }
145
147 colors, std::move(colorSpace), pos, colorCount, mode, interpolation);
148
149 const SkScalar t0 = startAngle / 360,
150 t1 = endAngle / 360;
151
152 return SkLocalMatrixShader::MakeWrapped<SkSweepGradient>(localMatrix,
153 SkPoint::Make(cx, cy),
154 t0, t1,
155 desc);
156}
static bool SkScalarNearlyEqual(SkScalar x, SkScalar y, SkScalar tolerance=SK_ScalarNearlyZero)
Definition SkScalar.h:107
float SkScalar
Definition extension.cpp:12
SkScalar startAngle
Definition SkRecords.h:250
PODArray< SkColor > colors
Definition SkRecords.h:276
it will be possible to load the file into Perfetto s trace viewer disable asset Prevents usage of any non test fonts unless they were explicitly Loaded via prefetched default font Indicates whether the embedding started a prefetch of the default font manager before creating the engine run In non interactive mode
Definition switches.h:228
static constexpr SkPoint Make(float x, float y)

◆ MakeSweep() [4/5]

static sk_sp< SkShader > SkGradientShader::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 
)
inlinestatic

Definition at line 336 of file SkGradientShader.h.

341 {
342 return MakeSweep(cx, cy, colors, std::move(colorSpace), pos, count, mode, startAngle,
343 endAngle, Interpolation::FromFlags(flags), localMatrix);
344 }

◆ MakeSweep() [5/5]

static sk_sp< SkShader > SkGradientShader::MakeSweep ( SkScalar  cx,
SkScalar  cy,
const SkColor4f  colors[],
sk_sp< SkColorSpace colorSpace,
const SkScalar  pos[],
int  count,
uint32_t  flags = 0,
const SkMatrix localMatrix = nullptr 
)
inlinestatic

Definition at line 345 of file SkGradientShader.h.

348 {
349 return MakeSweep(cx, cy, colors, std::move(colorSpace), pos, count, SkTileMode::kClamp,
350 0, 360, flags, localMatrix);
351 }

◆ MakeTwoPointConical() [1/3]

sk_sp< SkShader > SkGradientShader::MakeTwoPointConical ( const SkPoint start,
SkScalar  startRadius,
const SkPoint end,
SkScalar  endRadius,
const SkColor  colors[],
const SkScalar  pos[],
int  count,
SkTileMode  mode,
uint32_t  flags = 0,
const SkMatrix localMatrix = nullptr 
)
static

Returns a shader that generates a conical gradient given two circles, or returns NULL if the inputs are invalid. The gradient interprets the two circles according to the following HTML spec. http://dev.w3.org/html5/2dcontext/#dom-context-2d-createradialgradient

Definition at line 337 of file SkConicalGradient.cpp.

346 {
347 SkColorConverter converter(colors, colorCount);
349 startRadius,
350 end,
351 endRadius,
352 converter.fColors4f.begin(),
353 nullptr,
354 pos,
355 colorCount,
356 mode,
357 flags,
358 localMatrix);
359}
static sk_sp< SkShader > MakeTwoPointConical(const SkPoint &start, SkScalar startRadius, const SkPoint &end, SkScalar endRadius, const SkColor colors[], const SkScalar pos[], int count, SkTileMode mode, uint32_t flags=0, const SkMatrix *localMatrix=nullptr)
glong glong end

◆ MakeTwoPointConical() [2/3]

sk_sp< SkShader > SkGradientShader::MakeTwoPointConical ( const SkPoint start,
SkScalar  startRadius,
const SkPoint end,
SkScalar  endRadius,
const SkColor4f  colors[],
sk_sp< SkColorSpace colorSpace,
const SkScalar  pos[],
int  count,
SkTileMode  mode,
const Interpolation interpolation,
const SkMatrix localMatrix 
)
static

Returns a shader that generates a conical gradient given two circles, or returns NULL if the inputs are invalid. The gradient interprets the two circles according to the following HTML spec. http://dev.w3.org/html5/2dcontext/#dom-context-2d-createradialgradient

Definition at line 261 of file SkConicalGradient.cpp.

271 {
272 if (startRadius < 0 || endRadius < 0) {
273 return nullptr;
274 }
275 if (!SkGradientBaseShader::ValidGradient(colors, colorCount, mode, interpolation)) {
276 return nullptr;
277 }
279 // If the center positions are the same, then the gradient is the radial variant of a 2 pt
280 // conical gradient, an actual radial gradient (startRadius == 0), or it is fully degenerate
281 // (startRadius == endRadius).
283 startRadius, endRadius, SkGradientBaseShader::kDegenerateThreshold)) {
284 // Degenerate case, where the interpolation region area approaches zero. The proper
285 // behavior depends on the tile mode, which is consistent with the default degenerate
286 // gradient behavior, except when mode = clamp and the radii > 0.
287 if (mode == SkTileMode::kClamp &&
289 // The interpolation region becomes an infinitely thin ring at the radius, so the
290 // final gradient will be the first color repeated from p=0 to 1, and then a hard
291 // stop switching to the last color at p=1.
292 static constexpr SkScalar circlePos[3] = {0, 1, 1};
293 SkColor4f reColors[3] = {colors[0], colors[0], colors[colorCount - 1]};
294 return MakeRadial(start,
295 endRadius,
296 reColors,
297 std::move(colorSpace),
298 circlePos,
299 3,
300 mode,
301 interpolation,
302 localMatrix);
303 } else {
304 // Otherwise use the default degenerate case
306 colors, pos, colorCount, std::move(colorSpace), mode);
307 }
309 // We can treat this gradient as radial, which is faster. If we got here, we know
310 // that endRadius is not equal to 0, so this produces a meaningful gradient
311 return MakeRadial(start,
312 endRadius,
313 colors,
314 std::move(colorSpace),
315 pos,
316 colorCount,
317 mode,
318 interpolation,
319 localMatrix);
320 }
321 // Else it's the 2pt conical radial variant with no degenerate radii, so fall through to the
322 // regular 2pt constructor.
323 }
324
325 if (localMatrix && !localMatrix->invert(nullptr)) {
326 return nullptr;
327 }
328 EXPAND_1_COLOR(colorCount);
329
331 colors, std::move(colorSpace), pos, colorCount, mode, interpolation);
332 return SkConicalGradient::Create(start, startRadius, end, endRadius, desc, localMatrix);
333}
#define EXPAND_1_COLOR(count)
static sk_sp< SkShader > Create(const SkPoint &start, SkScalar startRadius, const SkPoint &end, SkScalar endRadius, const Descriptor &, const SkMatrix *localMatrix)

◆ MakeTwoPointConical() [3/3]

static sk_sp< SkShader > SkGradientShader::MakeTwoPointConical ( const SkPoint start,
SkScalar  startRadius,
const SkPoint end,
SkScalar  endRadius,
const SkColor4f  colors[],
sk_sp< SkColorSpace colorSpace,
const SkScalar  pos[],
int  count,
SkTileMode  mode,
uint32_t  flags = 0,
const SkMatrix localMatrix = nullptr 
)
inlinestatic

Definition at line 251 of file SkGradientShader.h.

257 {
258 return MakeTwoPointConical(start, startRadius, end, endRadius, colors,
259 std::move(colorSpace), pos, count, mode,
260 Interpolation::FromFlags(flags), localMatrix);
261 }

The documentation for this class was generated from the following files: