blob: 8a6b19a8f250fdaec792517b82153fc429c8ad44 [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) {
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000101 SkPoint center0, center1;
102 center0.set(SkScalarAve(pts[0].fX, pts[1].fX),
103 SkScalarAve(pts[0].fY, pts[1].fY));
104 center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5),
105 SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4));
reed1a9b9642016-03-13 14:13:58 -0700106 return SkGradientShader::MakeTwoPointConical(center0, (pts[1].fX - pts[0].fX) / 7,
107 center0, (pts[1].fX - pts[0].fX) / 2,
108 data.fColors, data.fPos, data.fCount, tm,
109 0, &localMatrix);
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000110}
111
reed1a9b9642016-03-13 14:13:58 -0700112static sk_sp<SkShader> Make2ConicalZeroRad(const SkPoint pts[2], const GradData& data,
113 SkShader::TileMode tm, const SkMatrix& localMatrix) {
114 SkPoint center0, center1;
115 center0.set(SkScalarAve(pts[0].fX, pts[1].fX),
116 SkScalarAve(pts[0].fY, pts[1].fY));
117 center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5),
118 SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4));
119 return SkGradientShader::MakeTwoPointConical(center1, 0.f,
120 center0, (pts[1].fX - pts[0].fX) / 2,
121 data.fColors, data.fPos, data.fCount, tm,
122 0, &localMatrix);
123}
124
125static sk_sp<SkShader> Make2ConicalZeroRadFlip(const SkPoint pts[2], const GradData& data,
126 SkShader::TileMode tm, const SkMatrix& localMatrix) {
127 SkPoint center0, center1;
128 center0.set(SkScalarAve(pts[0].fX, pts[1].fX),
129 SkScalarAve(pts[0].fY, pts[1].fY));
130 center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5),
131 SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4));
132 return SkGradientShader::MakeTwoPointConical(center1, (pts[1].fX - pts[0].fX) / 2,
133 center0, 0.f,
134 data.fColors, data.fPos, data.fCount, tm,
135 0, &localMatrix);
136}
137
138static sk_sp<SkShader> Make2ConicalZeroRadCenter(const SkPoint pts[2], const GradData& data,
commit-bot@chromium.org83f23d82014-05-22 12:27:41 +0000139 SkShader::TileMode tm, const SkMatrix& localMatrix) {
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000140 SkPoint center0, center1;
141 center0.set(SkScalarAve(pts[0].fX, pts[1].fX),
142 SkScalarAve(pts[0].fY, pts[1].fY));
143 center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5),
144 SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4));
reed1a9b9642016-03-13 14:13:58 -0700145 return SkGradientShader::MakeTwoPointConical(center0, 0.f, center0, (pts[1].fX - pts[0].fX) / 2,
146 data.fColors, data.fPos, data.fCount, tm,
147 0, &localMatrix);
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000148}
149
reed1a9b9642016-03-13 14:13:58 -0700150static sk_sp<SkShader> Make2ConicalZeroRadOutside(const SkPoint pts[2], const GradData& data,
151 SkShader::TileMode tm,
152 const SkMatrix& localMatrix) {
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000153 SkPoint center0, center1;
commit-bot@chromium.org80894672014-04-22 21:24:22 +0000154 SkScalar radius0 = 0.f;
reed80ea19c2015-05-12 10:37:34 -0700155 SkScalar radius1 = (pts[1].fX - pts[0].fX) / 3;
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000156 center0.set(pts[0].fX + radius0, pts[0].fY + radius0);
157 center1.set(pts[1].fX - radius1, pts[1].fY - radius1);
reed1a9b9642016-03-13 14:13:58 -0700158 return SkGradientShader::MakeTwoPointConical(center0, radius0, center1, radius1,
159 data.fColors, data.fPos,
160 data.fCount, tm, 0, &localMatrix);
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000161}
162
reed1a9b9642016-03-13 14:13:58 -0700163static sk_sp<SkShader> Make2ConicalZeroRadFlipOutside(const SkPoint pts[2], const GradData& data,
164 SkShader::TileMode tm,
165 const SkMatrix& localMatrix) {
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000166 SkPoint center0, center1;
commit-bot@chromium.org80894672014-04-22 21:24:22 +0000167 SkScalar radius0 = 0.f;
reed80ea19c2015-05-12 10:37:34 -0700168 SkScalar radius1 = (pts[1].fX - pts[0].fX) / 3;
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000169 center0.set(pts[0].fX + radius0, pts[0].fY + radius0);
170 center1.set(pts[1].fX - radius1, pts[1].fY - radius1);
reed1a9b9642016-03-13 14:13:58 -0700171 return SkGradientShader::MakeTwoPointConical(center1, radius1, center0, radius0, data.fColors,
172 data.fPos, data.fCount, tm, 0, &localMatrix);
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000173}
174
reed1a9b9642016-03-13 14:13:58 -0700175static sk_sp<SkShader> Make2ConicalEdgeX(const SkPoint pts[2], const GradData& data,
176 SkShader::TileMode tm, const SkMatrix& localMatrix) {
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000177 SkPoint center0, center1;
reed80ea19c2015-05-12 10:37:34 -0700178 SkScalar radius0 = (pts[1].fX - pts[0].fX) / 7;
179 SkScalar radius1 = (pts[1].fX - pts[0].fX) / 3;
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000180 center1.set(SkScalarAve(pts[0].fX, pts[1].fX),
181 SkScalarAve(pts[0].fY, pts[1].fY));
182 center0.set(center1.fX + radius1, center1.fY);
reed1a9b9642016-03-13 14:13:58 -0700183 return SkGradientShader::MakeTwoPointConical(center0, radius0, center1, radius1, data.fColors,
184 data.fPos, data.fCount, tm, 0, &localMatrix);
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000185}
186
reed1a9b9642016-03-13 14:13:58 -0700187static sk_sp<SkShader> Make2ConicalEdgeY(const SkPoint pts[2], const GradData& data,
188 SkShader::TileMode tm, const SkMatrix& localMatrix) {
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000189 SkPoint center0, center1;
reed80ea19c2015-05-12 10:37:34 -0700190 SkScalar radius0 = (pts[1].fX - pts[0].fX) / 7;
191 SkScalar radius1 = (pts[1].fX - pts[0].fX) / 3;
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000192 center1.set(SkScalarAve(pts[0].fX, pts[1].fX),
193 SkScalarAve(pts[0].fY, pts[1].fY));
194 center0.set(center1.fX, center1.fY + radius1);
reed1a9b9642016-03-13 14:13:58 -0700195 return SkGradientShader::MakeTwoPointConical(center0, radius0, center1, radius1, data.fColors,
196 data.fPos, data.fCount, tm, 0, &localMatrix);
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000197}
egdaniel8405ef92014-06-09 11:57:28 -0700198
reed1a9b9642016-03-13 14:13:58 -0700199static sk_sp<SkShader> Make2ConicalZeroRadEdgeX(const SkPoint pts[2], const GradData& data,
200 SkShader::TileMode tm,
201 const SkMatrix& localMatrix) {
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000202 SkPoint center0, center1;
commit-bot@chromium.org80894672014-04-22 21:24:22 +0000203 SkScalar radius0 = 0.f;
reed80ea19c2015-05-12 10:37:34 -0700204 SkScalar radius1 = (pts[1].fX - pts[0].fX) / 3;
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000205 center1.set(SkScalarAve(pts[0].fX, pts[1].fX),
206 SkScalarAve(pts[0].fY, pts[1].fY));
207 center0.set(center1.fX + radius1, center1.fY);
reed1a9b9642016-03-13 14:13:58 -0700208 return SkGradientShader::MakeTwoPointConical(center0, radius0, center1, radius1, data.fColors,
209 data.fPos, data.fCount, tm, 0, &localMatrix);
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000210}
211
reed1a9b9642016-03-13 14:13:58 -0700212static sk_sp<SkShader> Make2ConicalZeroRadEdgeY(const SkPoint pts[2], const GradData& data,
213 SkShader::TileMode tm, const SkMatrix& localMatrix) {
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000214 SkPoint center0, center1;
commit-bot@chromium.org80894672014-04-22 21:24:22 +0000215 SkScalar radius0 = 0.f;
reed80ea19c2015-05-12 10:37:34 -0700216 SkScalar radius1 = (pts[1].fX - pts[0].fX) / 3;
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000217 center1.set(SkScalarAve(pts[0].fX, pts[1].fX),
218 SkScalarAve(pts[0].fY, pts[1].fY));
219 center0.set(center1.fX, center1.fY + radius1);
reed1a9b9642016-03-13 14:13:58 -0700220 return SkGradientShader::MakeTwoPointConical(center0, radius0, center1, radius1, data.fColors,
221 data.fPos, data.fCount, tm, 0, &localMatrix);
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000222}
223
reed1a9b9642016-03-13 14:13:58 -0700224static sk_sp<SkShader> Make2ConicalTouchX(const SkPoint pts[2], const GradData& data,
225 SkShader::TileMode tm, const SkMatrix& localMatrix) {
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000226 SkPoint center0, center1;
reed80ea19c2015-05-12 10:37:34 -0700227 SkScalar radius0 = (pts[1].fX - pts[0].fX) / 7;
228 SkScalar radius1 = (pts[1].fX - pts[0].fX) / 3;
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000229 center1.set(SkScalarAve(pts[0].fX, pts[1].fX),
230 SkScalarAve(pts[0].fY, pts[1].fY));
231 center0.set(center1.fX - radius1 + radius0, center1.fY);
reed1a9b9642016-03-13 14:13:58 -0700232 return SkGradientShader::MakeTwoPointConical(center0, radius0, center1, radius1, data.fColors,
233 data.fPos, data.fCount, tm, 0, &localMatrix);
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000234}
235
reed1a9b9642016-03-13 14:13:58 -0700236static sk_sp<SkShader> Make2ConicalTouchY(const SkPoint pts[2], const GradData& data,
237 SkShader::TileMode tm, const SkMatrix& localMatrix) {
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000238 SkPoint center0, center1;
reed80ea19c2015-05-12 10:37:34 -0700239 SkScalar radius0 = (pts[1].fX - pts[0].fX) / 7;
240 SkScalar radius1 = (pts[1].fX - pts[0].fX) / 3;
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000241 center1.set(SkScalarAve(pts[0].fX, pts[1].fX),
242 SkScalarAve(pts[0].fY, pts[1].fY));
243 center0.set(center1.fX, center1.fY + radius1 - radius0);
reed1a9b9642016-03-13 14:13:58 -0700244 return SkGradientShader::MakeTwoPointConical(center0, radius0, center1, radius1, data.fColors,
245 data.fPos, data.fCount, tm, 0, &localMatrix);
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000246}
247
reed1a9b9642016-03-13 14:13:58 -0700248static sk_sp<SkShader> Make2ConicalInsideSmallRad(const SkPoint pts[2], const GradData& data,
commit-bot@chromium.org83f23d82014-05-22 12:27:41 +0000249 SkShader::TileMode tm, const SkMatrix& localMatrix) {
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000250 SkPoint center0, center1;
251 center0.set(SkScalarAve(pts[0].fX, pts[1].fX),
252 SkScalarAve(pts[0].fY, pts[1].fY));
253 center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5),
254 SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4));
reed1a9b9642016-03-13 14:13:58 -0700255 return SkGradientShader::MakeTwoPointConical(center0, 0.0000000000000000001f,
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +0000256 center0, (pts[1].fX - pts[0].fX) / 2,
commit-bot@chromium.org83f23d82014-05-22 12:27:41 +0000257 data.fColors, data.fPos, data.fCount, tm,
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +0000258 0, &localMatrix);
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000259}
260
reed1a9b9642016-03-13 14:13:58 -0700261typedef sk_sp<SkShader> (*GradMaker)(const SkPoint pts[2], const GradData& data,
262 SkShader::TileMode tm, const SkMatrix& localMatrix);
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000263
mtkleindbfd7ab2016-09-01 11:24:54 -0700264constexpr GradMaker gGradMakersOutside[] = {
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000265 Make2ConicalOutside, Make2ConicalOutsideFlip,
Yuqian Li81d9f0d2017-12-13 15:47:26 -0500266 Make2ConicalZeroRadOutside, Make2ConicalZeroRadFlipOutside,
267 Make2ConicalOutsideStrip
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000268};
269
mtkleindbfd7ab2016-09-01 11:24:54 -0700270constexpr GradMaker gGradMakersInside[] = {
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000271 Make2ConicalInside, Make2ConicalInsideFlip, Make2ConicalInsideCenter,
272 Make2ConicalZeroRad, Make2ConicalZeroRadFlip, Make2ConicalZeroRadCenter,
273};
274
mtkleindbfd7ab2016-09-01 11:24:54 -0700275constexpr GradMaker gGradMakersEdgeCases[] = {
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000276 Make2ConicalEdgeX, Make2ConicalEdgeY,
277 Make2ConicalZeroRadEdgeX, Make2ConicalZeroRadEdgeY,
278 Make2ConicalTouchX, Make2ConicalTouchY,
279 Make2ConicalInsideSmallRad
280};
281
282
mtkleindbfd7ab2016-09-01 11:24:54 -0700283constexpr struct {
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000284 const GradMaker* fMaker;
285 const int fCount;
286 const char* fName;
287} gGradCases[] = {
288 { gGradMakersOutside, SK_ARRAY_COUNT(gGradMakersOutside), "outside" },
289 { gGradMakersInside, SK_ARRAY_COUNT(gGradMakersInside), "inside" },
290 { gGradMakersEdgeCases, SK_ARRAY_COUNT(gGradMakersEdgeCases), "edge" },
291};
292
293enum GradCaseType { // these must match the order in gGradCases
294 kOutside_GradCaseType,
295 kInside_GradCaseType,
296 kEdge_GradCaseType,
297};
298
299///////////////////////////////////////////////////////////////////////////////
300
301class ConicalGradientsGM : public GM {
302public:
Florin Malita26249e02017-06-27 13:38:26 -0400303 ConicalGradientsGM(GradCaseType gradCaseType, bool dither,
304 SkShader::TileMode mode = SkShader::kClamp_TileMode)
fmalita063675b2015-10-12 10:41:48 -0700305 : fGradCaseType(gradCaseType)
Florin Malita26249e02017-06-27 13:38:26 -0400306 , fDither(dither)
307 , fMode(mode) {
caryclark65cdba62015-06-15 06:51:08 -0700308 this->setBGColor(sk_tool_utils::color_to_565(0xFFDDDDDD));
fmalita063675b2015-10-12 10:41:48 -0700309 fName.printf("gradients_2pt_conical_%s%s", gGradCases[gradCaseType].fName,
310 fDither ? "" : "_nodither");
Florin Malita26249e02017-06-27 13:38:26 -0400311 switch (mode) {
312 case SkShader::kRepeat_TileMode:
313 fName.appendf("_repeat");
314 break;
315 case SkShader::kMirror_TileMode:
316 fName.appendf("_mirror");
317 break;
318 default:
319 break;
320 }
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000321 }
322
323protected:
324 SkString onShortName() {
325 return fName;
326 }
327
328 virtual SkISize onISize() { return SkISize::Make(840, 815); }
329
330 virtual void onDraw(SkCanvas* canvas) {
331
332 SkPoint pts[2] = {
333 { 0, 0 },
334 { SkIntToScalar(100), SkIntToScalar(100) }
335 };
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000336 SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(100) };
337 SkPaint paint;
338 paint.setAntiAlias(true);
fmalita063675b2015-10-12 10:41:48 -0700339 paint.setDither(fDither);
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000340
341 canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
342
343 const GradMaker* gradMaker = gGradCases[fGradCaseType].fMaker;
344 const int count = gGradCases[fGradCaseType].fCount;
345
346 for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); i++) {
347 canvas->save();
348 for (int j = 0; j < count; j++) {
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +0000349 SkMatrix scale = SkMatrix::I();
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000350
351 if (i == 3) { // if the clamp case
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000352 scale.setScale(0.5f, 0.5f);
353 scale.postTranslate(25.f, 25.f);
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000354 }
355
Florin Malita26249e02017-06-27 13:38:26 -0400356 paint.setShader(gradMaker[j](pts, gGradData[i], fMode, scale));
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000357 canvas->drawRect(r, paint);
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000358 canvas->translate(0, SkIntToScalar(120));
359 }
360 canvas->restore();
361 canvas->translate(SkIntToScalar(120), 0);
362 }
363 }
364
365private:
366 typedef GM INHERITED;
367
368 GradCaseType fGradCaseType;
369 SkString fName;
fmalita063675b2015-10-12 10:41:48 -0700370 bool fDither;
Florin Malita26249e02017-06-27 13:38:26 -0400371 SkShader::TileMode fMode;
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000372};
373///////////////////////////////////////////////////////////////////////////////
374
fmalita063675b2015-10-12 10:41:48 -0700375DEF_GM( return new ConicalGradientsGM(kInside_GradCaseType, true); )
376DEF_GM( return new ConicalGradientsGM(kOutside_GradCaseType, true); )
377DEF_GM( return new ConicalGradientsGM(kEdge_GradCaseType, true); )
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000378
Florin Malita26249e02017-06-27 13:38:26 -0400379DEF_GM( return new ConicalGradientsGM(kInside_GradCaseType, true, SkShader::kRepeat_TileMode); )
380DEF_GM( return new ConicalGradientsGM(kOutside_GradCaseType, true, SkShader::kRepeat_TileMode); )
381DEF_GM( return new ConicalGradientsGM(kEdge_GradCaseType, true, SkShader::kRepeat_TileMode); )
382
383DEF_GM( return new ConicalGradientsGM(kInside_GradCaseType, true, SkShader::kMirror_TileMode); )
384DEF_GM( return new ConicalGradientsGM(kOutside_GradCaseType, true, SkShader::kMirror_TileMode); )
385DEF_GM( return new ConicalGradientsGM(kEdge_GradCaseType, true, SkShader::kMirror_TileMode); )
386
fmalita063675b2015-10-12 10:41:48 -0700387DEF_GM( return new ConicalGradientsGM(kInside_GradCaseType, false); )
388DEF_GM( return new ConicalGradientsGM(kOutside_GradCaseType, false); )
389DEF_GM( return new ConicalGradientsGM(kEdge_GradCaseType, false); )
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000390
commit-bot@chromium.orgc8379d72014-04-22 20:56:37 +0000391}