blob: f2e2d1810e066809b244486cdcd22af11fbc60c3 [file] [log] [blame]
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +00001/*
2 * Copyright 2014 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
commit-bot@chromium.org83f23d82014-05-22 12:27:41 +00007
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +00008#include "gm.h"
Mike Klein33d20552017-03-22 13:47:51 -04009#include "sk_tool_utils.h"
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +000010#include "SkGradientShader.h"
11
12namespace skiagm {
13
14struct GradData {
15 int fCount;
16 const SkColor* fColors;
17 const SkScalar* fPos;
18};
19
mtkleindbfd7ab2016-09-01 11:24:54 -070020constexpr SkColor gColors[] = {
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +000021 SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK
22};
mtkleindbfd7ab2016-09-01 11:24:54 -070023constexpr SkScalar gPos0[] = { 0, SK_Scalar1 };
24constexpr SkScalar gPos1[] = { SK_Scalar1/4, SK_Scalar1*3/4 };
25constexpr SkScalar gPos2[] = {
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +000026 0, SK_Scalar1/8, SK_Scalar1/2, SK_Scalar1*7/8, SK_Scalar1
27};
28
mtkleindbfd7ab2016-09-01 11:24:54 -070029constexpr SkScalar gPosClamp[] = {0.0f, 0.0f, 1.0f, 1.0f};
30constexpr SkColor gColorClamp[] = {
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +000031 SK_ColorRED, SK_ColorGREEN, SK_ColorGREEN, SK_ColorBLUE
32};
33
mtkleindbfd7ab2016-09-01 11:24:54 -070034constexpr GradData gGradData[] = {
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +000035 { 2, gColors, gPos0 },
36 { 2, gColors, gPos1 },
37 { 5, gColors, gPos2 },
38 { 4, gColorClamp, gPosClamp }
39};
40
reed1a9b9642016-03-13 14:13:58 -070041static sk_sp<SkShader> Make2ConicalOutside(const SkPoint pts[2], const GradData& data,
42 SkShader::TileMode tm, const SkMatrix& localMatrix) {
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +000043 SkPoint center0, center1;
reed80ea19c2015-05-12 10:37:34 -070044 SkScalar radius0 = (pts[1].fX - pts[0].fX) / 10;
45 SkScalar radius1 = (pts[1].fX - pts[0].fX) / 3;
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +000046 center0.set(pts[0].fX + radius0, pts[0].fY + radius0);
47 center1.set(pts[1].fX - radius1, pts[1].fY - radius1);
reed1a9b9642016-03-13 14:13:58 -070048 return SkGradientShader::MakeTwoPointConical(center0, radius0, center1, radius1, data.fColors,
49 data.fPos, data.fCount, tm, 0, &localMatrix);
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +000050}
51
Yuqian Li81d9f0d2017-12-13 15:47:26 -050052static sk_sp<SkShader> Make2ConicalOutsideStrip(const SkPoint pts[2], const GradData& data,
53 SkShader::TileMode tm, const SkMatrix& localMatrix) {
54 SkPoint center0, center1;
55 SkScalar radius = (pts[1].fX - pts[0].fX) / 3;
56 center0.set(pts[0].fX, pts[0].fY);
57 center1.set(pts[1].fX, pts[1].fY);
58 return SkGradientShader::MakeTwoPointConical(center0, radius, center1, radius, data.fColors,
59 data.fPos, data.fCount, tm, 0, &localMatrix);
60}
61
reed1a9b9642016-03-13 14:13:58 -070062static sk_sp<SkShader> Make2ConicalOutsideFlip(const SkPoint pts[2], const GradData& data,
commit-bot@chromium.org83f23d82014-05-22 12:27:41 +000063 SkShader::TileMode tm, const SkMatrix& localMatrix) {
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +000064 SkPoint center0, center1;
reed80ea19c2015-05-12 10:37:34 -070065 SkScalar radius0 = (pts[1].fX - pts[0].fX) / 10;
66 SkScalar radius1 = (pts[1].fX - pts[0].fX) / 3;
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +000067 center0.set(pts[0].fX + radius0, pts[0].fY + radius0);
68 center1.set(pts[1].fX - radius1, pts[1].fY - radius1);
reed1a9b9642016-03-13 14:13:58 -070069 return SkGradientShader::MakeTwoPointConical(center1, radius1, center0, radius0, data.fColors,
70 data.fPos, data.fCount, tm, 0, &localMatrix);
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +000071}
72
reed1a9b9642016-03-13 14:13:58 -070073static sk_sp<SkShader> Make2ConicalInside(const SkPoint pts[2], const GradData& data,
74 SkShader::TileMode tm, const SkMatrix& localMatrix) {
75 SkPoint center0, center1;
76 center0.set(SkScalarAve(pts[0].fX, pts[1].fX),
77 SkScalarAve(pts[0].fY, pts[1].fY));
78 center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5),
79 SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4));
80 return SkGradientShader::MakeTwoPointConical(center1, (pts[1].fX - pts[0].fX) / 7,
81 center0, (pts[1].fX - pts[0].fX) / 2,
82 data.fColors, data.fPos, data.fCount, tm,
83 0, &localMatrix);
84}
85
86static sk_sp<SkShader> Make2ConicalInsideFlip(const SkPoint pts[2], const GradData& data,
87 SkShader::TileMode tm, const SkMatrix& localMatrix) {
88 SkPoint center0, center1;
89 center0.set(SkScalarAve(pts[0].fX, pts[1].fX),
90 SkScalarAve(pts[0].fY, pts[1].fY));
91 center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5),
92 SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4));
93 return SkGradientShader::MakeTwoPointConical(center0, (pts[1].fX - pts[0].fX) / 2,
94 center1, (pts[1].fX - pts[0].fX) / 7,
95 data.fColors, data.fPos, data.fCount, tm,
96 0, &localMatrix);
97}
98
99static sk_sp<SkShader> Make2ConicalInsideCenter(const SkPoint pts[2], const GradData& data,
commit-bot@chromium.org83f23d82014-05-22 12:27:41 +0000100 SkShader::TileMode tm, const SkMatrix& localMatrix) {
Yuqian Li650dd902018-03-19 14:23:48 -0400101 SkPoint center0;
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000102 center0.set(SkScalarAve(pts[0].fX, pts[1].fX),
103 SkScalarAve(pts[0].fY, pts[1].fY));
reed1a9b9642016-03-13 14:13:58 -0700104 return SkGradientShader::MakeTwoPointConical(center0, (pts[1].fX - pts[0].fX) / 7,
105 center0, (pts[1].fX - pts[0].fX) / 2,
106 data.fColors, data.fPos, data.fCount, tm,
107 0, &localMatrix);
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000108}
109
Yuqian Li650dd902018-03-19 14:23:48 -0400110static sk_sp<SkShader> Make2ConicalInsideCenterReversed(const SkPoint pts[2], const GradData& data,
111 SkShader::TileMode tm, const SkMatrix& localMatrix) {
112 SkPoint center0;
113 center0.set(SkScalarAve(pts[0].fX, pts[1].fX),
114 SkScalarAve(pts[0].fY, pts[1].fY));
115 return SkGradientShader::MakeTwoPointConical(center0, (pts[1].fX - pts[0].fX) / 2,
116 center0, (pts[1].fX - pts[0].fX) / 7,
117 data.fColors, data.fPos, data.fCount, tm,
118 0, &localMatrix);
119}
120
reed1a9b9642016-03-13 14:13:58 -0700121static sk_sp<SkShader> Make2ConicalZeroRad(const SkPoint pts[2], const GradData& data,
122 SkShader::TileMode tm, const SkMatrix& localMatrix) {
123 SkPoint center0, center1;
124 center0.set(SkScalarAve(pts[0].fX, pts[1].fX),
125 SkScalarAve(pts[0].fY, pts[1].fY));
126 center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5),
127 SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4));
128 return SkGradientShader::MakeTwoPointConical(center1, 0.f,
129 center0, (pts[1].fX - pts[0].fX) / 2,
130 data.fColors, data.fPos, data.fCount, tm,
131 0, &localMatrix);
132}
133
134static sk_sp<SkShader> Make2ConicalZeroRadFlip(const SkPoint pts[2], const GradData& data,
135 SkShader::TileMode tm, const SkMatrix& localMatrix) {
136 SkPoint center0, center1;
137 center0.set(SkScalarAve(pts[0].fX, pts[1].fX),
138 SkScalarAve(pts[0].fY, pts[1].fY));
139 center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5),
140 SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4));
141 return SkGradientShader::MakeTwoPointConical(center1, (pts[1].fX - pts[0].fX) / 2,
142 center0, 0.f,
143 data.fColors, data.fPos, data.fCount, tm,
144 0, &localMatrix);
145}
146
147static sk_sp<SkShader> Make2ConicalZeroRadCenter(const SkPoint pts[2], const GradData& data,
commit-bot@chromium.org83f23d82014-05-22 12:27:41 +0000148 SkShader::TileMode tm, const SkMatrix& localMatrix) {
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000149 SkPoint center0, center1;
150 center0.set(SkScalarAve(pts[0].fX, pts[1].fX),
151 SkScalarAve(pts[0].fY, pts[1].fY));
152 center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5),
153 SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4));
reed1a9b9642016-03-13 14:13:58 -0700154 return SkGradientShader::MakeTwoPointConical(center0, 0.f, center0, (pts[1].fX - pts[0].fX) / 2,
155 data.fColors, data.fPos, data.fCount, tm,
156 0, &localMatrix);
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000157}
158
reed1a9b9642016-03-13 14:13:58 -0700159static sk_sp<SkShader> Make2ConicalZeroRadOutside(const SkPoint pts[2], const GradData& data,
160 SkShader::TileMode tm,
161 const SkMatrix& localMatrix) {
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000162 SkPoint center0, center1;
commit-bot@chromium.org80894672014-04-22 21:24:22 +0000163 SkScalar radius0 = 0.f;
reed80ea19c2015-05-12 10:37:34 -0700164 SkScalar radius1 = (pts[1].fX - pts[0].fX) / 3;
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000165 center0.set(pts[0].fX + radius0, pts[0].fY + radius0);
166 center1.set(pts[1].fX - radius1, pts[1].fY - radius1);
reed1a9b9642016-03-13 14:13:58 -0700167 return SkGradientShader::MakeTwoPointConical(center0, radius0, center1, radius1,
168 data.fColors, data.fPos,
169 data.fCount, tm, 0, &localMatrix);
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000170}
171
reed1a9b9642016-03-13 14:13:58 -0700172static sk_sp<SkShader> Make2ConicalZeroRadFlipOutside(const SkPoint pts[2], const GradData& data,
173 SkShader::TileMode tm,
174 const SkMatrix& localMatrix) {
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000175 SkPoint center0, center1;
commit-bot@chromium.org80894672014-04-22 21:24:22 +0000176 SkScalar radius0 = 0.f;
reed80ea19c2015-05-12 10:37:34 -0700177 SkScalar radius1 = (pts[1].fX - pts[0].fX) / 3;
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000178 center0.set(pts[0].fX + radius0, pts[0].fY + radius0);
179 center1.set(pts[1].fX - radius1, pts[1].fY - radius1);
reed1a9b9642016-03-13 14:13:58 -0700180 return SkGradientShader::MakeTwoPointConical(center1, radius1, center0, radius0, data.fColors,
181 data.fPos, data.fCount, tm, 0, &localMatrix);
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000182}
183
reed1a9b9642016-03-13 14:13:58 -0700184static sk_sp<SkShader> Make2ConicalEdgeX(const SkPoint pts[2], const GradData& data,
185 SkShader::TileMode tm, const SkMatrix& localMatrix) {
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000186 SkPoint center0, center1;
reed80ea19c2015-05-12 10:37:34 -0700187 SkScalar radius0 = (pts[1].fX - pts[0].fX) / 7;
188 SkScalar radius1 = (pts[1].fX - pts[0].fX) / 3;
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000189 center1.set(SkScalarAve(pts[0].fX, pts[1].fX),
190 SkScalarAve(pts[0].fY, pts[1].fY));
191 center0.set(center1.fX + radius1, center1.fY);
reed1a9b9642016-03-13 14:13:58 -0700192 return SkGradientShader::MakeTwoPointConical(center0, radius0, center1, radius1, data.fColors,
193 data.fPos, data.fCount, tm, 0, &localMatrix);
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000194}
195
reed1a9b9642016-03-13 14:13:58 -0700196static sk_sp<SkShader> Make2ConicalEdgeY(const SkPoint pts[2], const GradData& data,
197 SkShader::TileMode tm, const SkMatrix& localMatrix) {
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000198 SkPoint center0, center1;
reed80ea19c2015-05-12 10:37:34 -0700199 SkScalar radius0 = (pts[1].fX - pts[0].fX) / 7;
200 SkScalar radius1 = (pts[1].fX - pts[0].fX) / 3;
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000201 center1.set(SkScalarAve(pts[0].fX, pts[1].fX),
202 SkScalarAve(pts[0].fY, pts[1].fY));
203 center0.set(center1.fX, center1.fY + radius1);
reed1a9b9642016-03-13 14:13:58 -0700204 return SkGradientShader::MakeTwoPointConical(center0, radius0, center1, radius1, data.fColors,
205 data.fPos, data.fCount, tm, 0, &localMatrix);
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000206}
egdaniel8405ef92014-06-09 11:57:28 -0700207
reed1a9b9642016-03-13 14:13:58 -0700208static sk_sp<SkShader> Make2ConicalZeroRadEdgeX(const SkPoint pts[2], const GradData& data,
209 SkShader::TileMode tm,
210 const SkMatrix& localMatrix) {
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000211 SkPoint center0, center1;
commit-bot@chromium.org80894672014-04-22 21:24:22 +0000212 SkScalar radius0 = 0.f;
reed80ea19c2015-05-12 10:37:34 -0700213 SkScalar radius1 = (pts[1].fX - pts[0].fX) / 3;
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000214 center1.set(SkScalarAve(pts[0].fX, pts[1].fX),
215 SkScalarAve(pts[0].fY, pts[1].fY));
216 center0.set(center1.fX + radius1, center1.fY);
reed1a9b9642016-03-13 14:13:58 -0700217 return SkGradientShader::MakeTwoPointConical(center0, radius0, center1, radius1, data.fColors,
218 data.fPos, data.fCount, tm, 0, &localMatrix);
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000219}
220
reed1a9b9642016-03-13 14:13:58 -0700221static sk_sp<SkShader> Make2ConicalZeroRadEdgeY(const SkPoint pts[2], const GradData& data,
222 SkShader::TileMode tm, const SkMatrix& localMatrix) {
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000223 SkPoint center0, center1;
commit-bot@chromium.org80894672014-04-22 21:24:22 +0000224 SkScalar radius0 = 0.f;
reed80ea19c2015-05-12 10:37:34 -0700225 SkScalar radius1 = (pts[1].fX - pts[0].fX) / 3;
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000226 center1.set(SkScalarAve(pts[0].fX, pts[1].fX),
227 SkScalarAve(pts[0].fY, pts[1].fY));
228 center0.set(center1.fX, center1.fY + radius1);
reed1a9b9642016-03-13 14:13:58 -0700229 return SkGradientShader::MakeTwoPointConical(center0, radius0, center1, radius1, data.fColors,
230 data.fPos, data.fCount, tm, 0, &localMatrix);
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000231}
232
reed1a9b9642016-03-13 14:13:58 -0700233static sk_sp<SkShader> Make2ConicalTouchX(const SkPoint pts[2], const GradData& data,
234 SkShader::TileMode tm, const SkMatrix& localMatrix) {
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000235 SkPoint center0, center1;
reed80ea19c2015-05-12 10:37:34 -0700236 SkScalar radius0 = (pts[1].fX - pts[0].fX) / 7;
237 SkScalar radius1 = (pts[1].fX - pts[0].fX) / 3;
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000238 center1.set(SkScalarAve(pts[0].fX, pts[1].fX),
239 SkScalarAve(pts[0].fY, pts[1].fY));
240 center0.set(center1.fX - radius1 + radius0, center1.fY);
reed1a9b9642016-03-13 14:13:58 -0700241 return SkGradientShader::MakeTwoPointConical(center0, radius0, center1, radius1, data.fColors,
242 data.fPos, data.fCount, tm, 0, &localMatrix);
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000243}
244
reed1a9b9642016-03-13 14:13:58 -0700245static sk_sp<SkShader> Make2ConicalTouchY(const SkPoint pts[2], const GradData& data,
246 SkShader::TileMode tm, const SkMatrix& localMatrix) {
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000247 SkPoint center0, center1;
reed80ea19c2015-05-12 10:37:34 -0700248 SkScalar radius0 = (pts[1].fX - pts[0].fX) / 7;
249 SkScalar radius1 = (pts[1].fX - pts[0].fX) / 3;
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000250 center1.set(SkScalarAve(pts[0].fX, pts[1].fX),
251 SkScalarAve(pts[0].fY, pts[1].fY));
252 center0.set(center1.fX, center1.fY + radius1 - radius0);
reed1a9b9642016-03-13 14:13:58 -0700253 return SkGradientShader::MakeTwoPointConical(center0, radius0, center1, radius1, data.fColors,
254 data.fPos, data.fCount, tm, 0, &localMatrix);
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000255}
256
reed1a9b9642016-03-13 14:13:58 -0700257static sk_sp<SkShader> Make2ConicalInsideSmallRad(const SkPoint pts[2], const GradData& data,
commit-bot@chromium.org83f23d82014-05-22 12:27:41 +0000258 SkShader::TileMode tm, const SkMatrix& localMatrix) {
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000259 SkPoint center0, center1;
260 center0.set(SkScalarAve(pts[0].fX, pts[1].fX),
261 SkScalarAve(pts[0].fY, pts[1].fY));
262 center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5),
263 SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4));
reed1a9b9642016-03-13 14:13:58 -0700264 return SkGradientShader::MakeTwoPointConical(center0, 0.0000000000000000001f,
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +0000265 center0, (pts[1].fX - pts[0].fX) / 2,
commit-bot@chromium.org83f23d82014-05-22 12:27:41 +0000266 data.fColors, data.fPos, data.fCount, tm,
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +0000267 0, &localMatrix);
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000268}
269
reed1a9b9642016-03-13 14:13:58 -0700270typedef sk_sp<SkShader> (*GradMaker)(const SkPoint pts[2], const GradData& data,
271 SkShader::TileMode tm, const SkMatrix& localMatrix);
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000272
mtkleindbfd7ab2016-09-01 11:24:54 -0700273constexpr GradMaker gGradMakersOutside[] = {
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000274 Make2ConicalOutside, Make2ConicalOutsideFlip,
Yuqian Li81d9f0d2017-12-13 15:47:26 -0500275 Make2ConicalZeroRadOutside, Make2ConicalZeroRadFlipOutside,
276 Make2ConicalOutsideStrip
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000277};
278
mtkleindbfd7ab2016-09-01 11:24:54 -0700279constexpr GradMaker gGradMakersInside[] = {
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000280 Make2ConicalInside, Make2ConicalInsideFlip, Make2ConicalInsideCenter,
281 Make2ConicalZeroRad, Make2ConicalZeroRadFlip, Make2ConicalZeroRadCenter,
Yuqian Li650dd902018-03-19 14:23:48 -0400282 Make2ConicalInsideCenterReversed
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000283};
284
mtkleindbfd7ab2016-09-01 11:24:54 -0700285constexpr GradMaker gGradMakersEdgeCases[] = {
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000286 Make2ConicalEdgeX, Make2ConicalEdgeY,
287 Make2ConicalZeroRadEdgeX, Make2ConicalZeroRadEdgeY,
288 Make2ConicalTouchX, Make2ConicalTouchY,
289 Make2ConicalInsideSmallRad
290};
291
292
mtkleindbfd7ab2016-09-01 11:24:54 -0700293constexpr struct {
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000294 const GradMaker* fMaker;
295 const int fCount;
296 const char* fName;
297} gGradCases[] = {
298 { gGradMakersOutside, SK_ARRAY_COUNT(gGradMakersOutside), "outside" },
299 { gGradMakersInside, SK_ARRAY_COUNT(gGradMakersInside), "inside" },
300 { gGradMakersEdgeCases, SK_ARRAY_COUNT(gGradMakersEdgeCases), "edge" },
301};
302
303enum GradCaseType { // these must match the order in gGradCases
304 kOutside_GradCaseType,
305 kInside_GradCaseType,
306 kEdge_GradCaseType,
307};
308
309///////////////////////////////////////////////////////////////////////////////
310
311class ConicalGradientsGM : public GM {
312public:
Florin Malita26249e02017-06-27 13:38:26 -0400313 ConicalGradientsGM(GradCaseType gradCaseType, bool dither,
314 SkShader::TileMode mode = SkShader::kClamp_TileMode)
fmalita063675b2015-10-12 10:41:48 -0700315 : fGradCaseType(gradCaseType)
Florin Malita26249e02017-06-27 13:38:26 -0400316 , fDither(dither)
317 , fMode(mode) {
caryclark65cdba62015-06-15 06:51:08 -0700318 this->setBGColor(sk_tool_utils::color_to_565(0xFFDDDDDD));
fmalita063675b2015-10-12 10:41:48 -0700319 fName.printf("gradients_2pt_conical_%s%s", gGradCases[gradCaseType].fName,
320 fDither ? "" : "_nodither");
Florin Malita26249e02017-06-27 13:38:26 -0400321 switch (mode) {
322 case SkShader::kRepeat_TileMode:
323 fName.appendf("_repeat");
324 break;
325 case SkShader::kMirror_TileMode:
326 fName.appendf("_mirror");
327 break;
328 default:
329 break;
330 }
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000331 }
332
333protected:
334 SkString onShortName() {
335 return fName;
336 }
337
338 virtual SkISize onISize() { return SkISize::Make(840, 815); }
339
340 virtual void onDraw(SkCanvas* canvas) {
341
342 SkPoint pts[2] = {
343 { 0, 0 },
344 { SkIntToScalar(100), SkIntToScalar(100) }
345 };
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000346 SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(100) };
347 SkPaint paint;
348 paint.setAntiAlias(true);
fmalita063675b2015-10-12 10:41:48 -0700349 paint.setDither(fDither);
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000350
351 canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
352
353 const GradMaker* gradMaker = gGradCases[fGradCaseType].fMaker;
354 const int count = gGradCases[fGradCaseType].fCount;
355
356 for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); i++) {
357 canvas->save();
358 for (int j = 0; j < count; j++) {
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +0000359 SkMatrix scale = SkMatrix::I();
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000360
361 if (i == 3) { // if the clamp case
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000362 scale.setScale(0.5f, 0.5f);
363 scale.postTranslate(25.f, 25.f);
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000364 }
365
Florin Malita26249e02017-06-27 13:38:26 -0400366 paint.setShader(gradMaker[j](pts, gGradData[i], fMode, scale));
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000367 canvas->drawRect(r, paint);
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000368 canvas->translate(0, SkIntToScalar(120));
369 }
370 canvas->restore();
371 canvas->translate(SkIntToScalar(120), 0);
372 }
373 }
374
375private:
376 typedef GM INHERITED;
377
378 GradCaseType fGradCaseType;
379 SkString fName;
fmalita063675b2015-10-12 10:41:48 -0700380 bool fDither;
Florin Malita26249e02017-06-27 13:38:26 -0400381 SkShader::TileMode fMode;
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000382};
383///////////////////////////////////////////////////////////////////////////////
384
fmalita063675b2015-10-12 10:41:48 -0700385DEF_GM( return new ConicalGradientsGM(kInside_GradCaseType, true); )
386DEF_GM( return new ConicalGradientsGM(kOutside_GradCaseType, true); )
387DEF_GM( return new ConicalGradientsGM(kEdge_GradCaseType, true); )
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000388
Florin Malita26249e02017-06-27 13:38:26 -0400389DEF_GM( return new ConicalGradientsGM(kInside_GradCaseType, true, SkShader::kRepeat_TileMode); )
390DEF_GM( return new ConicalGradientsGM(kOutside_GradCaseType, true, SkShader::kRepeat_TileMode); )
391DEF_GM( return new ConicalGradientsGM(kEdge_GradCaseType, true, SkShader::kRepeat_TileMode); )
392
393DEF_GM( return new ConicalGradientsGM(kInside_GradCaseType, true, SkShader::kMirror_TileMode); )
394DEF_GM( return new ConicalGradientsGM(kOutside_GradCaseType, true, SkShader::kMirror_TileMode); )
395DEF_GM( return new ConicalGradientsGM(kEdge_GradCaseType, true, SkShader::kMirror_TileMode); )
396
fmalita063675b2015-10-12 10:41:48 -0700397DEF_GM( return new ConicalGradientsGM(kInside_GradCaseType, false); )
398DEF_GM( return new ConicalGradientsGM(kOutside_GradCaseType, false); )
399DEF_GM( return new ConicalGradientsGM(kEdge_GradCaseType, false); )
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000400
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000401}