1e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi/* 2e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi * Copyright 2016 Google Inc. 3e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi * 4e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi * Use of this source code is governed by a BSD-style license that can be 5e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi * found in the LICENSE file. 6e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi */ 7e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi 8e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi#include "Benchmark.h" 9e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi 10e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi#include "SkCanvas.h" 11e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi#include "SkShader.h" 12e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi#include "SkGradientShader.h" 13e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi#include "SkString.h" 14e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi#include "SkColor.h" 15e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi#include "SkPaint.h" 16e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi 17e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzienum class Kind { 18e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi k001, 19e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi k011, 20e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi kCentered, 21e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi}; 22e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi 23e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozziconst char* kindstr(Kind k) { 24e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi switch (k) { 25e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi case Kind::k001: 26e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi return "001"; 27e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi case Kind::k011: 28e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi return "011"; 29e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi case Kind::kCentered: 30e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi return "centered"; 31e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi default: 32e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi return "Invalid kind"; 33e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi } 34e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi} 35e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi 36e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozziclass HardStopGradientBench_SpecialHardStops : public Benchmark { 37e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzipublic: 38e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi HardStopGradientBench_SpecialHardStops(int w, int h, Kind kind) { 39e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi fW = w; 40e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi fH = h; 41e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi fKind = kind; 42e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi 43e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi fName.printf("hardstop_special_%03dx%03d_%s", fW, fH, kindstr(fKind)); 44e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi } 45e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi 46e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi const char* onGetName() override { 47e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi return fName.c_str(); 48e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi } 49e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi 50e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi SkIPoint onGetSize() override { 51e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi return SkIPoint::Make(fW, fH); 52e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi } 53e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi 54e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi void onPreDraw(SkCanvas* canvas) override { 55e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi SkPoint points[2] = { 56e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi SkPoint::Make( 0.0f, fH/2.0f), 57e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi SkPoint::Make(fW+2.0f, fH/2.0f), 58e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi }; 59e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi 60e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi SkColor colors[4] = { 61e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi SK_ColorRED, 62e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi SK_ColorGREEN, 63e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi SK_ColorBLUE, 64e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi SK_ColorYELLOW, 65e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi }; 66e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi 67e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi SkScalar pos_001[3] = { 68e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi 0.0f, 69e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi 0.0f, 70e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi 1.0f, 71e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi }; 72e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi 73e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi SkScalar pos_011[3] = { 74e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi 0.0f, 75e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi 1.0f, 76e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi 1.0f, 77e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi }; 78e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi 79e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi SkScalar pos_centered[4] = { 80e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi 0.0f, 81e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi 0.5f, 82e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi 0.5f, 83e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi 1.0f, 84e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi }; 85e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi 86e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi SkScalar* positions = fKind == Kind::k001 ? pos_001 : 87e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi fKind == Kind::k011 ? pos_011 : 88e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi pos_centered; 89e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi 90e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi int count = fKind == Kind::kCentered ? 4 : 3; 91e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi 92e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi fPaint.setShader(SkGradientShader::MakeLinear(points, 93e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi colors, 94e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi positions, 95e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi count, 96e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi SkShader::kClamp_TileMode, 97e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi 0, 98e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi nullptr)); 99e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi } 100e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi 101e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi void onDraw(int loops, SkCanvas* canvas) override { 102e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi for (int i = 0; i < loops; i++) { 103e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi canvas->drawPaint(fPaint); 104e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi } 105e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi } 106e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi 107e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozziprivate: 108e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi SkString fName; 109e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi int fW; 110e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi int fH; 111e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi Kind fKind; 112e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi SkPaint fPaint; 113e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi}; 114e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi 115e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozziDEF_BENCH(return new HardStopGradientBench_SpecialHardStops(100, 100, Kind::k001);); 116e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozziDEF_BENCH(return new HardStopGradientBench_SpecialHardStops(200, 200, Kind::k001);); 117e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozziDEF_BENCH(return new HardStopGradientBench_SpecialHardStops(300, 300, Kind::k001);); 118e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozziDEF_BENCH(return new HardStopGradientBench_SpecialHardStops(400, 400, Kind::k001);); 119e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozziDEF_BENCH(return new HardStopGradientBench_SpecialHardStops(500, 500, Kind::k001);); 120e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi 121e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozziDEF_BENCH(return new HardStopGradientBench_SpecialHardStops(100, 100, Kind::k011);); 122e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozziDEF_BENCH(return new HardStopGradientBench_SpecialHardStops(200, 200, Kind::k011);); 123e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozziDEF_BENCH(return new HardStopGradientBench_SpecialHardStops(300, 300, Kind::k011);); 124e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozziDEF_BENCH(return new HardStopGradientBench_SpecialHardStops(400, 400, Kind::k011);); 125e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozziDEF_BENCH(return new HardStopGradientBench_SpecialHardStops(500, 500, Kind::k011);); 126e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozzi 127e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozziDEF_BENCH(return new HardStopGradientBench_SpecialHardStops(100, 100, Kind::kCentered);); 128e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozziDEF_BENCH(return new HardStopGradientBench_SpecialHardStops(200, 200, Kind::kCentered);); 129e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozziDEF_BENCH(return new HardStopGradientBench_SpecialHardStops(300, 300, Kind::kCentered);); 130e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozziDEF_BENCH(return new HardStopGradientBench_SpecialHardStops(400, 400, Kind::kCentered);); 131e57b8c9a790253df1e2f0663bf63f8d6e04227d1fmenozziDEF_BENCH(return new HardStopGradientBench_SpecialHardStops(500, 500, Kind::kCentered);); 132