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