• 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(const char name[])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     };
33 protected:
onGetName()34     virtual const char* onGetName() {
35         return fName.c_str();
36     }
37 
onDraw(const int loops,SkCanvas * canvas)38     virtual void onDraw(const int loops, SkCanvas* canvas) {
39 
40         SkPicture picture;
41 
42         SkCanvas* pCanvas = picture.beginRecording(PICTURE_WIDTH, PICTURE_HEIGHT);
43         recordCanvas(pCanvas);
44         picture.endRecording();
45 
46         const SkPoint translateDelta = getTranslateDelta(loops);
47 
48         for (int i = 0; i < loops; i++) {
49             picture.draw(canvas);
50             canvas->translate(translateDelta.fX, translateDelta.fY);
51         }
52     }
53 
54     virtual void recordCanvas(SkCanvas* canvas) = 0;
getTranslateDelta(int N)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));
59     }
60 
61     SkString fName;
62     SkScalar fPictureWidth;
63     SkScalar fPictureHeight;
64     SkScalar fTextSize;
65 private:
66     typedef SkBenchmark INHERITED;
67 };
68 
69 
70 class TextPlaybackBench : public PicturePlaybackBench {
71 public:
TextPlaybackBench()72     TextPlaybackBench() : INHERITED("drawText") { }
73 protected:
recordCanvas(SkCanvas * canvas)74     virtual void recordCanvas(SkCanvas* canvas) {
75         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     }
89 private:
90     typedef PicturePlaybackBench INHERITED;
91 };
92 
93 class PosTextPlaybackBench : public PicturePlaybackBench {
94 public:
PosTextPlaybackBench(bool drawPosH)95     PosTextPlaybackBench(bool drawPosH)
96         : INHERITED(drawPosH ? "drawPosTextH" : "drawPosText")
97         , fDrawPosH(drawPosH) { }
98 protected:
recordCanvas(SkCanvas * canvas)99     virtual void recordCanvas(SkCanvas* canvas) {
100         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
121                         pos[i].set(x + advX, y + i);
122                     advX += adv[i];
123                 }
124 
125                 canvas->drawPosText(text, len, pos, paint);
126                 delete[] pos;
127             }
128         }
129         delete[] adv;
130     }
131 private:
132     bool fDrawPosH;
133     typedef PicturePlaybackBench INHERITED;
134 };
135 
136 
137 ///////////////////////////////////////////////////////////////////////////////
138 
139 DEF_BENCH( return new TextPlaybackBench(); )
140 DEF_BENCH( return new PosTextPlaybackBench(true); )
141 DEF_BENCH( return new PosTextPlaybackBench(false); )
142