Home | History | Annotate | Download | only in bench
      1 /*
      2  * Copyright 2014 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 "SkColor.h"
     11 #include "SkNullCanvas.h"
     12 #include "SkPaint.h"
     13 #include "SkPicture.h"
     14 #include "SkPictureRecorder.h"
     15 #include "SkString.h"
     16 
     17 class PictureNesting : public Benchmark {
     18 public:
     19     PictureNesting(const char* name, int maxLevel, int maxPictureLevel)
     20         : fMaxLevel(maxLevel)
     21         , fMaxPictureLevel(maxPictureLevel) {
     22 
     23         fPaint.setColor(SK_ColorRED);
     24         fPaint.setAntiAlias(true);
     25         fPaint.setStyle(SkPaint::kStroke_Style);
     26         SkAutoTUnref<SkCanvas> nullCanvas(SkCreateNullCanvas());
     27         fName.printf("picture_nesting_%s_%d", name, this->sierpinsky(nullCanvas, 0, fPaint));
     28     }
     29 
     30 protected:
     31     virtual const char* onGetName() SK_OVERRIDE {
     32         return fName.c_str();
     33     }
     34 
     35     void doDraw(SkCanvas* canvas) {
     36         SkIPoint canvasSize = onGetSize();
     37         canvas->save();
     38         canvas->scale(SkIntToScalar(canvasSize.x()), SkIntToScalar(canvasSize.y()));
     39 
     40         this->sierpinsky(canvas, 0, fPaint);
     41 
     42         canvas->restore();
     43     }
     44 
     45     int sierpinsky(SkCanvas* canvas, int lvl, const SkPaint& paint) {
     46         if (++lvl > fMaxLevel) {
     47             return 0;
     48         }
     49 
     50         int pics = 0;
     51         bool recordPicture = lvl <= fMaxPictureLevel;
     52         SkPictureRecorder recorder;
     53         SkCanvas* c = canvas;
     54 
     55         if (recordPicture) {
     56             c = recorder.beginRecording(1, 1);
     57             pics++;
     58         }
     59 
     60         c->drawLine(0.5, 0, 0, 1, paint);
     61         c->drawLine(0.5, 0, 1, 1, paint);
     62         c->drawLine(0,   1, 1, 1, paint);
     63 
     64         c->save();
     65             c->scale(0.5, 0.5);
     66 
     67             c->translate(0, 1);
     68             pics += this->sierpinsky(c, lvl, paint);
     69 
     70             c->translate(1, 0);
     71             pics += this->sierpinsky(c, lvl, paint);
     72 
     73             c->translate(-0.5, -1);
     74             pics += this->sierpinsky(c, lvl, paint);
     75         c->restore();
     76 
     77         if (recordPicture) {
     78             SkAutoTUnref<SkPicture> picture(recorder.endRecording());
     79             canvas->drawPicture(picture);
     80         }
     81 
     82         return pics;
     83     }
     84 
     85     int fMaxLevel;
     86     int fMaxPictureLevel;
     87 
     88 private:
     89     SkString fName;
     90     SkPaint  fPaint;
     91 
     92     typedef Benchmark INHERITED;
     93 };
     94 
     95 class PictureNestingRecording : public PictureNesting {
     96 public:
     97     PictureNestingRecording(int maxLevel, int maxPictureLevel)
     98         : INHERITED("recording", maxLevel, maxPictureLevel) {
     99     }
    100 
    101 protected:
    102     virtual bool isSuitableFor(Backend backend) {
    103         return backend == kNonRendering_Backend;
    104     }
    105 
    106     virtual void onDraw(const int loops, SkCanvas*) {
    107         SkIPoint canvasSize = onGetSize();
    108         SkPictureRecorder recorder;
    109 
    110         for (int i = 0; i < loops; i++) {
    111             SkCanvas* c = recorder.beginRecording(SkIntToScalar(canvasSize.x()),
    112                                                   SkIntToScalar(canvasSize.y()));
    113             this->doDraw(c);
    114             SkAutoTUnref<SkPicture> picture(recorder.endRecording());
    115         }
    116     }
    117 
    118 private:
    119     typedef PictureNesting INHERITED;
    120 };
    121 
    122 class PictureNestingPlayback : public PictureNesting {
    123 public:
    124     PictureNestingPlayback(int maxLevel, int maxPictureLevel)
    125         : INHERITED("playback", maxLevel, maxPictureLevel) {
    126 
    127         SkIPoint canvasSize = onGetSize();
    128         SkPictureRecorder recorder;
    129         SkCanvas* c = recorder.beginRecording(SkIntToScalar(canvasSize.x()),
    130                                               SkIntToScalar(canvasSize.y()));
    131 
    132         this->doDraw(c);
    133         fPicture.reset(recorder.endRecording());
    134     }
    135 
    136 protected:
    137     virtual void onDraw(const int loops, SkCanvas* canvas) {
    138         for (int i = 0; i < loops; i++) {
    139             canvas->drawPicture(fPicture);
    140         }
    141     }
    142 
    143 private:
    144     SkAutoTUnref<SkPicture> fPicture;
    145 
    146     typedef PictureNesting INHERITED;
    147 };
    148 
    149 DEF_BENCH( return new PictureNestingRecording(8, 0); )
    150 DEF_BENCH( return new PictureNestingRecording(8, 1); )
    151 DEF_BENCH( return new PictureNestingRecording(8, 2); )
    152 DEF_BENCH( return new PictureNestingRecording(8, 3); )
    153 DEF_BENCH( return new PictureNestingRecording(8, 4); )
    154 DEF_BENCH( return new PictureNestingRecording(8, 5); )
    155 DEF_BENCH( return new PictureNestingRecording(8, 6); )
    156 DEF_BENCH( return new PictureNestingRecording(8, 7); )
    157 DEF_BENCH( return new PictureNestingRecording(8, 8); )
    158 
    159 DEF_BENCH( return new PictureNestingPlayback(8, 0); )
    160 DEF_BENCH( return new PictureNestingPlayback(8, 1); )
    161 DEF_BENCH( return new PictureNestingPlayback(8, 2); )
    162 DEF_BENCH( return new PictureNestingPlayback(8, 3); )
    163 DEF_BENCH( return new PictureNestingPlayback(8, 4); )
    164 DEF_BENCH( return new PictureNestingPlayback(8, 5); )
    165 DEF_BENCH( return new PictureNestingPlayback(8, 6); )
    166 DEF_BENCH( return new PictureNestingPlayback(8, 7); )
    167 DEF_BENCH( return new PictureNestingPlayback(8, 8); )
    168