PathIterBench.cpp revision e0e7cfe44bb9d66d76120a79e5275c294bacaa22
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