1282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/*
2282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Copyright 2011 Google Inc.
3282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
4282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Use of this source code is governed by a BSD-style license that can be
5282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * found in the LICENSE file.
6282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */
7282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "Benchmark.h"
8282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "SkCanvas.h"
9282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "SkColor.h"
10282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "SkPaint.h"
11282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "SkPicture.h"
12282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "SkPictureRecorder.h"
13282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "SkPoint.h"
14282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "SkRect.h"
15282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "SkString.h"
16282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
17282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// This is designed to emulate about 4 screens of textual content
18282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
19282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiclass PicturePlaybackBench : public Benchmark {
21282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipublic:
22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    PicturePlaybackBench(const char name[])  {
23282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fName.printf("picture_playback_%s", name);
24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fPictureWidth = SkIntToScalar(PICTURE_WIDTH);
25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fPictureHeight = SkIntToScalar(PICTURE_HEIGHT);
26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        fTextSize = SkIntToScalar(TEXT_SIZE);
27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    enum {
30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        PICTURE_WIDTH = 1000,
31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        PICTURE_HEIGHT = 4000,
32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        TEXT_SIZE = 10
33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    };
34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiprotected:
35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual const char* onGetName() {
36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return fName.c_str();
37282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
386381dd4ff212a95be30d2b445d40ff419ab076b4Narayan Kamath
396381dd4ff212a95be30d2b445d40ff419ab076b4Narayan Kamath    virtual void onDraw(const int loops, SkCanvas* canvas) {
406381dd4ff212a95be30d2b445d40ff419ab076b4Narayan Kamath
41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        SkPictureRecorder recorder;
42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        SkCanvas* pCanvas = recorder.beginRecording(PICTURE_WIDTH, PICTURE_HEIGHT, NULL, 0);
43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        this->recordCanvas(pCanvas);
44282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        SkAutoTUnref<SkPicture> picture(recorder.endRecording());
45282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const SkPoint translateDelta = getTranslateDelta(loops);
47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        for (int i = 0; i < loops; i++) {
49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            picture->playback(canvas);
50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            canvas->translate(translateDelta.fX, translateDelta.fY);
516381dd4ff212a95be30d2b445d40ff419ab076b4Narayan Kamath        }
526381dd4ff212a95be30d2b445d40ff419ab076b4Narayan Kamath    }
536381dd4ff212a95be30d2b445d40ff419ab076b4Narayan Kamath
546381dd4ff212a95be30d2b445d40ff419ab076b4Narayan Kamath    virtual void recordCanvas(SkCanvas* canvas) = 0;
556381dd4ff212a95be30d2b445d40ff419ab076b4Narayan Kamath    virtual SkPoint getTranslateDelta(int N) {
566381dd4ff212a95be30d2b445d40ff419ab076b4Narayan Kamath        SkIPoint canvasSize = onGetSize();
576381dd4ff212a95be30d2b445d40ff419ab076b4Narayan Kamath        return SkPoint::Make(SkIntToScalar((PICTURE_WIDTH - canvasSize.fX)/N),
586381dd4ff212a95be30d2b445d40ff419ab076b4Narayan Kamath                             SkIntToScalar((PICTURE_HEIGHT- canvasSize.fY)/N));
596381dd4ff212a95be30d2b445d40ff419ab076b4Narayan Kamath    }
60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    SkString fName;
62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    SkScalar fPictureWidth;
63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    SkScalar fPictureHeight;
64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    SkScalar fTextSize;
65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiprivate:
66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    typedef Benchmark INHERITED;
67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
696381dd4ff212a95be30d2b445d40ff419ab076b4Narayan Kamath
706381dd4ff212a95be30d2b445d40ff419ab076b4Narayan Kamathclass TextPlaybackBench : public PicturePlaybackBench {
716381dd4ff212a95be30d2b445d40ff419ab076b4Narayan Kamathpublic:
72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    TextPlaybackBench() : INHERITED("drawText") { }
73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiprotected:
74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void recordCanvas(SkCanvas* canvas) SK_OVERRIDE {
75282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        SkPaint paint;
76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        paint.setTextSize(fTextSize);
77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        paint.setColor(SK_ColorBLACK);
78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const char* text = "Hamburgefons";
8047cd8e921db73e894f94ec4729ade90da50996f5Chris Craik        size_t len = strlen(text);
8147cd8e921db73e894f94ec4729ade90da50996f5Chris Craik        const SkScalar textWidth = paint.measureText(text, len);
8247cd8e921db73e894f94ec4729ade90da50996f5Chris Craik
8347cd8e921db73e894f94ec4729ade90da50996f5Chris Craik        for (SkScalar x = 0; x < fPictureWidth; x += textWidth) {
8447cd8e921db73e894f94ec4729ade90da50996f5Chris Craik            for (SkScalar y = 0; y < fPictureHeight; y += fTextSize) {
8547cd8e921db73e894f94ec4729ade90da50996f5Chris Craik                canvas->drawText(text, len, x, y, paint);
8677b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik            }
8747cd8e921db73e894f94ec4729ade90da50996f5Chris Craik        }
88282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
89282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiprivate:
90282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    typedef PicturePlaybackBench INHERITED;
91282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
92859e19f97d481bf07c768087d8eb3031fac77aadJohn Reck
93859e19f97d481bf07c768087d8eb3031fac77aadJohn Reckclass PosTextPlaybackBench : public PicturePlaybackBench {
94859e19f97d481bf07c768087d8eb3031fac77aadJohn Reckpublic:
95859e19f97d481bf07c768087d8eb3031fac77aadJohn Reck    PosTextPlaybackBench(bool drawPosH)
96859e19f97d481bf07c768087d8eb3031fac77aadJohn Reck        : INHERITED(drawPosH ? "drawPosTextH" : "drawPosText")
97859e19f97d481bf07c768087d8eb3031fac77aadJohn Reck        , fDrawPosH(drawPosH) { }
98282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiprotected:
99282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual void recordCanvas(SkCanvas* canvas) SK_OVERRIDE {
100282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        SkPaint paint;
101282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        paint.setTextSize(fTextSize);
102282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        paint.setColor(SK_ColorBLACK);
103282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
104282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const char* text = "Hamburgefons";
105282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        size_t len = strlen(text);
106859e19f97d481bf07c768087d8eb3031fac77aadJohn Reck        const SkScalar textWidth = paint.measureText(text, len);
107859e19f97d481bf07c768087d8eb3031fac77aadJohn Reck
108282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        SkScalar* adv = new SkScalar[len];
109282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        paint.getTextWidths(text, len, adv);
110282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
111282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        for (SkScalar x = 0; x < fPictureWidth; x += textWidth) {
112282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            for (SkScalar y = 0; y < fPictureHeight; y += fTextSize) {
113282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
114282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                SkPoint* pos = new SkPoint[len];
115282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                SkScalar advX = 0;
116282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
117282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                for (size_t i = 0; i < len; i++) {
118282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    if (fDrawPosH)
119282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        pos[i].set(x + advX, y);
120282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    else
121282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        pos[i].set(x + advX, y + i);
122282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    advX += adv[i];
123282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
124282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
125282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                canvas->drawPosText(text, len, pos, paint);
126282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                delete[] pos;
127282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
128282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
129282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        delete[] adv;
130282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
131282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiprivate:
132282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    bool fDrawPosH;
133282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    typedef PicturePlaybackBench INHERITED;
134282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
135282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
136282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
137282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski///////////////////////////////////////////////////////////////////////////////
138859e19f97d481bf07c768087d8eb3031fac77aadJohn Reck
139859e19f97d481bf07c768087d8eb3031fac77aadJohn ReckDEF_BENCH( return new TextPlaybackBench(); )
140282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiDEF_BENCH( return new PosTextPlaybackBench(true); )
141282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiDEF_BENCH( return new PosTextPlaybackBench(false); )
142282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski