PathBench.cpp revision 6e8d335b458ac2416bc5d09bab40e503384d102d
1#include "SkBenchmark.h" 2#include "SkBitmap.h" 3#include "SkCanvas.h" 4#include "SkColorPriv.h" 5#include "SkPaint.h" 6#include "SkRandom.h" 7#include "SkShader.h" 8#include "SkString.h" 9 10enum Flags { 11 kStroke_Flag = 1 << 0, 12 kBig_Flag = 1 << 1 13}; 14 15#define FLAGS00 Flags(0) 16#define FLAGS01 Flags(kStroke_Flag) 17#define FLAGS10 Flags(kBig_Flag) 18#define FLAGS11 Flags(kStroke_Flag | kBig_Flag) 19 20class PathBench : public SkBenchmark { 21 SkPaint fPaint; 22 SkString fName; 23 Flags fFlags; 24 enum { N = 1000 }; 25public: 26 PathBench(void* param, Flags flags) : INHERITED(param), fFlags(flags) { 27 fPaint.setStyle(flags & kStroke_Flag ? SkPaint::kStroke_Style : 28 SkPaint::kFill_Style); 29 fPaint.setStrokeWidth(SkIntToScalar(5)); 30 fPaint.setStrokeJoin(SkPaint::kBevel_Join); 31 } 32 33 virtual void appendName(SkString*) = 0; 34 virtual void makePath(SkPath*) = 0; 35 virtual int complexity() { return 0; } 36 37protected: 38 virtual const char* onGetName() { 39 fName.printf("path_%s_%s_", 40 fFlags & kStroke_Flag ? "stroke" : "fill", 41 fFlags & kBig_Flag ? "big" : "small"); 42 this->appendName(&fName); 43 return fName.c_str(); 44 } 45 46 virtual void onDraw(SkCanvas* canvas) { 47 SkPaint paint(fPaint); 48 this->setupPaint(&paint); 49 50 SkPath path; 51 this->makePath(&path); 52 if (fFlags & kBig_Flag) { 53 SkMatrix m; 54 m.setScale(SkIntToScalar(10), SkIntToScalar(10)); 55 path.transform(m); 56 } 57 58 int count = N; 59 if (fFlags & kBig_Flag) { 60 count >>= 2; 61 } 62 count >>= (3 * complexity()); 63 64 for (int i = 0; i < count; i++) { 65 canvas->drawPath(path, paint); 66 } 67 } 68 69private: 70 typedef SkBenchmark INHERITED; 71}; 72 73class TrianglePathBench : public PathBench { 74public: 75 TrianglePathBench(void* param, Flags flags) : INHERITED(param, flags) {} 76 77 virtual void appendName(SkString* name) { 78 name->append("triangle"); 79 } 80 virtual void makePath(SkPath* path) { 81 static const int gCoord[] = { 82 10, 10, 15, 5, 20, 20 83 }; 84 path->moveTo(SkIntToScalar(gCoord[0]), SkIntToScalar(gCoord[1])); 85 path->lineTo(SkIntToScalar(gCoord[2]), SkIntToScalar(gCoord[3])); 86 path->lineTo(SkIntToScalar(gCoord[4]), SkIntToScalar(gCoord[5])); 87 path->close(); 88 } 89private: 90 typedef PathBench INHERITED; 91}; 92 93class RectPathBench : public PathBench { 94public: 95 RectPathBench(void* param, Flags flags) : INHERITED(param, flags) {} 96 97 virtual void appendName(SkString* name) { 98 name->append("rect"); 99 } 100 virtual void makePath(SkPath* path) { 101 SkRect r = { 10, 10, 20, 20 }; 102 path->addRect(r); 103 } 104private: 105 typedef PathBench INHERITED; 106}; 107 108class OvalPathBench : public PathBench { 109public: 110 OvalPathBench(void* param, Flags flags) : INHERITED(param, flags) {} 111 112 virtual void appendName(SkString* name) { 113 name->append("oval"); 114 } 115 virtual void makePath(SkPath* path) { 116 SkRect r = { 10, 10, 20, 20 }; 117 path->addOval(r); 118 } 119private: 120 typedef PathBench INHERITED; 121}; 122 123class SawToothPathBench : public PathBench { 124public: 125 SawToothPathBench(void* param, Flags flags) : INHERITED(param, flags) {} 126 127 virtual void appendName(SkString* name) { 128 name->append("sawtooth"); 129 } 130 virtual void makePath(SkPath* path) { 131 SkScalar x = SkIntToScalar(20); 132 SkScalar y = SkIntToScalar(20); 133 const SkScalar x0 = x; 134 const SkScalar dx = SK_Scalar1 * 5; 135 const SkScalar dy = SK_Scalar1 * 10; 136 137 path->moveTo(x, y); 138 for (int i = 0; i < 32; i++) { 139 x += dx; 140 path->lineTo(x, y - dy); 141 x += dx; 142 path->lineTo(x, y + dy); 143 } 144 path->lineTo(x, y + 2 * dy); 145 path->lineTo(x0, y + 2 * dy); 146 path->close(); 147 } 148 virtual int complexity() { return 1; } 149private: 150 typedef PathBench INHERITED; 151}; 152 153class LongCurvedPathBench : public PathBench { 154public: 155 LongCurvedPathBench(void * param, Flags flags) 156 : INHERITED(param, flags) { 157 } 158 159 virtual void appendName(SkString* name) { 160 name->append("long_curved"); 161 } 162 virtual void makePath(SkPath* path) { 163 SkRandom rand (12); 164 int i; 165 for (i = 0; i < 100; i++) { 166 path->quadTo(SkScalarMul(rand.nextUScalar1(), SkIntToScalar(640)), 167 SkScalarMul(rand.nextUScalar1(), SkIntToScalar(480)), 168 SkScalarMul(rand.nextUScalar1(), SkIntToScalar(640)), 169 SkScalarMul(rand.nextUScalar1(), SkIntToScalar(480))); 170 } 171 path->close(); 172 } 173 virtual int complexity() { return 2; } 174private: 175 typedef PathBench INHERITED; 176}; 177 178 179 180static SkBenchmark* FactT00(void* p) { return new TrianglePathBench(p, FLAGS00); } 181static SkBenchmark* FactT01(void* p) { return new TrianglePathBench(p, FLAGS01); } 182static SkBenchmark* FactT10(void* p) { return new TrianglePathBench(p, FLAGS10); } 183static SkBenchmark* FactT11(void* p) { return new TrianglePathBench(p, FLAGS11); } 184 185static SkBenchmark* FactR00(void* p) { return new RectPathBench(p, FLAGS00); } 186static SkBenchmark* FactR01(void* p) { return new RectPathBench(p, FLAGS01); } 187static SkBenchmark* FactR10(void* p) { return new RectPathBench(p, FLAGS10); } 188static SkBenchmark* FactR11(void* p) { return new RectPathBench(p, FLAGS11); } 189 190static SkBenchmark* FactO00(void* p) { return new OvalPathBench(p, FLAGS00); } 191static SkBenchmark* FactO01(void* p) { return new OvalPathBench(p, FLAGS01); } 192static SkBenchmark* FactO10(void* p) { return new OvalPathBench(p, FLAGS10); } 193static SkBenchmark* FactO11(void* p) { return new OvalPathBench(p, FLAGS11); } 194 195static SkBenchmark* FactS00(void* p) { return new SawToothPathBench(p, FLAGS00); } 196static SkBenchmark* FactS01(void* p) { return new SawToothPathBench(p, FLAGS01); } 197 198static SkBenchmark* FactLC00(void* p) { 199 return new LongCurvedPathBench(p, FLAGS00); 200} 201static SkBenchmark* FactLC01(void* p) { 202 return new LongCurvedPathBench(p, FLAGS01); 203} 204 205static BenchRegistry gRegT00(FactT00); 206static BenchRegistry gRegT01(FactT01); 207static BenchRegistry gRegT10(FactT10); 208static BenchRegistry gRegT11(FactT11); 209 210static BenchRegistry gRegR00(FactR00); 211static BenchRegistry gRegR01(FactR01); 212static BenchRegistry gRegR10(FactR10); 213static BenchRegistry gRegR11(FactR11); 214 215static BenchRegistry gRegO00(FactO00); 216static BenchRegistry gRegO01(FactO01); 217static BenchRegistry gRegO10(FactO10); 218static BenchRegistry gRegO11(FactO11); 219 220static BenchRegistry gRegS00(FactS00); 221static BenchRegistry gRegS01(FactS01); 222 223static BenchRegistry gRegLC00(FactLC00); 224static BenchRegistry gRegLC01(FactLC01); 225 226