RectBench.cpp revision 7cc0a6ac7b817b217dd614cba96fc533b32d505d
1#include "SkBenchmark.h" 2#include "SkCanvas.h" 3#include "SkPaint.h" 4#include "SkRandom.h" 5#include "SkString.h" 6 7class RectBench : public SkBenchmark { 8public: 9 int fShift; 10 enum { 11 W = 640, 12 H = 480, 13 N = 300 14 }; 15 SkRect fRects[N]; 16 SkColor fColors[N]; 17 18 RectBench(int shift) : fShift(shift) { 19 SkRandom rand; 20 for (int i = 0; i < N; i++) { 21 int x = rand.nextU() % W; 22 int y = rand.nextU() % H; 23 int w = rand.nextU() % W; 24 int h = rand.nextU() % H; 25 w >>= shift; 26 h >>= shift; 27 x -= w/2; 28 y -= h/2; 29 fRects[i].set(SkIntToScalar(x), SkIntToScalar(y), 30 SkIntToScalar(x+w), SkIntToScalar(y+h)); 31 fColors[i] = rand.nextU() | 0xFF808080; 32 } 33 } 34 35 SkString fName; 36 const char* computeName(const char root[]) { 37 fName.set(root); 38 fName.appendS32(fShift); 39 return fName.c_str(); 40 } 41 42protected: 43 virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) { 44 c->drawRect(r, p); 45 } 46 47 virtual const char* onGetName() { return computeName("rects"); } 48 virtual void onDraw(SkCanvas* canvas) { 49 SkPaint paint; 50 for (int i = 0; i < N; i++) { 51 paint.setColor(fColors[i]); 52 this->setupPaint(&paint); 53 this->drawThisRect(canvas, fRects[i], paint); 54 } 55 } 56}; 57 58class OvalBench : public RectBench { 59public: 60 OvalBench(int shift) : RectBench(shift) {} 61protected: 62 virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) { 63 c->drawOval(r, p); 64 } 65 virtual const char* onGetName() { return computeName("ovals"); } 66}; 67 68class RRectBench : public RectBench { 69public: 70 RRectBench(int shift) : RectBench(shift) {} 71protected: 72 virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) { 73 c->drawRoundRect(r, r.width() / 4, r.height() / 4, p); 74 } 75 virtual const char* onGetName() { return computeName("rrects"); } 76}; 77 78class PointsBench : public RectBench { 79public: 80 SkCanvas::PointMode fMode; 81 const char* fName; 82 83 PointsBench(SkCanvas::PointMode mode, const char* name) : 84 RectBench(2), fMode(mode) { 85 fName = name; 86 } 87 88protected: 89 virtual void onDraw(SkCanvas* canvas) { 90 static const SkScalar gSizes[] = { 91 SkIntToScalar(7), 0 92 }; 93 94 SkPaint paint; 95 paint.setStrokeCap(SkPaint::kRound_Cap); 96 97 for (size_t i = 0; i < SK_ARRAY_COUNT(gSizes); i++) { 98 paint.setStrokeWidth(gSizes[i]); 99 this->setupPaint(&paint); 100 canvas->drawPoints(fMode, N * 2, 101 reinterpret_cast<const SkPoint*>(fRects), paint); 102 paint.setColor(fColors[i]); 103 } 104 } 105 virtual const char* onGetName() { return fName; } 106}; 107 108static SkBenchmark* RectFactory1(void*) { return SkNEW_ARGS(RectBench, (1)); } 109static SkBenchmark* RectFactory2(void*) { return SkNEW_ARGS(RectBench, (3)); } 110static SkBenchmark* OvalFactory1(void*) { return SkNEW_ARGS(OvalBench, (1)); } 111static SkBenchmark* OvalFactory2(void*) { return SkNEW_ARGS(OvalBench, (3)); } 112static SkBenchmark* RRectFactory1(void*) { return SkNEW_ARGS(RRectBench, (1)); } 113static SkBenchmark* RRectFactory2(void*) { return SkNEW_ARGS(RRectBench, (3)); } 114static SkBenchmark* PointsFactory(void*) { 115 return SkNEW_ARGS(PointsBench, (SkCanvas::kPoints_PointMode, "points")); 116} 117static SkBenchmark* LinesFactory(void*) { 118 return SkNEW_ARGS(PointsBench, (SkCanvas::kLines_PointMode, "lines")); 119} 120static SkBenchmark* PolygonFactory(void*) { 121 return SkNEW_ARGS(PointsBench, (SkCanvas::kPolygon_PointMode, "polygon")); 122} 123 124static BenchRegistry gRectReg1(RectFactory1); 125static BenchRegistry gRectReg2(RectFactory2); 126static BenchRegistry gOvalReg1(OvalFactory1); 127static BenchRegistry gOvalReg2(OvalFactory2); 128static BenchRegistry gRRectReg1(RRectFactory1); 129static BenchRegistry gRRectReg2(RRectFactory2); 130static BenchRegistry gPointsReg(PointsFactory); 131static BenchRegistry gLinesReg(LinesFactory); 132static BenchRegistry gPolygonReg(PolygonFactory); 133 134