1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2016 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "bench/Benchmark.h" 9cb93a386Sopenharmony_ci 10cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h" 11cb93a386Sopenharmony_ci#include "include/core/SkColor.h" 12cb93a386Sopenharmony_ci#include "include/core/SkPaint.h" 13cb93a386Sopenharmony_ci#include "include/core/SkShader.h" 14cb93a386Sopenharmony_ci#include "include/core/SkString.h" 15cb93a386Sopenharmony_ci#include "include/effects/SkGradientShader.h" 16cb93a386Sopenharmony_ci#include "include/private/SkTemplates.h" 17cb93a386Sopenharmony_ci 18cb93a386Sopenharmony_ciclass HardStopGradientBench_ScaleNumHardStops : public Benchmark { 19cb93a386Sopenharmony_cipublic: 20cb93a386Sopenharmony_ci HardStopGradientBench_ScaleNumHardStops(int colorCount, int hardStopCount) { 21cb93a386Sopenharmony_ci SkASSERT(hardStopCount <= colorCount/2); 22cb93a386Sopenharmony_ci 23cb93a386Sopenharmony_ci fName.printf("hardstop_scale_num_hard_stops_%03d_colors_%03d_hard_stops", 24cb93a386Sopenharmony_ci colorCount, hardStopCount); 25cb93a386Sopenharmony_ci 26cb93a386Sopenharmony_ci fColorCount = colorCount; 27cb93a386Sopenharmony_ci fHardStopCount = hardStopCount; 28cb93a386Sopenharmony_ci } 29cb93a386Sopenharmony_ci 30cb93a386Sopenharmony_ci const char* onGetName() override { 31cb93a386Sopenharmony_ci return fName.c_str(); 32cb93a386Sopenharmony_ci } 33cb93a386Sopenharmony_ci 34cb93a386Sopenharmony_ci SkIPoint onGetSize() override { 35cb93a386Sopenharmony_ci return SkIPoint::Make(kSize, kSize); 36cb93a386Sopenharmony_ci } 37cb93a386Sopenharmony_ci 38cb93a386Sopenharmony_ci void onPreDraw(SkCanvas* canvas) override { 39cb93a386Sopenharmony_ci // Left to right 40cb93a386Sopenharmony_ci SkPoint points[2] = { 41cb93a386Sopenharmony_ci SkPoint::Make(0, kSize/2), 42cb93a386Sopenharmony_ci SkPoint::Make(kSize-1, kSize/2), 43cb93a386Sopenharmony_ci }; 44cb93a386Sopenharmony_ci 45cb93a386Sopenharmony_ci constexpr int kNumColorChoices = 4; 46cb93a386Sopenharmony_ci SkColor color_choices[kNumColorChoices] = { 47cb93a386Sopenharmony_ci SK_ColorRED, 48cb93a386Sopenharmony_ci SK_ColorGREEN, 49cb93a386Sopenharmony_ci SK_ColorBLUE, 50cb93a386Sopenharmony_ci SK_ColorYELLOW, 51cb93a386Sopenharmony_ci }; 52cb93a386Sopenharmony_ci 53cb93a386Sopenharmony_ci // Alternate between different choices 54cb93a386Sopenharmony_ci SkAutoTArray<SkColor> colors(fColorCount); 55cb93a386Sopenharmony_ci for (int i = 0; i < fColorCount; i++) { 56cb93a386Sopenharmony_ci colors[i] = color_choices[i % kNumColorChoices]; 57cb93a386Sopenharmony_ci } 58cb93a386Sopenharmony_ci 59cb93a386Sopenharmony_ci // Create requisite number of hard stops, and evenly 60cb93a386Sopenharmony_ci // space positions after that 61cb93a386Sopenharmony_ci SkAutoTArray<SkScalar> positions(fColorCount); 62cb93a386Sopenharmony_ci int k = 0; 63cb93a386Sopenharmony_ci for (int i = 0; i < fHardStopCount; i++) { 64cb93a386Sopenharmony_ci float val = k/2.0f; 65cb93a386Sopenharmony_ci positions[k++] = val / fColorCount; 66cb93a386Sopenharmony_ci positions[k++] = val / fColorCount; 67cb93a386Sopenharmony_ci } 68cb93a386Sopenharmony_ci for (int i = k; i < fColorCount; i++) { 69cb93a386Sopenharmony_ci positions[i] = i / (fColorCount - 1.0f); 70cb93a386Sopenharmony_ci } 71cb93a386Sopenharmony_ci 72cb93a386Sopenharmony_ci fPaint.setShader(SkGradientShader::MakeLinear(points, 73cb93a386Sopenharmony_ci colors.get(), 74cb93a386Sopenharmony_ci positions.get(), 75cb93a386Sopenharmony_ci fColorCount, 76cb93a386Sopenharmony_ci SkTileMode::kClamp, 77cb93a386Sopenharmony_ci 0, 78cb93a386Sopenharmony_ci nullptr)); 79cb93a386Sopenharmony_ci } 80cb93a386Sopenharmony_ci 81cb93a386Sopenharmony_ci /* 82cb93a386Sopenharmony_ci * Draw simple linear gradient from left to right 83cb93a386Sopenharmony_ci */ 84cb93a386Sopenharmony_ci void onDraw(int loops, SkCanvas* canvas) override { 85cb93a386Sopenharmony_ci for (int i = 0; i < loops; i++) { 86cb93a386Sopenharmony_ci canvas->drawPaint(fPaint); 87cb93a386Sopenharmony_ci } 88cb93a386Sopenharmony_ci } 89cb93a386Sopenharmony_ci 90cb93a386Sopenharmony_ciprivate: 91cb93a386Sopenharmony_ci static const int kSize = 500; 92cb93a386Sopenharmony_ci 93cb93a386Sopenharmony_ci SkString fName; 94cb93a386Sopenharmony_ci int fColorCount; 95cb93a386Sopenharmony_ci int fHardStopCount; 96cb93a386Sopenharmony_ci SkPaint fPaint; 97cb93a386Sopenharmony_ci 98cb93a386Sopenharmony_ci using INHERITED = Benchmark; 99cb93a386Sopenharmony_ci}; 100cb93a386Sopenharmony_ci 101cb93a386Sopenharmony_ciDEF_BENCH(return new HardStopGradientBench_ScaleNumHardStops(10, 1);) 102cb93a386Sopenharmony_ciDEF_BENCH(return new HardStopGradientBench_ScaleNumHardStops(10, 2);) 103cb93a386Sopenharmony_ciDEF_BENCH(return new HardStopGradientBench_ScaleNumHardStops(10, 5);) 104cb93a386Sopenharmony_ci 105cb93a386Sopenharmony_ciDEF_BENCH(return new HardStopGradientBench_ScaleNumHardStops(20, 1);) 106cb93a386Sopenharmony_ciDEF_BENCH(return new HardStopGradientBench_ScaleNumHardStops(20, 5);) 107cb93a386Sopenharmony_ciDEF_BENCH(return new HardStopGradientBench_ScaleNumHardStops(20, 10);) 108cb93a386Sopenharmony_ci 109cb93a386Sopenharmony_ciDEF_BENCH(return new HardStopGradientBench_ScaleNumHardStops(50, 1);) 110cb93a386Sopenharmony_ciDEF_BENCH(return new HardStopGradientBench_ScaleNumHardStops(50, 10);) 111cb93a386Sopenharmony_ciDEF_BENCH(return new HardStopGradientBench_ScaleNumHardStops(50, 25);) 112cb93a386Sopenharmony_ci 113cb93a386Sopenharmony_ciDEF_BENCH(return new HardStopGradientBench_ScaleNumHardStops(100, 1);) 114cb93a386Sopenharmony_ciDEF_BENCH(return new HardStopGradientBench_ScaleNumHardStops(100, 25);) 115cb93a386Sopenharmony_ciDEF_BENCH(return new HardStopGradientBench_ScaleNumHardStops(100, 50);) 116