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