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