ShaderMaskBench.cpp revision c289743864e2ab926a95e617a5cd1d29b26d1825
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 "SkBenchmark.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 19enum FontQuality { 20 kBW, 21 kAA, 22 kLCD 23}; 24 25static 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 35class ShaderMaskBench : public SkBenchmark { 36 SkPaint fPaint; 37 SkString fText; 38 SkString fName; 39 FontQuality fFQ; 40public: 41 ShaderMaskBench(void* param, bool isOpaque, FontQuality fq) : INHERITED(param) { 42 fFQ = fq; 43 fText.set(STR); 44 45 fPaint.setAntiAlias(kBW != fq); 46 fPaint.setLCDRenderText(kLCD == fq); 47 fPaint.setAlpha(isOpaque ? 0xFF : 0x80); 48 fPaint.setShader(new SkColorShader)->unref(); 49 } 50 51protected: 52 virtual const char* onGetName() { 53 fName.printf("shadermask"); 54 fName.appendf("_%s", fontQualityName(fPaint)); 55 fName.appendf("_%02X", fPaint.getAlpha()); 56 return fName.c_str(); 57 } 58 59 virtual void onDraw(SkCanvas* canvas) { 60 const SkIPoint dim = this->getSize(); 61 SkRandom rand; 62 63 SkPaint paint(fPaint); 64 this->setupPaint(&paint); 65 // explicitly need these 66 paint.setAlpha(fPaint.getAlpha()); 67 paint.setAntiAlias(kBW != fFQ); 68 paint.setLCDRenderText(kLCD == fFQ); 69 70 const SkScalar x0 = SkIntToScalar(-10); 71 const SkScalar y0 = SkIntToScalar(-10); 72 73 paint.setTextSize(SkIntToScalar(12)); 74 for (int i = 0; i < this->getLoops(); i++) { 75 SkScalar x = x0 + rand.nextUScalar1() * dim.fX; 76 SkScalar y = y0 + rand.nextUScalar1() * dim.fY; 77 canvas->drawText(fText.c_str(), fText.size(), x, y, paint); 78 } 79 80 paint.setTextSize(SkIntToScalar(48)); 81 for (int i = 0; i < this->getLoops() / 4 ; i++) { 82 SkScalar x = x0 + rand.nextUScalar1() * dim.fX; 83 SkScalar y = y0 + rand.nextUScalar1() * dim.fY; 84 canvas->drawText(fText.c_str(), fText.size(), x, y, paint); 85 } 86 } 87 88private: 89 typedef SkBenchmark INHERITED; 90}; 91 92/////////////////////////////////////////////////////////////////////////////// 93 94static SkBenchmark* Fact00(void* p) { return new ShaderMaskBench(p, true, kBW); } 95static SkBenchmark* Fact01(void* p) { return new ShaderMaskBench(p, false, kBW); } 96static SkBenchmark* Fact10(void* p) { return new ShaderMaskBench(p, true, kAA); } 97static SkBenchmark* Fact11(void* p) { return new ShaderMaskBench(p, false, kAA); } 98static SkBenchmark* Fact20(void* p) { return new ShaderMaskBench(p, true, kLCD); } 99static SkBenchmark* Fact21(void* p) { return new ShaderMaskBench(p, false, kLCD); } 100 101static BenchRegistry gReg00(Fact00); 102static BenchRegistry gReg01(Fact01); 103static BenchRegistry gReg10(Fact10); 104static BenchRegistry gReg11(Fact11); 105static BenchRegistry gReg20(Fact20); 106static BenchRegistry gReg21(Fact21); 107