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"
882d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com#include "SkGradientShader.h"
982d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com
1082d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.comusing namespace skiagm;
1182d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com
1282d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.comstruct GradData {
1382d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    int             fCount;
1482d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    const SkColor*  fColors;
1582d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    const SkScalar* fPos;
1682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com};
1782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com
1882d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.comstatic const SkColor gColors[] = {
1982d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE,
2082d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com};
2182d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com
2282d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.comstatic const GradData gGradData[] = {
2382d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    { 1, gColors, NULL },
2482d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    { 2, gColors, NULL },
2582d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    { 3, gColors, NULL },
2682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    { 4, gColors, NULL },
2782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com};
2882d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com
2983f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.orgstatic SkShader* MakeLinear(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) {
3083f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org    return SkGradientShader::CreateLinear(pts, data.fColors, data.fPos, data.fCount, tm);
3182d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com}
3282d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com
3383f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.orgstatic SkShader* MakeRadial(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) {
3482d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    SkPoint center;
3582d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    center.set(SkScalarAve(pts[0].fX, pts[1].fX),
3682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com               SkScalarAve(pts[0].fY, pts[1].fY));
3782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    return SkGradientShader::CreateRadial(center, center.fX, data.fColors,
3883f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                                          data.fPos, data.fCount, tm);
3982d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com}
4082d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com
4183f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.orgstatic 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));
4583f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org    return SkGradientShader::CreateSweep(center.fX, center.fY, data.fColors, data.fPos, data.fCount);
4682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com}
4782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com
4883f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.orgstatic 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));
5482d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    return SkGradientShader::CreateTwoPointRadial(
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
6083f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.orgstatic SkShader* Make2Conical(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) {
6182d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    SkPoint center0, center1;
6282d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    SkScalar radius0 = SkScalarDiv(pts[1].fX - pts[0].fX, 10);
6382d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    SkScalar radius1 = SkScalarDiv(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);
6682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    return SkGradientShader::CreateTwoPointConical(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
7383f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.orgtypedef SkShader* (*GradMaker)(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm);
7483f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org
7582d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.comstatic const 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:
8382d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    GradientsNoTextureGM() {
8482d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com        this->setBGColor(0xFFDDDDDD);
8582d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    }
8682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com
8782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.comprotected:
88a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
89a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org        return kSkipTiled_Flag;
90a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    }
91a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
9282d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    SkString onShortName() SK_OVERRIDE { return SkString("gradients_no_texture"); }
93f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina    virtual SkISize onISize() SK_OVERRIDE { return SkISize::Make(640, 615); }
9482d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com
9582d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
9682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com        static const SkPoint kPts[2] = { { 0, 0 },
9782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com                                         { SkIntToScalar(50), SkIntToScalar(50) } };
9882d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com        static const 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);
10282d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com
10382d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com        canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
10482d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com        static const uint8_t kAlphas[] = { 0xff, 0x40 };
10582d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com        for (size_t a = 0; a < SK_ARRAY_COUNT(kAlphas); ++a) {
10682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com            for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); ++i) {
10782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com                canvas->save();
10882d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com                for (size_t j = 0; j < SK_ARRAY_COUNT(gGradMakers); ++j) {
10983f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                    SkShader* shader = gGradMakers[j](kPts, gGradData[i], kTM);
11082d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com                    paint.setShader(shader)->unref();
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:
12282d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com    typedef GM INHERITED;
12382d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com};
12482d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com
12582d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com///////////////////////////////////////////////////////////////////////////////
12682d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.com
1277b8999b5047e059f8dbce2bb24586ac49d928731reed@google.comstruct ColorPos {
1287b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    SkColor*    fColors;
1297b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    SkScalar*   fPos;
1307b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    int         fCount;
1317b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com
1327b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    ColorPos() : fColors(NULL), fPos(NULL), fCount(0) {}
1337b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    ~ColorPos() {
134c25cec5f9aa4e8801ae87854adc629c742b9de59bsalomon@google.com        SkDELETE_ARRAY(fColors);
135c25cec5f9aa4e8801ae87854adc629c742b9de59bsalomon@google.com        SkDELETE_ARRAY(fPos);
1367b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    }
1377b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com
1387b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    void construct(const SkColor colors[], const SkScalar pos[], int count) {
1397b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        fColors = SkNEW_ARRAY(SkColor, count);
1407b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        memcpy(fColors, colors, count * sizeof(SkColor));
1417b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        if (pos) {
1427b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com            fPos = SkNEW_ARRAY(SkScalar, count);
1437b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com            memcpy(fPos, pos, count * sizeof(SkScalar));
1447b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com            fPos[0] = 0;
1457b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com            fPos[count - 1] = 1;
1467b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        }
1477b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        fCount = count;
1487b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    }
1497b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com};
1507b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com
1517b8999b5047e059f8dbce2bb24586ac49d928731reed@google.comstatic void make0(ColorPos* rec) {
1527b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com#if 0
1537b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    From http://jsfiddle.net/3fe2a/
1547b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com
1557b8999b5047e059f8dbce2bb24586ac49d928731reed@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%);
1567b8999b5047e059f8dbce2bb24586ac49d928731reed@google.comheight: 30px;
1577b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com#endif
1587b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com
1597b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    const SkColor colors[] = {
1607b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        0xFF22d1cd, 0xFF22d1cd, 0xFFdf4b37, 0xFFdf4b37, 0xFF22d1cd, 0xFF22d1cd, 0xFFe6de36, 0xFFe6de36,
1617b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        0xFF3267ff, 0xFF3267ff, 0xFF9d47d1, 0xFF9d47d1, 0xFF3267ff, 0xFF3267ff, 0xFF5cdd9d, 0xFF5cdd9d,
1627b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        0xFF3267ff, 0xFF3267ff, 0xFF9d47d1, 0xFF9d47d1, 0xFF3267ff, 0xFF3267ff, 0xFFe3d082, 0xFFe3d082
1637b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    };
1647b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    const double percent[] = {
1657b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        1, 0.9510157507590116, 2.9510157507590113, 23.695886056604927,
1667b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        25.695886056604927, 25.39321881940624, 27.39321881940624, 31.849399922570655,
1677b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        33.849399922570655, 44.57735802921938, 46.57735802921938, 53.27185850805876,
1687b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        55.27185850805876, 61.95718972227316, 63.95718972227316, 69.89166004442,
1697b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        71.89166004442, 74.45795382765857, 76.45795382765857, 82.78364610713776,
1707b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        84.78364610713776, 94.52743647737229, 96.52743647737229, 96.03934633331295,
1717b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    };
1727b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    const int N = SK_ARRAY_COUNT(percent);
1737b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    SkScalar pos[N];
1747b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    for (int i = 0; i < N; ++i) {
1757b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        pos[i] = SkDoubleToScalar(percent[i] / 100);
1767b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    }
1777b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    rec->construct(colors, pos, N);
1787b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com}
1797b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com
1807b8999b5047e059f8dbce2bb24586ac49d928731reed@google.comstatic void make1(ColorPos* rec) {
1817b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    const SkColor colors[] = {
1827b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        SK_ColorBLACK, SK_ColorWHITE, SK_ColorBLACK, SK_ColorWHITE,
1837b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        SK_ColorBLACK, SK_ColorWHITE, SK_ColorBLACK, SK_ColorWHITE,
1847b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        SK_ColorBLACK,
1857b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    };
1867b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    rec->construct(colors, NULL, SK_ARRAY_COUNT(colors));
1877b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com}
1887b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com
1897b8999b5047e059f8dbce2bb24586ac49d928731reed@google.comstatic void make2(ColorPos* rec) {
1907b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    const SkColor colors[] = {
1917b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        SK_ColorBLACK, SK_ColorWHITE, SK_ColorBLACK, SK_ColorWHITE,
1927b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        SK_ColorBLACK, SK_ColorWHITE, SK_ColorBLACK, SK_ColorWHITE,
1937b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        SK_ColorBLACK,
1947b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    };
1957b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    const int N = SK_ARRAY_COUNT(colors);
1967b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    SkScalar pos[N];
1977b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    for (int i = 0; i < N; ++i) {
1987b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        pos[i] = SK_Scalar1 * i / (N - 1);
1997b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    }
2007b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    rec->construct(colors, pos, N);
2017b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com}
2027b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com
2037b8999b5047e059f8dbce2bb24586ac49d928731reed@google.comclass GradientsManyColorsGM : public GM {
2047b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    enum {
2057b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        W = 800,
2067b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    };
2077b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    SkAutoTUnref<SkShader> fShader;
2087b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com
2097b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    typedef void (*Proc)(ColorPos*);
2107b8999b5047e059f8dbce2bb24586ac49d928731reed@google.compublic:
2117b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    GradientsManyColorsGM() {}
2128a777a5e6ad081f54ec169dcf714343c38517161skia.committer@gmail.com
2137b8999b5047e059f8dbce2bb24586ac49d928731reed@google.comprotected:
214a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
215a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org        return kSkipTiled_Flag;
216a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    }
217a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
2187b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    SkString onShortName() SK_OVERRIDE { return SkString("gradients_many"); }
2197b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    virtual SkISize onISize() SK_OVERRIDE { return SkISize::Make(850, 100); }
2208a777a5e6ad081f54ec169dcf714343c38517161skia.committer@gmail.com
2217b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
2227b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        const Proc procs[] = {
2237b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com            make0, make1, make2,
2247b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        };
2257b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        const SkPoint pts[] = {
2267b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com            { 0, 0 },
2277b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com            { SkIntToScalar(W), 0 },
2287b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        };
2297b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        const SkRect r = SkRect::MakeWH(SkIntToScalar(W), 30);
2307b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com
2317b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        SkPaint paint;
2328a777a5e6ad081f54ec169dcf714343c38517161skia.committer@gmail.com
2337b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        canvas->translate(20, 20);
2348a777a5e6ad081f54ec169dcf714343c38517161skia.committer@gmail.com
2357b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        for (int i = 0; i <= 8; ++i) {
2367b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com            SkScalar x = r.width() * i / 8;
2377b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com            canvas->drawLine(x, 0, x, 10000, paint);
2387b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        }
2397b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com
2407b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        for (size_t i = 0; i < SK_ARRAY_COUNT(procs); ++i) {
2417b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com            ColorPos rec;
2427b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com            procs[i](&rec);
2437b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com            SkShader* s = SkGradientShader::CreateLinear(pts, rec.fColors, rec.fPos, rec.fCount,
2447b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com                                                         SkShader::kClamp_TileMode);
2457b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com            paint.setShader(s)->unref();
2467b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com            canvas->drawRect(r, paint);
2477b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com            canvas->translate(0, r.height() + 20);
2487b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com        }
2497b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    }
2508a777a5e6ad081f54ec169dcf714343c38517161skia.committer@gmail.com
2517b8999b5047e059f8dbce2bb24586ac49d928731reed@google.comprivate:
2527b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com    typedef GM INHERITED;
2537b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com};
2547b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com
2557b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com///////////////////////////////////////////////////////////////////////////////
2567b8999b5047e059f8dbce2bb24586ac49d928731reed@google.com
25782d1223aece4703bc9f3a3612cbabaa8c2f2809bbsalomon@google.comDEF_GM( return SkNEW(GradientsNoTextureGM));
2587b8999b5047e059f8dbce2bb24586ac49d928731reed@google.comDEF_GM( return SkNEW(GradientsManyColorsGM));
259