blob: 2fcce75c30ecfcedf29caeb40ccfc3a63b4d22d0 [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) {
48 return MakeLinear(pts, colors, pos, count, mode, 0, NULL);
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) {
70 return MakeLinear(pts, colors, std::move(colorSpace), pos, count, mode, 0, NULL);
71 }
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) {
93 return MakeRadial(center, radius, colors, pos, count, mode, 0, NULL);
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) {
116 return MakeRadial(center, radius, colors, std::move(colorSpace), pos, count, mode, 0, NULL);
117 }
118
reed@google.comcb7be692012-06-06 20:31:56 +0000119 /**
120 * Returns a shader that generates a conical gradient given two circles, or
121 * returns NULL if the inputs are invalid. The gradient interprets the
122 * two circles according to the following HTML spec.
123 * http://dev.w3.org/html5/2dcontext/#dom-context-2d-createradialgradient
124 */
reed8a21c9f2016-03-08 18:50:00 -0800125 static sk_sp<SkShader> MakeTwoPointConical(const SkPoint& start, SkScalar startRadius,
126 const SkPoint& end, SkScalar endRadius,
127 const SkColor colors[], const SkScalar pos[],
128 int count, SkShader::TileMode mode,
129 uint32_t flags, const SkMatrix* localMatrix);
130 static sk_sp<SkShader> MakeTwoPointConical(const SkPoint& start, SkScalar startRadius,
131 const SkPoint& end, SkScalar endRadius,
132 const SkColor colors[], const SkScalar pos[],
133 int count, SkShader::TileMode mode) {
134 return MakeTwoPointConical(start, startRadius, end, endRadius, colors, pos, count, mode,
135 0, NULL);
commit-bot@chromium.org7b171522014-05-19 15:46:09 +0000136 }
137
brianosmane25d71c2016-09-28 11:27:28 -0700138 /**
139 * Returns a shader that generates a conical gradient given two circles, or
140 * returns NULL if the inputs are invalid. The gradient interprets the
141 * two circles according to the following HTML spec.
142 * http://dev.w3.org/html5/2dcontext/#dom-context-2d-createradialgradient
143 */
144 static sk_sp<SkShader> MakeTwoPointConical(const SkPoint& start, SkScalar startRadius,
145 const SkPoint& end, SkScalar endRadius,
146 const SkColor4f colors[],
147 sk_sp<SkColorSpace> colorSpace, const SkScalar pos[],
148 int count, SkShader::TileMode mode,
149 uint32_t flags, const SkMatrix* localMatrix);
150 static sk_sp<SkShader> MakeTwoPointConical(const SkPoint& start, SkScalar startRadius,
151 const SkPoint& end, SkScalar endRadius,
152 const SkColor4f colors[],
153 sk_sp<SkColorSpace> colorSpace, const SkScalar pos[],
154 int count, SkShader::TileMode mode) {
155 return MakeTwoPointConical(start, startRadius, end, endRadius, colors,
156 std::move(colorSpace), pos, count, mode, 0, NULL);
157 }
158
reed@android.com8a1c16f2008-12-17 15:59:43 +0000159 /** Returns a shader that generates a sweep gradient given a center.
160 <p />
reed@android.com8a1c16f2008-12-17 15:59:43 +0000161 @param cx The X coordinate of the center of the sweep
162 @param cx The Y coordinate of the center of the sweep
163 @param colors The array[count] of colors, to be distributed around the center.
164 @param pos May be NULL. The array[count] of SkScalars, or NULL, of the relative position of
165 each corresponding color in the colors array. If this is NULL,
166 the the colors are distributed evenly between the center and edge of the circle.
167 If this is not null, the values must begin with 0, end with 1.0, and
168 intermediate values must be strictly increasing.
169 @param count Must be >= 2. The number of colors (and pos if not NULL) entries
reed@android.com8a1c16f2008-12-17 15:59:43 +0000170 */
reed8a21c9f2016-03-08 18:50:00 -0800171 static sk_sp<SkShader> MakeSweep(SkScalar cx, SkScalar cy,
172 const SkColor colors[], const SkScalar pos[], int count,
173 uint32_t flags, const SkMatrix* localMatrix);
174 static sk_sp<SkShader> MakeSweep(SkScalar cx, SkScalar cy,
175 const SkColor colors[], const SkScalar pos[], int count) {
176 return MakeSweep(cx, cy, colors, pos, count, 0, NULL);
177 }
178
brianosmane25d71c2016-09-28 11:27:28 -0700179 /** Returns a shader that generates a sweep gradient given a center.
180 <p />
181 @param cx The X coordinate of the center of the sweep
182 @param cx The Y coordinate of the center of the sweep
183 @param colors The array[count] of colors, to be distributed around the center.
184 @param pos May be NULL. The array[count] of SkScalars, or NULL, of the relative position of
185 each corresponding color in the colors array. If this is NULL,
186 the the colors are distributed evenly between the center and edge of the circle.
187 If this is not null, the values must begin with 0, end with 1.0, and
188 intermediate values must be strictly increasing.
189 @param count Must be >= 2. The number of colors (and pos if not NULL) entries
190 */
191 static sk_sp<SkShader> MakeSweep(SkScalar cx, SkScalar cy,
192 const SkColor4f colors[], sk_sp<SkColorSpace> colorSpace,
193 const SkScalar pos[], int count,
194 uint32_t flags, const SkMatrix* localMatrix);
195 static sk_sp<SkShader> MakeSweep(SkScalar cx, SkScalar cy,
196 const SkColor4f colors[], sk_sp<SkColorSpace> colorSpace,
197 const SkScalar pos[], int count) {
198 return MakeSweep(cx, cy, colors, std::move(colorSpace), pos, count, 0, NULL);
199 }
200
reed8a21c9f2016-03-08 18:50:00 -0800201#ifdef SK_SUPPORT_LEGACY_CREATESHADER_PTR
202 static SkShader* CreateLinear(const SkPoint pts[2],
203 const SkColor colors[], const SkScalar pos[], int count,
204 SkShader::TileMode mode,
205 uint32_t flags, const SkMatrix* localMatrix) {
206 return MakeLinear(pts, colors, pos, count, mode, flags, localMatrix).release();
207 }
208 static SkShader* CreateLinear(const SkPoint pts[2],
209 const SkColor colors[], const SkScalar pos[], int count,
210 SkShader::TileMode mode) {
211 return CreateLinear(pts, colors, pos, count, mode, 0, NULL);
212 }
213
214 static SkShader* CreateRadial(const SkPoint& center, SkScalar radius,
215 const SkColor colors[], const SkScalar pos[], int count,
216 SkShader::TileMode mode,
217 uint32_t flags, const SkMatrix* localMatrix) {
218 return MakeRadial(center, radius, colors, pos, count, mode, flags, localMatrix).release();
219 }
220
221 static SkShader* CreateRadial(const SkPoint& center, SkScalar radius,
222 const SkColor colors[], const SkScalar pos[], int count,
223 SkShader::TileMode mode) {
224 return CreateRadial(center, radius, colors, pos, count, mode, 0, NULL);
225 }
226
227 static SkShader* CreateTwoPointConical(const SkPoint& start, SkScalar startRadius,
228 const SkPoint& end, SkScalar endRadius,
229 const SkColor colors[], const SkScalar pos[], int count,
230 SkShader::TileMode mode,
231 uint32_t flags, const SkMatrix* localMatrix) {
232 return MakeTwoPointConical(start, startRadius, end, endRadius, colors, pos, count, mode,
233 flags, localMatrix).release();
234 }
235 static SkShader* CreateTwoPointConical(const SkPoint& start, SkScalar startRadius,
236 const SkPoint& end, SkScalar endRadius,
237 const SkColor colors[], const SkScalar pos[], int count,
238 SkShader::TileMode mode) {
239 return CreateTwoPointConical(start, startRadius, end, endRadius, colors, pos, count, mode,
240 0, NULL);
241 }
242
reed@android.com8a1c16f2008-12-17 15:59:43 +0000243 static SkShader* CreateSweep(SkScalar cx, SkScalar cy,
commit-bot@chromium.org83f23d82014-05-22 12:27:41 +0000244 const SkColor colors[], const SkScalar pos[], int count,
reed8a21c9f2016-03-08 18:50:00 -0800245 uint32_t flags, const SkMatrix* localMatrix) {
246 return MakeSweep(cx, cy, colors, pos, count, flags, localMatrix).release();
247 }
commit-bot@chromium.org7b171522014-05-19 15:46:09 +0000248 static SkShader* CreateSweep(SkScalar cx, SkScalar cy,
commit-bot@chromium.org83f23d82014-05-22 12:27:41 +0000249 const SkColor colors[], const SkScalar pos[], int count) {
250 return CreateSweep(cx, cy, colors, pos, count, 0, NULL);
commit-bot@chromium.org7b171522014-05-19 15:46:09 +0000251 }
reed8a21c9f2016-03-08 18:50:00 -0800252#endif
253
commit-bot@chromium.org7b171522014-05-19 15:46:09 +0000254
djsollen@google.coma2ca41e2012-03-23 19:00:34 +0000255 SK_DECLARE_FLATTENABLE_REGISTRAR_GROUP()
reed@android.com8a1c16f2008-12-17 15:59:43 +0000256};
257
258#endif