Flutter Engine
The Flutter Engine
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 132 of file SkLinearGradient.cpp.

138 {
139 SkColorConverter converter(colors, colorCount);
140 return MakeLinear(pts, converter.fColors4f.begin(), nullptr, pos, colorCount, mode, flags,
141 localMatrix);
142}
SkPoint pos
static sk_sp< SkShader > MakeLinear(const SkPoint pts[2], const SkColor colors[], const SkScalar pos[], int count, SkTileMode mode, uint32_t flags=0, const SkMatrix *localMatrix=nullptr)
FlutterSemanticsFlag flags
PODArray< SkColor > colors
Definition: SkRecords.h:276
string converter
Definition: cacheimages.py:19
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

◆ 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 94 of file SkLinearGradient.cpp.

101 {
102 if (!pts || !SkIsFinite((pts[1] - pts[0]).length())) {
103 return nullptr;
104 }
105 if (!SkGradientBaseShader::ValidGradient(colors, colorCount, mode, interpolation)) {
106 return nullptr;
107 }
108 if (1 == colorCount) {
109 return SkShaders::Color(colors[0], std::move(colorSpace));
110 }
111 if (localMatrix && !localMatrix->invert(nullptr)) {
112 return nullptr;
113 }
114
115 if (SkScalarNearlyZero((pts[1] - pts[0]).length(),
117 // Degenerate gradient, the only tricky complication is when in clamp mode, the limit of
118 // the gradient approaches two half planes of solid color (first and last). However, they
119 // are divided by the line perpendicular to the start and end point, which becomes undefined
120 // once start and end are exactly the same, so just use the end color for a stable solution.
122 colors, pos, colorCount, std::move(colorSpace), mode);
123 }
124
126 colors, std::move(colorSpace), pos, colorCount, mode, interpolation);
127
128 sk_sp<SkShader> s = sk_make_sp<SkLinearGradient>(pts, desc);
129 return s->makeWithLocalMatrix(localMatrix ? *localMatrix : SkMatrix::I());
130}
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
static const SkMatrix & I()
Definition: SkMatrix.cpp:1544
struct MyStruct s
size_t length
SK_API sk_sp< SkShader > Color(SkColor)

◆ 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
Definition: FontMgrTest.cpp:50
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 123 of file SkRadialGradient.cpp.

129 {
130 SkColorConverter converter(colors, colorCount);
131 return MakeRadial(center, radius, converter.fColors4f.begin(), nullptr, pos, colorCount, mode,
132 flags, localMatrix);
133}
static SkScalar center(float pos0, float pos1)
static sk_sp< SkShader > MakeRadial(const SkPoint &center, SkScalar radius, const SkColor colors[], const SkScalar pos[], int count, SkTileMode mode, uint32_t flags=0, const SkMatrix *localMatrix=nullptr)

◆ 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 89 of file SkRadialGradient.cpp.

96 {
97 if (radius < 0) {
98 return nullptr;
99 }
100 if (!SkGradientBaseShader::ValidGradient(colors, colorCount, mode, interpolation)) {
101 return nullptr;
102 }
103 if (1 == colorCount) {
104 return SkShaders::Color(colors[0], std::move(colorSpace));
105 }
106 if (localMatrix && !localMatrix->invert(nullptr)) {
107 return nullptr;
108 }
109
111 // Degenerate gradient optimization, and no special logic needed for clamped radial gradient
113 colors, pos, colorCount, std::move(colorSpace), mode);
114 }
115
117 colors, std::move(colorSpace), pos, colorCount, mode, interpolation);
118
119 sk_sp<SkShader> s = sk_make_sp<SkRadialGradient>(center, radius, desc);
120 return s->makeWithLocalMatrix(localMatrix ? *localMatrix : SkMatrix::I());
121}

◆ 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 155 of file SkSweepGradient.cpp.

163 {
164 SkColorConverter converter(colors, colorCount);
165 return MakeSweep(cx, cy, converter.fColors4f.begin(), nullptr, pos, colorCount,
166 mode, startAngle, endAngle, flags, localMatrix);
167}
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)
SkScalar startAngle
Definition: SkRecords.h:250

◆ 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 100 of file SkSweepGradient.cpp.

109 {
110 if (!SkGradientBaseShader::ValidGradient(colors, colorCount, mode, interpolation)) {
111 return nullptr;
112 }
113 if (1 == colorCount) {
114 return SkShaders::Color(colors[0], std::move(colorSpace));
115 }
116 if (!SkIsFinite(startAngle, endAngle) || startAngle > endAngle) {
117 return nullptr;
118 }
119 if (localMatrix && !localMatrix->invert(nullptr)) {
120 return nullptr;
121 }
122
124 // Degenerate gradient, which should follow default degenerate behavior unless it is
125 // clamped and the angle is greater than 0.
127 // In this case, the first color is repeated from 0 to the angle, then a hardstop
128 // switches to the last color (all other colors are compressed to the infinitely thin
129 // interpolation region).
130 static constexpr SkScalar clampPos[3] = {0, 1, 1};
131 SkColor4f reColors[3] = {colors[0], colors[0], colors[colorCount - 1]};
132 return MakeSweep(cx, cy, reColors, std::move(colorSpace), clampPos, 3, mode, 0,
133 endAngle, interpolation, localMatrix);
134 } else {
136 colors, pos, colorCount, std::move(colorSpace), mode);
137 }
138 }
139
140 if (startAngle <= 0 && endAngle >= 360) {
141 // If the t-range includes [0,1], then we can always use clamping (presumably faster).
143 }
144
146 colors, std::move(colorSpace), pos, colorCount, mode, interpolation);
147
148 const SkScalar t0 = startAngle / 360,
149 t1 = endAngle / 360;
150
151 sk_sp<SkShader> s = sk_make_sp<SkSweepGradient>(SkPoint::Make(cx, cy), t0, t1, desc);
152 return s->makeWithLocalMatrix(localMatrix ? *localMatrix : SkMatrix::I());
153}
static bool SkScalarNearlyEqual(SkScalar x, SkScalar y, SkScalar tolerance=SK_ScalarNearlyZero)
Definition: SkScalar.h:107
float SkScalar
Definition: extension.cpp:12
static constexpr SkPoint Make(float x, float y)
Definition: SkPoint_impl.h:173

◆ 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 344 of file SkConicalGradient.cpp.

353 {
354 SkColorConverter converter(colors, colorCount);
356 startRadius,
357 end,
358 endRadius,
359 converter.fColors4f.begin(),
360 nullptr,
361 pos,
362 colorCount,
363 mode,
364 flags,
365 localMatrix);
366}
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 268 of file SkConicalGradient.cpp.

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