1b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org/*
2b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org * Copyright 2013 Google Inc.
3b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org *
4b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be
5b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org * found in the LICENSE file.
6b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org */
7b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org#include "gm.h"
833d2055e594177b27360f84e0631b26d74a55a9bMike Klein#include "sk_tool_utils.h"
9b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org#include "SkGradientShader.h"
10b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org
11b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.orgusing namespace skiagm;
12b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org
13b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.orgstruct GradData {
14b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org    int             fCount;
15b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org    const SkColor*  fColors;
16b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org    const SkScalar* fPos;
17b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org};
18b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org
19dbfd7ab10883f173f5c1b653a233e18dc6142002mtkleinconstexpr SkColor gColors[] = {
20b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org    SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK,
21b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org    SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK,
22b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org    SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK,
23b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org    SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK,
24b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org    SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK,
25b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org    SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK,
26b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org    SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK,
27b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org    SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK,
28b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org};
29b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org
30dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein//constexpr SkScalar gPos[] = { SK_Scalar1*999/2000, SK_Scalar1*1001/2000 };
31b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org
32dbfd7ab10883f173f5c1b653a233e18dc6142002mtkleinconstexpr GradData gGradData[] = {
3396fcdcc219d2a0d3579719b84b28bede76efba64halcanary    { 40, gColors, nullptr },
34b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org    //  { 2, gColors, gPos },
3596fcdcc219d2a0d3579719b84b28bede76efba64halcanary    //  { 2, gCol2, nullptr },
36b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org};
37b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org
381a9b9640843a64af8d9d90337ec3b3fea663196areedstatic sk_sp<SkShader> MakeLinear(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) {
391a9b9640843a64af8d9d90337ec3b3fea663196areed    return SkGradientShader::MakeLinear(pts, data.fColors, data.fPos, data.fCount, tm);
40b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org}
41b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org
421a9b9640843a64af8d9d90337ec3b3fea663196areedstatic sk_sp<SkShader> MakeRadial(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) {
431a9b9640843a64af8d9d90337ec3b3fea663196areed    const SkPoint pt{ SkScalarAve(pts[0].fX, pts[1].fX), SkScalarAve(pts[0].fY, pts[1].fY) };
441a9b9640843a64af8d9d90337ec3b3fea663196areed    return SkGradientShader::MakeRadial(pt, pt.fX, data.fColors, data.fPos, data.fCount, tm);
45b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org}
46b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org
471a9b9640843a64af8d9d90337ec3b3fea663196areedstatic sk_sp<SkShader> MakeSweep(const SkPoint pts[2], const GradData& data, SkShader::TileMode) {
481a9b9640843a64af8d9d90337ec3b3fea663196areed    const SkPoint pt{ SkScalarAve(pts[0].fX, pts[1].fX), SkScalarAve(pts[0].fY, pts[1].fY) };
491a9b9640843a64af8d9d90337ec3b3fea663196areed    return SkGradientShader::MakeSweep(pt.fX, pt.fY, data.fColors, data.fPos, data.fCount);
50b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org}
51b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org
52b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org
531a9b9640843a64af8d9d90337ec3b3fea663196areedtypedef sk_sp<SkShader> (*GradMaker)(const SkPoint pts[2], const GradData&, SkShader::TileMode);
5483f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org
55dbfd7ab10883f173f5c1b653a233e18dc6142002mtkleinconstexpr GradMaker gGradMakers[] = {
569e1ec1a52985cce9db3a0d0e8d448b82a32e70cbskia.committer@gmail.com    MakeLinear, MakeRadial, MakeSweep,
57b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org};
58b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org
59b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org///////////////////////////////////////////////////////////////////////////////
60b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org
61b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.orgclass GradientsGM : public GM {
62b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.orgpublic:
63b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org    GradientsGM() {
6465cdba6ba78aaec0c0a4596bb5941020c789482bcaryclark        this->setBGColor(sk_tool_utils::color_to_565(0xFFDDDDDD));
65b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org    }
66b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org
67b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.orgprotected:
6836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkString onShortName() override { return SkString("gradient_dirty_laundry"); }
6936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkISize onISize() override { return SkISize::Make(640, 615); }
70b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org
7136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(SkCanvas* canvas) override {
72b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org        SkPoint pts[2] = { { 0, 0 },
73b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org                           { SkIntToScalar(100), SkIntToScalar(100) }
74b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org        };
75b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org        SkShader::TileMode tm = SkShader::kClamp_TileMode;
76b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org        SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(100) };
77b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org        SkPaint paint;
78b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org        paint.setAntiAlias(true);
79b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org
80b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org        canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
81b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org        for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); i++) {
82b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org            canvas->save();
83b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org            for (size_t j = 0; j < SK_ARRAY_COUNT(gGradMakers); j++) {
841a9b9640843a64af8d9d90337ec3b3fea663196areed                paint.setShader(gGradMakers[j](pts, gGradData[i], tm));
85b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org                canvas->drawRect(r, paint);
86b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org                canvas->translate(0, SkIntToScalar(120));
87b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org            }
88b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org            canvas->restore();
89b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org            canvas->translate(SkIntToScalar(120), 0);
90b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org        }
91b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org    }
92b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org
93b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.orgprivate:
94b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org    typedef GM INHERITED;
95b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org};
96b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org
97b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org///////////////////////////////////////////////////////////////////////////////
98b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org
99b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.orgstatic GM* MyFactory(void*) { return new GradientsGM; }
100b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.orgstatic GMRegistry reg(MyFactory);
101