PicturePlaybackBench.cpp revision 5fb2ce38b3dcb8e60e9e112df23c9d42456d7069
1/*
2 * Copyright 2011 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#include "SkBenchmark.h"
8#include "SkCanvas.h"
9#include "SkColor.h"
10#include "SkPaint.h"
11#include "SkPicture.h"
12#include "SkPoint.h"
13#include "SkRect.h"
14#include "SkString.h"
15
16// This is designed to emulate about 4 screens of textual content
17
18
19class PicturePlaybackBench : public SkBenchmark {
20public:
21    PicturePlaybackBench(const char name[])  {
22        fName.printf("picture_playback_%s", name);
23        fPictureWidth = SkIntToScalar(PICTURE_WIDTH);
24        fPictureHeight = SkIntToScalar(PICTURE_HEIGHT);
25        fTextSize = SkIntToScalar(TEXT_SIZE);
26    }
27
28    enum {
29        PICTURE_WIDTH = 1000,
30        PICTURE_HEIGHT = 4000,
31        TEXT_SIZE = 10
32    };
33protected:
34    virtual const char* onGetName() {
35        return fName.c_str();
36    }
37
38    virtual void onDraw(const int loops, SkCanvas* canvas) {
39
40        SkPictureRecorder recorder;
41        SkCanvas* pCanvas = recorder.beginRecording(PICTURE_WIDTH, PICTURE_HEIGHT, NULL, 0);
42        this->recordCanvas(pCanvas);
43        SkAutoTUnref<SkPicture> picture(recorder.endRecording());
44
45        const SkPoint translateDelta = getTranslateDelta(loops);
46
47        for (int i = 0; i < loops; i++) {
48            picture->draw(canvas);
49            canvas->translate(translateDelta.fX, translateDelta.fY);
50        }
51    }
52
53    virtual void recordCanvas(SkCanvas* canvas) = 0;
54    virtual SkPoint getTranslateDelta(int N) {
55        SkIPoint canvasSize = onGetSize();
56        return SkPoint::Make(SkIntToScalar((PICTURE_WIDTH - canvasSize.fX)/N),
57                             SkIntToScalar((PICTURE_HEIGHT- canvasSize.fY)/N));
58    }
59
60    SkString fName;
61    SkScalar fPictureWidth;
62    SkScalar fPictureHeight;
63    SkScalar fTextSize;
64private:
65    typedef SkBenchmark INHERITED;
66};
67
68
69class TextPlaybackBench : public PicturePlaybackBench {
70public:
71    TextPlaybackBench() : INHERITED("drawText") { }
72protected:
73    virtual void recordCanvas(SkCanvas* canvas) SK_OVERRIDE {
74        SkPaint paint;
75        paint.setTextSize(fTextSize);
76        paint.setColor(SK_ColorBLACK);
77
78        const char* text = "Hamburgefons";
79        size_t len = strlen(text);
80        const SkScalar textWidth = paint.measureText(text, len);
81
82        for (SkScalar x = 0; x < fPictureWidth; x += textWidth) {
83            for (SkScalar y = 0; y < fPictureHeight; y += fTextSize) {
84                canvas->drawText(text, len, x, y, paint);
85            }
86        }
87    }
88private:
89    typedef PicturePlaybackBench INHERITED;
90};
91
92class PosTextPlaybackBench : public PicturePlaybackBench {
93public:
94    PosTextPlaybackBench(bool drawPosH)
95        : INHERITED(drawPosH ? "drawPosTextH" : "drawPosText")
96        , fDrawPosH(drawPosH) { }
97protected:
98    virtual void recordCanvas(SkCanvas* canvas) SK_OVERRIDE {
99        SkPaint paint;
100        paint.setTextSize(fTextSize);
101        paint.setColor(SK_ColorBLACK);
102
103        const char* text = "Hamburgefons";
104        size_t len = strlen(text);
105        const SkScalar textWidth = paint.measureText(text, len);
106
107        SkScalar* adv = new SkScalar[len];
108        paint.getTextWidths(text, len, adv);
109
110        for (SkScalar x = 0; x < fPictureWidth; x += textWidth) {
111            for (SkScalar y = 0; y < fPictureHeight; y += fTextSize) {
112
113                SkPoint* pos = new SkPoint[len];
114                SkScalar advX = 0;
115
116                for (size_t i = 0; i < len; i++) {
117                    if (fDrawPosH)
118                        pos[i].set(x + advX, y);
119                    else
120                        pos[i].set(x + advX, y + i);
121                    advX += adv[i];
122                }
123
124                canvas->drawPosText(text, len, pos, paint);
125                delete[] pos;
126            }
127        }
128        delete[] adv;
129    }
130private:
131    bool fDrawPosH;
132    typedef PicturePlaybackBench INHERITED;
133};
134
135
136///////////////////////////////////////////////////////////////////////////////
137
138DEF_BENCH( return new TextPlaybackBench(); )
139DEF_BENCH( return new PosTextPlaybackBench(true); )
140DEF_BENCH( return new PosTextPlaybackBench(false); )
141