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