blob: 278fc25735c3b9e50156759915db06173fb3b1a6 [file] [log] [blame]
reed@android.com8a1c16f2008-12-17 15:59:43 +00001/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00002 * Copyright 2006 The Android Open Source Project
reed@android.com8a1c16f2008-12-17 15:59:43 +00003 *
epoger@google.comec3ed6a2011-07-28 14:26:00 +00004 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
reed@android.com8a1c16f2008-12-17 15:59:43 +00006 */
7
8#ifndef SkGradientShader_DEFINED
9#define SkGradientShader_DEFINED
10
11#include "SkShader.h"
12
reed@android.com8a1c16f2008-12-17 15:59:43 +000013/** \class SkGradientShader
14
15 SkGradientShader hosts factories for creating subclasses of SkShader that
16 render linear and radial gradients.
17*/
ctguil@chromium.org7ffb1b22011-03-15 21:27:08 +000018class SK_API SkGradientShader {
reed@android.com8a1c16f2008-12-17 15:59:43 +000019public:
reed@google.com3d3a8602013-05-24 14:58:44 +000020 enum Flags {
21 /** By default gradients will interpolate their colors in unpremul space
22 * and then premultiply each of the results. By setting this flag, the
23 * gradients will premultiply their colors first, and then interpolate
24 * between them.
25 */
26 kInterpolateColorsInPremul_Flag = 1 << 0,
27 };
28
brianosmana99b66d2016-09-27 03:33:12 -070029 /** Returns a shader that generates a linear gradient between the two specified points.
reed@android.com8a1c16f2008-12-17 15:59:43 +000030 <p />
brianosmana99b66d2016-09-27 03:33:12 -070031 @param pts The start and end points for the gradient.
reed@android.com8a1c16f2008-12-17 15:59:43 +000032 @param colors The array[count] of colors, to be distributed between the two points
33 @param pos May be NULL. array[count] of SkScalars, or NULL, of the relative position of
34 each corresponding color in the colors array. If this is NULL,
35 the the colors are distributed evenly between the start and end point.
36 If this is not null, the values must begin with 0, end with 1.0, and
37 intermediate values must be strictly increasing.
rmistry@google.comfbfcd562012-08-23 18:09:54 +000038 @param count Must be >=2. The number of colors (and pos if not NULL) entries.
reed@android.com8a1c16f2008-12-17 15:59:43 +000039 @param mode The tiling mode
reed@android.com8a1c16f2008-12-17 15:59:43 +000040 */
reed8a21c9f2016-03-08 18:50:00 -080041 static sk_sp<SkShader> MakeLinear(const SkPoint pts[2],
42 const SkColor colors[], const SkScalar pos[], int count,
43 SkShader::TileMode mode,
44 uint32_t flags, const SkMatrix* localMatrix);
45 static sk_sp<SkShader> MakeLinear(const SkPoint pts[2],
46 const SkColor colors[], const SkScalar pos[], int count,
47 SkShader::TileMode mode) {
Ben Wagnera93a14a2017-08-28 10:34:05 -040048 return MakeLinear(pts, colors, pos, count, mode, 0, nullptr);
commit-bot@chromium.org7b171522014-05-19 15:46:09 +000049 }
50
brianosmane25d71c2016-09-28 11:27:28 -070051 /** Returns a shader that generates a linear gradient between the two specified points.
52 <p />
53 @param pts The start and end points for the gradient.
54 @param colors The array[count] of colors, to be distributed between the two points
55 @param pos May be NULL. array[count] of SkScalars, or NULL, of the relative position of
56 each corresponding color in the colors array. If this is NULL,
57 the the colors are distributed evenly between the start and end point.
58 If this is not null, the values must begin with 0, end with 1.0, and
59 intermediate values must be strictly increasing.
60 @param count Must be >=2. The number of colors (and pos if not NULL) entries.
61 @param mode The tiling mode
62 */
63 static sk_sp<SkShader> MakeLinear(const SkPoint pts[2],
64 const SkColor4f colors[], sk_sp<SkColorSpace> colorSpace,
65 const SkScalar pos[], int count, SkShader::TileMode mode,
66 uint32_t flags, const SkMatrix* localMatrix);
67 static sk_sp<SkShader> MakeLinear(const SkPoint pts[2],
68 const SkColor4f colors[], sk_sp<SkColorSpace> colorSpace,
69 const SkScalar pos[], int count, SkShader::TileMode mode) {
Ben Wagnera93a14a2017-08-28 10:34:05 -040070 return MakeLinear(pts, colors, std::move(colorSpace), pos, count, mode, 0, nullptr);
brianosmane25d71c2016-09-28 11:27:28 -070071 }
72
reed@android.com8a1c16f2008-12-17 15:59:43 +000073 /** Returns a shader that generates a radial gradient given the center and radius.
74 <p />
reed@android.com8a1c16f2008-12-17 15:59:43 +000075 @param center The center of the circle for this gradient
76 @param radius Must be positive. The radius of the circle for this gradient
77 @param colors The array[count] of colors, to be distributed between the center and edge of the circle
78 @param pos May be NULL. The array[count] of SkScalars, or NULL, of the relative position of
79 each corresponding color in the colors array. If this is NULL,
80 the the colors are distributed evenly between the center and edge of the circle.
81 If this is not null, the values must begin with 0, end with 1.0, and
82 intermediate values must be strictly increasing.
83 @param count Must be >= 2. The number of colors (and pos if not NULL) entries
84 @param mode The tiling mode
reed@android.com8a1c16f2008-12-17 15:59:43 +000085 */
reed8a21c9f2016-03-08 18:50:00 -080086 static sk_sp<SkShader> MakeRadial(const SkPoint& center, SkScalar radius,
87 const SkColor colors[], const SkScalar pos[], int count,
88 SkShader::TileMode mode,
89 uint32_t flags, const SkMatrix* localMatrix);
90 static sk_sp<SkShader> MakeRadial(const SkPoint& center, SkScalar radius,
91 const SkColor colors[], const SkScalar pos[], int count,
92 SkShader::TileMode mode) {
Ben Wagnera93a14a2017-08-28 10:34:05 -040093 return MakeRadial(center, radius, colors, pos, count, mode, 0, nullptr);
commit-bot@chromium.org7b171522014-05-19 15:46:09 +000094 }
95
brianosmane25d71c2016-09-28 11:27:28 -070096 /** Returns a shader that generates a radial gradient given the center and radius.
97 <p />
98 @param center The center of the circle for this gradient
99 @param radius Must be positive. The radius of the circle for this gradient
100 @param colors The array[count] of colors, to be distributed between the center and edge of the circle
101 @param pos May be NULL. The array[count] of SkScalars, or NULL, of the relative position of
102 each corresponding color in the colors array. If this is NULL,
103 the the colors are distributed evenly between the center and edge of the circle.
104 If this is not null, the values must begin with 0, end with 1.0, and
105 intermediate values must be strictly increasing.
106 @param count Must be >= 2. The number of colors (and pos if not NULL) entries
107 @param mode The tiling mode
108 */
109 static sk_sp<SkShader> MakeRadial(const SkPoint& center, SkScalar radius,
110 const SkColor4f colors[], sk_sp<SkColorSpace> colorSpace,
111 const SkScalar pos[], int count, SkShader::TileMode mode,
112 uint32_t flags, const SkMatrix* localMatrix);
113 static sk_sp<SkShader> MakeRadial(const SkPoint& center, SkScalar radius,
114 const SkColor4f colors[], sk_sp<SkColorSpace> colorSpace,
115 const SkScalar pos[], int count, SkShader::TileMode mode) {
Ben Wagnera93a14a2017-08-28 10:34:05 -0400116 return MakeRadial(center, radius, colors, std::move(colorSpace), pos, count, mode,
117 0, nullptr);
brianosmane25d71c2016-09-28 11:27:28 -0700118 }
119
reed@google.comcb7be692012-06-06 20:31:56 +0000120 /**
121 * Returns a shader that generates a conical gradient given two circles, or
122 * returns NULL if the inputs are invalid. The gradient interprets the
123 * two circles according to the following HTML spec.
124 * http://dev.w3.org/html5/2dcontext/#dom-context-2d-createradialgradient
125 */
reed8a21c9f2016-03-08 18:50:00 -0800126 static sk_sp<SkShader> MakeTwoPointConical(const SkPoint& start, SkScalar startRadius,
127 const SkPoint& end, SkScalar endRadius,
128 const SkColor colors[], const SkScalar pos[],
129 int count, SkShader::TileMode mode,
130 uint32_t flags, const SkMatrix* localMatrix);
131 static sk_sp<SkShader> MakeTwoPointConical(const SkPoint& start, SkScalar startRadius,
132 const SkPoint& end, SkScalar endRadius,
133 const SkColor colors[], const SkScalar pos[],
134 int count, SkShader::TileMode mode) {
135 return MakeTwoPointConical(start, startRadius, end, endRadius, colors, pos, count, mode,
Ben Wagnera93a14a2017-08-28 10:34:05 -0400136 0, nullptr);
commit-bot@chromium.org7b171522014-05-19 15:46:09 +0000137 }
138
brianosmane25d71c2016-09-28 11:27:28 -0700139 /**
140 * Returns a shader that generates a conical gradient given two circles, or
141 * returns NULL if the inputs are invalid. The gradient interprets the
142 * two circles according to the following HTML spec.
143 * http://dev.w3.org/html5/2dcontext/#dom-context-2d-createradialgradient
144 */
145 static sk_sp<SkShader> MakeTwoPointConical(const SkPoint& start, SkScalar startRadius,
146 const SkPoint& end, SkScalar endRadius,
147 const SkColor4f colors[],
148 sk_sp<SkColorSpace> colorSpace, const SkScalar pos[],
149 int count, SkShader::TileMode mode,
150 uint32_t flags, const SkMatrix* localMatrix);
151 static sk_sp<SkShader> MakeTwoPointConical(const SkPoint& start, SkScalar startRadius,
152 const SkPoint& end, SkScalar endRadius,
153 const SkColor4f colors[],
154 sk_sp<SkColorSpace> colorSpace, const SkScalar pos[],
155 int count, SkShader::TileMode mode) {
156 return MakeTwoPointConical(start, startRadius, end, endRadius, colors,
Ben Wagnera93a14a2017-08-28 10:34:05 -0400157 std::move(colorSpace), pos, count, mode, 0, nullptr);
brianosmane25d71c2016-09-28 11:27:28 -0700158 }
159
reed@android.com8a1c16f2008-12-17 15:59:43 +0000160 /** Returns a shader that generates a sweep gradient given a center.
161 <p />
Florin Malita5a9a9812017-08-01 16:38:08 -0400162 @param cx The X coordinate of the center of the sweep
163 @param cx The Y coordinate of the center of the sweep
164 @param colors The array[count] of colors, to be distributed around the center, within
165 the gradient angle range.
166 @param pos May be NULL. The array[count] of SkScalars, or NULL, of the relative
167 position of each corresponding color in the colors array. If this is
168 NULL, then the colors are distributed evenly within the angular range.
169 If this is not null, the values must begin with 0, end with 1.0, and
170 intermediate values must be strictly increasing.
171 @param count Must be >= 2. The number of colors (and pos if not NULL) entries
172 @param mode Tiling mode: controls drawing outside of the gradient angular range.
173 @param startAngle Start of the angular range, corresponding to pos == 0.
174 @param endAngle End of the angular range, corresponding to pos == 1.
reed@android.com8a1c16f2008-12-17 15:59:43 +0000175 */
reed8a21c9f2016-03-08 18:50:00 -0800176 static sk_sp<SkShader> MakeSweep(SkScalar cx, SkScalar cy,
177 const SkColor colors[], const SkScalar pos[], int count,
Florin Malita5a9a9812017-08-01 16:38:08 -0400178 SkShader::TileMode mode,
179 SkScalar startAngle, SkScalar endAngle,
reed8a21c9f2016-03-08 18:50:00 -0800180 uint32_t flags, const SkMatrix* localMatrix);
181 static sk_sp<SkShader> MakeSweep(SkScalar cx, SkScalar cy,
Florin Malita5a9a9812017-08-01 16:38:08 -0400182 const SkColor colors[], const SkScalar pos[], int count,
183 uint32_t flags, const SkMatrix* localMatrix) {
184 return MakeSweep(cx, cy, colors, pos, count, SkShader::kClamp_TileMode, 0, 360, flags,
185 localMatrix);
186 }
187 static sk_sp<SkShader> MakeSweep(SkScalar cx, SkScalar cy,
reed8a21c9f2016-03-08 18:50:00 -0800188 const SkColor colors[], const SkScalar pos[], int count) {
Florin Malita5a9a9812017-08-01 16:38:08 -0400189 return MakeSweep(cx, cy, colors, pos, count, 0, nullptr);
reed8a21c9f2016-03-08 18:50:00 -0800190 }
191
brianosmane25d71c2016-09-28 11:27:28 -0700192 /** Returns a shader that generates a sweep gradient given a center.
193 <p />
Florin Malita5a9a9812017-08-01 16:38:08 -0400194 @param cx The X coordinate of the center of the sweep
195 @param cx The Y coordinate of the center of the sweep
196 @param colors The array[count] of colors, to be distributed around the center, within
197 the gradient angle range.
198 @param pos May be NULL. The array[count] of SkScalars, or NULL, of the relative
199 position of each corresponding color in the colors array. If this is
200 NULL, then the colors are distributed evenly within the angular range.
201 If this is not null, the values must begin with 0, end with 1.0, and
202 intermediate values must be strictly increasing.
203 @param count Must be >= 2. The number of colors (and pos if not NULL) entries
204 @param mode Tiling mode: controls drawing outside of the gradient angular range.
205 @param startAngle Start of the angular range, corresponding to pos == 0.
206 @param endAngle End of the angular range, corresponding to pos == 1.
brianosmane25d71c2016-09-28 11:27:28 -0700207 */
208 static sk_sp<SkShader> MakeSweep(SkScalar cx, SkScalar cy,
209 const SkColor4f colors[], sk_sp<SkColorSpace> colorSpace,
210 const SkScalar pos[], int count,
Florin Malita5a9a9812017-08-01 16:38:08 -0400211 SkShader::TileMode mode,
212 SkScalar startAngle, SkScalar endAngle,
brianosmane25d71c2016-09-28 11:27:28 -0700213 uint32_t flags, const SkMatrix* localMatrix);
214 static sk_sp<SkShader> MakeSweep(SkScalar cx, SkScalar cy,
215 const SkColor4f colors[], sk_sp<SkColorSpace> colorSpace,
Florin Malita5a9a9812017-08-01 16:38:08 -0400216 const SkScalar pos[], int count,
217 uint32_t flags, const SkMatrix* localMatrix) {
218 return MakeSweep(cx, cy, colors, std::move(colorSpace), pos, count,
219 SkShader::kClamp_TileMode, 0, 360, flags, localMatrix);
220 }
221 static sk_sp<SkShader> MakeSweep(SkScalar cx, SkScalar cy,
222 const SkColor4f colors[], sk_sp<SkColorSpace> colorSpace,
brianosmane25d71c2016-09-28 11:27:28 -0700223 const SkScalar pos[], int count) {
Florin Malita5a9a9812017-08-01 16:38:08 -0400224 return MakeSweep(cx, cy, colors, std::move(colorSpace), pos, count, 0, nullptr);
brianosmane25d71c2016-09-28 11:27:28 -0700225 }
226
Cary Clark4dc5a452018-05-21 11:56:57 -0400227 static void InitializeFlattenables();
reed@android.com8a1c16f2008-12-17 15:59:43 +0000228};
229
230#endif