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