• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
19 class PicturePlaybackBench : public SkBenchmark {
20 public:
PicturePlaybackBench(void * param,const char name[])21     PicturePlaybackBench(void* param, const char name[]) : INHERITED(param) {
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         N = SkBENCHLOOP(200),   // number of times to playback the picture
30         PICTURE_WIDTH = 1000,
31         PICTURE_HEIGHT = 4000,
32         TEXT_SIZE = 10
33     };
34 protected:
onGetName()35     virtual const char* onGetName() {
36         return fName.c_str();
37     }
38 
onDraw(SkCanvas * canvas)39     virtual void onDraw(SkCanvas* canvas) {
40 
41         SkPicture picture;
42 
43         SkCanvas* pCanvas = picture.beginRecording(PICTURE_WIDTH, PICTURE_HEIGHT);
44         recordCanvas(pCanvas);
45         picture.endRecording();
46 
47         const SkPoint translateDelta = getTranslateDelta();
48 
49         for (int i = 0; i < N; i++) {
50             picture.draw(canvas);
51             canvas->translate(translateDelta.fX, translateDelta.fY);
52         }
53     }
54 
55     virtual void recordCanvas(SkCanvas* canvas) = 0;
getTranslateDelta()56     virtual SkPoint getTranslateDelta() {
57         SkIPoint canvasSize = onGetSize();
58         return SkPoint::Make(SkIntToScalar((PICTURE_WIDTH - canvasSize.fX)/N),
59                              SkIntToScalar((PICTURE_HEIGHT- canvasSize.fY)/N));
60     }
61 
62     SkString fName;
63     SkScalar fPictureWidth;
64     SkScalar fPictureHeight;
65     SkScalar fTextSize;
66 private:
67     typedef SkBenchmark INHERITED;
68 };
69 
70 
71 class TextPlaybackBench : public PicturePlaybackBench {
72 public:
TextPlaybackBench(void * param)73     TextPlaybackBench(void* param) : INHERITED(param, "drawText") { }
74 protected:
recordCanvas(SkCanvas * canvas)75     virtual void recordCanvas(SkCanvas* canvas) {
76         SkPaint paint;
77         paint.setTextSize(fTextSize);
78         paint.setColor(SK_ColorBLACK);
79 
80         const char* text = "Hamburgefons";
81         size_t len = strlen(text);
82         const SkScalar textWidth = paint.measureText(text, len);
83 
84         for (SkScalar x = 0; x < fPictureWidth; x += textWidth) {
85             for (SkScalar y = 0; y < fPictureHeight; y += fTextSize) {
86                 canvas->drawText(text, len, x, y, paint);
87             }
88         }
89     }
90 private:
91     typedef PicturePlaybackBench INHERITED;
92 };
93 
94 class PosTextPlaybackBench : public PicturePlaybackBench {
95 public:
PosTextPlaybackBench(void * param,bool drawPosH)96     PosTextPlaybackBench(void* param, bool drawPosH)
97         : INHERITED(param, drawPosH ? "drawPosTextH" : "drawPosText")
98         , fDrawPosH(drawPosH) { }
99 protected:
recordCanvas(SkCanvas * canvas)100     virtual void recordCanvas(SkCanvas* canvas) {
101         SkPaint paint;
102         paint.setTextSize(fTextSize);
103         paint.setColor(SK_ColorBLACK);
104 
105         const char* text = "Hamburgefons";
106         size_t len = strlen(text);
107         const SkScalar textWidth = paint.measureText(text, len);
108 
109         SkScalar* adv = new SkScalar[len];
110         paint.getTextWidths(text, len, adv);
111 
112         for (SkScalar x = 0; x < fPictureWidth; x += textWidth) {
113             for (SkScalar y = 0; y < fPictureHeight; y += fTextSize) {
114 
115                 SkPoint* pos = new SkPoint[len];
116                 SkScalar advX = 0;
117 
118                 for (size_t i = 0; i < len; i++) {
119                     if (fDrawPosH)
120                         pos[i].set(x + advX, y);
121                     else
122                         pos[i].set(x + advX, y + i);
123                     advX += adv[i];
124                 }
125 
126                 canvas->drawPosText(text, len, pos, paint);
127                 delete[] pos;
128             }
129         }
130         delete[] adv;
131     }
132 private:
133     bool fDrawPosH;
134     typedef PicturePlaybackBench INHERITED;
135 };
136 
137 
138 ///////////////////////////////////////////////////////////////////////////////
139 
Fact0(void * p)140 static SkBenchmark* Fact0(void* p) { return new TextPlaybackBench(p); }
Fact1(void * p)141 static SkBenchmark* Fact1(void* p) { return new PosTextPlaybackBench(p, true); }
Fact2(void * p)142 static SkBenchmark* Fact2(void* p) { return new PosTextPlaybackBench(p, false); }
143 
144 static BenchRegistry gReg0(Fact0);
145 static BenchRegistry gReg1(Fact1);
146 static BenchRegistry gReg2(Fact2);
147