Home | History | Annotate | Download | only in bench
      1 
      2 /*
      3  * Copyright 2011 Google Inc.
      4  *
      5  * Use of this source code is governed by a BSD-style license that can be
      6  * found in the LICENSE file.
      7  */
      8 #include "SkBenchmark.h"
      9 #include "SkCanvas.h"
     10 #include "SkPaint.h"
     11 #include "SkRandom.h"
     12 #include "SkShader.h"
     13 #include "SkString.h"
     14 #include "SkBlurMaskFilter.h"
     15 
     16 #define SMALL   SkIntToScalar(2)
     17 #define REAL    SkFloatToScalar(1.5f)
     18 #define BIG     SkIntToScalar(10)
     19 #define REALBIG SkFloatToScalar(100.5f)
     20 
     21 static const char* gStyleName[] = {
     22     "normal",
     23     "solid",
     24     "outer",
     25     "inner"
     26 };
     27 
     28 class BlurBench : public SkBenchmark {
     29     SkScalar    fRadius;
     30     SkBlurMaskFilter::BlurStyle fStyle;
     31     uint32_t                    fFlags;
     32     SkString    fName;
     33 
     34 public:
     35     BlurBench(void* param, SkScalar rad, SkBlurMaskFilter::BlurStyle bs, uint32_t flags = 0) : INHERITED(param) {
     36         fRadius = rad;
     37         fStyle = bs;
     38         fFlags = flags;
     39         const char* name = rad > 0 ? gStyleName[bs] : "none";
     40         const char* quality = flags & SkBlurMaskFilter::kHighQuality_BlurFlag ? "high_quality" : "low_quality";
     41         if (SkScalarFraction(rad) != 0) {
     42             fName.printf("blur_%.2f_%s_%s", SkScalarToFloat(rad), name, quality);
     43         } else {
     44             fName.printf("blur_%d_%s_%s", SkScalarRound(rad), name, quality);
     45         }
     46     }
     47 
     48 protected:
     49     virtual const char* onGetName() {
     50         return fName.c_str();
     51     }
     52 
     53     virtual void onDraw(SkCanvas* canvas) {
     54         SkPaint paint;
     55         this->setupPaint(&paint);
     56 
     57         paint.setAntiAlias(true);
     58 
     59         SkRandom rand;
     60         for (int i = 0; i < SkBENCHLOOP(10); i++) {
     61             SkRect r = SkRect::MakeWH(rand.nextUScalar1() * 400,
     62                                       rand.nextUScalar1() * 400);
     63             r.offset(fRadius, fRadius);
     64 
     65             if (fRadius > 0) {
     66                 SkMaskFilter* mf = SkBlurMaskFilter::Create(fRadius, fStyle, fFlags);
     67                 paint.setMaskFilter(mf)->unref();
     68             }
     69             canvas->drawOval(r, paint);
     70         }
     71     }
     72 
     73 private:
     74     typedef SkBenchmark INHERITED;
     75 };
     76 
     77 DEF_BENCH(return new BlurBench(p, SMALL, SkBlurMaskFilter::kNormal_BlurStyle);)
     78 DEF_BENCH(return new BlurBench(p, SMALL, SkBlurMaskFilter::kSolid_BlurStyle);)
     79 DEF_BENCH(return new BlurBench(p, SMALL, SkBlurMaskFilter::kOuter_BlurStyle);)
     80 DEF_BENCH(return new BlurBench(p, SMALL, SkBlurMaskFilter::kInner_BlurStyle);)
     81 
     82 DEF_BENCH(return new BlurBench(p, BIG, SkBlurMaskFilter::kNormal_BlurStyle);)
     83 DEF_BENCH(return new BlurBench(p, BIG, SkBlurMaskFilter::kSolid_BlurStyle);)
     84 DEF_BENCH(return new BlurBench(p, BIG, SkBlurMaskFilter::kOuter_BlurStyle);)
     85 DEF_BENCH(return new BlurBench(p, BIG, SkBlurMaskFilter::kInner_BlurStyle);)
     86 
     87 DEF_BENCH(return new BlurBench(p, REALBIG, SkBlurMaskFilter::kNormal_BlurStyle);)
     88 DEF_BENCH(return new BlurBench(p, REALBIG, SkBlurMaskFilter::kSolid_BlurStyle);)
     89 DEF_BENCH(return new BlurBench(p, REALBIG, SkBlurMaskFilter::kOuter_BlurStyle);)
     90 DEF_BENCH(return new BlurBench(p, REALBIG, SkBlurMaskFilter::kInner_BlurStyle);)
     91 
     92 DEF_BENCH(return new BlurBench(p, REAL, SkBlurMaskFilter::kNormal_BlurStyle);)
     93 DEF_BENCH(return new BlurBench(p, REAL, SkBlurMaskFilter::kSolid_BlurStyle);)
     94 DEF_BENCH(return new BlurBench(p, REAL, SkBlurMaskFilter::kOuter_BlurStyle);)
     95 DEF_BENCH(return new BlurBench(p, REAL, SkBlurMaskFilter::kInner_BlurStyle);)
     96 
     97 DEF_BENCH(return new BlurBench(p, SMALL, SkBlurMaskFilter::kNormal_BlurStyle, SkBlurMaskFilter::kHighQuality_BlurFlag);)
     98 
     99 DEF_BENCH(return new BlurBench(p, BIG, SkBlurMaskFilter::kNormal_BlurStyle, SkBlurMaskFilter::kHighQuality_BlurFlag);)
    100 
    101 DEF_BENCH(return new BlurBench(p, REALBIG, SkBlurMaskFilter::kNormal_BlurStyle, SkBlurMaskFilter::kHighQuality_BlurFlag);)
    102 
    103 DEF_BENCH(return new BlurBench(p, REAL, SkBlurMaskFilter::kNormal_BlurStyle, SkBlurMaskFilter::kHighQuality_BlurFlag);)
    104 
    105 DEF_BENCH(return new BlurBench(p, 0, SkBlurMaskFilter::kNormal_BlurStyle);)
    106