2 * Copyright 2011 Google Inc.
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
11 #include "SkPicture.h"
12 #include "SkPictureRecorder.h"
17 // This is designed to emulate about 4 screens of textual content
20 class PicturePlaybackBench : public Benchmark {
22 PicturePlaybackBench(const char name[]) {
23 fName.printf("picture_playback_%s", name);
24 fPictureWidth = SkIntToScalar(PICTURE_WIDTH);
25 fPictureHeight = SkIntToScalar(PICTURE_HEIGHT);
26 fTextSize = SkIntToScalar(TEXT_SIZE);
31 PICTURE_HEIGHT = 4000,
35 virtual const char* onGetName() {
39 virtual void onDraw(const int loops, SkCanvas* canvas) {
41 SkPictureRecorder recorder;
42 SkCanvas* pCanvas = recorder.beginRecording(PICTURE_WIDTH, PICTURE_HEIGHT, NULL, 0);
43 this->recordCanvas(pCanvas);
44 SkAutoTUnref<SkPicture> picture(recorder.endRecording());
46 const SkPoint translateDelta = getTranslateDelta(loops);
48 for (int i = 0; i < loops; i++) {
49 picture->playback(canvas);
50 canvas->translate(translateDelta.fX, translateDelta.fY);
54 virtual void recordCanvas(SkCanvas* canvas) = 0;
55 virtual SkPoint getTranslateDelta(int N) {
56 SkIPoint canvasSize = onGetSize();
57 return SkPoint::Make(SkIntToScalar((PICTURE_WIDTH - canvasSize.fX)/N),
58 SkIntToScalar((PICTURE_HEIGHT- canvasSize.fY)/N));
62 SkScalar fPictureWidth;
63 SkScalar fPictureHeight;
66 typedef Benchmark INHERITED;
70 class TextPlaybackBench : public PicturePlaybackBench {
72 TextPlaybackBench() : INHERITED("drawText") { }
74 virtual void recordCanvas(SkCanvas* canvas) SK_OVERRIDE {
76 paint.setTextSize(fTextSize);
77 paint.setColor(SK_ColorBLACK);
79 const char* text = "Hamburgefons";
80 size_t len = strlen(text);
81 const SkScalar textWidth = paint.measureText(text, len);
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);
90 typedef PicturePlaybackBench INHERITED;
93 class PosTextPlaybackBench : public PicturePlaybackBench {
95 PosTextPlaybackBench(bool drawPosH)
96 : INHERITED(drawPosH ? "drawPosTextH" : "drawPosText")
97 , fDrawPosH(drawPosH) { }
99 virtual void recordCanvas(SkCanvas* canvas) SK_OVERRIDE {
101 paint.setTextSize(fTextSize);
102 paint.setColor(SK_ColorBLACK);
104 const char* text = "Hamburgefons";
105 size_t len = strlen(text);
106 const SkScalar textWidth = paint.measureText(text, len);
108 SkScalar* adv = new SkScalar[len];
109 paint.getTextWidths(text, len, adv);
111 for (SkScalar x = 0; x < fPictureWidth; x += textWidth) {
112 for (SkScalar y = 0; y < fPictureHeight; y += fTextSize) {
114 SkPoint* pos = new SkPoint[len];
117 for (size_t i = 0; i < len; i++) {
119 pos[i].set(x + advX, y);
121 pos[i].set(x + advX, y + i);
125 canvas->drawPosText(text, len, pos, paint);
133 typedef PicturePlaybackBench INHERITED;
137 ///////////////////////////////////////////////////////////////////////////////
139 DEF_BENCH( return new TextPlaybackBench(); )
140 DEF_BENCH( return new PosTextPlaybackBench(true); )
141 DEF_BENCH( return new PosTextPlaybackBench(false); )