1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2016 Google Inc. 3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be 5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file. 6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "Benchmark.h" 9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCanvas.h" 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkShader.h" 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkGradientShader.h" 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkString.h" 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkColor.h" 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPaint.h" 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic const char* get_tilemode_name(SkShader::TileMode tilemode) { 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot switch (tilemode) { 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case SkShader::kClamp_TileMode: 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return "clamp"; 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case SkShader::kRepeat_TileMode: 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return "repeat"; 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case SkShader::kMirror_TileMode: 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return "mirror"; 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot default: 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkDEBUGFAIL("Unknown tilemode"); 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return "error"; 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass HardStopGradientBench_ScaleNumColors : public Benchmark { 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot HardStopGradientBench_ScaleNumColors(SkShader::TileMode tilemode, int count) { 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fName.printf("hardstop_scale_num_colors_%s_%03d_colors", get_tilemode_name(tilemode), count); 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fTileMode = tilemode; 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fColorCount = count; 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* onGetName() override { 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return fName.c_str(); 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkIPoint onGetSize() override { 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkIPoint::Make(kSize, kSize); 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /* 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Set up a linear gradient from left to right with 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * fColorCount colors alternating between four 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * different colors. The positions are evenly spaced, 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * with the exception of the first two; these create a 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * hard stop in order to trigger the hard stop code. 54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onPreDraw(SkCanvas* canvas) override { 56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // Left to right 57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPoint points[2] = { 58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPoint::Make(0, kSize/2), 59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPoint::Make(kSize-1, kSize/2), 60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot constexpr int kNumColorChoices = 4; 63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColor color_choices[kNumColorChoices] = { 64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SK_ColorRED, 65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SK_ColorGREEN, 66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SK_ColorBLUE, 67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SK_ColorYELLOW, 68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // Alternate between different choices 71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColor colors[100]; 72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < fColorCount; i++) { 73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot colors[i] = color_choices[i % kNumColorChoices]; 74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // Create a hard stop 77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar positions[100]; 78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot positions[0] = 0.0f; 79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot positions[1] = 0.0f; 80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 2; i < fColorCount; i++) { 81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // Evenly spaced afterwards 82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot positions[i] = i / (fColorCount - 1.0f); 83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fPaint.setShader(SkGradientShader::MakeLinear(points, 86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot colors, 87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot positions, 88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fColorCount, 89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fTileMode, 90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 0, 91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot nullptr)); 92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /* 95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Draw simple linear gradient from left to right 96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDraw(int loops, SkCanvas* canvas) override { 98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < loops; i++) { 99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawPaint(fPaint); 100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static const int kSize = 500; 105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkShader::TileMode fTileMode; 107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString fName; 108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int fColorCount; 109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint fPaint; 110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef Benchmark INHERITED; 112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// Clamp 115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kClamp_TileMode, 3);) 116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kClamp_TileMode, 4);) 117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kClamp_TileMode, 5);) 118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kClamp_TileMode, 10);) 119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kClamp_TileMode, 25);) 120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kClamp_TileMode, 50);) 121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kClamp_TileMode, 100);) 122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// Repeat 124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kRepeat_TileMode, 3);) 125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kRepeat_TileMode, 4);) 126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kRepeat_TileMode, 5);) 127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kRepeat_TileMode, 10);) 128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kRepeat_TileMode, 25);) 129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kRepeat_TileMode, 50);) 130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kRepeat_TileMode, 100);) 131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// Mirror 133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kMirror_TileMode, 3);) 134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kMirror_TileMode, 4);) 135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kMirror_TileMode, 5);) 136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kMirror_TileMode, 10);) 137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kMirror_TileMode, 25);) 138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kMirror_TileMode, 50);) 139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH(return new HardStopGradientBench_ScaleNumColors(SkShader::kMirror_TileMode, 100);) 140