blob: 0109c720fc0431186729edfeeff8e899e4349226 [file] [log] [blame]
djsollen@google.com809a2a92012-02-23 20:57:09 +00001/*
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 */
tfarinaf168b862014-06-19 12:32:29 -07007#include "Benchmark.h"
djsollen@google.com809a2a92012-02-23 20:57:09 +00008#include "SkCanvas.h"
9#include "SkColor.h"
10#include "SkPaint.h"
11#include "SkPicture.h"
robertphillips@google.com770963f2014-04-18 18:04:41 +000012#include "SkPictureRecorder.h"
djsollen@google.com809a2a92012-02-23 20:57:09 +000013#include "SkPoint.h"
14#include "SkRect.h"
15#include "SkString.h"
16
17// This is designed to emulate about 4 screens of textual content
18
19
tfarinaf168b862014-06-19 12:32:29 -070020class PicturePlaybackBench : public Benchmark {
djsollen@google.com809a2a92012-02-23 20:57:09 +000021public:
mtklein@google.com410e6e82013-09-13 19:52:27 +000022 PicturePlaybackBench(const char name[]) {
djsollen@google.com809a2a92012-02-23 20:57:09 +000023 fName.printf("picture_playback_%s", name);
24 fPictureWidth = SkIntToScalar(PICTURE_WIDTH);
25 fPictureHeight = SkIntToScalar(PICTURE_HEIGHT);
26 fTextSize = SkIntToScalar(TEXT_SIZE);
27 }
28
29 enum {
djsollen@google.com809a2a92012-02-23 20:57:09 +000030 PICTURE_WIDTH = 1000,
31 PICTURE_HEIGHT = 4000,
32 TEXT_SIZE = 10
33 };
34protected:
35 virtual const char* onGetName() {
36 return fName.c_str();
37 }
38
commit-bot@chromium.org33614712013-12-03 18:17:16 +000039 virtual void onDraw(const int loops, SkCanvas* canvas) {
djsollen@google.com809a2a92012-02-23 20:57:09 +000040
robertphillips@google.com84b18c72014-04-13 19:09:42 +000041 SkPictureRecorder recorder;
commit-bot@chromium.org5fb2ce32014-04-17 23:35:06 +000042 SkCanvas* pCanvas = recorder.beginRecording(PICTURE_WIDTH, PICTURE_HEIGHT, NULL, 0);
robertphillips@google.com84b18c72014-04-13 19:09:42 +000043 this->recordCanvas(pCanvas);
44 SkAutoTUnref<SkPicture> picture(recorder.endRecording());
djsollen@google.com809a2a92012-02-23 20:57:09 +000045
commit-bot@chromium.org33614712013-12-03 18:17:16 +000046 const SkPoint translateDelta = getTranslateDelta(loops);
djsollen@google.com809a2a92012-02-23 20:57:09 +000047
commit-bot@chromium.org33614712013-12-03 18:17:16 +000048 for (int i = 0; i < loops; i++) {
robertphillips@google.com84b18c72014-04-13 19:09:42 +000049 picture->draw(canvas);
djsollen@google.com809a2a92012-02-23 20:57:09 +000050 canvas->translate(translateDelta.fX, translateDelta.fY);
51 }
52 }
53
54 virtual void recordCanvas(SkCanvas* canvas) = 0;
mtklein@google.comc2897432013-09-10 19:23:38 +000055 virtual SkPoint getTranslateDelta(int N) {
djsollen@google.com809a2a92012-02-23 20:57:09 +000056 SkIPoint canvasSize = onGetSize();
57 return SkPoint::Make(SkIntToScalar((PICTURE_WIDTH - canvasSize.fX)/N),
58 SkIntToScalar((PICTURE_HEIGHT- canvasSize.fY)/N));
59 }
60
61 SkString fName;
62 SkScalar fPictureWidth;
63 SkScalar fPictureHeight;
64 SkScalar fTextSize;
65private:
tfarinaf168b862014-06-19 12:32:29 -070066 typedef Benchmark INHERITED;
djsollen@google.com809a2a92012-02-23 20:57:09 +000067};
68
69
70class TextPlaybackBench : public PicturePlaybackBench {
71public:
mtklein@google.com410e6e82013-09-13 19:52:27 +000072 TextPlaybackBench() : INHERITED("drawText") { }
djsollen@google.com809a2a92012-02-23 20:57:09 +000073protected:
robertphillips@google.com84b18c72014-04-13 19:09:42 +000074 virtual void recordCanvas(SkCanvas* canvas) SK_OVERRIDE {
djsollen@google.com809a2a92012-02-23 20:57:09 +000075 SkPaint paint;
76 paint.setTextSize(fTextSize);
77 paint.setColor(SK_ColorBLACK);
78
79 const char* text = "Hamburgefons";
80 size_t len = strlen(text);
81 const SkScalar textWidth = paint.measureText(text, len);
82
83 for (SkScalar x = 0; x < fPictureWidth; x += textWidth) {
84 for (SkScalar y = 0; y < fPictureHeight; y += fTextSize) {
85 canvas->drawText(text, len, x, y, paint);
86 }
87 }
88 }
89private:
90 typedef PicturePlaybackBench INHERITED;
91};
92
93class PosTextPlaybackBench : public PicturePlaybackBench {
94public:
mtklein@google.com410e6e82013-09-13 19:52:27 +000095 PosTextPlaybackBench(bool drawPosH)
96 : INHERITED(drawPosH ? "drawPosTextH" : "drawPosText")
djsollen@google.com710c2692012-02-27 16:22:48 +000097 , fDrawPosH(drawPosH) { }
djsollen@google.com809a2a92012-02-23 20:57:09 +000098protected:
robertphillips@google.com84b18c72014-04-13 19:09:42 +000099 virtual void recordCanvas(SkCanvas* canvas) SK_OVERRIDE {
djsollen@google.com809a2a92012-02-23 20:57:09 +0000100 SkPaint paint;
101 paint.setTextSize(fTextSize);
102 paint.setColor(SK_ColorBLACK);
103
104 const char* text = "Hamburgefons";
105 size_t len = strlen(text);
106 const SkScalar textWidth = paint.measureText(text, len);
107
108 SkScalar* adv = new SkScalar[len];
109 paint.getTextWidths(text, len, adv);
110
111 for (SkScalar x = 0; x < fPictureWidth; x += textWidth) {
112 for (SkScalar y = 0; y < fPictureHeight; y += fTextSize) {
113
114 SkPoint* pos = new SkPoint[len];
115 SkScalar advX = 0;
116
117 for (size_t i = 0; i < len; i++) {
118 if (fDrawPosH)
119 pos[i].set(x + advX, y);
120 else
borenet@google.comb7961192012-08-20 18:58:26 +0000121 pos[i].set(x + advX, y + i);
djsollen@google.com809a2a92012-02-23 20:57:09 +0000122 advX += adv[i];
123 }
124
125 canvas->drawPosText(text, len, pos, paint);
126 delete[] pos;
127 }
128 }
129 delete[] adv;
130 }
131private:
132 bool fDrawPosH;
133 typedef PicturePlaybackBench INHERITED;
134};
135
136
137///////////////////////////////////////////////////////////////////////////////
138
mtklein@google.com410e6e82013-09-13 19:52:27 +0000139DEF_BENCH( return new TextPlaybackBench(); )
140DEF_BENCH( return new PosTextPlaybackBench(true); )
141DEF_BENCH( return new PosTextPlaybackBench(false); )