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