1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
842309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com#include "gm.h"
942309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com#include "SkGradientShader.h"
1042309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com
1142309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.comnamespace skiagm {
1242309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com
1342309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.comstruct GradData {
1442309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com    int             fCount;
1542309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com    const SkColor*  fColors;
1642309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com    const SkScalar* fPos;
1742309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com};
1842309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com
1942309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.comstatic const SkColor gColors[] = {
2042309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com    SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK
2142309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com};
2242309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.comstatic const SkScalar gPos0[] = { 0, SK_Scalar1 };
2342309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.comstatic const SkScalar gPos1[] = { SK_Scalar1/4, SK_Scalar1*3/4 };
2442309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.comstatic const SkScalar gPos2[] = {
2542309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com    0, SK_Scalar1/8, SK_Scalar1/2, SK_Scalar1*7/8, SK_Scalar1
2642309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com};
2742309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com
288ba1ad3a0bc278988f8503e3ca5280898cb396a9commit-bot@chromium.orgstatic const SkScalar gPosClamp[]   = {0.0f, 0.0f, 1.0f, 1.0f};
298ba1ad3a0bc278988f8503e3ca5280898cb396a9commit-bot@chromium.orgstatic const SkColor  gColorClamp[] = {
308ba1ad3a0bc278988f8503e3ca5280898cb396a9commit-bot@chromium.org    SK_ColorRED, SK_ColorGREEN, SK_ColorGREEN, SK_ColorBLUE
318ba1ad3a0bc278988f8503e3ca5280898cb396a9commit-bot@chromium.org};
328ba1ad3a0bc278988f8503e3ca5280898cb396a9commit-bot@chromium.org
3342309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.comstatic const GradData gGradData[] = {
3442309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com    { 2, gColors, NULL },
3542309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com    { 2, gColors, gPos0 },
3642309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com    { 2, gColors, gPos1 },
3742309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com    { 5, gColors, NULL },
388ba1ad3a0bc278988f8503e3ca5280898cb396a9commit-bot@chromium.org    { 5, gColors, gPos2 },
398ba1ad3a0bc278988f8503e3ca5280898cb396a9commit-bot@chromium.org    { 4, gColorClamp, gPosClamp }
4042309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com};
4142309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com
4242309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.comstatic SkShader* MakeLinear(const SkPoint pts[2], const GradData& data,
4383f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                            SkShader::TileMode tm, const SkMatrix& localMatrix) {
4442309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com    return SkGradientShader::CreateLinear(pts, data.fColors, data.fPos,
4583f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                                          data.fCount, tm, 0, &localMatrix);
4642309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com}
47f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com
4842309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.comstatic SkShader* MakeRadial(const SkPoint pts[2], const GradData& data,
4983f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                            SkShader::TileMode tm, const SkMatrix& localMatrix) {
5042309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com    SkPoint center;
5142309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com    center.set(SkScalarAve(pts[0].fX, pts[1].fX),
5242309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com               SkScalarAve(pts[0].fY, pts[1].fY));
5342309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com    return SkGradientShader::CreateRadial(center, center.fX, data.fColors,
5483f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                                          data.fPos, data.fCount, tm, 0, &localMatrix);
5542309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com}
5642309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com
5742309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.comstatic SkShader* MakeSweep(const SkPoint pts[2], const GradData& data,
5883f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                           SkShader::TileMode, const SkMatrix& localMatrix) {
5942309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com    SkPoint center;
6042309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com    center.set(SkScalarAve(pts[0].fX, pts[1].fX),
6142309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com               SkScalarAve(pts[0].fY, pts[1].fY));
6242309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com    return SkGradientShader::CreateSweep(center.fX, center.fY, data.fColors,
6383f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                                         data.fPos, data.fCount, 0, &localMatrix);
6442309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com}
6542309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com
66f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.comstatic SkShader* Make2Radial(const SkPoint pts[2], const GradData& data,
6783f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                             SkShader::TileMode tm, const SkMatrix& localMatrix) {
68f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com    SkPoint center0, center1;
69f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com    center0.set(SkScalarAve(pts[0].fX, pts[1].fX),
70f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com                SkScalarAve(pts[0].fY, pts[1].fY));
71f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com    center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5),
72f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com                SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4));
73f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com    return SkGradientShader::CreateTwoPointRadial(
74f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com                                                  center1, (pts[1].fX - pts[0].fX) / 7,
75f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com                                                  center0, (pts[1].fX - pts[0].fX) / 2,
7683f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                                                  data.fColors, data.fPos, data.fCount, tm,
779c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org                                                  0, &localMatrix);
78f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com}
79f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com
805cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.comstatic SkShader* Make2Conical(const SkPoint pts[2], const GradData& data,
8183f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                             SkShader::TileMode tm, const SkMatrix& localMatrix) {
825cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com    SkPoint center0, center1;
835cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com    SkScalar radius0 = SkScalarDiv(pts[1].fX - pts[0].fX, 10);
845cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com    SkScalar radius1 = SkScalarDiv(pts[1].fX - pts[0].fX, 3);
855cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com    center0.set(pts[0].fX + radius0, pts[0].fY + radius0);
865cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com    center1.set(pts[1].fX - radius1, pts[1].fY - radius1);
87d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    return SkGradientShader::CreateTwoPointConical(center1, radius1,
88d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com                                                   center0, radius0,
89d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com                                                   data.fColors, data.fPos,
9083f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                                                   data.fCount, tm, 0, &localMatrix);
915cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com}
925cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com
9342309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.comtypedef SkShader* (*GradMaker)(const SkPoint pts[2], const GradData& data,
9483f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                               SkShader::TileMode tm, const SkMatrix& localMatrix);
9542309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.comstatic const GradMaker gGradMakers[] = {
965cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com    MakeLinear, MakeRadial, MakeSweep, Make2Radial, Make2Conical
9742309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com};
9842309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com
9942309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com///////////////////////////////////////////////////////////////////////////////
10042309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com
10142309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.comclass GradientsGM : public GM {
10242309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.compublic:
103d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    GradientsGM() {
10448dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com        this->setBGColor(0xFFDDDDDD);
10548dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com    }
106d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
10742309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.comprotected:
108a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
109a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org        return kSkipTiled_Flag;
110a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    }
111a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
11242309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com    SkString onShortName() {
11342309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com        return SkString("gradients");
11442309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com    }
115d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
1161da3a80d46f10b06d7fa4e90a355547f1572c65fedisonn@google.com    virtual SkISize onISize() { return SkISize::Make(840, 815); }
117d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
11842309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com    virtual void onDraw(SkCanvas* canvas) {
119d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
12042309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com        SkPoint pts[2] = {
12142309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com            { 0, 0 },
12242309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com            { SkIntToScalar(100), SkIntToScalar(100) }
12342309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com        };
12442309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com        SkShader::TileMode tm = SkShader::kClamp_TileMode;
12542309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com        SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(100) };
12642309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com        SkPaint paint;
12742309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com        paint.setAntiAlias(true);
128d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
12942309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com        canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
13042309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com        for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); i++) {
13142309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com            canvas->save();
13242309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com            for (size_t j = 0; j < SK_ARRAY_COUNT(gGradMakers); j++) {
1339c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org                SkMatrix scale = SkMatrix::I();
1348ba1ad3a0bc278988f8503e3ca5280898cb396a9commit-bot@chromium.org
1358ba1ad3a0bc278988f8503e3ca5280898cb396a9commit-bot@chromium.org                if (i == 5) { // if the clamp case
1368ba1ad3a0bc278988f8503e3ca5280898cb396a9commit-bot@chromium.org                    scale.setScale(0.5f, 0.5f);
1378ba1ad3a0bc278988f8503e3ca5280898cb396a9commit-bot@chromium.org                    scale.postTranslate(25.f, 25.f);
1388ba1ad3a0bc278988f8503e3ca5280898cb396a9commit-bot@chromium.org                }
139d55e357a8e276d1f1cd6231d57dda339a2beb76fskia.committer@gmail.com
14083f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                SkShader* shader = gGradMakers[j](pts, gGradData[i], tm, scale);
1419c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org
14242309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com                paint.setShader(shader);
14342309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com                canvas->drawRect(r, paint);
14442309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com                shader->unref();
14542309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com                canvas->translate(0, SkIntToScalar(120));
14642309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com            }
14742309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com            canvas->restore();
14842309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com            canvas->translate(SkIntToScalar(120), 0);
14942309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com        }
15042309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com    }
151d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
15242309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.comprivate:
15342309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com    typedef GM INHERITED;
15442309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com};
15542309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com
1565cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com// Based on the original gradient slide, but with perspective applied to the
1575cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com// gradient shaders' local matrices
1585cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.comclass GradientsLocalPerspectiveGM : public GM {
1595cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.compublic:
160d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    GradientsLocalPerspectiveGM() {
1615cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com        this->setBGColor(0xFFDDDDDD);
1625cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com    }
163d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
1645cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.comprotected:
165a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
166a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org        return kSkipTiled_Flag;
167a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    }
168a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
1695cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com    SkString onShortName() {
1705cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com        return SkString("gradients_local_perspective");
1715cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com    }
172d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
1731da3a80d46f10b06d7fa4e90a355547f1572c65fedisonn@google.com    virtual SkISize onISize() { return SkISize::Make(840, 815); }
174d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
1755cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com    virtual void onDraw(SkCanvas* canvas) {
176d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
1775cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com        SkPoint pts[2] = {
1785cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com            { 0, 0 },
1795cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com            { SkIntToScalar(100), SkIntToScalar(100) }
1805cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com        };
1815cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com        SkShader::TileMode tm = SkShader::kClamp_TileMode;
1825cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com        SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(100) };
1835cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com        SkPaint paint;
1845cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com        paint.setAntiAlias(true);
185d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
1865cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com        canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
1875cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com        for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); i++) {
1885cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com            canvas->save();
1895cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com            for (size_t j = 0; j < SK_ARRAY_COUNT(gGradMakers); j++) {
1905cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com                // apply an increasing y perspective as we move to the right
1915cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com                SkMatrix perspective;
1925cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com                perspective.setIdentity();
193b7961193a3ecca44cf2650d9e446ebaa10b1583dborenet@google.com                perspective.setPerspY(SkScalarDiv(SkIntToScalar((unsigned) i+1),
1945cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com                                      SkIntToScalar(500)));
195b7961193a3ecca44cf2650d9e446ebaa10b1583dborenet@google.com                perspective.setSkewX(SkScalarDiv(SkIntToScalar((unsigned) i+1),
1965cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com                                     SkIntToScalar(10)));
1978ba1ad3a0bc278988f8503e3ca5280898cb396a9commit-bot@chromium.org
19883f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                SkShader* shader = gGradMakers[j](pts, gGradData[i], tm, perspective);
1995cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com
2005cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com                paint.setShader(shader);
2015cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com                canvas->drawRect(r, paint);
2025cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com                shader->unref();
2035cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com                canvas->translate(0, SkIntToScalar(120));
2045cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com            }
2055cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com            canvas->restore();
2065cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com            canvas->translate(SkIntToScalar(120), 0);
2075cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com        }
2085cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com    }
209d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
2105cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.comprivate:
2115cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com    typedef GM INHERITED;
2125cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com};
2135cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com
2145cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com// Based on the original gradient slide, but with perspective applied to
2155cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com// the view matrix
2165cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.comclass GradientsViewPerspectiveGM : public GradientsGM {
2175cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.comprotected:
2185cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com    SkString onShortName() {
2195cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com        return SkString("gradients_view_perspective");
2205cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com    }
221d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
2221da3a80d46f10b06d7fa4e90a355547f1572c65fedisonn@google.com    virtual SkISize onISize() { return SkISize::Make(840, 500); }
223d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
2245cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com    virtual void onDraw(SkCanvas* canvas) {
2255cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com        SkMatrix perspective;
2265cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com        perspective.setIdentity();
2275cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com        perspective.setPerspY(SkScalarDiv(SK_Scalar1, SkIntToScalar(1000)));
2285cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com        perspective.setSkewX(SkScalarDiv(SkIntToScalar(8), SkIntToScalar(25)));
229837d31a0c9351c4d65f5d703ff12db2c7cc5f6cdscroggo@google.com        canvas->concat(perspective);
2305cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com        INHERITED::onDraw(canvas);
2315cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com    }
232d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
2335cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.comprivate:
2345cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com    typedef GradientsGM INHERITED;
2355cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com};
2365cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com
237ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com/*
238ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com Inspired by this <canvas> javascript, where we need to detect that we are not
239ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com solving a quadratic equation, but must instead solve a linear (since our X^2
240ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com coefficient is 0)
241ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com
242ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com ctx.fillStyle = '#f00';
243ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com ctx.fillRect(0, 0, 100, 50);
244d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
245ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com var g = ctx.createRadialGradient(-80, 25, 70, 0, 25, 150);
246ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com g.addColorStop(0, '#f00');
247ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com g.addColorStop(0.01, '#0f0');
248ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com g.addColorStop(0.99, '#0f0');
249ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com g.addColorStop(1, '#f00');
250ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com ctx.fillStyle = g;
251ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com ctx.fillRect(0, 0, 100, 50);
252ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com */
253ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.comclass GradientsDegenrate2PointGM : public GM {
254ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.compublic:
255ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com    GradientsDegenrate2PointGM() {}
256d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
257ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.comprotected:
258ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com    SkString onShortName() {
259ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com        return SkString("gradients_degenerate_2pt");
260ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com    }
261d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
2621da3a80d46f10b06d7fa4e90a355547f1572c65fedisonn@google.com    virtual SkISize onISize() { return SkISize::Make(320, 320); }
263d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
264ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com    void drawBG(SkCanvas* canvas) {
265ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com        canvas->drawColor(SK_ColorBLUE);
266ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com    }
267d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
268ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com    virtual void onDraw(SkCanvas* canvas) {
269ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com        this->drawBG(canvas);
270d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
271ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com        SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorGREEN, SK_ColorRED };
2724b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org        SkScalar pos[] = { 0, 0.01f, 0.99f, SK_Scalar1 };
27359f3abf146bc40ccf923dbfe3797f87c13c20dd4epoger@google.com        SkPoint c0;
27459f3abf146bc40ccf923dbfe3797f87c13c20dd4epoger@google.com        c0.iset(-80, 25);
27559f3abf146bc40ccf923dbfe3797f87c13c20dd4epoger@google.com        SkScalar r0 = SkIntToScalar(70);
27659f3abf146bc40ccf923dbfe3797f87c13c20dd4epoger@google.com        SkPoint c1;
27759f3abf146bc40ccf923dbfe3797f87c13c20dd4epoger@google.com        c1.iset(0, 25);
27859f3abf146bc40ccf923dbfe3797f87c13c20dd4epoger@google.com        SkScalar r1 = SkIntToScalar(150);
279ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com        SkShader* s = SkGradientShader::CreateTwoPointRadial(c0, r0, c1, r1, colors,
280ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com                                                             pos, SK_ARRAY_COUNT(pos),
281ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com                                                             SkShader::kClamp_TileMode);
282ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com        SkPaint paint;
283ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com        paint.setShader(s)->unref();
284ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com        canvas->drawPaint(paint);
285ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com    }
286d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
287ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.comprivate:
288ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com    typedef GM INHERITED;
289ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com};
290ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com
2915ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com/// Tests correctness of *optimized* codepaths in gradients.
2925ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com
2935ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.comclass ClampedGradientsGM : public GM {
2945ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.compublic:
2955ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com    ClampedGradientsGM() {}
2965ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com
2975ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.comprotected:
2985ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com    SkString onShortName() { return SkString("clamped_gradients"); }
2995ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com
3001da3a80d46f10b06d7fa4e90a355547f1572c65fedisonn@google.com    virtual SkISize onISize() { return SkISize::Make(640, 510); }
3015ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com
3025ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com    void drawBG(SkCanvas* canvas) {
3035ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com        canvas->drawColor(0xFFDDDDDD);
3045ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com    }
3055ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com
3065ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com    virtual void onDraw(SkCanvas* canvas) {
3075ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com        this->drawBG(canvas);
3085ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com
3095ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com        SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(300) };
3105ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com        SkPaint paint;
3115ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com        paint.setAntiAlias(true);
3125ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com
3135ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com        SkPoint center;
3145ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com        center.iset(0, 300);
3155ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com        canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
3165ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com        SkShader* shader = SkGradientShader::CreateRadial(
3175ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com            SkPoint(center),
31801744a46e8cf0419f9e85ac148fe2bed2120e51fbungeman@google.com            SkIntToScalar(200), gColors, NULL, 5,
31983f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org            SkShader::kClamp_TileMode);
3205ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com        paint.setShader(shader);
3215ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com        canvas->drawRect(r, paint);
3225ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com        shader->unref();
3235ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com    }
3245ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com
3255ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.comprivate:
3265ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com    typedef GM INHERITED;
3275ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com};
3285ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com
329b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com/// Checks quality of large radial gradients, which may display
330b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com/// some banding.
331b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com
332b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.comclass RadialGradientGM : public GM {
333b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.compublic:
334b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com    RadialGradientGM() {}
335b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com
336b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.comprotected:
337a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
338a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org        return kSkipTiled_Flag;
339a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    }
340a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
341b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com    SkString onShortName() { return SkString("radial_gradient"); }
3421da3a80d46f10b06d7fa4e90a355547f1572c65fedisonn@google.com    virtual SkISize onISize() { return SkISize::Make(1280, 1280); }
343b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com    void drawBG(SkCanvas* canvas) {
344b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com        canvas->drawColor(0xFF000000);
345b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com    }
346b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com    virtual void onDraw(SkCanvas* canvas) {
347bb0948fce2744e1009d9f388c9faad5cc6dc946creed@google.com        const SkISize dim = this->getISize();
348bb0948fce2744e1009d9f388c9faad5cc6dc946creed@google.com
349b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com        this->drawBG(canvas);
350d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
351b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com        SkPaint paint;
352b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com        paint.setDither(true);
353b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com        SkPoint center;
354bb0948fce2744e1009d9f388c9faad5cc6dc946creed@google.com        center.set(SkIntToScalar(dim.width())/2, SkIntToScalar(dim.height())/2);
355bb0948fce2744e1009d9f388c9faad5cc6dc946creed@google.com        SkScalar radius = SkIntToScalar(dim.width())/2;
356bb0948fce2744e1009d9f388c9faad5cc6dc946creed@google.com        const SkColor colors[] = { 0x7f7f7f7f, 0x7f7f7f7f, 0xb2000000 };
3574b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org        const SkScalar pos[] = { 0.0f,
3584b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org                             0.35f,
3594b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org                             1.0f };
360b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com        SkShader* shader =
361b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com            SkGradientShader::CreateRadial(center, radius, colors,
362bb0948fce2744e1009d9f388c9faad5cc6dc946creed@google.com                                           pos, SK_ARRAY_COUNT(pos),
363bb0948fce2744e1009d9f388c9faad5cc6dc946creed@google.com                                           SkShader::kClamp_TileMode);
364b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com        paint.setShader(shader)->unref();
365bb0948fce2744e1009d9f388c9faad5cc6dc946creed@google.com        SkRect r = {
366bb0948fce2744e1009d9f388c9faad5cc6dc946creed@google.com            0, 0, SkIntToScalar(dim.width()), SkIntToScalar(dim.height())
367bb0948fce2744e1009d9f388c9faad5cc6dc946creed@google.com        };
368b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com        canvas->drawRect(r, paint);
369b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com    }
370b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.comprivate:
371b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com    typedef GM INHERITED;
372b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com};
373b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com
374b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.com
375361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.comclass RadialGradient2GM : public GM {
376361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.compublic:
377361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com    RadialGradient2GM() {}
378361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com
379361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.comprotected:
380a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
381a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org        return kSkipTiled_Flag;
382a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    }
383a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
384361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com    SkString onShortName() { return SkString("radial_gradient2"); }
3851da3a80d46f10b06d7fa4e90a355547f1572c65fedisonn@google.com    virtual SkISize onISize() { return SkISize::Make(800, 400); }
386361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com    void drawBG(SkCanvas* canvas) {
387361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com        canvas->drawColor(0xFF000000);
388361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com    }
389361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com
390361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com    // Reproduces the example given in bug 7671058.
391361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com    virtual void onDraw(SkCanvas* canvas) {
392361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com        SkPaint paint1, paint2, paint3;
393361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com        paint1.setStyle(SkPaint::kFill_Style);
394361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com        paint2.setStyle(SkPaint::kFill_Style);
395361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com        paint3.setStyle(SkPaint::kFill_Style);
396361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com
397361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com        const SkColor sweep_colors[] =
398361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com            { 0xFFFF0000, 0xFFFFFF00, 0xFF00FF00, 0xFF00FFFF, 0xFF0000FF, 0xFFFF00FF, 0xFFFF0000 };
399361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com        const SkColor colors1[] = { 0xFFFFFFFF, 0x00000000 };
400361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com        const SkColor colors2[] = { 0xFF000000, 0x00000000 };
401361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com
402361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com        const SkScalar cx = 200, cy = 200, radius = 150;
403361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com        SkPoint center;
404361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com        center.set(cx, cy);
405361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com
4063ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com        // We can either interpolate endpoints and premultiply each point (default, more precision),
4073ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com        // or premultiply the endpoints first, avoiding the need to premultiply each point (cheap).
4083ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com        const uint32_t flags[] = { 0, SkGradientShader::kInterpolateColorsInPremul_Flag };
4093ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com
4103ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com        for (size_t i = 0; i < SK_ARRAY_COUNT(flags); i++) {
4113ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com            SkAutoTUnref<SkShader> sweep(
4123ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com                    SkGradientShader::CreateSweep(cx, cy, sweep_colors,
4133ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com                                                  NULL, SK_ARRAY_COUNT(sweep_colors),
41483f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                                                  flags[i], NULL));
4153ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com            SkAutoTUnref<SkShader> radial1(
4163ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com                    SkGradientShader::CreateRadial(center, radius, colors1,
4173ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com                                                   NULL, SK_ARRAY_COUNT(colors1),
4183ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com                                                   SkShader::kClamp_TileMode,
41983f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                                                   flags[i], NULL));
4203ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com            SkAutoTUnref<SkShader> radial2(
4213ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com                    SkGradientShader::CreateRadial(center, radius, colors2,
4223ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com                                                   NULL, SK_ARRAY_COUNT(colors2),
4233ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com                                                   SkShader::kClamp_TileMode,
42483f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                                                   flags[i], NULL));
4253ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com            paint1.setShader(sweep);
4263ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com            paint2.setShader(radial1);
4273ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com            paint3.setShader(radial2);
4283ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com
4293ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com            canvas->drawCircle(cx, cy, radius, paint1);
4303ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com            canvas->drawCircle(cx, cy, radius, paint3);
4313ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com            canvas->drawCircle(cx, cy, radius, paint2);
4323ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com
4333ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com            canvas->translate(400, 0);
4343ef7eeac9a2205285ca56d2d70e4d6740af556e6mtklein@google.com        }
435361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com    }
436361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com
437361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.comprivate:
438361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com    typedef GM INHERITED;
439361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com};
4405ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com
44142309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com///////////////////////////////////////////////////////////////////////////////
44242309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com
44342309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.comstatic GM* MyFactory(void*) { return new GradientsGM; }
44442309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.comstatic GMRegistry reg(MyFactory);
44542309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com
446ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.comstatic GM* MyFactory2(void*) { return new GradientsDegenrate2PointGM; }
447ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.comstatic GMRegistry reg2(MyFactory2);
448ac864a945cb7e1be93717f209bf7eff2c4b6b2b5reed@google.com
4495ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.comstatic GM* MyFactory3(void*) { return new ClampedGradientsGM; }
4505ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.comstatic GMRegistry reg3(MyFactory3);
4515ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com
452b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.comstatic GM* MyFactory4(void*) { return new RadialGradientGM; }
453b18e58c065cad6eb273ee23ef4d68a03791ef3aftomhudson@google.comstatic GMRegistry reg4(MyFactory4);
4545cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com
4555cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.comstatic GM* MyFactory5(void*) { return new GradientsLocalPerspectiveGM; }
4565cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.comstatic GMRegistry reg5(MyFactory5);
4575cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.com
4585cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.comstatic GM* MyFactory6(void*) { return new GradientsViewPerspectiveGM; }
4595cf2c28427c1e8eaf464aaedddc1c9c73f2475aerileya@google.comstatic GMRegistry reg6(MyFactory6);
460361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.com
461361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.comstatic GM* MyFactory7(void*) { return new RadialGradient2GM; }
462361a72fc4579ce04d112f2894eaa74139f6488c4mtklein@google.comstatic GMRegistry reg7(MyFactory7);
46342309d415e56f6fbeeea8239479d3f4ccf81a5acreed@android.com}
464