182d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com/*
282d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com * Copyright 2013 Google Inc.
382d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com *
482d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com * Use of this source code is governed by a BSD-style license that can be
582d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com * found in the LICENSE file.
682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com */
782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com#include "gm.h"
833d2055e594177b27360f84e0631b26d74a55a9bMike Klein#include "sk_tool_utils.h"
982d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com#include "SkGradientShader.h"
1082d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com
1182d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.comusing namespace skiagm;
1282d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com
1382d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.comstruct GradData {
1482d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    int             fCount;
1582d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    const SkColor*  fColors;
1682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    const SkScalar* fPos;
1782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com};
1882d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com
19dbfd7ab10883f173f5c1b653a233e18dc6142002mtkleinconstexpr SkColor gColors[] = {
2082d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE,
2182d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com};
2282d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com
23dbfd7ab10883f173f5c1b653a233e18dc6142002mtkleinconstexpr GradData gGradData[] = {
2496fcdcc219d2a0d3579719b84b28bede76efba64halcanary    { 1, gColors, nullptr },
2596fcdcc219d2a0d3579719b84b28bede76efba64halcanary    { 2, gColors, nullptr },
2696fcdcc219d2a0d3579719b84b28bede76efba64halcanary    { 3, gColors, nullptr },
2796fcdcc219d2a0d3579719b84b28bede76efba64halcanary    { 4, gColors, nullptr },
2882d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com};
2982d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com
301a9b9640843a64af8d9d90337ec3b3fea663196areedstatic sk_sp<SkShader> MakeLinear(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) {
311a9b9640843a64af8d9d90337ec3b3fea663196areed    return SkGradientShader::MakeLinear(pts, data.fColors, data.fPos, data.fCount, tm);
3282d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com}
3382d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com
341a9b9640843a64af8d9d90337ec3b3fea663196areedstatic sk_sp<SkShader> MakeRadial(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) {
3582d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    SkPoint center;
3682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    center.set(SkScalarAve(pts[0].fX, pts[1].fX),
3782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com               SkScalarAve(pts[0].fY, pts[1].fY));
381a9b9640843a64af8d9d90337ec3b3fea663196areed    return SkGradientShader::MakeRadial(center, center.fX, data.fColors, data.fPos, data.fCount, tm);
3982d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com}
4082d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com
411a9b9640843a64af8d9d90337ec3b3fea663196areedstatic sk_sp<SkShader> MakeSweep(const SkPoint pts[2], const GradData& data, SkShader::TileMode) {
4282d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    SkPoint center;
4382d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    center.set(SkScalarAve(pts[0].fX, pts[1].fX),
4482d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com               SkScalarAve(pts[0].fY, pts[1].fY));
451a9b9640843a64af8d9d90337ec3b3fea663196areed    return SkGradientShader::MakeSweep(center.fX, center.fY, data.fColors, data.fPos, data.fCount);
4682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com}
4782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com
481a9b9640843a64af8d9d90337ec3b3fea663196areedstatic sk_sp<SkShader> Make2Radial(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) {
4982d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    SkPoint center0, center1;
5082d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    center0.set(SkScalarAve(pts[0].fX, pts[1].fX),
5182d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com                SkScalarAve(pts[0].fY, pts[1].fY));
5282d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5),
5382d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com                SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4));
541a9b9640843a64af8d9d90337ec3b3fea663196areed    return SkGradientShader::MakeTwoPointConical(
5582d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com        center1, (pts[1].fX - pts[0].fX) / 7,
5682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com        center0, (pts[1].fX - pts[0].fX) / 2,
5783f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org        data.fColors, data.fPos, data.fCount, tm);
5882d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com}
5982d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com
601a9b9640843a64af8d9d90337ec3b3fea663196areedstatic sk_sp<SkShader> Make2Conical(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) {
6182d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    SkPoint center0, center1;
6280ea19ca4bdd68c1493666a5fe7e4ce9d43ded8breed    SkScalar radius0 = (pts[1].fX - pts[0].fX) / 10;
6380ea19ca4bdd68c1493666a5fe7e4ce9d43ded8breed    SkScalar radius1 = (pts[1].fX - pts[0].fX) / 3;
6482d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    center0.set(pts[0].fX + radius0, pts[0].fY + radius0);
6582d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    center1.set(pts[1].fX - radius1, pts[1].fY - radius1);
661a9b9640843a64af8d9d90337ec3b3fea663196areed    return SkGradientShader::MakeTwoPointConical(center1, radius1,
6782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com                                                   center0, radius0,
6882d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com                                                   data.fColors, data.fPos,
6983f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                                                   data.fCount, tm);
7082d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com}
7182d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com
7282d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com
731a9b9640843a64af8d9d90337ec3b3fea663196areedtypedef sk_sp<SkShader> (*GradMaker)(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm);
7483f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org
75dbfd7ab10883f173f5c1b653a233e18dc6142002mtkleinconstexpr GradMaker gGradMakers[] = {
7682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    MakeLinear, MakeRadial, MakeSweep, Make2Radial, Make2Conical,
7782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com};
7882d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com
7982d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com///////////////////////////////////////////////////////////////////////////////
8082d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com
8182d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.comclass GradientsNoTextureGM : public GM {
8282d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.compublic:
83063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita    GradientsNoTextureGM(bool dither) : fDither(dither) {
8465cdba6ba78aaec0c0a4596bb5941020c789482bcaryclark        this->setBGColor(sk_tool_utils::color_to_565(0xFFDDDDDD));
8582d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    }
8682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com
8782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.comprotected:
88a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
89063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita    SkString onShortName() override {
90063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita        return SkString(fDither ? "gradients_no_texture" : "gradients_no_texture_nodither");
91063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita    }
92063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita
9336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkISize onISize() override { return SkISize::Make(640, 615); }
9482d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com
9536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(SkCanvas* canvas) override {
96dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein        constexpr SkPoint kPts[2] = { { 0, 0 },
9782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com                                         { SkIntToScalar(50), SkIntToScalar(50) } };
98dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein        constexpr SkShader::TileMode kTM = SkShader::kClamp_TileMode;
9982d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com        SkRect kRect = { 0, 0, SkIntToScalar(50), SkIntToScalar(50) };
10082d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com        SkPaint paint;
10182d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com        paint.setAntiAlias(true);
102063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita        paint.setDither(fDither);
10382d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com
10482d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com        canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
105dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein        constexpr uint8_t kAlphas[] = { 0xff, 0x40 };
10682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com        for (size_t a = 0; a < SK_ARRAY_COUNT(kAlphas); ++a) {
10782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com            for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); ++i) {
10882d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com                canvas->save();
10982d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com                for (size_t j = 0; j < SK_ARRAY_COUNT(gGradMakers); ++j) {
1101a9b9640843a64af8d9d90337ec3b3fea663196areed                    paint.setShader(gGradMakers[j](kPts, gGradData[i], kTM));
11182d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com                    paint.setAlpha(kAlphas[a]);
11282d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com                    canvas->drawRect(kRect, paint);
11382d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com                    canvas->translate(0, SkIntToScalar(kRect.height() + 20));
11482d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com                }
11582d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com                canvas->restore();
11682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com                canvas->translate(SkIntToScalar(kRect.width() + 20), 0);
11782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com            }
11882d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com        }
11982d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    }
12082d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com
12182d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.comprivate:
122063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita    bool fDither;
123063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita
12482d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    typedef GM INHERITED;
12582d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com};
12682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com
12782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com///////////////////////////////////////////////////////////////////////////////
12882d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com
1297b8999b5047e059f8dbce2bb24586ac49d928731reed@google.comstruct ColorPos {
1307b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    SkColor*    fColors;
1317b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    SkScalar*   fPos;
1327b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    int         fCount;
1337b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com
13496fcdcc219d2a0d3579719b84b28bede76efba64halcanary    ColorPos() : fColors(nullptr), fPos(nullptr), fCount(0) {}
1357b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    ~ColorPos() {
136385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanary        delete[] fColors;
137385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanary        delete[] fPos;
1387b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    }
1397b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com
1407b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    void construct(const SkColor colors[], const SkScalar pos[], int count) {
141385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanary        fColors = new SkColor[count];
1427b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        memcpy(fColors, colors, count * sizeof(SkColor));
1437b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        if (pos) {
144385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanary            fPos = new SkScalar[count];
1457b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com            memcpy(fPos, pos, count * sizeof(SkScalar));
1467b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com            fPos[0] = 0;
1477b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com            fPos[count - 1] = 1;
1487b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        }
1497b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        fCount = count;
1507b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    }
1517b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com};
1527b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com
1537b8999b5047e059f8dbce2bb24586ac49d928731reed@google.comstatic void make0(ColorPos* rec) {
1547b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com#if 0
1557b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    From http://jsfiddle.net/3fe2a/
1567b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com
1577b8999b5047e059f8dbce2bb24586ac49d928731reed@google.combackground-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%);
1587b8999b5047e059f8dbce2bb24586ac49d928731reed@google.comheight: 30px;
1597b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com#endif
1607b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com
1617b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    const SkColor colors[] = {
1627b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        0xFF22d1cd, 0xFF22d1cd, 0xFFdf4b37, 0xFFdf4b37, 0xFF22d1cd, 0xFF22d1cd, 0xFFe6de36, 0xFFe6de36,
1637b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        0xFF3267ff, 0xFF3267ff, 0xFF9d47d1, 0xFF9d47d1, 0xFF3267ff, 0xFF3267ff, 0xFF5cdd9d, 0xFF5cdd9d,
1647b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        0xFF3267ff, 0xFF3267ff, 0xFF9d47d1, 0xFF9d47d1, 0xFF3267ff, 0xFF3267ff, 0xFFe3d082, 0xFFe3d082
1657b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    };
1667b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    const double percent[] = {
1677b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        1, 0.9510157507590116, 2.9510157507590113, 23.695886056604927,
1687b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        25.695886056604927, 25.39321881940624, 27.39321881940624, 31.849399922570655,
1697b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        33.849399922570655, 44.57735802921938, 46.57735802921938, 53.27185850805876,
1707b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        55.27185850805876, 61.95718972227316, 63.95718972227316, 69.89166004442,
1717b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        71.89166004442, 74.45795382765857, 76.45795382765857, 82.78364610713776,
1727b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        84.78364610713776, 94.52743647737229, 96.52743647737229, 96.03934633331295,
1737b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    };
1747b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    const int N = SK_ARRAY_COUNT(percent);
1757b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    SkScalar pos[N];
1767b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    for (int i = 0; i < N; ++i) {
1777b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        pos[i] = SkDoubleToScalar(percent[i] / 100);
1787b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    }
1797b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    rec->construct(colors, pos, N);
1807b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com}
1817b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com
1827b8999b5047e059f8dbce2bb24586ac49d928731reed@google.comstatic void make1(ColorPos* rec) {
1837b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    const SkColor colors[] = {
1847b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        SK_ColorBLACK, SK_ColorWHITE, SK_ColorBLACK, SK_ColorWHITE,
1857b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        SK_ColorBLACK, SK_ColorWHITE, SK_ColorBLACK, SK_ColorWHITE,
1867b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        SK_ColorBLACK,
1877b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    };
18896fcdcc219d2a0d3579719b84b28bede76efba64halcanary    rec->construct(colors, nullptr, SK_ARRAY_COUNT(colors));
1897b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com}
1907b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com
1917b8999b5047e059f8dbce2bb24586ac49d928731reed@google.comstatic void make2(ColorPos* rec) {
1927b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    const SkColor colors[] = {
1937b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        SK_ColorBLACK, SK_ColorWHITE, SK_ColorBLACK, SK_ColorWHITE,
1947b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        SK_ColorBLACK, SK_ColorWHITE, SK_ColorBLACK, SK_ColorWHITE,
1957b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        SK_ColorBLACK,
1967b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    };
1977b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    const int N = SK_ARRAY_COUNT(colors);
1987b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    SkScalar pos[N];
1997b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    for (int i = 0; i < N; ++i) {
2007b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        pos[i] = SK_Scalar1 * i / (N - 1);
2017b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    }
2027b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    rec->construct(colors, pos, N);
2037b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com}
2047b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com
2056b90df6b1c6ed843be3ac09605050605f9ec9150reedstatic void make3(ColorPos* rec) {
2066b90df6b1c6ed843be3ac09605050605f9ec9150reed    const SkColor colors[] = {
2076b90df6b1c6ed843be3ac09605050605f9ec9150reed        SK_ColorRED, SK_ColorBLUE, SK_ColorBLUE, SK_ColorGREEN, SK_ColorGREEN, SK_ColorBLACK,
2086b90df6b1c6ed843be3ac09605050605f9ec9150reed    };
2096b90df6b1c6ed843be3ac09605050605f9ec9150reed    const SkScalar pos[] = {
2106b90df6b1c6ed843be3ac09605050605f9ec9150reed        0, 0, 0.5f, 0.5, 1, 1,
2116b90df6b1c6ed843be3ac09605050605f9ec9150reed    };
2126b90df6b1c6ed843be3ac09605050605f9ec9150reed    rec->construct(colors, pos, SK_ARRAY_COUNT(colors));
2136b90df6b1c6ed843be3ac09605050605f9ec9150reed}
2146b90df6b1c6ed843be3ac09605050605f9ec9150reed
2157b8999b5047e059f8dbce2bb24586ac49d928731reed@google.comclass GradientsManyColorsGM : public GM {
2167b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    enum {
2177b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        W = 800,
2187b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    };
219cefc43112c8f6fe3702facb89447bdfcc2715345Hal Canary    sk_sp<SkShader> fShader;
2207b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com
2217b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    typedef void (*Proc)(ColorPos*);
2227b8999b5047e059f8dbce2bb24586ac49d928731reed@google.compublic:
223063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita    GradientsManyColorsGM(bool dither) : fDither(dither) {}
2248a777a5e6ad081f54ec169dcf714343c38517161skia.committer@gmail.com
2257b8999b5047e059f8dbce2bb24586ac49d928731reed@google.comprotected:
226a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
227063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita    SkString onShortName() override {
228063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita        return SkString(fDither ? "gradients_many" : "gradients_many_nodither");
229063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita    }
230063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita
2316b90df6b1c6ed843be3ac09605050605f9ec9150reed    SkISize onISize() override { return SkISize::Make(880, 400); }
2328a777a5e6ad081f54ec169dcf714343c38517161skia.committer@gmail.com
23336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(SkCanvas* canvas) override {
2347b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        const Proc procs[] = {
2356b90df6b1c6ed843be3ac09605050605f9ec9150reed            make0, make1, make2, make3,
2367b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        };
2377b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        const SkPoint pts[] = {
2387b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com            { 0, 0 },
2397b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com            { SkIntToScalar(W), 0 },
2407b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        };
2417b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        const SkRect r = SkRect::MakeWH(SkIntToScalar(W), 30);
2427b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com
2437b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        SkPaint paint;
244063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita        paint.setDither(fDither);
2458a777a5e6ad081f54ec169dcf714343c38517161skia.committer@gmail.com
2466b90df6b1c6ed843be3ac09605050605f9ec9150reed        canvas->translate(40, 20);
2478a777a5e6ad081f54ec169dcf714343c38517161skia.committer@gmail.com
2487b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        for (int i = 0; i <= 8; ++i) {
2497b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com            SkScalar x = r.width() * i / 8;
2507b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com            canvas->drawLine(x, 0, x, 10000, paint);
2517b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        }
2527b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com
2536b90df6b1c6ed843be3ac09605050605f9ec9150reed        // expand the drawing rect so we exercise clampping in the gradients
2546b90df6b1c6ed843be3ac09605050605f9ec9150reed        const SkRect drawR = r.makeOutset(20, 0);
2557b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        for (size_t i = 0; i < SK_ARRAY_COUNT(procs); ++i) {
2567b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com            ColorPos rec;
2577b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com            procs[i](&rec);
2581a9b9640843a64af8d9d90337ec3b3fea663196areed            paint.setShader(SkGradientShader::MakeLinear(pts, rec.fColors, rec.fPos, rec.fCount,
2591a9b9640843a64af8d9d90337ec3b3fea663196areed                                                         SkShader::kClamp_TileMode));
2606b90df6b1c6ed843be3ac09605050605f9ec9150reed            canvas->drawRect(drawR, paint);
2616b90df6b1c6ed843be3ac09605050605f9ec9150reed
2626b90df6b1c6ed843be3ac09605050605f9ec9150reed            canvas->save();
2636b90df6b1c6ed843be3ac09605050605f9ec9150reed            canvas->translate(r.centerX(), r.height() + 4);
2646b90df6b1c6ed843be3ac09605050605f9ec9150reed            canvas->scale(-1, 1);
2656b90df6b1c6ed843be3ac09605050605f9ec9150reed            canvas->translate(-r.centerX(), 0);
2666b90df6b1c6ed843be3ac09605050605f9ec9150reed            canvas->drawRect(drawR, paint);
2676b90df6b1c6ed843be3ac09605050605f9ec9150reed            canvas->restore();
2686b90df6b1c6ed843be3ac09605050605f9ec9150reed
2696b90df6b1c6ed843be3ac09605050605f9ec9150reed            canvas->translate(0, r.height() + 2*r.height() + 8);
2707b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        }
2717b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    }
2728a777a5e6ad081f54ec169dcf714343c38517161skia.committer@gmail.com
2737b8999b5047e059f8dbce2bb24586ac49d928731reed@google.comprivate:
274063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita    bool fDither;
275063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita
2767b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    typedef GM INHERITED;
2777b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com};
2787b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com
2797b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com///////////////////////////////////////////////////////////////////////////////
2807b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com
281063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalitaDEF_GM(return new GradientsNoTextureGM(true);)
282063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalitaDEF_GM(return new GradientsNoTextureGM(false);)
283063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalitaDEF_GM(return new GradientsManyColorsGM(true);)
284063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalitaDEF_GM(return new GradientsManyColorsGM(false);)
285