144162675ca4b790c2af0fbd9c41f262c8be26b05fmalita/* 244162675ca4b790c2af0fbd9c41f262c8be26b05fmalita * Copyright 2014 Google Inc. 344162675ca4b790c2af0fbd9c41f262c8be26b05fmalita * 444162675ca4b790c2af0fbd9c41f262c8be26b05fmalita * Use of this source code is governed by a BSD-style license that can be 544162675ca4b790c2af0fbd9c41f262c8be26b05fmalita * found in the LICENSE file. 644162675ca4b790c2af0fbd9c41f262c8be26b05fmalita */ 744162675ca4b790c2af0fbd9c41f262c8be26b05fmalita 844162675ca4b790c2af0fbd9c41f262c8be26b05fmalita#include "Benchmark.h" 944162675ca4b790c2af0fbd9c41f262c8be26b05fmalita#include "SkCanvas.h" 1044162675ca4b790c2af0fbd9c41f262c8be26b05fmalita#include "SkColor.h" 1144162675ca4b790c2af0fbd9c41f262c8be26b05fmalita#include "SkNullCanvas.h" 1244162675ca4b790c2af0fbd9c41f262c8be26b05fmalita#include "SkPaint.h" 1344162675ca4b790c2af0fbd9c41f262c8be26b05fmalita#include "SkPicture.h" 1444162675ca4b790c2af0fbd9c41f262c8be26b05fmalita#include "SkPictureRecorder.h" 1544162675ca4b790c2af0fbd9c41f262c8be26b05fmalita#include "SkString.h" 1644162675ca4b790c2af0fbd9c41f262c8be26b05fmalita 1744162675ca4b790c2af0fbd9c41f262c8be26b05fmalitaclass PictureNesting : public Benchmark { 1844162675ca4b790c2af0fbd9c41f262c8be26b05fmalitapublic: 1944162675ca4b790c2af0fbd9c41f262c8be26b05fmalita PictureNesting(const char* name, int maxLevel, int maxPictureLevel) 2044162675ca4b790c2af0fbd9c41f262c8be26b05fmalita : fMaxLevel(maxLevel) 2144162675ca4b790c2af0fbd9c41f262c8be26b05fmalita , fMaxPictureLevel(maxPictureLevel) { 2244162675ca4b790c2af0fbd9c41f262c8be26b05fmalita 2344162675ca4b790c2af0fbd9c41f262c8be26b05fmalita fPaint.setColor(SK_ColorRED); 2444162675ca4b790c2af0fbd9c41f262c8be26b05fmalita fPaint.setAntiAlias(true); 2544162675ca4b790c2af0fbd9c41f262c8be26b05fmalita fPaint.setStyle(SkPaint::kStroke_Style); 26df886ea06f0978e10695b482e658cf3daa9a1fc9fmalita SkAutoTUnref<SkCanvas> nullCanvas(SkCreateNullCanvas()); 27df886ea06f0978e10695b482e658cf3daa9a1fc9fmalita fName.printf("picture_nesting_%s_%d", name, this->sierpinsky(nullCanvas, 0, fPaint)); 2844162675ca4b790c2af0fbd9c41f262c8be26b05fmalita } 2944162675ca4b790c2af0fbd9c41f262c8be26b05fmalita 3044162675ca4b790c2af0fbd9c41f262c8be26b05fmalitaprotected: 3144162675ca4b790c2af0fbd9c41f262c8be26b05fmalita virtual const char* onGetName() SK_OVERRIDE { 3244162675ca4b790c2af0fbd9c41f262c8be26b05fmalita return fName.c_str(); 3344162675ca4b790c2af0fbd9c41f262c8be26b05fmalita } 3444162675ca4b790c2af0fbd9c41f262c8be26b05fmalita 3544162675ca4b790c2af0fbd9c41f262c8be26b05fmalita void doDraw(SkCanvas* canvas) { 3644162675ca4b790c2af0fbd9c41f262c8be26b05fmalita SkIPoint canvasSize = onGetSize(); 3744162675ca4b790c2af0fbd9c41f262c8be26b05fmalita canvas->save(); 3844162675ca4b790c2af0fbd9c41f262c8be26b05fmalita canvas->scale(SkIntToScalar(canvasSize.x()), SkIntToScalar(canvasSize.y())); 3944162675ca4b790c2af0fbd9c41f262c8be26b05fmalita 4044162675ca4b790c2af0fbd9c41f262c8be26b05fmalita this->sierpinsky(canvas, 0, fPaint); 4144162675ca4b790c2af0fbd9c41f262c8be26b05fmalita 4244162675ca4b790c2af0fbd9c41f262c8be26b05fmalita canvas->restore(); 4344162675ca4b790c2af0fbd9c41f262c8be26b05fmalita } 4444162675ca4b790c2af0fbd9c41f262c8be26b05fmalita 4544162675ca4b790c2af0fbd9c41f262c8be26b05fmalita int sierpinsky(SkCanvas* canvas, int lvl, const SkPaint& paint) { 4644162675ca4b790c2af0fbd9c41f262c8be26b05fmalita if (++lvl > fMaxLevel) { 4744162675ca4b790c2af0fbd9c41f262c8be26b05fmalita return 0; 4844162675ca4b790c2af0fbd9c41f262c8be26b05fmalita } 4944162675ca4b790c2af0fbd9c41f262c8be26b05fmalita 5044162675ca4b790c2af0fbd9c41f262c8be26b05fmalita int pics = 0; 5144162675ca4b790c2af0fbd9c41f262c8be26b05fmalita bool recordPicture = lvl <= fMaxPictureLevel; 5244162675ca4b790c2af0fbd9c41f262c8be26b05fmalita SkPictureRecorder recorder; 5344162675ca4b790c2af0fbd9c41f262c8be26b05fmalita SkCanvas* c = canvas; 5444162675ca4b790c2af0fbd9c41f262c8be26b05fmalita 5544162675ca4b790c2af0fbd9c41f262c8be26b05fmalita if (recordPicture) { 5644162675ca4b790c2af0fbd9c41f262c8be26b05fmalita c = recorder.beginRecording(1, 1); 5744162675ca4b790c2af0fbd9c41f262c8be26b05fmalita pics++; 5844162675ca4b790c2af0fbd9c41f262c8be26b05fmalita } 5944162675ca4b790c2af0fbd9c41f262c8be26b05fmalita 6044162675ca4b790c2af0fbd9c41f262c8be26b05fmalita c->drawLine(0.5, 0, 0, 1, paint); 6144162675ca4b790c2af0fbd9c41f262c8be26b05fmalita c->drawLine(0.5, 0, 1, 1, paint); 6244162675ca4b790c2af0fbd9c41f262c8be26b05fmalita c->drawLine(0, 1, 1, 1, paint); 6344162675ca4b790c2af0fbd9c41f262c8be26b05fmalita 6444162675ca4b790c2af0fbd9c41f262c8be26b05fmalita c->save(); 6544162675ca4b790c2af0fbd9c41f262c8be26b05fmalita c->scale(0.5, 0.5); 6644162675ca4b790c2af0fbd9c41f262c8be26b05fmalita 6744162675ca4b790c2af0fbd9c41f262c8be26b05fmalita c->translate(0, 1); 6844162675ca4b790c2af0fbd9c41f262c8be26b05fmalita pics += this->sierpinsky(c, lvl, paint); 6944162675ca4b790c2af0fbd9c41f262c8be26b05fmalita 7044162675ca4b790c2af0fbd9c41f262c8be26b05fmalita c->translate(1, 0); 7144162675ca4b790c2af0fbd9c41f262c8be26b05fmalita pics += this->sierpinsky(c, lvl, paint); 7244162675ca4b790c2af0fbd9c41f262c8be26b05fmalita 7344162675ca4b790c2af0fbd9c41f262c8be26b05fmalita c->translate(-0.5, -1); 7444162675ca4b790c2af0fbd9c41f262c8be26b05fmalita pics += this->sierpinsky(c, lvl, paint); 7544162675ca4b790c2af0fbd9c41f262c8be26b05fmalita c->restore(); 7644162675ca4b790c2af0fbd9c41f262c8be26b05fmalita 7744162675ca4b790c2af0fbd9c41f262c8be26b05fmalita if (recordPicture) { 7844162675ca4b790c2af0fbd9c41f262c8be26b05fmalita SkAutoTUnref<SkPicture> picture(recorder.endRecording()); 7944162675ca4b790c2af0fbd9c41f262c8be26b05fmalita canvas->drawPicture(picture); 8044162675ca4b790c2af0fbd9c41f262c8be26b05fmalita } 8144162675ca4b790c2af0fbd9c41f262c8be26b05fmalita 8244162675ca4b790c2af0fbd9c41f262c8be26b05fmalita return pics; 8344162675ca4b790c2af0fbd9c41f262c8be26b05fmalita } 8444162675ca4b790c2af0fbd9c41f262c8be26b05fmalita 8544162675ca4b790c2af0fbd9c41f262c8be26b05fmalita int fMaxLevel; 8644162675ca4b790c2af0fbd9c41f262c8be26b05fmalita int fMaxPictureLevel; 8744162675ca4b790c2af0fbd9c41f262c8be26b05fmalita 8844162675ca4b790c2af0fbd9c41f262c8be26b05fmalitaprivate: 8944162675ca4b790c2af0fbd9c41f262c8be26b05fmalita SkString fName; 9044162675ca4b790c2af0fbd9c41f262c8be26b05fmalita SkPaint fPaint; 9144162675ca4b790c2af0fbd9c41f262c8be26b05fmalita 9244162675ca4b790c2af0fbd9c41f262c8be26b05fmalita typedef Benchmark INHERITED; 9344162675ca4b790c2af0fbd9c41f262c8be26b05fmalita}; 9444162675ca4b790c2af0fbd9c41f262c8be26b05fmalita 9544162675ca4b790c2af0fbd9c41f262c8be26b05fmalitaclass PictureNestingRecording : public PictureNesting { 9644162675ca4b790c2af0fbd9c41f262c8be26b05fmalitapublic: 9744162675ca4b790c2af0fbd9c41f262c8be26b05fmalita PictureNestingRecording(int maxLevel, int maxPictureLevel) 9844162675ca4b790c2af0fbd9c41f262c8be26b05fmalita : INHERITED("recording", maxLevel, maxPictureLevel) { 9944162675ca4b790c2af0fbd9c41f262c8be26b05fmalita } 10044162675ca4b790c2af0fbd9c41f262c8be26b05fmalita 10144162675ca4b790c2af0fbd9c41f262c8be26b05fmalitaprotected: 102e1daac9b2671d723ee26c0fc6e7e54f42d423c6bmtklein virtual bool isSuitableFor(Backend backend) { 103e1daac9b2671d723ee26c0fc6e7e54f42d423c6bmtklein return backend == kNonRendering_Backend; 104e1daac9b2671d723ee26c0fc6e7e54f42d423c6bmtklein } 105e1daac9b2671d723ee26c0fc6e7e54f42d423c6bmtklein 106e1daac9b2671d723ee26c0fc6e7e54f42d423c6bmtklein virtual void onDraw(const int loops, SkCanvas*) { 10744162675ca4b790c2af0fbd9c41f262c8be26b05fmalita SkIPoint canvasSize = onGetSize(); 10844162675ca4b790c2af0fbd9c41f262c8be26b05fmalita SkPictureRecorder recorder; 10944162675ca4b790c2af0fbd9c41f262c8be26b05fmalita 11044162675ca4b790c2af0fbd9c41f262c8be26b05fmalita for (int i = 0; i < loops; i++) { 11144162675ca4b790c2af0fbd9c41f262c8be26b05fmalita SkCanvas* c = recorder.beginRecording(SkIntToScalar(canvasSize.x()), 11244162675ca4b790c2af0fbd9c41f262c8be26b05fmalita SkIntToScalar(canvasSize.y())); 11344162675ca4b790c2af0fbd9c41f262c8be26b05fmalita this->doDraw(c); 11444162675ca4b790c2af0fbd9c41f262c8be26b05fmalita SkAutoTUnref<SkPicture> picture(recorder.endRecording()); 11544162675ca4b790c2af0fbd9c41f262c8be26b05fmalita } 11644162675ca4b790c2af0fbd9c41f262c8be26b05fmalita } 11744162675ca4b790c2af0fbd9c41f262c8be26b05fmalita 11844162675ca4b790c2af0fbd9c41f262c8be26b05fmalitaprivate: 11944162675ca4b790c2af0fbd9c41f262c8be26b05fmalita typedef PictureNesting INHERITED; 12044162675ca4b790c2af0fbd9c41f262c8be26b05fmalita}; 12144162675ca4b790c2af0fbd9c41f262c8be26b05fmalita 12244162675ca4b790c2af0fbd9c41f262c8be26b05fmalitaclass PictureNestingPlayback : public PictureNesting { 12344162675ca4b790c2af0fbd9c41f262c8be26b05fmalitapublic: 12444162675ca4b790c2af0fbd9c41f262c8be26b05fmalita PictureNestingPlayback(int maxLevel, int maxPictureLevel) 12544162675ca4b790c2af0fbd9c41f262c8be26b05fmalita : INHERITED("playback", maxLevel, maxPictureLevel) { 12644162675ca4b790c2af0fbd9c41f262c8be26b05fmalita 12744162675ca4b790c2af0fbd9c41f262c8be26b05fmalita SkIPoint canvasSize = onGetSize(); 12844162675ca4b790c2af0fbd9c41f262c8be26b05fmalita SkPictureRecorder recorder; 12944162675ca4b790c2af0fbd9c41f262c8be26b05fmalita SkCanvas* c = recorder.beginRecording(SkIntToScalar(canvasSize.x()), 13044162675ca4b790c2af0fbd9c41f262c8be26b05fmalita SkIntToScalar(canvasSize.y())); 13144162675ca4b790c2af0fbd9c41f262c8be26b05fmalita 13244162675ca4b790c2af0fbd9c41f262c8be26b05fmalita this->doDraw(c); 13344162675ca4b790c2af0fbd9c41f262c8be26b05fmalita fPicture.reset(recorder.endRecording()); 13444162675ca4b790c2af0fbd9c41f262c8be26b05fmalita } 13544162675ca4b790c2af0fbd9c41f262c8be26b05fmalita 13644162675ca4b790c2af0fbd9c41f262c8be26b05fmalitaprotected: 13744162675ca4b790c2af0fbd9c41f262c8be26b05fmalita virtual void onDraw(const int loops, SkCanvas* canvas) { 13844162675ca4b790c2af0fbd9c41f262c8be26b05fmalita for (int i = 0; i < loops; i++) { 13944162675ca4b790c2af0fbd9c41f262c8be26b05fmalita canvas->drawPicture(fPicture); 14044162675ca4b790c2af0fbd9c41f262c8be26b05fmalita } 14144162675ca4b790c2af0fbd9c41f262c8be26b05fmalita } 14244162675ca4b790c2af0fbd9c41f262c8be26b05fmalita 14344162675ca4b790c2af0fbd9c41f262c8be26b05fmalitaprivate: 14444162675ca4b790c2af0fbd9c41f262c8be26b05fmalita SkAutoTUnref<SkPicture> fPicture; 14544162675ca4b790c2af0fbd9c41f262c8be26b05fmalita 14644162675ca4b790c2af0fbd9c41f262c8be26b05fmalita typedef PictureNesting INHERITED; 14744162675ca4b790c2af0fbd9c41f262c8be26b05fmalita}; 14844162675ca4b790c2af0fbd9c41f262c8be26b05fmalita 14944162675ca4b790c2af0fbd9c41f262c8be26b05fmalitaDEF_BENCH( return new PictureNestingRecording(8, 0); ) 15044162675ca4b790c2af0fbd9c41f262c8be26b05fmalitaDEF_BENCH( return new PictureNestingRecording(8, 1); ) 15144162675ca4b790c2af0fbd9c41f262c8be26b05fmalitaDEF_BENCH( return new PictureNestingRecording(8, 2); ) 15244162675ca4b790c2af0fbd9c41f262c8be26b05fmalitaDEF_BENCH( return new PictureNestingRecording(8, 3); ) 15344162675ca4b790c2af0fbd9c41f262c8be26b05fmalitaDEF_BENCH( return new PictureNestingRecording(8, 4); ) 15444162675ca4b790c2af0fbd9c41f262c8be26b05fmalitaDEF_BENCH( return new PictureNestingRecording(8, 5); ) 15544162675ca4b790c2af0fbd9c41f262c8be26b05fmalitaDEF_BENCH( return new PictureNestingRecording(8, 6); ) 15644162675ca4b790c2af0fbd9c41f262c8be26b05fmalitaDEF_BENCH( return new PictureNestingRecording(8, 7); ) 15744162675ca4b790c2af0fbd9c41f262c8be26b05fmalitaDEF_BENCH( return new PictureNestingRecording(8, 8); ) 15844162675ca4b790c2af0fbd9c41f262c8be26b05fmalita 15944162675ca4b790c2af0fbd9c41f262c8be26b05fmalitaDEF_BENCH( return new PictureNestingPlayback(8, 0); ) 16044162675ca4b790c2af0fbd9c41f262c8be26b05fmalitaDEF_BENCH( return new PictureNestingPlayback(8, 1); ) 16144162675ca4b790c2af0fbd9c41f262c8be26b05fmalitaDEF_BENCH( return new PictureNestingPlayback(8, 2); ) 16244162675ca4b790c2af0fbd9c41f262c8be26b05fmalitaDEF_BENCH( return new PictureNestingPlayback(8, 3); ) 16344162675ca4b790c2af0fbd9c41f262c8be26b05fmalitaDEF_BENCH( return new PictureNestingPlayback(8, 4); ) 16444162675ca4b790c2af0fbd9c41f262c8be26b05fmalitaDEF_BENCH( return new PictureNestingPlayback(8, 5); ) 16544162675ca4b790c2af0fbd9c41f262c8be26b05fmalitaDEF_BENCH( return new PictureNestingPlayback(8, 6); ) 16644162675ca4b790c2af0fbd9c41f262c8be26b05fmalitaDEF_BENCH( return new PictureNestingPlayback(8, 7); ) 16744162675ca4b790c2af0fbd9c41f262c8be26b05fmalitaDEF_BENCH( return new PictureNestingPlayback(8, 8); ) 168