gradients_no_texture.cpp revision f539318f0d3dba743ec1886d5d9df0fb1be628a1
1d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek/*
2d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek * Copyright 2013 Google Inc.
3d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek *
4d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek * Use of this source code is governed by a BSD-style license that can be
5d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek * found in the LICENSE file.
6d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek */
7d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek#include "gm.h"
8d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek#include "SkGradientShader.h"
9d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek
10d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenekusing namespace skiagm;
11d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek
12d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenekstruct GradData {
13d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek    int             fCount;
14d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek    const SkColor*  fColors;
15d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek    const SkScalar* fPos;
16d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek};
17d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek
18d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenekstatic const SkColor gColors[] = {
1988145034694ed5267fa6fa5febc54fadc02bd479Steve Naroff    SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE,
203d31560343856c573376a04558a7111e7afad4f7Chandler Carruth};
210a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor
2288145034694ed5267fa6fa5febc54fadc02bd479Steve Naroffstatic const GradData gGradData[] = {
23db2a685287e57d9dfec09c867152c465af6fc6b0Arnaud A. de Grandmaison    { 1, gColors, NULL },
24db2a685287e57d9dfec09c867152c465af6fc6b0Arnaud A. de Grandmaison    { 2, gColors, NULL },
25db2a685287e57d9dfec09c867152c465af6fc6b0Arnaud A. de Grandmaison    { 3, gColors, NULL },
264d9eff53c49a2c1b9b460b899c95dcdbb3e056e1Argyrios Kyrtzidis    { 4, gColors, NULL },
274d9eff53c49a2c1b9b460b899c95dcdbb3e056e1Argyrios Kyrtzidis};
284d9eff53c49a2c1b9b460b899c95dcdbb3e056e1Argyrios Kyrtzidis
294d9eff53c49a2c1b9b460b899c95dcdbb3e056e1Argyrios Kyrtzidisstatic SkShader* MakeLinear(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) {
304d9eff53c49a2c1b9b460b899c95dcdbb3e056e1Argyrios Kyrtzidis    return SkGradientShader::CreateLinear(pts, data.fColors, data.fPos, data.fCount, tm);
314d9eff53c49a2c1b9b460b899c95dcdbb3e056e1Argyrios Kyrtzidis}
324d9eff53c49a2c1b9b460b899c95dcdbb3e056e1Argyrios Kyrtzidis
334d9eff53c49a2c1b9b460b899c95dcdbb3e056e1Argyrios Kyrtzidisstatic SkShader* MakeRadial(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) {
34ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidis    SkPoint center;
352d5c133d3dd95507db63147997109f06e8cfa833Argyrios Kyrtzidis    center.set(SkScalarAve(pts[0].fX, pts[1].fX),
36ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidis               SkScalarAve(pts[0].fY, pts[1].fY));
37ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidis    return SkGradientShader::CreateRadial(center, center.fX, data.fColors,
38ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidis                                          data.fPos, data.fCount, tm);
39ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidis}
40ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidis
41ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidisstatic SkShader* MakeSweep(const SkPoint pts[2], const GradData& data, SkShader::TileMode) {
42ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidis    SkPoint center;
43ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidis    center.set(SkScalarAve(pts[0].fX, pts[1].fX),
44ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidis               SkScalarAve(pts[0].fY, pts[1].fY));
45ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidis    return SkGradientShader::CreateSweep(center.fX, center.fY, data.fColors, data.fPos, data.fCount);
46ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidis}
47ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidis
48ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidisstatic SkShader* Make2Radial(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) {
49ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidis    SkPoint center0, center1;
50ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidis    center0.set(SkScalarAve(pts[0].fX, pts[1].fX),
51ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidis                SkScalarAve(pts[0].fY, pts[1].fY));
52ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidis    center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5),
53ca9805a79dad01f12fa13c245f48724203699f08Argyrios Kyrtzidis                SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4));
54d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek    return SkGradientShader::CreateTwoPointRadial(
55d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek        center1, (pts[1].fX - pts[0].fX) / 7,
56d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek        center0, (pts[1].fX - pts[0].fX) / 2,
57d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek        data.fColors, data.fPos, data.fCount, tm);
5887fb9404cd962b78c98947d75d68be1691c4e737Douglas Gregor}
5920d416c36b46dd19ee0b1ea2d0266ae43be86e51Douglas Gregor
601efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbarstatic SkShader* Make2Conical(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) {
61f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor    SkPoint center0, center1;
62f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor    SkScalar radius0 = SkScalarDiv(pts[1].fX - pts[0].fX, 10);
63f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor    SkScalar radius1 = SkScalarDiv(pts[1].fX - pts[0].fX, 3);
64f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor    center0.set(pts[0].fX + radius0, pts[0].fY + radius0);
65f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor    center1.set(pts[1].fX - radius1, pts[1].fY - radius1);
661efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar    return SkGradientShader::CreateTwoPointConical(center1, radius1,
67f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor                                                   center0, radius0,
68f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor                                                   data.fColors, data.fPos,
69f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor                                                   data.fCount, tm);
701efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar}
711efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar
72f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor
7320d416c36b46dd19ee0b1ea2d0266ae43be86e51Douglas Gregortypedef SkShader* (*GradMaker)(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm);
7420d416c36b46dd19ee0b1ea2d0266ae43be86e51Douglas Gregor
7520d416c36b46dd19ee0b1ea2d0266ae43be86e51Douglas Gregorstatic const GradMaker gGradMakers[] = {
761efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar    MakeLinear, MakeRadial, MakeSweep, Make2Radial, Make2Conical,
777f17376e0931a337d544b75d9030bc92763be287Douglas Gregor};
787f17376e0931a337d544b75d9030bc92763be287Douglas Gregor
797f17376e0931a337d544b75d9030bc92763be287Douglas Gregor///////////////////////////////////////////////////////////////////////////////
807f17376e0931a337d544b75d9030bc92763be287Douglas Gregor
817f17376e0931a337d544b75d9030bc92763be287Douglas Gregorclass GradientsNoTextureGM : public GM {
82600866cc7d6d9ec2e27d4b6d6ec461f6463b5ab6Steve Naroffpublic:
837f17376e0931a337d544b75d9030bc92763be287Douglas Gregor    GradientsNoTextureGM() {
847f17376e0931a337d544b75d9030bc92763be287Douglas Gregor        this->setBGColor(0xFFDDDDDD);
857f17376e0931a337d544b75d9030bc92763be287Douglas Gregor    }
860a90d32523bfe5fa63e11b648686c9699f786d15Ted Kremenek
87600866cc7d6d9ec2e27d4b6d6ec461f6463b5ab6Steve Naroffprotected:
887f17376e0931a337d544b75d9030bc92763be287Douglas Gregor    virtual uint32_t onGetFlags() const SK_OVERRIDE {
89c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor        return kSkipTiled_Flag;
90c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    }
917f17376e0931a337d544b75d9030bc92763be287Douglas Gregor
92c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    SkString onShortName() SK_OVERRIDE { return SkString("gradients_no_texture"); }
931efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar    virtual SkISize onISize() SK_OVERRIDE { return SkISize::Make(640, 615); }
94735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor
95735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
96735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor        static const SkPoint kPts[2] = { { 0, 0 },
97735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor                                         { SkIntToScalar(50), SkIntToScalar(50) } };
98735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor        static const SkShader::TileMode kTM = SkShader::kClamp_TileMode;
99735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor        SkRect kRect = { 0, 0, SkIntToScalar(50), SkIntToScalar(50) };
100735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor        SkPaint paint;
101735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor        paint.setAntiAlias(true);
1021efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar
1031efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar        canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
104735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor        static const uint8_t kAlphas[] = { 0xff, 0x40 };
105735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor        for (size_t a = 0; a < SK_ARRAY_COUNT(kAlphas); ++a) {
106735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor            for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); ++i) {
107735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor                canvas->save();
108735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor                for (size_t j = 0; j < SK_ARRAY_COUNT(gGradMakers); ++j) {
1091efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar                    SkShader* shader = gGradMakers[j](kPts, gGradData[i], kTM);
110c8dfe5ece04e683106eb96c58a2999f70b53ac21Douglas Gregor                    paint.setShader(shader)->unref();
111735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor                    paint.setAlpha(kAlphas[a]);
112735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor                    canvas->drawRect(kRect, paint);
113735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor                    canvas->translate(0, SkIntToScalar(kRect.height() + 20));
114735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor                }
115c8dfe5ece04e683106eb96c58a2999f70b53ac21Douglas Gregor                canvas->restore();
116735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor                canvas->translate(SkIntToScalar(kRect.width() + 20), 0);
117735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor            }
118735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor        }
119735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor    }
120076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne
121076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourneprivate:
122076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne    typedef GM INHERITED;
123076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne};
124076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne
12558ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor///////////////////////////////////////////////////////////////////////////////
126076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne
127076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbournestruct ColorPos {
128076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne    SkColor*    fColors;
12958ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor    SkScalar*   fPos;
130076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne    int         fCount;
131076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne
132076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne    ColorPos() : fColors(NULL), fPos(NULL), fCount(0) {}
133076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne    ~ColorPos() {
13458ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor        SkDELETE_ARRAY(fColors);
135076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne        SkDELETE_ARRAY(fPos);
136076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne    }
137076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne
138d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen    void construct(const SkColor colors[], const SkScalar pos[], int count) {
139d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen        fColors = SkNEW_ARRAY(SkColor, count);
140d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen        memcpy(fColors, colors, count * sizeof(SkColor));
141d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen        if (pos) {
142d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen            fPos = SkNEW_ARRAY(SkScalar, count);
143d12059673dcef32bc2b6bae5321654d33863afe6Erik Verbruggen            memcpy(fPos, pos, count * sizeof(SkScalar));
14458ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor            fPos[0] = 0;
145cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor            fPos[count - 1] = 1;
146cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor        }
147cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor        fCount = count;
148cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor    }
149cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor};
150cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor
151cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregorstatic void make0(ColorPos* rec) {
152cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor#if 0
153cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor    From http://jsfiddle.net/3fe2a/
154cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor
155cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregorbackground-image: -webkit-linear-gradient(left, #22d1cd 1%, #22d1cd 0.9510157507590116%, #df4b37 2.9510157507590113%, #df4b37 23.695886056604927%, #22d1cd 25.695886056604927%, #22d1cd 25.39321881940624%, #e6de36 27.39321881940624%, #e6de36 31.849399922570655%, #3267ff 33.849399922570655%, #3267ff 44.57735802921938%, #9d47d1 46.57735802921938%, #9d47d1 53.27185850805876%, #3267ff 55.27185850805876%, #3267ff 61.95718972227316%, #5cdd9d 63.95718972227316%, #5cdd9d 69.89166004442%, #3267ff 71.89166004442%, #3267ff 74.45795382765857%, #9d47d1 76.45795382765857%, #9d47d1 82.78364610713776%, #3267ff 84.78364610713776%, #3267ff 94.52743647737229%, #e3d082 96.52743647737229%, #e3d082 96.03934633331295%);
156cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregorheight: 30px;
157cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor#endif
158cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor
159cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor    const SkColor colors[] = {
160cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor        0xFF22d1cd, 0xFF22d1cd, 0xFFdf4b37, 0xFFdf4b37, 0xFF22d1cd, 0xFF22d1cd, 0xFFe6de36, 0xFFe6de36,
161cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor        0xFF3267ff, 0xFF3267ff, 0xFF9d47d1, 0xFF9d47d1, 0xFF3267ff, 0xFF3267ff, 0xFF5cdd9d, 0xFF5cdd9d,
162cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor        0xFF3267ff, 0xFF3267ff, 0xFF9d47d1, 0xFF9d47d1, 0xFF3267ff, 0xFF3267ff, 0xFFe3d082, 0xFFe3d082
163cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor    };
164cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor    const double percent[] = {
165cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor        1, 0.9510157507590116, 2.9510157507590113, 23.695886056604927,
166cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor        25.695886056604927, 25.39321881940624, 27.39321881940624, 31.849399922570655,
167cc889664dec7776ebb598e4584e7df5ba2f59ab4Douglas Gregor        33.849399922570655, 44.57735802921938, 46.57735802921938, 53.27185850805876,
16858ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor        55.27185850805876, 61.95718972227316, 63.95718972227316, 69.89166004442,
1697f17376e0931a337d544b75d9030bc92763be287Douglas Gregor        71.89166004442, 74.45795382765857, 76.45795382765857, 82.78364610713776,
1707eee0184570366285589d788bcd7f5dda8345915James Dennett        84.78364610713776, 94.52743647737229, 96.52743647737229, 96.03934633331295,
1717eee0184570366285589d788bcd7f5dda8345915James Dennett    };
1727eee0184570366285589d788bcd7f5dda8345915James Dennett    const int N = SK_ARRAY_COUNT(percent);
173e56b4baeba5097852e04bc41ca2e0396cf729955Steve Naroff    SkScalar pos[N];
174e56b4baeba5097852e04bc41ca2e0396cf729955Steve Naroff    for (int i = 0; i < N; ++i) {
175e56b4baeba5097852e04bc41ca2e0396cf729955Steve Naroff        pos[i] = SkDoubleToScalar(percent[i] / 100);
1761efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar    }
177e56b4baeba5097852e04bc41ca2e0396cf729955Steve Naroff    rec->construct(colors, pos, N);
178e56b4baeba5097852e04bc41ca2e0396cf729955Steve Naroff}
179e56b4baeba5097852e04bc41ca2e0396cf729955Steve Naroff
180b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroffstatic void make1(ColorPos* rec) {
181b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff    const SkColor colors[] = {
1827eee0184570366285589d788bcd7f5dda8345915James Dennett        SK_ColorBLACK, SK_ColorWHITE, SK_ColorBLACK, SK_ColorWHITE,
1830a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor        SK_ColorBLACK, SK_ColorWHITE, SK_ColorBLACK, SK_ColorWHITE,
1840a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor        SK_ColorBLACK,
185b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff    };
186b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff    rec->construct(colors, NULL, SK_ARRAY_COUNT(colors));
187b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff}
188b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff
189b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroffstatic void make2(ColorPos* rec) {
190b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff    const SkColor colors[] = {
1911efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar        SK_ColorBLACK, SK_ColorWHITE, SK_ColorBLACK, SK_ColorWHITE,
192002a528ab0189fc60cfbf9328962c96ccbe567eeDouglas Gregor        SK_ColorBLACK, SK_ColorWHITE, SK_ColorBLACK, SK_ColorWHITE,
193b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff        SK_ColorBLACK,
194b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff    };
195b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff    const int N = SK_ARRAY_COUNT(colors);
196b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff    SkScalar pos[N];
197fd9f23464bfd35314c87c4df410f3937d59eb96dDaniel Dunbar    for (int i = 0; i < N; ++i) {
198fd9f23464bfd35314c87c4df410f3937d59eb96dDaniel Dunbar        pos[i] = SK_Scalar1 * i / (N - 1);
199fd9f23464bfd35314c87c4df410f3937d59eb96dDaniel Dunbar    }
200b2cd48756119f4d8d2a865b4b3e0e8efd02e26a0Douglas Gregor    rec->construct(colors, pos, N);
201b2cd48756119f4d8d2a865b4b3e0e8efd02e26a0Douglas Gregor}
202b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff
2037eee0184570366285589d788bcd7f5dda8345915James Dennettclass GradientsManyColorsGM : public GM {
204b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff    enum {
205b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff        W = 800,
206b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff    };
207b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff    SkAutoTUnref<SkShader> fShader;
208e56b4baeba5097852e04bc41ca2e0396cf729955Steve Naroff
2090a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor    typedef void (*Proc)(ColorPos*);
2100a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregorpublic:
211896b70ffc348f6e2c680b5fb5841984d5785b7b5Ted Kremenek    GradientsManyColorsGM() {}
2120087e1a12b67b6bb032a72ea485a863daeccf55bDouglas Gregor
2130087e1a12b67b6bb032a72ea485a863daeccf55bDouglas Gregorprotected:
2140087e1a12b67b6bb032a72ea485a863daeccf55bDouglas Gregor    virtual uint32_t onGetFlags() const SK_OVERRIDE {
2150087e1a12b67b6bb032a72ea485a863daeccf55bDouglas Gregor        return kSkipTiled_Flag;
2160087e1a12b67b6bb032a72ea485a863daeccf55bDouglas Gregor    }
2170087e1a12b67b6bb032a72ea485a863daeccf55bDouglas Gregor
2188506dde586459887b7e14e23a30af8ac5be5adb6Daniel Dunbar    SkString onShortName() SK_OVERRIDE { return SkString("gradients_many"); }
2191efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar    virtual SkISize onISize() SK_OVERRIDE { return SkISize::Make(850, 100); }
220fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis
221fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
222fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis        const Proc procs[] = {
223fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis            make0, make1, make2,
224fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis        };
225fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis        const SkPoint pts[] = {
226fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis            { 0, 0 },
227fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis            { SkIntToScalar(W), 0 },
228fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis        };
2297eee0184570366285589d788bcd7f5dda8345915James Dennett        const SkRect r = SkRect::MakeWH(SkIntToScalar(W), 30);
2307eee0184570366285589d788bcd7f5dda8345915James Dennett
2317eee0184570366285589d788bcd7f5dda8345915James Dennett        SkPaint paint;
232fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis
233fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis        canvas->translate(20, 20);
234fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis
235fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis        for (int i = 0; i <= 8; ++i) {
236fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis            SkScalar x = r.width() * i / 8;
237fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis            canvas->drawLine(x, 0, x, 10000, paint);
2387eee0184570366285589d788bcd7f5dda8345915James Dennett        }
2397eee0184570366285589d788bcd7f5dda8345915James Dennett
2407eee0184570366285589d788bcd7f5dda8345915James Dennett        for (size_t i = 0; i < SK_ARRAY_COUNT(procs); ++i) {
241fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis            ColorPos rec;
242fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis            procs[i](&rec);
243fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis            SkShader* s = SkGradientShader::CreateLinear(pts, rec.fColors, rec.fPos, rec.fCount,
244fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis                                                         SkShader::kClamp_TileMode);
245fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis            paint.setShader(s)->unref();
246fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis            canvas->drawRect(r, paint);
247fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis            canvas->translate(0, r.height() + 20);
248fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis        }
249fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis    }
250fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis
251fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidisprivate:
252fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis    typedef GM INHERITED;
253fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis};
254fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis
2557eee0184570366285589d788bcd7f5dda8345915James Dennett///////////////////////////////////////////////////////////////////////////////
256fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis
257fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios KyrtzidisDEF_GM( return SkNEW(GradientsNoTextureGM));
258fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios KyrtzidisDEF_GM( return SkNEW(GradientsManyColorsGM));
259fdc1795acc9d5d73a767cc7d43ad1546e93adbbaArgyrios Kyrtzidis