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 */
8f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h"
984e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com#include "SkBitmap.h"
1084e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com#include "SkCanvas.h"
1184e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com#include "SkColorPriv.h"
1284e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com#include "SkGradientShader.h"
1384e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com#include "SkPaint.h"
1484e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com#include "SkShader.h"
1584e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com#include "SkString.h"
1684e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com
1784e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.comstruct GradData {
1884e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com    int             fCount;
1984e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com    const SkColor*  fColors;
2084e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com    const SkScalar* fPos;
215396a048d2f9f32fd3977d44f580c86028f4b1b9commit-bot@chromium.org    const char*     fName;
2284e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com};
2384e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com
2484e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.comstatic const SkColor gColors[] = {
25b686539ab5270c66ab4994b4d6a8740143dec73acommit-bot@chromium.org    SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK,
265396a048d2f9f32fd3977d44f580c86028f4b1b9commit-bot@chromium.org    SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK,
275396a048d2f9f32fd3977d44f580c86028f4b1b9commit-bot@chromium.org    SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK,
285396a048d2f9f32fd3977d44f580c86028f4b1b9commit-bot@chromium.org    SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK,
295396a048d2f9f32fd3977d44f580c86028f4b1b9commit-bot@chromium.org    SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK,
305396a048d2f9f32fd3977d44f580c86028f4b1b9commit-bot@chromium.org    SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK,
315396a048d2f9f32fd3977d44f580c86028f4b1b9commit-bot@chromium.org    SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK,
325396a048d2f9f32fd3977d44f580c86028f4b1b9commit-bot@chromium.org    SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK,
335396a048d2f9f32fd3977d44f580c86028f4b1b9commit-bot@chromium.org    SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK,
345396a048d2f9f32fd3977d44f580c86028f4b1b9commit-bot@chromium.org    SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK, // 10 lines, 50 colors
3584e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com};
3684e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com
37f461a8fdf642ba713dcdfb217534652df1eac278krajcevskistatic const SkColor gShallowColors[] = { 0xFF555555, 0xFF444444 };
38f461a8fdf642ba713dcdfb217534652df1eac278krajcevski
393400f4b00aaf9159713d9a7bb0a4f828fd6899c3commit-bot@chromium.org// We have several special-cases depending on the number (and spacing) of colors, so
403400f4b00aaf9159713d9a7bb0a4f828fd6899c3commit-bot@chromium.org// try to exercise those here.
4184e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.comstatic const GradData gGradData[] = {
425396a048d2f9f32fd3977d44f580c86028f4b1b9commit-bot@chromium.org    { 2, gColors, NULL, "" },
435396a048d2f9f32fd3977d44f580c86028f4b1b9commit-bot@chromium.org    { 50, gColors, NULL, "_hicolor" }, // many color gradient
443400f4b00aaf9159713d9a7bb0a4f828fd6899c3commit-bot@chromium.org    { 3, gColors, NULL, "_3color" },
45f461a8fdf642ba713dcdfb217534652df1eac278krajcevski    { 2, gShallowColors, NULL, "_shallow" },
4684e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com};
4784e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com
485ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com/// Ignores scale
4984e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.comstatic SkShader* MakeLinear(const SkPoint pts[2], const GradData& data,
5083f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                            SkShader::TileMode tm, float scale) {
5183f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org    return SkGradientShader::CreateLinear(pts, data.fColors, data.fPos, data.fCount, tm);
5284e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com}
5384e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com
5484e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.comstatic SkShader* MakeRadial(const SkPoint pts[2], const GradData& data,
5583f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                            SkShader::TileMode tm, float scale) {
5684e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com    SkPoint center;
5784e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com    center.set(SkScalarAve(pts[0].fX, pts[1].fX),
5884e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com               SkScalarAve(pts[0].fY, pts[1].fY));
595ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com    return SkGradientShader::CreateRadial(center, center.fX * scale,
605ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com                                          data.fColors,
6183f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                                          data.fPos, data.fCount, tm);
6284e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com}
6384e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com
645ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com/// Ignores scale
6584e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.comstatic SkShader* MakeSweep(const SkPoint pts[2], const GradData& data,
6683f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                           SkShader::TileMode tm, float scale) {
6784e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com    SkPoint center;
6884e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com    center.set(SkScalarAve(pts[0].fX, pts[1].fX),
6984e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com               SkScalarAve(pts[0].fY, pts[1].fY));
7084e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com    return SkGradientShader::CreateSweep(center.fX, center.fY, data.fColors,
7183f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                                         data.fPos, data.fCount);
7284e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com}
7384e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com
745ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com/// Ignores scale
7584e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.comstatic SkShader* Make2Radial(const SkPoint pts[2], const GradData& data,
7683f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                             SkShader::TileMode tm, float scale) {
7784e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com    SkPoint center0, center1;
7884e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com    center0.set(SkScalarAve(pts[0].fX, pts[1].fX),
7984e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com                SkScalarAve(pts[0].fY, pts[1].fY));
8084e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com    center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5),
8184e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com                SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4));
8284e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com    return SkGradientShader::CreateTwoPointRadial(
83258e0bf00cbb6fcc9c1b0db1a6b7dbd90b1b83f6reed@google.com                                                  center1, (pts[1].fX - pts[0].fX) / 7,
84258e0bf00cbb6fcc9c1b0db1a6b7dbd90b1b83f6reed@google.com                                                  center0, (pts[1].fX - pts[0].fX) / 2,
8583f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                                                  data.fColors, data.fPos, data.fCount, tm);
86258e0bf00cbb6fcc9c1b0db1a6b7dbd90b1b83f6reed@google.com}
87258e0bf00cbb6fcc9c1b0db1a6b7dbd90b1b83f6reed@google.com
88258e0bf00cbb6fcc9c1b0db1a6b7dbd90b1b83f6reed@google.com/// Ignores scale
89258e0bf00cbb6fcc9c1b0db1a6b7dbd90b1b83f6reed@google.comstatic SkShader* MakeConical(const SkPoint pts[2], const GradData& data,
9083f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                             SkShader::TileMode tm, float scale) {
91258e0bf00cbb6fcc9c1b0db1a6b7dbd90b1b83f6reed@google.com    SkPoint center0, center1;
92258e0bf00cbb6fcc9c1b0db1a6b7dbd90b1b83f6reed@google.com    center0.set(SkScalarAve(pts[0].fX, pts[1].fX),
93258e0bf00cbb6fcc9c1b0db1a6b7dbd90b1b83f6reed@google.com                SkScalarAve(pts[0].fY, pts[1].fY));
94258e0bf00cbb6fcc9c1b0db1a6b7dbd90b1b83f6reed@google.com    center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5),
95258e0bf00cbb6fcc9c1b0db1a6b7dbd90b1b83f6reed@google.com                SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4));
96258e0bf00cbb6fcc9c1b0db1a6b7dbd90b1b83f6reed@google.com    return SkGradientShader::CreateTwoPointConical(center1, (pts[1].fX - pts[0].fX) / 7,
97258e0bf00cbb6fcc9c1b0db1a6b7dbd90b1b83f6reed@google.com                                                   center0, (pts[1].fX - pts[0].fX) / 2,
9883f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                                                   data.fColors, data.fPos, data.fCount, tm);
9984e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com}
10084e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com
10195f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org/// Ignores scale
10295f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.orgstatic SkShader* MakeConicalZeroRad(const SkPoint pts[2], const GradData& data,
10383f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                                    SkShader::TileMode tm, float scale) {
10495f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org    SkPoint center0, center1;
10595f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org    center0.set(SkScalarAve(pts[0].fX, pts[1].fX),
10695f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org                SkScalarAve(pts[0].fY, pts[1].fY));
10795f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org    center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5),
10895f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org                SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4));
10995f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org    return SkGradientShader::CreateTwoPointConical(center1, 0.0,
11095f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org                                                   center0, (pts[1].fX - pts[0].fX) / 2,
11183f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                                                   data.fColors, data.fPos, data.fCount, tm);
11295f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org}
11395f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org
11495f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org/// Ignores scale
11595f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.orgstatic SkShader* MakeConicalOutside(const SkPoint pts[2], const GradData& data,
11683f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                                    SkShader::TileMode tm, float scale) {
11795f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org    SkPoint center0, center1;
11895f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org    SkScalar radius0 = SkScalarDiv(pts[1].fX - pts[0].fX, 10);
11995f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org    SkScalar radius1 = SkScalarDiv(pts[1].fX - pts[0].fX, 3);
12095f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org    center0.set(pts[0].fX + radius0, pts[0].fY + radius0);
12195f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org    center1.set(pts[1].fX - radius1, pts[1].fY - radius1);
12295f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org    return SkGradientShader::CreateTwoPointConical(center0, radius0,
12395f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org                                                   center1, radius1,
12495f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org                                                   data.fColors, data.fPos,
12583f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                                                   data.fCount, tm);
12695f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org}
12795f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org
12895f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org/// Ignores scale
12995f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.orgstatic SkShader* MakeConicalOutsideZeroRad(const SkPoint pts[2], const GradData& data,
13083f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                                           SkShader::TileMode tm, float scale) {
13195f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org    SkPoint center0, center1;
13295f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org    SkScalar radius0 = SkScalarDiv(pts[1].fX - pts[0].fX, 10);
13395f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org    SkScalar radius1 = SkScalarDiv(pts[1].fX - pts[0].fX, 3);
13495f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org    center0.set(pts[0].fX + radius0, pts[0].fY + radius0);
13595f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org    center1.set(pts[1].fX - radius1, pts[1].fY - radius1);
13695f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org    return SkGradientShader::CreateTwoPointConical(center0, 0.0,
13795f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org                                                   center1, radius1,
13895f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org                                                   data.fColors, data.fPos,
13983f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                                                   data.fCount, tm);
14095f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org}
14195f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org
14284e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.comtypedef SkShader* (*GradMaker)(const SkPoint pts[2], const GradData& data,
14383f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                               SkShader::TileMode tm, float scale);
14484e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com
14584e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.comstatic const struct {
14684e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com    GradMaker   fMaker;
14784e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com    const char* fName;
14884e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com} gGrads[] = {
14995f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org    { MakeLinear,                 "linear"  },
15095f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org    { MakeRadial,                 "radial1" },
15195f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org    { MakeSweep,                  "sweep"   },
15295f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org    { Make2Radial,                "radial2" },
15395f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org    { MakeConical,                "conical" },
15495f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org    { MakeConicalZeroRad,         "conicalZero" },
15595f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org    { MakeConicalOutside,         "conicalOut" },
15695f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org    { MakeConicalOutsideZeroRad,  "conicalOutZero" },
15784e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com};
15884e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com
15984e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.comenum GradType { // these must match the order in gGrads
16084e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com    kLinear_GradType,
16184e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com    kRadial_GradType,
16284e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com    kSweep_GradType,
163258e0bf00cbb6fcc9c1b0db1a6b7dbd90b1b83f6reed@google.com    kRadial2_GradType,
16495f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org    kConical_GradType,
16595f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org    kConicalZero_GradType,
16695f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org    kConicalOut_GradType,
16795f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.org    kConicalOutZero_GradType
16884e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com};
16984e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com
1705ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.comenum GeomType {
1715ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com    kRect_GeomType,
1725ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com    kOval_GeomType
1735ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com};
1745ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com
17572415161dde26f6aa2b206a8eaa0abaff2f782dereed@google.comstatic const char* tilemodename(SkShader::TileMode tm) {
17672415161dde26f6aa2b206a8eaa0abaff2f782dereed@google.com    switch (tm) {
17772415161dde26f6aa2b206a8eaa0abaff2f782dereed@google.com        case SkShader::kClamp_TileMode:
17872415161dde26f6aa2b206a8eaa0abaff2f782dereed@google.com            return "clamp";
17972415161dde26f6aa2b206a8eaa0abaff2f782dereed@google.com        case SkShader::kRepeat_TileMode:
18072415161dde26f6aa2b206a8eaa0abaff2f782dereed@google.com            return "repeat";
18172415161dde26f6aa2b206a8eaa0abaff2f782dereed@google.com        case SkShader::kMirror_TileMode:
18272415161dde26f6aa2b206a8eaa0abaff2f782dereed@google.com            return "mirror";
18372415161dde26f6aa2b206a8eaa0abaff2f782dereed@google.com        default:
184330313a8a8343876ee596da39da06a5d69badd9cmtklein@google.com            SkDEBUGFAIL("unknown tilemode");
18572415161dde26f6aa2b206a8eaa0abaff2f782dereed@google.com            return "error";
18672415161dde26f6aa2b206a8eaa0abaff2f782dereed@google.com    }
18772415161dde26f6aa2b206a8eaa0abaff2f782dereed@google.com}
18872415161dde26f6aa2b206a8eaa0abaff2f782dereed@google.com
1895ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.comstatic const char* geomtypename(GeomType gt) {
1905ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com    switch (gt) {
1915ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com        case kRect_GeomType:
1925ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com            return "rectangle";
1935ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com        case kOval_GeomType:
1945ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com            return "oval";
1955ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com        default:
196330313a8a8343876ee596da39da06a5d69badd9cmtklein@google.com            SkDEBUGFAIL("unknown geometry type");
1975ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com            return "error";
1985ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com    }
1995ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com}
2005ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com
20184e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com///////////////////////////////////////////////////////////////////////////////
20284e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com
203f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass GradientBench : public Benchmark {
20484e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com    SkString fName;
20584e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com    SkShader* fShader;
206f461a8fdf642ba713dcdfb217534652df1eac278krajcevski    bool fDither;
20784e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com    enum {
20884e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com        W   = 400,
20984e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com        H   = 400,
210b120bd986ec5e5eeaacdbb8aec04cbe352f98434commit-bot@chromium.org        kRepeat = 15,
21184e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com    };
21284e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.compublic:
213f461a8fdf642ba713dcdfb217534652df1eac278krajcevski    SkShader* makeShader(GradType gradType, GradData data, SkShader::TileMode tm, float scale) {
214f461a8fdf642ba713dcdfb217534652df1eac278krajcevski        const SkPoint pts[2] = {
215f461a8fdf642ba713dcdfb217534652df1eac278krajcevski            { 0, 0 },
216f461a8fdf642ba713dcdfb217534652df1eac278krajcevski            { SkIntToScalar(W), SkIntToScalar(H) }
217f461a8fdf642ba713dcdfb217534652df1eac278krajcevski        };
218f461a8fdf642ba713dcdfb217534652df1eac278krajcevski
219f461a8fdf642ba713dcdfb217534652df1eac278krajcevski        return gGrads[gradType].fMaker(pts, data, tm, scale);
220f461a8fdf642ba713dcdfb217534652df1eac278krajcevski    }
221f461a8fdf642ba713dcdfb217534652df1eac278krajcevski
222410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    GradientBench(GradType gradType,
2235396a048d2f9f32fd3977d44f580c86028f4b1b9commit-bot@chromium.org                  GradData data = gGradData[0],
2245ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com                  SkShader::TileMode tm = SkShader::kClamp_TileMode,
2255ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com                  GeomType geomType = kRect_GeomType,
2263400f4b00aaf9159713d9a7bb0a4f828fd6899c3commit-bot@chromium.org                  float scale = 1.0f) {
2275ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com        fName.printf("gradient_%s_%s", gGrads[gradType].fName,
2285ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com                     tilemodename(tm));
2295ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com        if (geomType != kRect_GeomType) {
2305ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com            fName.append("_");
2315ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com            fName.append(geomtypename(geomType));
2325ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com        }
23384e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com
2343400f4b00aaf9159713d9a7bb0a4f828fd6899c3commit-bot@chromium.org        if (scale != 1.f) {
2353400f4b00aaf9159713d9a7bb0a4f828fd6899c3commit-bot@chromium.org            fName.appendf("_scale_%g", scale);
2363400f4b00aaf9159713d9a7bb0a4f828fd6899c3commit-bot@chromium.org        }
2373400f4b00aaf9159713d9a7bb0a4f828fd6899c3commit-bot@chromium.org
2385396a048d2f9f32fd3977d44f580c86028f4b1b9commit-bot@chromium.org        fName.append(data.fName);
2395396a048d2f9f32fd3977d44f580c86028f4b1b9commit-bot@chromium.org
240f461a8fdf642ba713dcdfb217534652df1eac278krajcevski        fDither = false;
241f461a8fdf642ba713dcdfb217534652df1eac278krajcevski        fShader = this->makeShader(gradType, data, tm, scale);
2425ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com        fGeomType = geomType;
24384e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com    }
24484e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com
245f461a8fdf642ba713dcdfb217534652df1eac278krajcevski    GradientBench(GradType gradType, GradData data, bool dither) {
246f461a8fdf642ba713dcdfb217534652df1eac278krajcevski        const char *tmname = tilemodename(SkShader::kClamp_TileMode);
247f461a8fdf642ba713dcdfb217534652df1eac278krajcevski        fName.printf("gradient_%s_%s", gGrads[gradType].fName, tmname);
248f461a8fdf642ba713dcdfb217534652df1eac278krajcevski        fName.append(data.fName);
249f461a8fdf642ba713dcdfb217534652df1eac278krajcevski
250f461a8fdf642ba713dcdfb217534652df1eac278krajcevski        fDither = dither;
251f461a8fdf642ba713dcdfb217534652df1eac278krajcevski        if (dither) {
252f461a8fdf642ba713dcdfb217534652df1eac278krajcevski            fName.appendf("_dither");
253f461a8fdf642ba713dcdfb217534652df1eac278krajcevski        }
254f461a8fdf642ba713dcdfb217534652df1eac278krajcevski
255f461a8fdf642ba713dcdfb217534652df1eac278krajcevski        fShader = this->makeShader(gradType, data, SkShader::kClamp_TileMode, 1.0f);
256f461a8fdf642ba713dcdfb217534652df1eac278krajcevski        fGeomType = kRect_GeomType;
257f461a8fdf642ba713dcdfb217534652df1eac278krajcevski    }
258f461a8fdf642ba713dcdfb217534652df1eac278krajcevski
25984e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com    virtual ~GradientBench() {
26084e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com        fShader->unref();
26184e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com    }
26284e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com
26384e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.comprotected:
26484e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com    virtual const char* onGetName() {
26584e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com        return fName.c_str();
26684e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com    }
26784e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com
2683361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas* canvas) {
26984e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com        SkPaint paint;
27084e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com        this->setupPaint(&paint);
27184e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com
27284e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com        paint.setShader(fShader);
273f461a8fdf642ba713dcdfb217534652df1eac278krajcevski        if (fDither) {
274f461a8fdf642ba713dcdfb217534652df1eac278krajcevski            paint.setDither(true);
275f461a8fdf642ba713dcdfb217534652df1eac278krajcevski        }
27684e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com
27784e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com        SkRect r = { 0, 0, SkIntToScalar(W), SkIntToScalar(H) };
2783361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops * kRepeat; i++) {
2795ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com            switch (fGeomType) {
2805ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com               case kRect_GeomType:
2815ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com                   canvas->drawRect(r, paint);
2825ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com                   break;
2835ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com               case kOval_GeomType:
2845ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com                   canvas->drawOval(r, paint);
2855ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com                   break;
2865ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com            }
28784e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com        }
28884e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com    }
28984e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com
29084e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.comprivate:
291f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
2925ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com
2935ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com    GeomType fGeomType;
29484e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com};
29584e9c0801f9a2da1ca12a38250a95fd393caded1reed@google.com
296b120bd986ec5e5eeaacdbb8aec04cbe352f98434commit-bot@chromium.orgDEF_BENCH( return new GradientBench(kLinear_GradType); )
297b120bd986ec5e5eeaacdbb8aec04cbe352f98434commit-bot@chromium.orgDEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[1]); )
298b120bd986ec5e5eeaacdbb8aec04cbe352f98434commit-bot@chromium.orgDEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[2]); )
299b120bd986ec5e5eeaacdbb8aec04cbe352f98434commit-bot@chromium.orgDEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[0], SkShader::kMirror_TileMode); )
300b120bd986ec5e5eeaacdbb8aec04cbe352f98434commit-bot@chromium.org
301b120bd986ec5e5eeaacdbb8aec04cbe352f98434commit-bot@chromium.orgDEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[0]); )
302b120bd986ec5e5eeaacdbb8aec04cbe352f98434commit-bot@chromium.orgDEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[1]); )
303b120bd986ec5e5eeaacdbb8aec04cbe352f98434commit-bot@chromium.orgDEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[2]); )
304b120bd986ec5e5eeaacdbb8aec04cbe352f98434commit-bot@chromium.org// Draw a radial gradient of radius 1/2 on a rectangle; half the lines should
305b120bd986ec5e5eeaacdbb8aec04cbe352f98434commit-bot@chromium.org// be completely pinned, the other half should pe partially pinned
306b120bd986ec5e5eeaacdbb8aec04cbe352f98434commit-bot@chromium.orgDEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[0], SkShader::kClamp_TileMode, kRect_GeomType, 0.5f); )
307b120bd986ec5e5eeaacdbb8aec04cbe352f98434commit-bot@chromium.org
308b120bd986ec5e5eeaacdbb8aec04cbe352f98434commit-bot@chromium.org// Draw a radial gradient on a circle of equal size; all the lines should
309b120bd986ec5e5eeaacdbb8aec04cbe352f98434commit-bot@chromium.org// hit the unpinned fast path (so long as GradientBench.W == H)
310b120bd986ec5e5eeaacdbb8aec04cbe352f98434commit-bot@chromium.orgDEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[0], SkShader::kClamp_TileMode, kOval_GeomType); )
311b120bd986ec5e5eeaacdbb8aec04cbe352f98434commit-bot@chromium.org
312b120bd986ec5e5eeaacdbb8aec04cbe352f98434commit-bot@chromium.orgDEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[0], SkShader::kMirror_TileMode); )
31334150b451da7d3c70a2d34e67b0285cb36932d45commit-bot@chromium.orgDEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[0], SkShader::kRepeat_TileMode); )
314b120bd986ec5e5eeaacdbb8aec04cbe352f98434commit-bot@chromium.orgDEF_BENCH( return new GradientBench(kSweep_GradType); )
315b120bd986ec5e5eeaacdbb8aec04cbe352f98434commit-bot@chromium.orgDEF_BENCH( return new GradientBench(kSweep_GradType, gGradData[1]); )
316b120bd986ec5e5eeaacdbb8aec04cbe352f98434commit-bot@chromium.orgDEF_BENCH( return new GradientBench(kSweep_GradType, gGradData[2]); )
317b120bd986ec5e5eeaacdbb8aec04cbe352f98434commit-bot@chromium.orgDEF_BENCH( return new GradientBench(kRadial2_GradType); )
318b120bd986ec5e5eeaacdbb8aec04cbe352f98434commit-bot@chromium.orgDEF_BENCH( return new GradientBench(kRadial2_GradType, gGradData[1]); )
319b120bd986ec5e5eeaacdbb8aec04cbe352f98434commit-bot@chromium.orgDEF_BENCH( return new GradientBench(kRadial2_GradType, gGradData[0], SkShader::kMirror_TileMode); )
320b120bd986ec5e5eeaacdbb8aec04cbe352f98434commit-bot@chromium.orgDEF_BENCH( return new GradientBench(kConical_GradType); )
321b120bd986ec5e5eeaacdbb8aec04cbe352f98434commit-bot@chromium.orgDEF_BENCH( return new GradientBench(kConical_GradType, gGradData[1]); )
322b120bd986ec5e5eeaacdbb8aec04cbe352f98434commit-bot@chromium.orgDEF_BENCH( return new GradientBench(kConical_GradType, gGradData[2]); )
32395f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.orgDEF_BENCH( return new GradientBench(kConicalZero_GradType); )
32495f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.orgDEF_BENCH( return new GradientBench(kConicalZero_GradType, gGradData[1]); )
32595f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.orgDEF_BENCH( return new GradientBench(kConicalZero_GradType, gGradData[2]); )
32695f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.orgDEF_BENCH( return new GradientBench(kConicalOut_GradType); )
32795f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.orgDEF_BENCH( return new GradientBench(kConicalOut_GradType, gGradData[1]); )
32895f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.orgDEF_BENCH( return new GradientBench(kConicalOut_GradType, gGradData[2]); )
32995f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.orgDEF_BENCH( return new GradientBench(kConicalOutZero_GradType); )
33095f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.orgDEF_BENCH( return new GradientBench(kConicalOutZero_GradType, gGradData[1]); )
33195f79261addecd8c3b4e64f2f1469f9e1aa0acb2commit-bot@chromium.orgDEF_BENCH( return new GradientBench(kConicalOutZero_GradType, gGradData[2]); )
332b120bd986ec5e5eeaacdbb8aec04cbe352f98434commit-bot@chromium.org
333f461a8fdf642ba713dcdfb217534652df1eac278krajcevski// Dithering
334f461a8fdf642ba713dcdfb217534652df1eac278krajcevskiDEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[3], true); )
335f461a8fdf642ba713dcdfb217534652df1eac278krajcevskiDEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[3], false); )
336f461a8fdf642ba713dcdfb217534652df1eac278krajcevskiDEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[3], true); )
337f461a8fdf642ba713dcdfb217534652df1eac278krajcevskiDEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[3], false); )
338f461a8fdf642ba713dcdfb217534652df1eac278krajcevskiDEF_BENCH( return new GradientBench(kSweep_GradType, gGradData[3], true); )
339f461a8fdf642ba713dcdfb217534652df1eac278krajcevskiDEF_BENCH( return new GradientBench(kSweep_GradType, gGradData[3], false); )
340f461a8fdf642ba713dcdfb217534652df1eac278krajcevskiDEF_BENCH( return new GradientBench(kConical_GradType, gGradData[3], true); )
341f461a8fdf642ba713dcdfb217534652df1eac278krajcevskiDEF_BENCH( return new GradientBench(kConical_GradType, gGradData[3], false); )
342f461a8fdf642ba713dcdfb217534652df1eac278krajcevski
343b120bd986ec5e5eeaacdbb8aec04cbe352f98434commit-bot@chromium.org///////////////////////////////////////////////////////////////////////////////
344b120bd986ec5e5eeaacdbb8aec04cbe352f98434commit-bot@chromium.org
345f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass Gradient2Bench : public Benchmark {
34673349aa33277889d79e3e8bd8cef89cdf0310288reed@google.com    SkString fName;
34773349aa33277889d79e3e8bd8cef89cdf0310288reed@google.com    bool     fHasAlpha;
34873349aa33277889d79e3e8bd8cef89cdf0310288reed@google.com
3498ac7a0fcef6c830935905fdaeda97cab87581ce8reed@google.compublic:
350410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    Gradient2Bench(bool hasAlpha)  {
35173349aa33277889d79e3e8bd8cef89cdf0310288reed@google.com        fName.printf("gradient_create_%s", hasAlpha ? "alpha" : "opaque");
35273349aa33277889d79e3e8bd8cef89cdf0310288reed@google.com        fHasAlpha = hasAlpha;
35373349aa33277889d79e3e8bd8cef89cdf0310288reed@google.com    }
354fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
3558ac7a0fcef6c830935905fdaeda97cab87581ce8reed@google.comprotected:
3568ac7a0fcef6c830935905fdaeda97cab87581ce8reed@google.com    virtual const char* onGetName() {
35773349aa33277889d79e3e8bd8cef89cdf0310288reed@google.com        return fName.c_str();
3588ac7a0fcef6c830935905fdaeda97cab87581ce8reed@google.com    }
359fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
3603361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas* canvas) {
3618ac7a0fcef6c830935905fdaeda97cab87581ce8reed@google.com        SkPaint paint;
3628ac7a0fcef6c830935905fdaeda97cab87581ce8reed@google.com        this->setupPaint(&paint);
363fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
3648ac7a0fcef6c830935905fdaeda97cab87581ce8reed@google.com        const SkRect r = { 0, 0, SkIntToScalar(4), SkIntToScalar(4) };
3651ca4f26039eb1dc08b301b7624cd05ab9b682cb8reed@google.com        const SkPoint pts[] = {
3661ca4f26039eb1dc08b301b7624cd05ab9b682cb8reed@google.com            { 0, 0 },
3671ca4f26039eb1dc08b301b7624cd05ab9b682cb8reed@google.com            { SkIntToScalar(100), SkIntToScalar(100) },
3681ca4f26039eb1dc08b301b7624cd05ab9b682cb8reed@google.com        };
3698ac7a0fcef6c830935905fdaeda97cab87581ce8reed@google.com
3703361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; i++) {
37173349aa33277889d79e3e8bd8cef89cdf0310288reed@google.com            const int gray = i % 256;
37273349aa33277889d79e3e8bd8cef89cdf0310288reed@google.com            const int alpha = fHasAlpha ? gray : 0xFF;
3735ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com            SkColor colors[] = {
3745ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com                SK_ColorBLACK,
37573349aa33277889d79e3e8bd8cef89cdf0310288reed@google.com                SkColorSetARGB(alpha, gray, gray, gray),
3765ea050f6620fa9e675a1c801f738e946fa993e14tomhudson@google.com                SK_ColorWHITE };
3778ac7a0fcef6c830935905fdaeda97cab87581ce8reed@google.com            SkShader* s = SkGradientShader::CreateLinear(pts, colors, NULL,
3788ac7a0fcef6c830935905fdaeda97cab87581ce8reed@google.com                                                         SK_ARRAY_COUNT(colors),
3798ac7a0fcef6c830935905fdaeda97cab87581ce8reed@google.com                                                         SkShader::kClamp_TileMode);
3808ac7a0fcef6c830935905fdaeda97cab87581ce8reed@google.com            paint.setShader(s)->unref();
3818ac7a0fcef6c830935905fdaeda97cab87581ce8reed@google.com            canvas->drawRect(r, paint);
3828ac7a0fcef6c830935905fdaeda97cab87581ce8reed@google.com        }
3838ac7a0fcef6c830935905fdaeda97cab87581ce8reed@google.com    }
384fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
3858ac7a0fcef6c830935905fdaeda97cab87581ce8reed@google.comprivate:
386f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
3878ac7a0fcef6c830935905fdaeda97cab87581ce8reed@google.com};
3888ac7a0fcef6c830935905fdaeda97cab87581ce8reed@google.com
389410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new Gradient2Bench(false); )
390410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new Gradient2Bench(true); )
391