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