183f7c659461d602e498569dab63f04b1b578b742reed@google.com/*
283f7c659461d602e498569dab63f04b1b578b742reed@google.com * Copyright 2013 Google Inc.
383f7c659461d602e498569dab63f04b1b578b742reed@google.com *
483f7c659461d602e498569dab63f04b1b578b742reed@google.com * Use of this source code is governed by a BSD-style license that can be
583f7c659461d602e498569dab63f04b1b578b742reed@google.com * found in the LICENSE file.
683f7c659461d602e498569dab63f04b1b578b742reed@google.com */
783f7c659461d602e498569dab63f04b1b578b742reed@google.com
883f7c659461d602e498569dab63f04b1b578b742reed@google.com#include "gm.h"
933d2055e594177b27360f84e0631b26d74a55a9bMike Klein#include "sk_tool_utils.h"
1083f7c659461d602e498569dab63f04b1b578b742reed@google.com#include "SkGradientShader.h"
1183f7c659461d602e498569dab63f04b1b578b742reed@google.com
121a9b9640843a64af8d9d90337ec3b3fea663196areedtypedef sk_sp<SkShader> (*MakeShaderProc)(const SkColor[], int count, const SkSize&);
1383f7c659461d602e498569dab63f04b1b578b742reed@google.com
141a9b9640843a64af8d9d90337ec3b3fea663196areedstatic sk_sp<SkShader> shader_linear(const SkColor colors[], int count, const SkSize& size) {
1583f7c659461d602e498569dab63f04b1b578b742reed@google.com    SkPoint pts[] = { { 0, 0 }, { size.width(), size.height() } };
161a9b9640843a64af8d9d90337ec3b3fea663196areed    return SkGradientShader::MakeLinear(pts, colors, nullptr, count, SkShader::kClamp_TileMode);
1783f7c659461d602e498569dab63f04b1b578b742reed@google.com}
1883f7c659461d602e498569dab63f04b1b578b742reed@google.com
191a9b9640843a64af8d9d90337ec3b3fea663196areedstatic sk_sp<SkShader> shader_radial(const SkColor colors[], int count, const SkSize& size) {
2083f7c659461d602e498569dab63f04b1b578b742reed@google.com    SkPoint center = { size.width()/2, size.height()/2 };
211a9b9640843a64af8d9d90337ec3b3fea663196areed    return SkGradientShader::MakeRadial(center, size.width()/2, colors, nullptr, count,
221a9b9640843a64af8d9d90337ec3b3fea663196areed                                        SkShader::kClamp_TileMode);
2383f7c659461d602e498569dab63f04b1b578b742reed@google.com}
2483f7c659461d602e498569dab63f04b1b578b742reed@google.com
251a9b9640843a64af8d9d90337ec3b3fea663196areedstatic sk_sp<SkShader> shader_conical(const SkColor colors[], int count, const SkSize& size) {
2683f7c659461d602e498569dab63f04b1b578b742reed@google.com    SkPoint center = { size.width()/2, size.height()/2 };
271a9b9640843a64af8d9d90337ec3b3fea663196areed    return SkGradientShader::MakeTwoPointConical(center, size.width()/64, center, size.width()/2,
281a9b9640843a64af8d9d90337ec3b3fea663196areed                                                colors, nullptr, count, SkShader::kClamp_TileMode);
2983f7c659461d602e498569dab63f04b1b578b742reed@google.com}
3083f7c659461d602e498569dab63f04b1b578b742reed@google.com
311a9b9640843a64af8d9d90337ec3b3fea663196areedstatic sk_sp<SkShader> shader_sweep(const SkColor colors[], int count, const SkSize& size) {
321a9b9640843a64af8d9d90337ec3b3fea663196areed    return SkGradientShader::MakeSweep(size.width()/2, size.height()/2, colors, nullptr, count);
3383f7c659461d602e498569dab63f04b1b578b742reed@google.com}
3483f7c659461d602e498569dab63f04b1b578b742reed@google.com
3583f7c659461d602e498569dab63f04b1b578b742reed@google.comclass ShallowGradientGM : public skiagm::GM {
3683f7c659461d602e498569dab63f04b1b578b742reed@google.compublic:
37063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita    ShallowGradientGM(MakeShaderProc proc, const char name[], bool dither)
38063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita        : fProc(proc)
39063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita        , fDither(dither) {
4083f7c659461d602e498569dab63f04b1b578b742reed@google.com        fName.printf("shallow_gradient_%s", name);
4183f7c659461d602e498569dab63f04b1b578b742reed@google.com    }
4283f7c659461d602e498569dab63f04b1b578b742reed@google.com
4383f7c659461d602e498569dab63f04b1b578b742reed@google.comprotected:
44a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
4536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkString onShortName() override {
4683f7c659461d602e498569dab63f04b1b578b742reed@google.com        return fName;
4783f7c659461d602e498569dab63f04b1b578b742reed@google.com    }
4883f7c659461d602e498569dab63f04b1b578b742reed@google.com
4936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkISize onISize() override {
5083f7c659461d602e498569dab63f04b1b578b742reed@google.com        return SkISize::Make(800, 800);
5183f7c659461d602e498569dab63f04b1b578b742reed@google.com    }
5283f7c659461d602e498569dab63f04b1b578b742reed@google.com
5336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(SkCanvas* canvas) override {
549d524f22bfde5dc3dc8f48e1be39bdebd3bb0304halcanary        const SkColor colors[] = { sk_tool_utils::color_to_565(0xFF555555),
55125960152dfd7f2aba4c2239131bdf75d9ac2705caryclark                sk_tool_utils::color_to_565(0xFF444444) };
5683f7c659461d602e498569dab63f04b1b578b742reed@google.com        const int colorCount = SK_ARRAY_COUNT(colors);
5783f7c659461d602e498569dab63f04b1b578b742reed@google.com
5883f7c659461d602e498569dab63f04b1b578b742reed@google.com        SkRect r = { 0, 0, this->width(), this->height() };
5983f7c659461d602e498569dab63f04b1b578b742reed@google.com        SkSize size = SkSize::Make(r.width(), r.height());
6083f7c659461d602e498569dab63f04b1b578b742reed@google.com
6183f7c659461d602e498569dab63f04b1b578b742reed@google.com        SkPaint paint;
621a9b9640843a64af8d9d90337ec3b3fea663196areed        paint.setShader(fProc(colors, colorCount, size));
63063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita        paint.setDither(fDither);
6483f7c659461d602e498569dab63f04b1b578b742reed@google.com        canvas->drawRect(r, paint);
6583f7c659461d602e498569dab63f04b1b578b742reed@google.com    }
6683f7c659461d602e498569dab63f04b1b578b742reed@google.com
6783f7c659461d602e498569dab63f04b1b578b742reed@google.comprivate:
6883f7c659461d602e498569dab63f04b1b578b742reed@google.com    MakeShaderProc fProc;
6983f7c659461d602e498569dab63f04b1b578b742reed@google.com    SkString fName;
70063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita    bool fDither;
7183f7c659461d602e498569dab63f04b1b578b742reed@google.com
7283f7c659461d602e498569dab63f04b1b578b742reed@google.com    typedef skiagm::GM INHERITED;
7383f7c659461d602e498569dab63f04b1b578b742reed@google.com};
7483f7c659461d602e498569dab63f04b1b578b742reed@google.com
7583f7c659461d602e498569dab63f04b1b578b742reed@google.com///////////////////////////////////////////////////////////////////////////////
7683f7c659461d602e498569dab63f04b1b578b742reed@google.com
77063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalitaDEF_GM( return new ShallowGradientGM(shader_linear, "linear", true); )
78063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalitaDEF_GM( return new ShallowGradientGM(shader_radial, "radial", true); )
79063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalitaDEF_GM( return new ShallowGradientGM(shader_conical, "conical", true); )
80063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalitaDEF_GM( return new ShallowGradientGM(shader_sweep, "sweep", true); )
81063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalita
82063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalitaDEF_GM( return new ShallowGradientGM(shader_linear, "linear_nodither", false); )
83063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalitaDEF_GM( return new ShallowGradientGM(shader_radial, "radial_nodither", false); )
84063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalitaDEF_GM( return new ShallowGradientGM(shader_conical, "conical_nodither", false); )
85063675ba374cb520fe58bbcdaf5afeea0aa0ad60fmalitaDEF_GM( return new ShallowGradientGM(shader_sweep, "sweep_nodither", false); )
86