1 2 /* 3 * Copyright 2011 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 #include "Benchmark.h" 9 #include "SkCanvas.h" 10 #include "SkColorShader.h" 11 #include "SkPaint.h" 12 #include "SkRandom.h" 13 #include "SkString.h" 14 #include "SkTemplates.h" 15 16 #define STR "Hamburgefons" 17 18 enum FontQuality { 19 kBW, 20 kAA, 21 kLCD 22 }; 23 24 static const char* fontQualityName(const SkPaint& paint) { 25 if (!paint.isAntiAlias()) { 26 return "BW"; 27 } 28 if (paint.isLCDRenderText()) { 29 return "LCD"; 30 } 31 return "AA"; 32 } 33 34 class ShaderMaskBench : public Benchmark { 35 SkPaint fPaint; 36 SkString fText; 37 SkString fName; 38 FontQuality fFQ; 39 public: 40 ShaderMaskBench(bool isOpaque, FontQuality fq) { 41 fFQ = fq; 42 fText.set(STR); 43 44 fPaint.setAntiAlias(kBW != fq); 45 fPaint.setLCDRenderText(kLCD == fq); 46 fPaint.setShader(new SkColorShader(isOpaque ? 0xFFFFFFFF : 0x80808080))->unref(); 47 } 48 49 protected: 50 virtual const char* onGetName() { 51 fName.printf("shadermask"); 52 fName.appendf("_%s", fontQualityName(fPaint)); 53 fName.appendf("_%02X", fPaint.getAlpha()); 54 return fName.c_str(); 55 } 56 57 virtual void onDraw(int loops, SkCanvas* canvas) { 58 const SkIPoint dim = this->getSize(); 59 SkRandom rand; 60 61 SkPaint paint(fPaint); 62 this->setupPaint(&paint); 63 // explicitly need these 64 paint.setAlpha(fPaint.getAlpha()); 65 paint.setAntiAlias(kBW != fFQ); 66 paint.setLCDRenderText(kLCD == fFQ); 67 68 const SkScalar x0 = SkIntToScalar(-10); 69 const SkScalar y0 = SkIntToScalar(-10); 70 71 paint.setTextSize(SkIntToScalar(12)); 72 for (int i = 0; i < loops; i++) { 73 SkScalar x = x0 + rand.nextUScalar1() * dim.fX; 74 SkScalar y = y0 + rand.nextUScalar1() * dim.fY; 75 canvas->drawText(fText.c_str(), fText.size(), x, y, paint); 76 } 77 78 paint.setTextSize(SkIntToScalar(48)); 79 for (int i = 0; i < loops / 4 ; i++) { 80 SkScalar x = x0 + rand.nextUScalar1() * dim.fX; 81 SkScalar y = y0 + rand.nextUScalar1() * dim.fY; 82 canvas->drawText(fText.c_str(), fText.size(), x, y, paint); 83 } 84 } 85 86 private: 87 typedef Benchmark INHERITED; 88 }; 89 90 /////////////////////////////////////////////////////////////////////////////// 91 92 DEF_BENCH( return new ShaderMaskBench(true, kBW); ) 93 DEF_BENCH( return new ShaderMaskBench(false, kBW); ) 94 DEF_BENCH( return new ShaderMaskBench(true, kAA); ) 95 DEF_BENCH( return new ShaderMaskBench(false, kAA); ) 96 DEF_BENCH( return new ShaderMaskBench(true, kLCD); ) 97 DEF_BENCH( return new ShaderMaskBench(false, kLCD); ) 98