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 8#include "SkBenchmark.h" 9#include "SkAAClip.h" 10#include "SkPath.h" 11#include "SkRegion.h" 12#include "SkString.h" 13 14class AAClipBuilderBench : public SkBenchmark { 15 SkString fName; 16 SkPath fPath; 17 SkRect fRect; 18 SkRegion fRegion; 19 bool fDoPath; 20 bool fDoAA; 21 22 enum { 23 N = SkBENCHLOOP(200), 24 }; 25 26public: 27 AAClipBuilderBench(void* param, bool doPath, bool doAA) : INHERITED(param) { 28 fDoPath = doPath; 29 fDoAA = doAA; 30 31 fName.printf("aaclip_build_%s_%s", doPath ? "path" : "rect", 32 doAA ? "AA" : "BW"); 33 34 fRegion.setRect(0, 0, 640, 480); 35 fRect.set(fRegion.getBounds()); 36 fRect.inset(SK_Scalar1/4, SK_Scalar1/4); 37 fPath.addRoundRect(fRect, SkIntToScalar(20), SkIntToScalar(20)); 38 } 39 40protected: 41 virtual const char* onGetName() { return fName.c_str(); } 42 virtual void onDraw(SkCanvas* canvas) { 43 SkPaint paint; 44 this->setupPaint(&paint); 45 46 for (int i = 0; i < N; ++i) { 47 SkAAClip clip; 48 if (fDoPath) { 49 clip.setPath(fPath, &fRegion, fDoAA); 50 } else { 51 clip.setRect(fRect, fDoAA); 52 } 53 } 54 } 55private: 56 typedef SkBenchmark INHERITED; 57}; 58 59class AAClipRegionBench : public SkBenchmark { 60public: 61 AAClipRegionBench(void* param) : INHERITED(param) { 62 SkPath path; 63 // test conversion of a complex clip to a aaclip 64 path.addCircle(0, 0, SkIntToScalar(200)); 65 path.addCircle(0, 0, SkIntToScalar(180)); 66 // evenodd means we've constructed basically a stroked circle 67 path.setFillType(SkPath::kEvenOdd_FillType); 68 69 SkIRect bounds; 70 path.getBounds().roundOut(&bounds); 71 fRegion.setPath(path, SkRegion(bounds)); 72 } 73 74protected: 75 virtual const char* onGetName() { return "aaclip_setregion"; } 76 virtual void onDraw(SkCanvas* canvas) { 77 for (int i = 0; i < N; ++i) { 78 SkAAClip clip; 79 clip.setRegion(fRegion); 80 } 81 } 82 83private: 84 enum { 85 N = SkBENCHLOOP(400), 86 }; 87 SkRegion fRegion; 88 typedef SkBenchmark INHERITED; 89}; 90 91/////////////////////////////////////////////////////////////////////////////// 92 93static SkBenchmark* Fact0(void* p) { return SkNEW_ARGS(AAClipBuilderBench, (p, false, false)); } 94static SkBenchmark* Fact1(void* p) { return SkNEW_ARGS(AAClipBuilderBench, (p, false, true)); } 95static SkBenchmark* Fact2(void* p) { return SkNEW_ARGS(AAClipBuilderBench, (p, true, false)); } 96static SkBenchmark* Fact3(void* p) { return SkNEW_ARGS(AAClipBuilderBench, (p, true, true)); } 97 98static BenchRegistry gReg0(Fact0); 99static BenchRegistry gReg1(Fact1); 100static BenchRegistry gReg2(Fact2); 101static BenchRegistry gReg3(Fact3); 102 103static SkBenchmark* Fact01(void* p) { return SkNEW_ARGS(AAClipRegionBench, (p)); } 104static BenchRegistry gReg01(Fact01); 105