PathIterBench.cpp revision c56a83ca9c1011fadd25475188fc2ea08930ec41
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 "SkBitmap.h" 10#include "SkCanvas.h" 11#include "SkColorPriv.h" 12#include "SkPaint.h" 13#include "SkRandom.h" 14#include "SkShader.h" 15#include "SkString.h" 16 17static int rand_pts(SkRandom& rand, SkPoint pts[4]) { 18 int n = rand.nextU() & 3; 19 n += 1; 20 21 for (int i = 0; i < n; ++i) { 22 pts[i].fX = rand.nextSScalar1(); 23 pts[i].fY = rand.nextSScalar1(); 24 } 25 return n; 26} 27 28class PathIterBench : public SkBenchmark { 29 SkString fName; 30 SkPath fPath; 31 bool fRaw; 32 33 enum { N = SkBENCHLOOP(500) }; 34 35public: 36 PathIterBench(void* param, bool raw) : INHERITED(param) { 37 fName.printf("pathiter_%s", raw ? "raw" : "consume"); 38 fRaw = raw; 39 40 SkRandom rand; 41 for (int i = 0; i < 1000; ++i) { 42 SkPoint pts[4]; 43 int n = rand_pts(rand, pts); 44 switch (n) { 45 case 1: 46 fPath.moveTo(pts[0]); 47 break; 48 case 2: 49 fPath.lineTo(pts[1]); 50 break; 51 case 3: 52 fPath.quadTo(pts[1], pts[2]); 53 break; 54 case 4: 55 fPath.cubicTo(pts[1], pts[2], pts[3]); 56 break; 57 } 58 } 59 } 60 61protected: 62 virtual const char* onGetName() SK_OVERRIDE { 63 return fName.c_str(); 64 } 65 66 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { 67 if (fRaw) { 68 for (int i = 0; i < N; ++i) { 69 SkPath::RawIter iter(fPath); 70 SkPath::Verb verb; 71 SkPoint pts[4]; 72 73 while ((verb = iter.next(pts)) != SkPath::kDone_Verb); 74 } 75 } else { 76 for (int i = 0; i < N; ++i) { 77 SkPath::Iter iter(fPath, false); 78 SkPath::Verb verb; 79 SkPoint pts[4]; 80 81 while ((verb = iter.next(pts)) != SkPath::kDone_Verb); 82 } 83 } 84 } 85 86private: 87 typedef SkBenchmark INHERITED; 88}; 89 90/////////////////////////////////////////////////////////////////////////////// 91 92static SkBenchmark* F0(void* p) { return new PathIterBench(p, false); } 93static SkBenchmark* F1(void* p) { return new PathIterBench(p, true); } 94 95static BenchRegistry gR0(F0); 96static BenchRegistry gR1(F1); 97