117e829794db9621879baf2e90856a72b17eaf7dcfmenozzi/*
217e829794db9621879baf2e90856a72b17eaf7dcfmenozzi * Copyright 2016 Google Inc.
317e829794db9621879baf2e90856a72b17eaf7dcfmenozzi *
417e829794db9621879baf2e90856a72b17eaf7dcfmenozzi * Use of this source code is governed by a BSD-style license that can be
517e829794db9621879baf2e90856a72b17eaf7dcfmenozzi * found in the LICENSE file.
617e829794db9621879baf2e90856a72b17eaf7dcfmenozzi */
717e829794db9621879baf2e90856a72b17eaf7dcfmenozzi
817e829794db9621879baf2e90856a72b17eaf7dcfmenozzi#include "Benchmark.h"
917e829794db9621879baf2e90856a72b17eaf7dcfmenozzi
1017e829794db9621879baf2e90856a72b17eaf7dcfmenozzi#include "SkCanvas.h"
1117e829794db9621879baf2e90856a72b17eaf7dcfmenozzi#include "SkShader.h"
1217e829794db9621879baf2e90856a72b17eaf7dcfmenozzi#include "SkGradientShader.h"
1317e829794db9621879baf2e90856a72b17eaf7dcfmenozzi#include "SkString.h"
1417e829794db9621879baf2e90856a72b17eaf7dcfmenozzi#include "SkColor.h"
1517e829794db9621879baf2e90856a72b17eaf7dcfmenozzi#include "SkPaint.h"
1617e829794db9621879baf2e90856a72b17eaf7dcfmenozzi
1717e829794db9621879baf2e90856a72b17eaf7dcfmenozzistatic const char* get_tilemode_name(SkShader::TileMode tilemode) {
1817e829794db9621879baf2e90856a72b17eaf7dcfmenozzi    switch (tilemode) {
1917e829794db9621879baf2e90856a72b17eaf7dcfmenozzi        case SkShader::kClamp_TileMode:
2017e829794db9621879baf2e90856a72b17eaf7dcfmenozzi            return "clamp";
2117e829794db9621879baf2e90856a72b17eaf7dcfmenozzi        case SkShader::kRepeat_TileMode:
2217e829794db9621879baf2e90856a72b17eaf7dcfmenozzi            return "repeat";
2317e829794db9621879baf2e90856a72b17eaf7dcfmenozzi        case SkShader::kMirror_TileMode:
2417e829794db9621879baf2e90856a72b17eaf7dcfmenozzi            return "mirror";
2517e829794db9621879baf2e90856a72b17eaf7dcfmenozzi        default:
2617e829794db9621879baf2e90856a72b17eaf7dcfmenozzi            SkDEBUGFAIL("Unknown tilemode");
2717e829794db9621879baf2e90856a72b17eaf7dcfmenozzi            return "error";
2817e829794db9621879baf2e90856a72b17eaf7dcfmenozzi    }
2917e829794db9621879baf2e90856a72b17eaf7dcfmenozzi}
3017e829794db9621879baf2e90856a72b17eaf7dcfmenozzi
3117e829794db9621879baf2e90856a72b17eaf7dcfmenozziclass HardStopGradientBench_ScaleNumColors : public Benchmark {
3217e829794db9621879baf2e90856a72b17eaf7dcfmenozzipublic:
3317e829794db9621879baf2e90856a72b17eaf7dcfmenozzi    HardStopGradientBench_ScaleNumColors(SkShader::TileMode tilemode, int count) {
3417e829794db9621879baf2e90856a72b17eaf7dcfmenozzi        fName.printf("hardstop_scale_num_colors_%s_%03d_colors", get_tilemode_name(tilemode), count);
3517e829794db9621879baf2e90856a72b17eaf7dcfmenozzi
3617e829794db9621879baf2e90856a72b17eaf7dcfmenozzi        fTileMode   = tilemode;
3717e829794db9621879baf2e90856a72b17eaf7dcfmenozzi        fColorCount = count;
3817e829794db9621879baf2e90856a72b17eaf7dcfmenozzi    }
3917e829794db9621879baf2e90856a72b17eaf7dcfmenozzi
4017e829794db9621879baf2e90856a72b17eaf7dcfmenozzi    const char* onGetName() override {
4117e829794db9621879baf2e90856a72b17eaf7dcfmenozzi        return fName.c_str();
4217e829794db9621879baf2e90856a72b17eaf7dcfmenozzi    }
4317e829794db9621879baf2e90856a72b17eaf7dcfmenozzi
4417e829794db9621879baf2e90856a72b17eaf7dcfmenozzi    SkIPoint onGetSize() override {
4517e829794db9621879baf2e90856a72b17eaf7dcfmenozzi        return SkIPoint::Make(kSize, kSize);
4617e829794db9621879baf2e90856a72b17eaf7dcfmenozzi    }
4717e829794db9621879baf2e90856a72b17eaf7dcfmenozzi
4817e829794db9621879baf2e90856a72b17eaf7dcfmenozzi    /*
4917e829794db9621879baf2e90856a72b17eaf7dcfmenozzi     * Set up a linear gradient from left to right with
5017e829794db9621879baf2e90856a72b17eaf7dcfmenozzi     * fColorCount colors alternating between four
5117e829794db9621879baf2e90856a72b17eaf7dcfmenozzi     * different colors. The positions are evenly spaced,
5217e829794db9621879baf2e90856a72b17eaf7dcfmenozzi     * with the exception of the first two; these create a
5317e829794db9621879baf2e90856a72b17eaf7dcfmenozzi     * hard stop in order to trigger the hard stop code.
5417e829794db9621879baf2e90856a72b17eaf7dcfmenozzi     */
5517e829794db9621879baf2e90856a72b17eaf7dcfmenozzi    void onPreDraw(SkCanvas* canvas) override {
5617e829794db9621879baf2e90856a72b17eaf7dcfmenozzi        // Left to right
5717e829794db9621879baf2e90856a72b17eaf7dcfmenozzi        SkPoint points[2] = {
5863fd760a37905c45d26fc3d49cac261fad1b4808Ben Wagner            SkPoint::Make(0,        kSize/2),
5917e829794db9621879baf2e90856a72b17eaf7dcfmenozzi            SkPoint::Make(kSize-1,  kSize/2),
6017e829794db9621879baf2e90856a72b17eaf7dcfmenozzi        };
6117e829794db9621879baf2e90856a72b17eaf7dcfmenozzi
6217e829794db9621879baf2e90856a72b17eaf7dcfmenozzi        constexpr int kNumColorChoices = 4;
6317e829794db9621879baf2e90856a72b17eaf7dcfmenozzi        SkColor color_choices[kNumColorChoices] = {
6417e829794db9621879baf2e90856a72b17eaf7dcfmenozzi            SK_ColorRED,
6517e829794db9621879baf2e90856a72b17eaf7dcfmenozzi            SK_ColorGREEN,
6617e829794db9621879baf2e90856a72b17eaf7dcfmenozzi            SK_ColorBLUE,
6717e829794db9621879baf2e90856a72b17eaf7dcfmenozzi            SK_ColorYELLOW,
6817e829794db9621879baf2e90856a72b17eaf7dcfmenozzi        };
6917e829794db9621879baf2e90856a72b17eaf7dcfmenozzi
7017e829794db9621879baf2e90856a72b17eaf7dcfmenozzi        // Alternate between different choices
7117e829794db9621879baf2e90856a72b17eaf7dcfmenozzi        SkColor  colors[100];
7217e829794db9621879baf2e90856a72b17eaf7dcfmenozzi        for (int i = 0; i < fColorCount; i++) {
7317e829794db9621879baf2e90856a72b17eaf7dcfmenozzi            colors[i] = color_choices[i % kNumColorChoices];
7417e829794db9621879baf2e90856a72b17eaf7dcfmenozzi        }
7517e829794db9621879baf2e90856a72b17eaf7dcfmenozzi
7617e829794db9621879baf2e90856a72b17eaf7dcfmenozzi        // Create a hard stop
7717e829794db9621879baf2e90856a72b17eaf7dcfmenozzi        SkScalar positions[100];
7817e829794db9621879baf2e90856a72b17eaf7dcfmenozzi        positions[0] = 0.0f;
7917e829794db9621879baf2e90856a72b17eaf7dcfmenozzi        positions[1] = 0.0f;
8017e829794db9621879baf2e90856a72b17eaf7dcfmenozzi        for (int i = 2; i < fColorCount; i++) {
8117e829794db9621879baf2e90856a72b17eaf7dcfmenozzi            // Evenly spaced afterwards
8217e829794db9621879baf2e90856a72b17eaf7dcfmenozzi            positions[i] = i / (fColorCount - 1.0f);
8317e829794db9621879baf2e90856a72b17eaf7dcfmenozzi        }
8417e829794db9621879baf2e90856a72b17eaf7dcfmenozzi
8517e829794db9621879baf2e90856a72b17eaf7dcfmenozzi        fPaint.setShader(SkGradientShader::MakeLinear(points,
8617e829794db9621879baf2e90856a72b17eaf7dcfmenozzi                                                      colors,
8717e829794db9621879baf2e90856a72b17eaf7dcfmenozzi                                                      positions,
8817e829794db9621879baf2e90856a72b17eaf7dcfmenozzi                                                      fColorCount,
8917e829794db9621879baf2e90856a72b17eaf7dcfmenozzi                                                      fTileMode,
9017e829794db9621879baf2e90856a72b17eaf7dcfmenozzi                                                      0,
9117e829794db9621879baf2e90856a72b17eaf7dcfmenozzi                                                      nullptr));
9217e829794db9621879baf2e90856a72b17eaf7dcfmenozzi    }
9317e829794db9621879baf2e90856a72b17eaf7dcfmenozzi
9417e829794db9621879baf2e90856a72b17eaf7dcfmenozzi    /*
9517e829794db9621879baf2e90856a72b17eaf7dcfmenozzi     * Draw simple linear gradient from left to right
9617e829794db9621879baf2e90856a72b17eaf7dcfmenozzi     */
9717e829794db9621879baf2e90856a72b17eaf7dcfmenozzi    void onDraw(int loops, SkCanvas* canvas) override {
9817e829794db9621879baf2e90856a72b17eaf7dcfmenozzi        for (int i = 0; i < loops; i++) {
9917e829794db9621879baf2e90856a72b17eaf7dcfmenozzi            canvas->drawPaint(fPaint);
10017e829794db9621879baf2e90856a72b17eaf7dcfmenozzi        }
10117e829794db9621879baf2e90856a72b17eaf7dcfmenozzi    }
10217e829794db9621879baf2e90856a72b17eaf7dcfmenozzi
10317e829794db9621879baf2e90856a72b17eaf7dcfmenozziprivate:
10417e829794db9621879baf2e90856a72b17eaf7dcfmenozzi    static const int kSize = 500;
10517e829794db9621879baf2e90856a72b17eaf7dcfmenozzi
10617e829794db9621879baf2e90856a72b17eaf7dcfmenozzi    SkShader::TileMode  fTileMode;
10717e829794db9621879baf2e90856a72b17eaf7dcfmenozzi    SkString            fName;
10817e829794db9621879baf2e90856a72b17eaf7dcfmenozzi    int                 fColorCount;
10917e829794db9621879baf2e90856a72b17eaf7dcfmenozzi    SkPaint             fPaint;
11017e829794db9621879baf2e90856a72b17eaf7dcfmenozzi
11117e829794db9621879baf2e90856a72b17eaf7dcfmenozzi    typedef Benchmark INHERITED;
11217e829794db9621879baf2e90856a72b17eaf7dcfmenozzi};
11317e829794db9621879baf2e90856a72b17eaf7dcfmenozzi
11417e829794db9621879baf2e90856a72b17eaf7dcfmenozzi// Clamp
11517e829794db9621879baf2e90856a72b17eaf7dcfmenozziDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kClamp_TileMode,   3);)
11617e829794db9621879baf2e90856a72b17eaf7dcfmenozziDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kClamp_TileMode,   4);)
11717e829794db9621879baf2e90856a72b17eaf7dcfmenozziDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kClamp_TileMode,   5);)
11817e829794db9621879baf2e90856a72b17eaf7dcfmenozziDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kClamp_TileMode,  10);)
11917e829794db9621879baf2e90856a72b17eaf7dcfmenozziDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kClamp_TileMode,  25);)
12017e829794db9621879baf2e90856a72b17eaf7dcfmenozziDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kClamp_TileMode,  50);)
12117e829794db9621879baf2e90856a72b17eaf7dcfmenozziDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kClamp_TileMode, 100);)
12217e829794db9621879baf2e90856a72b17eaf7dcfmenozzi
12317e829794db9621879baf2e90856a72b17eaf7dcfmenozzi// Repeat
12417e829794db9621879baf2e90856a72b17eaf7dcfmenozziDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kRepeat_TileMode,   3);)
12517e829794db9621879baf2e90856a72b17eaf7dcfmenozziDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kRepeat_TileMode,   4);)
12617e829794db9621879baf2e90856a72b17eaf7dcfmenozziDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kRepeat_TileMode,   5);)
12717e829794db9621879baf2e90856a72b17eaf7dcfmenozziDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kRepeat_TileMode,  10);)
12817e829794db9621879baf2e90856a72b17eaf7dcfmenozziDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kRepeat_TileMode,  25);)
12917e829794db9621879baf2e90856a72b17eaf7dcfmenozziDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kRepeat_TileMode,  50);)
13017e829794db9621879baf2e90856a72b17eaf7dcfmenozziDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kRepeat_TileMode, 100);)
13117e829794db9621879baf2e90856a72b17eaf7dcfmenozzi
13217e829794db9621879baf2e90856a72b17eaf7dcfmenozzi// Mirror
13317e829794db9621879baf2e90856a72b17eaf7dcfmenozziDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kMirror_TileMode,   3);)
13417e829794db9621879baf2e90856a72b17eaf7dcfmenozziDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kMirror_TileMode,   4);)
13517e829794db9621879baf2e90856a72b17eaf7dcfmenozziDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kMirror_TileMode,   5);)
13617e829794db9621879baf2e90856a72b17eaf7dcfmenozziDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kMirror_TileMode,  10);)
13717e829794db9621879baf2e90856a72b17eaf7dcfmenozziDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kMirror_TileMode,  25);)
13817e829794db9621879baf2e90856a72b17eaf7dcfmenozziDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kMirror_TileMode,  50);)
13917e829794db9621879baf2e90856a72b17eaf7dcfmenozziDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kMirror_TileMode, 100);)
140