1c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com
2c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com/*
3c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com * Copyright 2011 Google Inc.
4c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com *
5c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com * Use of this source code is governed by a BSD-style license that can be
6c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com * found in the LICENSE file.
7c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com */
8f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h"
9c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com#include "SkBitmap.h"
10c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com#include "SkCanvas.h"
11c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com#include "SkColorPriv.h"
12c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com#include "SkPaint.h"
13c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com#include "SkRandom.h"
14c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com#include "SkShader.h"
15c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com#include "SkString.h"
16c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com
17e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.orgstatic int rand_pts(SkRandom& rand, SkPoint pts[4]) {
18c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com    int n = rand.nextU() & 3;
19c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com    n += 1;
20c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com
21c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com    for (int i = 0; i < n; ++i) {
22c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com        pts[i].fX = rand.nextSScalar1();
23c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com        pts[i].fY = rand.nextSScalar1();
24c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com    }
25c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com    return n;
26c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com}
27c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com
28f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass PathIterBench : public Benchmark {
29c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com    SkString    fName;
30c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com    SkPath      fPath;
31c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com    bool        fRaw;
32c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com
33c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.compublic:
34410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    PathIterBench(bool raw)  {
35c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com        fName.printf("pathiter_%s", raw ? "raw" : "consume");
36c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com        fRaw = raw;
37c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com
38e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkRandom rand;
39c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com        for (int i = 0; i < 1000; ++i) {
40c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com            SkPoint pts[4];
41c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com            int n = rand_pts(rand, pts);
42c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com            switch (n) {
43c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com                case 1:
44c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com                    fPath.moveTo(pts[0]);
45c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com                    break;
46c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com                case 2:
47c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com                    fPath.lineTo(pts[1]);
48c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com                    break;
49c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com                case 3:
50c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com                    fPath.quadTo(pts[1], pts[2]);
51c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com                    break;
52c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com                case 4:
53c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com                    fPath.cubicTo(pts[1], pts[2], pts[3]);
54c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com                    break;
55c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com            }
56c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com        }
57644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org    }
58433ce5e6869d5937e31ff5f305be54092b37f2e4robertphillips@google.com
59644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org    virtual bool isSuitableFor(Backend backend) SK_OVERRIDE {
60644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org        return backend == kNonRendering_Backend;
61c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com    }
62c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com
63c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.comprotected:
64c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com    virtual const char* onGetName() SK_OVERRIDE {
65c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com        return fName.c_str();
66c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com    }
67c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com
683361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE {
69c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com        if (fRaw) {
703361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org            for (int i = 0; i < loops; ++i) {
71c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com                SkPath::RawIter iter(fPath);
72c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com                SkPath::Verb verb;
73c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com                SkPoint      pts[4];
74fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
75faa5ae456d184202993a5dbe782a3a95acc25326commit-bot@chromium.org                while ((verb = iter.next(pts)) != SkPath::kDone_Verb) { }
76c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com            }
77c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com        } else {
783361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org            for (int i = 0; i < loops; ++i) {
79c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com                SkPath::Iter iter(fPath, false);
80c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com                SkPath::Verb verb;
81c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com                SkPoint      pts[4];
82fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
83faa5ae456d184202993a5dbe782a3a95acc25326commit-bot@chromium.org                while ((verb = iter.next(pts)) != SkPath::kDone_Verb) { }
84c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com            }
85c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com        }
86c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com    }
87c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com
88c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.comprivate:
89f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
90c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com};
91c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com
92c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com///////////////////////////////////////////////////////////////////////////////
93c56a83ca9c1011fadd25475188fc2ea08930ec41reed@google.com
94410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new PathIterBench(false); )
95410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new PathIterBench(true); )
96