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 fIsRendering = false; 61 } 62 63protected: 64 virtual const char* onGetName() SK_OVERRIDE { 65 return fName.c_str(); 66 } 67 68 virtual void onDraw(SkCanvas*) SK_OVERRIDE { 69 if (fRaw) { 70 for (int i = 0; i < N; ++i) { 71 SkPath::RawIter iter(fPath); 72 SkPath::Verb verb; 73 SkPoint pts[4]; 74 75 while ((verb = iter.next(pts)) != SkPath::kDone_Verb) { } 76 } 77 } else { 78 for (int i = 0; i < N; ++i) { 79 SkPath::Iter iter(fPath, false); 80 SkPath::Verb verb; 81 SkPoint pts[4]; 82 83 while ((verb = iter.next(pts)) != SkPath::kDone_Verb) { } 84 } 85 } 86 } 87 88private: 89 typedef SkBenchmark INHERITED; 90}; 91 92/////////////////////////////////////////////////////////////////////////////// 93 94static SkBenchmark* F0(void* p) { return new PathIterBench(p, false); } 95static SkBenchmark* F1(void* p) { return new PathIterBench(p, true); } 96 97static BenchRegistry gR0(F0); 98static BenchRegistry gR1(F1); 99