1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
8f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h"
9bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com#include "SkCanvas.h"
10c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com#include "SkCommandLineFlags.h"
11bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com#include "SkPaint.h"
12bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com#include "SkRandom.h"
13981d4798007b91e2e19c13b171583927a56df63breed@google.com#include "SkShader.h"
14c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com#include "SkString.h"
15c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com
16c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.comDEFINE_double(strokeWidth, -1.0, "If set, use this stroke width in RectBench.");
17bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com
18f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass RectBench : public Benchmark {
19bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.compublic:
202ecead560421447acaf6ef6f1e8ba9da313b29d5mike@reedtribe.org    int fShift, fStroke;
21bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    enum {
22bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com        W = 640,
23bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com        H = 480,
24c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com        N = 300,
25bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    };
26bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    SkRect  fRects[N];
27bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    SkColor fColors[N];
28bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com
29410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    RectBench(int shift, int stroke = 0)
30410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com        : fShift(shift)
31000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org        , fStroke(stroke) {}
321fcd51e6b2a210a37b9b9c2cfb82e1be7196e42areed@google.com
33d2c37448011f184c38b4650a657904af0a928f7ereed@android.com    SkString fName;
34d2c37448011f184c38b4650a657904af0a928f7ereed@android.com    const char* computeName(const char root[]) {
352ecead560421447acaf6ef6f1e8ba9da313b29d5mike@reedtribe.org        fName.printf("%s_%d", root, fShift);
362ecead560421447acaf6ef6f1e8ba9da313b29d5mike@reedtribe.org        if (fStroke > 0) {
372ecead560421447acaf6ef6f1e8ba9da313b29d5mike@reedtribe.org            fName.appendf("_stroke_%d", fStroke);
382ecead560421447acaf6ef6f1e8ba9da313b29d5mike@reedtribe.org        }
39d2c37448011f184c38b4650a657904af0a928f7ereed@android.com        return fName.c_str();
40d2c37448011f184c38b4650a657904af0a928f7ereed@android.com    }
411fcd51e6b2a210a37b9b9c2cfb82e1be7196e42areed@google.com
42bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.comprotected:
43bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) {
44bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com        c->drawRect(r, p);
45bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    }
46bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com
474bc1983e01d756ae9c91fd380758457f579d26eareed@android.com    virtual const char* onGetName() { return computeName("rects"); }
48000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org
49000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org    virtual void onPreDraw() {
50000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org        SkRandom rand;
51000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org        const SkScalar offset = SK_Scalar1/3;
52000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org        for (int i = 0; i < N; i++) {
53000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org            int x = rand.nextU() % W;
54000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org            int y = rand.nextU() % H;
55000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org            int w = rand.nextU() % W;
56000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org            int h = rand.nextU() % H;
57000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org            w >>= fShift;
58000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org            h >>= fShift;
59000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org            x -= w/2;
60000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org            y -= h/2;
61000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org            fRects[i].set(SkIntToScalar(x), SkIntToScalar(y),
62000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org                          SkIntToScalar(x+w), SkIntToScalar(y+h));
63000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org            fRects[i].offset(offset, offset);
64000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org            fColors[i] = rand.nextU() | 0xFF808080;
65000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org        }
66000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org    }
67000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org
683361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas* canvas) {
69bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com        SkPaint paint;
702ecead560421447acaf6ef6f1e8ba9da313b29d5mike@reedtribe.org        if (fStroke > 0) {
712ecead560421447acaf6ef6f1e8ba9da313b29d5mike@reedtribe.org            paint.setStyle(SkPaint::kStroke_Style);
722ecead560421447acaf6ef6f1e8ba9da313b29d5mike@reedtribe.org            paint.setStrokeWidth(SkIntToScalar(fStroke));
732ecead560421447acaf6ef6f1e8ba9da313b29d5mike@reedtribe.org        }
743361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; i++) {
75c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com            paint.setColor(fColors[i % N]);
764bc1983e01d756ae9c91fd380758457f579d26eareed@android.com            this->setupPaint(&paint);
77c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com            this->drawThisRect(canvas, fRects[i % N], paint);
78bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com        }
79bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    }
80e9d0060f4d7b5a07a220182d83aae3a140784c4breed@android.comprivate:
81f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
82bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com};
83bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com
842d078b637a08d5d4298c50245d3b48950362e9cfreed@google.comclass SrcModeRectBench : public RectBench {
852d078b637a08d5d4298c50245d3b48950362e9cfreed@google.compublic:
86410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    SrcModeRectBench() : INHERITED(1, 0) {
872d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com        fMode = SkXfermode::Create(SkXfermode::kSrc_Mode);
882d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com    }
89884e60be30e20f38b3466a4697081187d2f1f814skia.committer@gmail.com
902d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com    virtual ~SrcModeRectBench() {
912d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com        SkSafeUnref(fMode);
922d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com    }
932d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com
942d078b637a08d5d4298c50245d3b48950362e9cfreed@google.comprotected:
952d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com    virtual void setupPaint(SkPaint* paint) SK_OVERRIDE {
962d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com        this->INHERITED::setupPaint(paint);
972d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com        // srcmode is most interesting when we're not opaque
982d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com        paint->setAlpha(0x80);
992d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com        paint->setXfermode(fMode);
1002d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com    }
1012d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com
1022d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com    virtual const char* onGetName() SK_OVERRIDE {
1032d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com        fName.set(this->INHERITED::onGetName());
1042d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com        fName.prepend("srcmode_");
1052d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com        return fName.c_str();
1062d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com    }
1072d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com
1082d078b637a08d5d4298c50245d3b48950362e9cfreed@google.comprivate:
1092d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com    SkString fName;
1102d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com    SkXfermode* fMode;
1112d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com
1122d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com    typedef RectBench INHERITED;
1132d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com};
1142d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com
115bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.comclass OvalBench : public RectBench {
116d2c37448011f184c38b4650a657904af0a928f7ereed@android.compublic:
117410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    OvalBench(int shift, int stroke = 0) : RectBench(shift, stroke) {}
118bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.comprotected:
119bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) {
120bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com        c->drawOval(r, p);
121bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    }
122d2c37448011f184c38b4650a657904af0a928f7ereed@android.com    virtual const char* onGetName() { return computeName("ovals"); }
123bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com};
124bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com
125bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.comclass RRectBench : public RectBench {
126d2c37448011f184c38b4650a657904af0a928f7ereed@android.compublic:
127410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    RRectBench(int shift, int stroke = 0) : RectBench(shift, stroke) {}
128bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.comprotected:
129bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) {
130bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com        c->drawRoundRect(r, r.width() / 4, r.height() / 4, p);
131bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    }
1324bc1983e01d756ae9c91fd380758457f579d26eareed@android.com    virtual const char* onGetName() { return computeName("rrects"); }
133bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com};
134bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com
135bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.comclass PointsBench : public RectBench {
136bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.compublic:
137bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    SkCanvas::PointMode fMode;
138bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    const char* fName;
139bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com
140410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    PointsBench(SkCanvas::PointMode mode, const char* name)
141410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com        : RectBench(2)
142410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com        , fMode(mode) {
143bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com        fName = name;
144bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    }
145bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com
146bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.comprotected:
1473361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas* canvas) {
148652807bbc8c57e5fa9622126b51fd369f5c67935agl@chromium.org        SkScalar gSizes[] = {
149bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com            SkIntToScalar(7), 0
150bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com        };
151652807bbc8c57e5fa9622126b51fd369f5c67935agl@chromium.org        size_t sizes = SK_ARRAY_COUNT(gSizes);
152652807bbc8c57e5fa9622126b51fd369f5c67935agl@chromium.org
153c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com        if (FLAGS_strokeWidth >= 0) {
154b87bf83f48e9424de6c3577e5578b3316cc88f8emtklein@google.com            gSizes[0] = (SkScalar)FLAGS_strokeWidth;
155652807bbc8c57e5fa9622126b51fd369f5c67935agl@chromium.org            sizes = 1;
156652807bbc8c57e5fa9622126b51fd369f5c67935agl@chromium.org        }
157bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com
158bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com        SkPaint paint;
159bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com        paint.setStrokeCap(SkPaint::kRound_Cap);
160652807bbc8c57e5fa9622126b51fd369f5c67935agl@chromium.org
1613361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int loop = 0; loop < loops; loop++) {
162c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com            for (size_t i = 0; i < sizes; i++) {
163c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                paint.setStrokeWidth(gSizes[i]);
164c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                this->setupPaint(&paint);
165c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                canvas->drawPoints(fMode, N * 2, SkTCast<SkPoint*>(fRects), paint);
166c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                paint.setColor(fColors[i % N]);
167c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com            }
168bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com        }
169bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    }
170bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    virtual const char* onGetName() { return fName; }
171bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com};
172bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com
173f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass AARectBench : public Benchmark {
17412310e42f1798ba7caf8038c2088be16727b0355robertphillips@google.compublic:
17512310e42f1798ba7caf8038c2088be16727b0355robertphillips@google.com    enum {
17612310e42f1798ba7caf8038c2088be16727b0355robertphillips@google.com        W = 640,
17712310e42f1798ba7caf8038c2088be16727b0355robertphillips@google.com        H = 480,
17812310e42f1798ba7caf8038c2088be16727b0355robertphillips@google.com    };
17912310e42f1798ba7caf8038c2088be16727b0355robertphillips@google.com
180410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    AARectBench(bool rotate) : fRotate(rotate) {}
18112310e42f1798ba7caf8038c2088be16727b0355robertphillips@google.com
18212310e42f1798ba7caf8038c2088be16727b0355robertphillips@google.comprotected:
18312310e42f1798ba7caf8038c2088be16727b0355robertphillips@google.com
1842fd42c471c77f54ace35c13975651e17d5b2e8c6skia.committer@gmail.com    virtual const char* onGetName() {
185370d835c1cf293b46b34477ec99b84ba82ff9c49robertphillips@google.com        if (fRotate) {
1862fd42c471c77f54ace35c13975651e17d5b2e8c6skia.committer@gmail.com            return "aarects_rotated";
187370d835c1cf293b46b34477ec99b84ba82ff9c49robertphillips@google.com        }
1882fd42c471c77f54ace35c13975651e17d5b2e8c6skia.committer@gmail.com        return "aarects";
189370d835c1cf293b46b34477ec99b84ba82ff9c49robertphillips@google.com    }
19012310e42f1798ba7caf8038c2088be16727b0355robertphillips@google.com
1913361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas* canvas) {
1924b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org        static const SkScalar kHalfRectSize = 0.75f;
193370d835c1cf293b46b34477ec99b84ba82ff9c49robertphillips@google.com
19412310e42f1798ba7caf8038c2088be16727b0355robertphillips@google.com        SkPaint paint;
19512310e42f1798ba7caf8038c2088be16727b0355robertphillips@google.com        this->setupPaint(&paint);
19612310e42f1798ba7caf8038c2088be16727b0355robertphillips@google.com        paint.setAntiAlias(true);
19712310e42f1798ba7caf8038c2088be16727b0355robertphillips@google.com        paint.setColor(SK_ColorBLACK);
198370d835c1cf293b46b34477ec99b84ba82ff9c49robertphillips@google.com        SkRect r = { -kHalfRectSize, -kHalfRectSize, kHalfRectSize, kHalfRectSize };
199370d835c1cf293b46b34477ec99b84ba82ff9c49robertphillips@google.com        int rot = 0;
20012310e42f1798ba7caf8038c2088be16727b0355robertphillips@google.com
2013361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; i++) {
202c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com            // Draw small aa rects in a grid across the screen
203c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com            for (SkScalar y = kHalfRectSize+SK_Scalar1; y < H; y += 2*kHalfRectSize+2) {
204c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                for (SkScalar x = kHalfRectSize+SK_Scalar1; x < W; x += 2*kHalfRectSize+2) {
205c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                    canvas->save();
206c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                    canvas->translate(x, y);
207c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com
208c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                    if (fRotate) {
209c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                        SkMatrix rotate;
210c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                        rotate.setRotate(SkIntToScalar(rot));
211c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                        canvas->concat(rotate);
212c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                        rot += 10;
213c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                    }
214c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com
215c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                    canvas->drawRect(r, paint);
216c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                    canvas->restore();
217370d835c1cf293b46b34477ec99b84ba82ff9c49robertphillips@google.com                }
21812310e42f1798ba7caf8038c2088be16727b0355robertphillips@google.com            }
21912310e42f1798ba7caf8038c2088be16727b0355robertphillips@google.com        }
22012310e42f1798ba7caf8038c2088be16727b0355robertphillips@google.com
22112310e42f1798ba7caf8038c2088be16727b0355robertphillips@google.com    }
22212310e42f1798ba7caf8038c2088be16727b0355robertphillips@google.comprivate:
223370d835c1cf293b46b34477ec99b84ba82ff9c49robertphillips@google.com    bool fRotate;
224f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
22512310e42f1798ba7caf8038c2088be16727b0355robertphillips@google.com};
22612310e42f1798ba7caf8038c2088be16727b0355robertphillips@google.com
227981d4798007b91e2e19c13b171583927a56df63breed@google.com/*******************************************************************************
228981d4798007b91e2e19c13b171583927a56df63breed@google.com * to bench BlitMask [Opaque, Black, color, shader]
229981d4798007b91e2e19c13b171583927a56df63breed@google.com *******************************************************************************/
230981d4798007b91e2e19c13b171583927a56df63breed@google.com
231981d4798007b91e2e19c13b171583927a56df63breed@google.comclass BlitMaskBench : public RectBench {
232981d4798007b91e2e19c13b171583927a56df63breed@google.compublic:
233981d4798007b91e2e19c13b171583927a56df63breed@google.com    enum kMaskType {
234981d4798007b91e2e19c13b171583927a56df63breed@google.com        kMaskOpaque = 0,
235981d4798007b91e2e19c13b171583927a56df63breed@google.com        kMaskBlack,
236981d4798007b91e2e19c13b171583927a56df63breed@google.com        kMaskColor,
237981d4798007b91e2e19c13b171583927a56df63breed@google.com        KMaskShader
238981d4798007b91e2e19c13b171583927a56df63breed@google.com    };
239981d4798007b91e2e19c13b171583927a56df63breed@google.com    SkCanvas::PointMode fMode;
240981d4798007b91e2e19c13b171583927a56df63breed@google.com    const char* fName;
241981d4798007b91e2e19c13b171583927a56df63breed@google.com
242410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    BlitMaskBench(SkCanvas::PointMode mode,
243981d4798007b91e2e19c13b171583927a56df63breed@google.com                  BlitMaskBench::kMaskType type, const char* name) :
244410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com        RectBench(2), fMode(mode), _type(type) {
245981d4798007b91e2e19c13b171583927a56df63breed@google.com        fName = name;
246981d4798007b91e2e19c13b171583927a56df63breed@google.com    }
247981d4798007b91e2e19c13b171583927a56df63breed@google.com
248981d4798007b91e2e19c13b171583927a56df63breed@google.comprotected:
2493361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas* canvas) {
250981d4798007b91e2e19c13b171583927a56df63breed@google.com        SkScalar gSizes[] = {
251981d4798007b91e2e19c13b171583927a56df63breed@google.com            SkIntToScalar(13), SkIntToScalar(24)
252981d4798007b91e2e19c13b171583927a56df63breed@google.com        };
253981d4798007b91e2e19c13b171583927a56df63breed@google.com        size_t sizes = SK_ARRAY_COUNT(gSizes);
254981d4798007b91e2e19c13b171583927a56df63breed@google.com
255c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com        if (FLAGS_strokeWidth >= 0) {
256b87bf83f48e9424de6c3577e5578b3316cc88f8emtklein@google.com            gSizes[0] = (SkScalar)FLAGS_strokeWidth;
257981d4798007b91e2e19c13b171583927a56df63breed@google.com            sizes = 1;
258981d4798007b91e2e19c13b171583927a56df63breed@google.com        }
259e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkRandom rand;
260981d4798007b91e2e19c13b171583927a56df63breed@google.com        SkColor color = 0xFF000000;
261981d4798007b91e2e19c13b171583927a56df63breed@google.com        U8CPU alpha = 0xFF;
262981d4798007b91e2e19c13b171583927a56df63breed@google.com        SkPaint paint;
263981d4798007b91e2e19c13b171583927a56df63breed@google.com        paint.setStrokeCap(SkPaint::kRound_Cap);
264981d4798007b91e2e19c13b171583927a56df63breed@google.com        if (_type == KMaskShader) {
265981d4798007b91e2e19c13b171583927a56df63breed@google.com            SkBitmap srcBM;
2666c22573edb234ad14df947278cfed010669a39a7reed            srcBM.allocN32Pixels(10, 1);
267981d4798007b91e2e19c13b171583927a56df63breed@google.com            srcBM.eraseColor(0xFF00FF00);
268981d4798007b91e2e19c13b171583927a56df63breed@google.com
269981d4798007b91e2e19c13b171583927a56df63breed@google.com            SkShader* s;
270981d4798007b91e2e19c13b171583927a56df63breed@google.com            s  = SkShader::CreateBitmapShader(srcBM, SkShader::kClamp_TileMode,
271981d4798007b91e2e19c13b171583927a56df63breed@google.com                                              SkShader::kClamp_TileMode);
272981d4798007b91e2e19c13b171583927a56df63breed@google.com            paint.setShader(s)->unref();
273981d4798007b91e2e19c13b171583927a56df63breed@google.com        }
2743361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int loop = 0; loop < loops; loop++) {
275c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com            for (size_t i = 0; i < sizes; i++) {
276c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                switch (_type) {
277c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                    case kMaskOpaque:
278c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                        color = fColors[i];
279c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                        alpha = 0xFF;
280c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                        break;
281c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                    case kMaskBlack:
282c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                        alpha = 0xFF;
283c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                        color = 0xFF000000;
284c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                        break;
285c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                    case kMaskColor:
286c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                        color = fColors[i];
287c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                        alpha = rand.nextU() & 255;
288c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                        break;
289c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                    case KMaskShader:
290c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                        break;
291c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                }
292c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                paint.setStrokeWidth(gSizes[i]);
293c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                this->setupPaint(&paint);
294c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                paint.setColor(color);
295c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                paint.setAlpha(alpha);
296c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                canvas->drawPoints(fMode, N * 2, SkTCast<SkPoint*>(fRects), paint);
297c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com           }
298c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com        }
299981d4798007b91e2e19c13b171583927a56df63breed@google.com    }
300981d4798007b91e2e19c13b171583927a56df63breed@google.com    virtual const char* onGetName() { return fName; }
301981d4798007b91e2e19c13b171583927a56df63breed@google.comprivate:
302fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com    typedef RectBench INHERITED;
303fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com    kMaskType _type;
304981d4798007b91e2e19c13b171583927a56df63breed@google.com};
305981d4798007b91e2e19c13b171583927a56df63breed@google.com
306981d4798007b91e2e19c13b171583927a56df63breed@google.com
307410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return SkNEW_ARGS(RectBench, (1)); )
308410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return SkNEW_ARGS(RectBench, (1, 4)); )
309410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return SkNEW_ARGS(RectBench, (3)); )
310410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return SkNEW_ARGS(RectBench, (3, 4)); )
311410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return SkNEW_ARGS(OvalBench, (1)); )
312410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return SkNEW_ARGS(OvalBench, (3)); )
313410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return SkNEW_ARGS(OvalBench, (1, 4)); )
314410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return SkNEW_ARGS(OvalBench, (3, 4)); )
315410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return SkNEW_ARGS(RRectBench, (1)); )
316410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return SkNEW_ARGS(RRectBench, (1, 4)); )
317410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return SkNEW_ARGS(RRectBench, (3)); )
318410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return SkNEW_ARGS(RRectBench, (3, 4)); )
319410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return SkNEW_ARGS(PointsBench, (SkCanvas::kPoints_PointMode, "points")); )
320410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return SkNEW_ARGS(PointsBench, (SkCanvas::kLines_PointMode, "lines")); )
321410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return SkNEW_ARGS(PointsBench, (SkCanvas::kPolygon_PointMode, "polygon")); )
322bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com
323410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return SkNEW_ARGS(SrcModeRectBench, ()); )
324370d835c1cf293b46b34477ec99b84ba82ff9c49robertphillips@google.com
325410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return SkNEW_ARGS(AARectBench, (false)); )
326410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return SkNEW_ARGS(AARectBench, (true)); )
3272d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com
328981d4798007b91e2e19c13b171583927a56df63breed@google.com/* init the blitmask bench
329981d4798007b91e2e19c13b171583927a56df63breed@google.com */
33060712f3180f5d35a51292ebfd0f25c16a3925d28reed@google.comDEF_BENCH( return SkNEW_ARGS(BlitMaskBench,
331410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com                      (SkCanvas::kPoints_PointMode,
332981d4798007b91e2e19c13b171583927a56df63breed@google.com                      BlitMaskBench::kMaskOpaque, "maskopaque")
33360712f3180f5d35a51292ebfd0f25c16a3925d28reed@google.com                      ); )
33460712f3180f5d35a51292ebfd0f25c16a3925d28reed@google.comDEF_BENCH( return SkNEW_ARGS(BlitMaskBench,
335410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com                      (SkCanvas::kPoints_PointMode,
336981d4798007b91e2e19c13b171583927a56df63breed@google.com                      BlitMaskBench::kMaskBlack, "maskblack")
33760712f3180f5d35a51292ebfd0f25c16a3925d28reed@google.com                      ); )
33860712f3180f5d35a51292ebfd0f25c16a3925d28reed@google.comDEF_BENCH( return SkNEW_ARGS(BlitMaskBench,
339410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com                      (SkCanvas::kPoints_PointMode,
340981d4798007b91e2e19c13b171583927a56df63breed@google.com                      BlitMaskBench::kMaskColor, "maskcolor")
34160712f3180f5d35a51292ebfd0f25c16a3925d28reed@google.com                      ); )
34260712f3180f5d35a51292ebfd0f25c16a3925d28reed@google.comDEF_BENCH( return SkNEW_ARGS(BlitMaskBench,
343410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com                     (SkCanvas::kPoints_PointMode,
344981d4798007b91e2e19c13b171583927a56df63breed@google.com                     BlitMaskBench::KMaskShader, "maskshader")
34560712f3180f5d35a51292ebfd0f25c16a3925d28reed@google.com                     ); )
346