Home | History | Annotate | Download | only in bench
      1 /*
      2  * Copyright 2015 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 #include "SkCanvas.h"
     10 #include "SkPath.h"
     11 #include "sk_tool_utils.h"
     12 
     13 enum Align {
     14     kLeft_Align,
     15     kMiddle_Align,
     16     kRight_Align
     17 };
     18 
     19 const char* gAlignName[] = { "left", "middle", "right" };
     20 
     21 // Inspired by crbug.com/455429
     22 class BigPathBench : public Benchmark {
     23     SkPath      fPath;
     24     SkString    fName;
     25     Align       fAlign;
     26     bool        fRound;
     27 
     28 public:
     29     BigPathBench(Align align, bool round) : fAlign(align), fRound(round) {
     30         fName.printf("bigpath_%s", gAlignName[fAlign]);
     31         if (round) {
     32             fName.append("_round");
     33         }
     34     }
     35 
     36 protected:
     37     const char* onGetName() override {
     38         return fName.c_str();
     39     }
     40 
     41     SkIPoint onGetSize() override {
     42         return SkIPoint::Make(640, 100);
     43     }
     44 
     45     void onDelayedSetup() override {
     46         sk_tool_utils::make_big_path(fPath);
     47     }
     48 
     49     void onDraw(int loops, SkCanvas* canvas) override {
     50         SkPaint paint;
     51         paint.setAntiAlias(true);
     52         paint.setStyle(SkPaint::kStroke_Style);
     53         paint.setStrokeWidth(2);
     54         if (fRound) {
     55             paint.setStrokeJoin(SkPaint::kRound_Join);
     56         }
     57         this->setupPaint(&paint);
     58 
     59         const SkRect r = fPath.getBounds();
     60         switch (fAlign) {
     61             case kLeft_Align:
     62                 canvas->translate(-r.left(), 0);
     63                 break;
     64             case kMiddle_Align:
     65                 break;
     66             case kRight_Align:
     67                 canvas->translate(640 - r.right(), 0);
     68                 break;
     69         }
     70 
     71         for (int i = 0; i < loops; i++) {
     72             canvas->drawPath(fPath, paint);
     73         }
     74     }
     75 
     76 private:
     77     typedef Benchmark INHERITED;
     78 };
     79 
     80 DEF_BENCH( return new BigPathBench(kLeft_Align,     false); )
     81 DEF_BENCH( return new BigPathBench(kMiddle_Align,   false); )
     82 DEF_BENCH( return new BigPathBench(kRight_Align,    false); )
     83 
     84 DEF_BENCH( return new BigPathBench(kLeft_Align,     true); )
     85 DEF_BENCH( return new BigPathBench(kMiddle_Align,   true); )
     86 DEF_BENCH( return new BigPathBench(kRight_Align,    true); )
     87