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
422880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    bool isVisual() override { return true; }
432880df2609eba09b555ca37be04b6ad89290c765Tom Hudson
44bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.comprotected:
45bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    virtual void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) {
46bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com        c->drawRect(r, p);
47bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    }
48bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com
492880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    const char* onGetName() override { return computeName("rects"); }
50000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org
512880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    void onDelayedSetup() override {
52000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org        SkRandom rand;
53000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org        const SkScalar offset = SK_Scalar1/3;
54000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org        for (int i = 0; i < N; i++) {
55000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org            int x = rand.nextU() % W;
56000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org            int y = rand.nextU() % H;
57000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org            int w = rand.nextU() % W;
58000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org            int h = rand.nextU() % H;
59000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org            w >>= fShift;
60000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org            h >>= fShift;
61000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org            x -= w/2;
62000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org            y -= h/2;
63000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org            fRects[i].set(SkIntToScalar(x), SkIntToScalar(y),
64000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org                          SkIntToScalar(x+w), SkIntToScalar(y+h));
65000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org            fRects[i].offset(offset, offset);
66000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org            fColors[i] = rand.nextU() | 0xFF808080;
67000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org        }
68000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org    }
69000d732ca70391aa7196efdbaf9992a96ff2fc99commit-bot@chromium.org
702880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    void onDraw(int loops, SkCanvas* canvas) override {
71bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com        SkPaint paint;
722ecead560421447acaf6ef6f1e8ba9da313b29d5mike@reedtribe.org        if (fStroke > 0) {
732ecead560421447acaf6ef6f1e8ba9da313b29d5mike@reedtribe.org            paint.setStyle(SkPaint::kStroke_Style);
742ecead560421447acaf6ef6f1e8ba9da313b29d5mike@reedtribe.org            paint.setStrokeWidth(SkIntToScalar(fStroke));
752ecead560421447acaf6ef6f1e8ba9da313b29d5mike@reedtribe.org        }
763361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; i++) {
77c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com            paint.setColor(fColors[i % N]);
784bc1983e01d756ae9c91fd380758457f579d26eareed@android.com            this->setupPaint(&paint);
79c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com            this->drawThisRect(canvas, fRects[i % N], paint);
80bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com        }
81bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    }
82e9d0060f4d7b5a07a220182d83aae3a140784c4breed@android.comprivate:
83f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
84bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com};
85bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com
862d078b637a08d5d4298c50245d3b48950362e9cfreed@google.comclass SrcModeRectBench : public RectBench {
872d078b637a08d5d4298c50245d3b48950362e9cfreed@google.compublic:
88410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    SrcModeRectBench() : INHERITED(1, 0) {
892d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com        fMode = SkXfermode::Create(SkXfermode::kSrc_Mode);
902d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com    }
91884e60be30e20f38b3466a4697081187d2f1f814skia.committer@gmail.com
922d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com    virtual ~SrcModeRectBench() {
932d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com        SkSafeUnref(fMode);
942d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com    }
952d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com
962d078b637a08d5d4298c50245d3b48950362e9cfreed@google.comprotected:
9736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void setupPaint(SkPaint* paint) override {
982d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com        this->INHERITED::setupPaint(paint);
992d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com        // srcmode is most interesting when we're not opaque
1002d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com        paint->setAlpha(0x80);
1012d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com        paint->setXfermode(fMode);
1022d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com    }
1032d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com
10436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* onGetName() override {
1052d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com        fName.set(this->INHERITED::onGetName());
1062d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com        fName.prepend("srcmode_");
1072d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com        return fName.c_str();
1082d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com    }
1092d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com
1102d078b637a08d5d4298c50245d3b48950362e9cfreed@google.comprivate:
1112d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com    SkString fName;
1122d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com    SkXfermode* fMode;
1132d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com
1142d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com    typedef RectBench INHERITED;
1152d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com};
1162d078b637a08d5d4298c50245d3b48950362e9cfreed@google.com
1172880df2609eba09b555ca37be04b6ad89290c765Tom Hudsonclass TransparentRectBench : public RectBench {
1182880df2609eba09b555ca37be04b6ad89290c765Tom Hudsonpublic:
1192880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    TransparentRectBench() : INHERITED(1, 0) {}
1202880df2609eba09b555ca37be04b6ad89290c765Tom Hudson
1212880df2609eba09b555ca37be04b6ad89290c765Tom Hudsonprotected:
1222880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    void setupPaint(SkPaint* paint) override {
1232880df2609eba09b555ca37be04b6ad89290c765Tom Hudson        this->INHERITED::setupPaint(paint);
1242880df2609eba09b555ca37be04b6ad89290c765Tom Hudson        // draw non opaque rect
1252880df2609eba09b555ca37be04b6ad89290c765Tom Hudson        paint->setAlpha(0x80);
1262880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    }
1272880df2609eba09b555ca37be04b6ad89290c765Tom Hudson
1282880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    const char* onGetName() override {
1292880df2609eba09b555ca37be04b6ad89290c765Tom Hudson        fName.set(this->INHERITED::onGetName());
1302880df2609eba09b555ca37be04b6ad89290c765Tom Hudson        fName.prepend("transparent_");
1312880df2609eba09b555ca37be04b6ad89290c765Tom Hudson        return fName.c_str();
1322880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    }
1332880df2609eba09b555ca37be04b6ad89290c765Tom Hudson
1342880df2609eba09b555ca37be04b6ad89290c765Tom Hudsonprivate:
1352880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    SkString fName;
1362880df2609eba09b555ca37be04b6ad89290c765Tom Hudson
1372880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    typedef RectBench INHERITED;
1382880df2609eba09b555ca37be04b6ad89290c765Tom Hudson};
1392880df2609eba09b555ca37be04b6ad89290c765Tom Hudson
1402880df2609eba09b555ca37be04b6ad89290c765Tom Hudson
141bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.comclass OvalBench : public RectBench {
142d2c37448011f184c38b4650a657904af0a928f7ereed@android.compublic:
143410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    OvalBench(int shift, int stroke = 0) : RectBench(shift, stroke) {}
144bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.comprotected:
1452880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) override {
146bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com        c->drawOval(r, p);
147bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    }
1482880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    const char* onGetName() override { return computeName("ovals"); }
149bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com};
150bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com
151bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.comclass RRectBench : public RectBench {
152d2c37448011f184c38b4650a657904af0a928f7ereed@android.compublic:
153410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    RRectBench(int shift, int stroke = 0) : RectBench(shift, stroke) {}
154bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.comprotected:
1552880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    void drawThisRect(SkCanvas* c, const SkRect& r, const SkPaint& p) override {
156bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com        c->drawRoundRect(r, r.width() / 4, r.height() / 4, p);
157bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    }
1582880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    const char* onGetName() override { return computeName("rrects"); }
159bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com};
160bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com
161bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.comclass PointsBench : public RectBench {
162bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.compublic:
163bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    SkCanvas::PointMode fMode;
164bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    const char* fName;
165bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com
166410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    PointsBench(SkCanvas::PointMode mode, const char* name)
167410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com        : RectBench(2)
168410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com        , fMode(mode) {
169bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com        fName = name;
170bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    }
171bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com
172bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.comprotected:
1732880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    void onDraw(int loops, SkCanvas* canvas) override {
174652807bbc8c57e5fa9622126b51fd369f5c67935agl@chromium.org        SkScalar gSizes[] = {
175bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com            SkIntToScalar(7), 0
176bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com        };
177652807bbc8c57e5fa9622126b51fd369f5c67935agl@chromium.org        size_t sizes = SK_ARRAY_COUNT(gSizes);
178652807bbc8c57e5fa9622126b51fd369f5c67935agl@chromium.org
179c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com        if (FLAGS_strokeWidth >= 0) {
180b87bf83f48e9424de6c3577e5578b3316cc88f8emtklein@google.com            gSizes[0] = (SkScalar)FLAGS_strokeWidth;
181652807bbc8c57e5fa9622126b51fd369f5c67935agl@chromium.org            sizes = 1;
182652807bbc8c57e5fa9622126b51fd369f5c67935agl@chromium.org        }
183bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com
184bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com        SkPaint paint;
185bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com        paint.setStrokeCap(SkPaint::kRound_Cap);
186652807bbc8c57e5fa9622126b51fd369f5c67935agl@chromium.org
1873361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int loop = 0; loop < loops; loop++) {
188c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com            for (size_t i = 0; i < sizes; i++) {
189c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                paint.setStrokeWidth(gSizes[i]);
190c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                this->setupPaint(&paint);
191c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                canvas->drawPoints(fMode, N * 2, SkTCast<SkPoint*>(fRects), paint);
192c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                paint.setColor(fColors[i % N]);
193c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com            }
194bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com        }
195bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    }
1962880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    const char* onGetName() override { return fName; }
197bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com};
198bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com
199981d4798007b91e2e19c13b171583927a56df63breed@google.com/*******************************************************************************
200981d4798007b91e2e19c13b171583927a56df63breed@google.com * to bench BlitMask [Opaque, Black, color, shader]
201981d4798007b91e2e19c13b171583927a56df63breed@google.com *******************************************************************************/
202981d4798007b91e2e19c13b171583927a56df63breed@google.com
203981d4798007b91e2e19c13b171583927a56df63breed@google.comclass BlitMaskBench : public RectBench {
204981d4798007b91e2e19c13b171583927a56df63breed@google.compublic:
205981d4798007b91e2e19c13b171583927a56df63breed@google.com    enum kMaskType {
206981d4798007b91e2e19c13b171583927a56df63breed@google.com        kMaskOpaque = 0,
207981d4798007b91e2e19c13b171583927a56df63breed@google.com        kMaskBlack,
208981d4798007b91e2e19c13b171583927a56df63breed@google.com        kMaskColor,
209981d4798007b91e2e19c13b171583927a56df63breed@google.com        KMaskShader
210981d4798007b91e2e19c13b171583927a56df63breed@google.com    };
211981d4798007b91e2e19c13b171583927a56df63breed@google.com    SkCanvas::PointMode fMode;
212981d4798007b91e2e19c13b171583927a56df63breed@google.com    const char* fName;
213981d4798007b91e2e19c13b171583927a56df63breed@google.com
214410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    BlitMaskBench(SkCanvas::PointMode mode,
215981d4798007b91e2e19c13b171583927a56df63breed@google.com                  BlitMaskBench::kMaskType type, const char* name) :
216410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com        RectBench(2), fMode(mode), _type(type) {
217981d4798007b91e2e19c13b171583927a56df63breed@google.com        fName = name;
218981d4798007b91e2e19c13b171583927a56df63breed@google.com    }
219981d4798007b91e2e19c13b171583927a56df63breed@google.com
220981d4798007b91e2e19c13b171583927a56df63breed@google.comprotected:
2212880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    void onDraw(int loops, SkCanvas* canvas) override {
222981d4798007b91e2e19c13b171583927a56df63breed@google.com        SkScalar gSizes[] = {
223981d4798007b91e2e19c13b171583927a56df63breed@google.com            SkIntToScalar(13), SkIntToScalar(24)
224981d4798007b91e2e19c13b171583927a56df63breed@google.com        };
225981d4798007b91e2e19c13b171583927a56df63breed@google.com        size_t sizes = SK_ARRAY_COUNT(gSizes);
226981d4798007b91e2e19c13b171583927a56df63breed@google.com
227c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com        if (FLAGS_strokeWidth >= 0) {
228b87bf83f48e9424de6c3577e5578b3316cc88f8emtklein@google.com            gSizes[0] = (SkScalar)FLAGS_strokeWidth;
229981d4798007b91e2e19c13b171583927a56df63breed@google.com            sizes = 1;
230981d4798007b91e2e19c13b171583927a56df63breed@google.com        }
231e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkRandom rand;
232981d4798007b91e2e19c13b171583927a56df63breed@google.com        SkColor color = 0xFF000000;
233981d4798007b91e2e19c13b171583927a56df63breed@google.com        U8CPU alpha = 0xFF;
234981d4798007b91e2e19c13b171583927a56df63breed@google.com        SkPaint paint;
235981d4798007b91e2e19c13b171583927a56df63breed@google.com        paint.setStrokeCap(SkPaint::kRound_Cap);
236981d4798007b91e2e19c13b171583927a56df63breed@google.com        if (_type == KMaskShader) {
237981d4798007b91e2e19c13b171583927a56df63breed@google.com            SkBitmap srcBM;
2386c22573edb234ad14df947278cfed010669a39a7reed            srcBM.allocN32Pixels(10, 1);
239981d4798007b91e2e19c13b171583927a56df63breed@google.com            srcBM.eraseColor(0xFF00FF00);
240981d4798007b91e2e19c13b171583927a56df63breed@google.com
241981d4798007b91e2e19c13b171583927a56df63breed@google.com            SkShader* s;
242981d4798007b91e2e19c13b171583927a56df63breed@google.com            s  = SkShader::CreateBitmapShader(srcBM, SkShader::kClamp_TileMode,
243981d4798007b91e2e19c13b171583927a56df63breed@google.com                                              SkShader::kClamp_TileMode);
244981d4798007b91e2e19c13b171583927a56df63breed@google.com            paint.setShader(s)->unref();
245981d4798007b91e2e19c13b171583927a56df63breed@google.com        }
2463361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int loop = 0; loop < loops; loop++) {
247c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com            for (size_t i = 0; i < sizes; i++) {
248c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                switch (_type) {
249c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                    case kMaskOpaque:
250c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                        color = fColors[i];
251c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                        alpha = 0xFF;
252c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                        break;
253c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                    case kMaskBlack:
254c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                        alpha = 0xFF;
255c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                        color = 0xFF000000;
256c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                        break;
257c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                    case kMaskColor:
258c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                        color = fColors[i];
259c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                        alpha = rand.nextU() & 255;
260c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                        break;
261c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                    case KMaskShader:
262c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                        break;
263c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                }
264c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                paint.setStrokeWidth(gSizes[i]);
265c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                this->setupPaint(&paint);
266c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                paint.setColor(color);
267c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                paint.setAlpha(alpha);
268c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                canvas->drawPoints(fMode, N * 2, SkTCast<SkPoint*>(fRects), paint);
269c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com           }
270c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com        }
271981d4798007b91e2e19c13b171583927a56df63breed@google.com    }
2722880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    const char* onGetName() override { return fName; }
273981d4798007b91e2e19c13b171583927a56df63breed@google.comprivate:
274fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com    typedef RectBench INHERITED;
275fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com    kMaskType _type;
276981d4798007b91e2e19c13b171583927a56df63breed@google.com};
277981d4798007b91e2e19c13b171583927a56df63breed@google.com
2782880df2609eba09b555ca37be04b6ad89290c765Tom HudsonDEF_BENCH(return new RectBench(1);)
2792880df2609eba09b555ca37be04b6ad89290c765Tom HudsonDEF_BENCH(return new RectBench(1, 4);)
2802880df2609eba09b555ca37be04b6ad89290c765Tom HudsonDEF_BENCH(return new RectBench(3);)
2812880df2609eba09b555ca37be04b6ad89290c765Tom HudsonDEF_BENCH(return new RectBench(3, 4);)
2822880df2609eba09b555ca37be04b6ad89290c765Tom HudsonDEF_BENCH(return new OvalBench(1);)
2832880df2609eba09b555ca37be04b6ad89290c765Tom HudsonDEF_BENCH(return new OvalBench(3);)
2842880df2609eba09b555ca37be04b6ad89290c765Tom HudsonDEF_BENCH(return new OvalBench(1, 4);)
2852880df2609eba09b555ca37be04b6ad89290c765Tom HudsonDEF_BENCH(return new OvalBench(3, 4);)
2862880df2609eba09b555ca37be04b6ad89290c765Tom HudsonDEF_BENCH(return new RRectBench(1);)
2872880df2609eba09b555ca37be04b6ad89290c765Tom HudsonDEF_BENCH(return new RRectBench(1, 4);)
2882880df2609eba09b555ca37be04b6ad89290c765Tom HudsonDEF_BENCH(return new RRectBench(3);)
2892880df2609eba09b555ca37be04b6ad89290c765Tom HudsonDEF_BENCH(return new RRectBench(3, 4);)
2902880df2609eba09b555ca37be04b6ad89290c765Tom HudsonDEF_BENCH(return new PointsBench(SkCanvas::kPoints_PointMode, "points");)
2912880df2609eba09b555ca37be04b6ad89290c765Tom HudsonDEF_BENCH(return new PointsBench(SkCanvas::kLines_PointMode, "lines");)
2922880df2609eba09b555ca37be04b6ad89290c765Tom HudsonDEF_BENCH(return new PointsBench(SkCanvas::kPolygon_PointMode, "polygon");)
2932880df2609eba09b555ca37be04b6ad89290c765Tom Hudson
2942880df2609eba09b555ca37be04b6ad89290c765Tom HudsonDEF_BENCH(return new SrcModeRectBench();)
2952880df2609eba09b555ca37be04b6ad89290c765Tom Hudson
2962880df2609eba09b555ca37be04b6ad89290c765Tom HudsonDEF_BENCH(return new TransparentRectBench();)
2978db65a6d0c60d0e31eadc64d427f6e7f050e1140joshualitt
298981d4798007b91e2e19c13b171583927a56df63breed@google.com/* init the blitmask bench
299981d4798007b91e2e19c13b171583927a56df63breed@google.com */
3002880df2609eba09b555ca37be04b6ad89290c765Tom HudsonDEF_BENCH(return new BlitMaskBench(SkCanvas::kPoints_PointMode,
3012880df2609eba09b555ca37be04b6ad89290c765Tom Hudson                                   BlitMaskBench::kMaskOpaque,
3022880df2609eba09b555ca37be04b6ad89290c765Tom Hudson                                   "maskopaque");)
3032880df2609eba09b555ca37be04b6ad89290c765Tom HudsonDEF_BENCH(return new BlitMaskBench(SkCanvas::kPoints_PointMode,
3042880df2609eba09b555ca37be04b6ad89290c765Tom Hudson                                   BlitMaskBench::kMaskBlack,
3052880df2609eba09b555ca37be04b6ad89290c765Tom Hudson                                   "maskblack");)
3062880df2609eba09b555ca37be04b6ad89290c765Tom HudsonDEF_BENCH(return new BlitMaskBench(SkCanvas::kPoints_PointMode,
3072880df2609eba09b555ca37be04b6ad89290c765Tom Hudson                                   BlitMaskBench::kMaskColor,
3082880df2609eba09b555ca37be04b6ad89290c765Tom Hudson                                   "maskcolor");)
3092880df2609eba09b555ca37be04b6ad89290c765Tom HudsonDEF_BENCH(return new BlitMaskBench(SkCanvas::kPoints_PointMode,
3102880df2609eba09b555ca37be04b6ad89290c765Tom Hudson                                   BlitMaskBench::KMaskShader,
3112880df2609eba09b555ca37be04b6ad89290c765Tom Hudson                                   "maskshader");)
312