Home | History | Annotate | Download | only in bench
      1 /*
      2  * Copyright 2011 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 #include "Benchmark.h"
      8 #include "SkBlurMask.h"
      9 #include "SkBlurMaskFilter.h"
     10 #include "SkCanvas.h"
     11 #include "SkPaint.h"
     12 #include "SkRandom.h"
     13 #include "SkShader.h"
     14 #include "SkString.h"
     15 
     16 #define MINI   0.01f
     17 #define SMALL   SkIntToScalar(2)
     18 #define REAL    0.5f
     19 #define BIG     SkIntToScalar(10)
     20 #define REALBIG 100.5f
     21 // The value that produces a sigma of just over 2.
     22 #define CUTOVER 2.6f
     23 
     24 static const char* gStyleName[] = {
     25     "normal",
     26     "solid",
     27     "outer",
     28     "inner"
     29 };
     30 
     31 class BlurBench : public Benchmark {
     32     SkScalar    fRadius;
     33     SkBlurStyle fStyle;
     34     uint32_t    fFlags;
     35     SkString    fName;
     36 
     37 public:
     38     BlurBench(SkScalar rad, SkBlurStyle bs, uint32_t flags = 0) {
     39         fRadius = rad;
     40         fStyle = bs;
     41         fFlags = flags;
     42         const char* name = rad > 0 ? gStyleName[bs] : "none";
     43         const char* quality = flags & SkBlurMaskFilter::kHighQuality_BlurFlag ? "high_quality"
     44                                                                               : "low_quality";
     45         if (SkScalarFraction(rad) != 0) {
     46             fName.printf("blur_%.2f_%s_%s", SkScalarToFloat(rad), name, quality);
     47         } else {
     48             fName.printf("blur_%d_%s_%s", SkScalarRoundToInt(rad), name, quality);
     49         }
     50     }
     51 
     52 protected:
     53     virtual const char* onGetName() {
     54         return fName.c_str();
     55     }
     56 
     57     virtual void onDraw(int loops, SkCanvas* canvas) {
     58         SkPaint paint;
     59         this->setupPaint(&paint);
     60 
     61         paint.setAntiAlias(true);
     62 
     63         SkRandom rand;
     64         for (int i = 0; i < loops; i++) {
     65             SkRect r = SkRect::MakeWH(rand.nextUScalar1() * 400,
     66                                       rand.nextUScalar1() * 400);
     67             r.offset(fRadius, fRadius);
     68 
     69             if (fRadius > 0) {
     70                 paint.setMaskFilter(SkBlurMaskFilter::Make(fStyle,
     71                                                           SkBlurMask::ConvertRadiusToSigma(fRadius),
     72                                                           fFlags));
     73             }
     74             canvas->drawOval(r, paint);
     75         }
     76     }
     77 
     78 private:
     79     typedef Benchmark INHERITED;
     80 };
     81 
     82 DEF_BENCH(return new BlurBench(MINI, kNormal_SkBlurStyle);)
     83 DEF_BENCH(return new BlurBench(MINI, kSolid_SkBlurStyle);)
     84 DEF_BENCH(return new BlurBench(MINI, kOuter_SkBlurStyle);)
     85 DEF_BENCH(return new BlurBench(MINI, kInner_SkBlurStyle);)
     86 
     87 DEF_BENCH(return new BlurBench(SMALL, kNormal_SkBlurStyle);)
     88 DEF_BENCH(return new BlurBench(SMALL, kSolid_SkBlurStyle);)
     89 DEF_BENCH(return new BlurBench(SMALL, kOuter_SkBlurStyle);)
     90 DEF_BENCH(return new BlurBench(SMALL, kInner_SkBlurStyle);)
     91 
     92 DEF_BENCH(return new BlurBench(BIG, kNormal_SkBlurStyle);)
     93 DEF_BENCH(return new BlurBench(BIG, kSolid_SkBlurStyle);)
     94 DEF_BENCH(return new BlurBench(BIG, kOuter_SkBlurStyle);)
     95 DEF_BENCH(return new BlurBench(BIG, kInner_SkBlurStyle);)
     96 
     97 DEF_BENCH(return new BlurBench(REALBIG, kNormal_SkBlurStyle);)
     98 DEF_BENCH(return new BlurBench(REALBIG, kSolid_SkBlurStyle);)
     99 DEF_BENCH(return new BlurBench(REALBIG, kOuter_SkBlurStyle);)
    100 DEF_BENCH(return new BlurBench(REALBIG, kInner_SkBlurStyle);)
    101 
    102 DEF_BENCH(return new BlurBench(REAL, kNormal_SkBlurStyle);)
    103 DEF_BENCH(return new BlurBench(REAL, kSolid_SkBlurStyle);)
    104 DEF_BENCH(return new BlurBench(REAL, kOuter_SkBlurStyle);)
    105 DEF_BENCH(return new BlurBench(REAL, kInner_SkBlurStyle);)
    106 
    107 DEF_BENCH(return new BlurBench(MINI, kNormal_SkBlurStyle, SkBlurMaskFilter::kHighQuality_BlurFlag);)
    108 
    109 DEF_BENCH(return new BlurBench(SMALL, kNormal_SkBlurStyle, SkBlurMaskFilter::kHighQuality_BlurFlag);)
    110 
    111 DEF_BENCH(return new BlurBench(BIG, kNormal_SkBlurStyle, SkBlurMaskFilter::kHighQuality_BlurFlag);)
    112 
    113 DEF_BENCH(return new BlurBench(REALBIG, kNormal_SkBlurStyle, SkBlurMaskFilter::kHighQuality_BlurFlag);)
    114 
    115 DEF_BENCH(return new BlurBench(REAL, kNormal_SkBlurStyle, SkBlurMaskFilter::kHighQuality_BlurFlag);)
    116 DEF_BENCH(return new BlurBench(CUTOVER, kNormal_SkBlurStyle, SkBlurMaskFilter::kHighQuality_BlurFlag);)
    117 
    118 DEF_BENCH(return new BlurBench(0, kNormal_SkBlurStyle);)
    119