BlendmodeBench.cpp revision bfa23d7d87819ede95941b70862b35448a7da1b9
1/*
2 * Copyright 2013 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "Benchmark.h"
9#include "SkBlendModePriv.h"
10#include "SkCanvas.h"
11#include "SkPaint.h"
12#include "SkRandom.h"
13#include "SkString.h"
14
15// Benchmark that draws non-AA rects or AA text with an SkXfermode::Mode.
16class XfermodeBench : public Benchmark {
17public:
18    XfermodeBench(SkBlendMode mode, bool aa) : fBlendMode(mode) {
19        fAA = aa;
20        fName.printf("blendmode_%s_%s", aa ? "mask" : "rect", SkBlendMode_Name(mode));
21    }
22
23protected:
24    const char* onGetName() override { return fName.c_str(); }
25
26    void onDraw(int loops, SkCanvas* canvas) override {
27        const char* text = "Hamburgefons";
28        size_t len = strlen(text);
29        SkISize size = canvas->getBaseLayerSize();
30        SkRandom random;
31        for (int i = 0; i < loops; ++i) {
32            SkPaint paint;
33            paint.setBlendMode(fBlendMode);
34            paint.setColor(random.nextU());
35            if (fAA) {
36                // Draw text to exercise AA code paths.
37                paint.setAntiAlias(true);
38                paint.setTextSize(random.nextRangeScalar(12, 96));
39                SkScalar x = random.nextRangeScalar(0, (SkScalar)size.fWidth),
40                         y = random.nextRangeScalar(0, (SkScalar)size.fHeight);
41                for (int j = 0; j < 1000; ++j) {
42                    canvas->drawText(text, len, x, y, paint);
43                }
44            } else {
45                // Draw rects to exercise non-AA code paths.
46                SkScalar w = random.nextRangeScalar(50, 100);
47                SkScalar h = random.nextRangeScalar(50, 100);
48                SkRect rect = SkRect::MakeXYWH(
49                    random.nextUScalar1() * (size.fWidth - w),
50                    random.nextUScalar1() * (size.fHeight - h),
51                    w,
52                    h
53                );
54                for (int j = 0; j < 1000; ++j) {
55                    canvas->drawRect(rect, paint);
56                }
57            }
58        }
59    }
60
61private:
62    SkBlendMode fBlendMode;
63    SkString    fName;
64    bool        fAA;
65
66    typedef Benchmark INHERITED;
67};
68
69//////////////////////////////////////////////////////////////////////////////
70
71#define BENCH(...)                                             \
72    DEF_BENCH( return new XfermodeBench(__VA_ARGS__, true); )  \
73    DEF_BENCH( return new XfermodeBench(__VA_ARGS__, false); )
74
75BENCH(SkBlendMode::kClear)
76BENCH(SkBlendMode::kSrc)
77BENCH(SkBlendMode::kDst)
78BENCH(SkBlendMode::kSrcOver)
79BENCH(SkBlendMode::kDstOver)
80BENCH(SkBlendMode::kSrcIn)
81BENCH(SkBlendMode::kDstIn)
82BENCH(SkBlendMode::kSrcOut)
83BENCH(SkBlendMode::kDstOut)
84BENCH(SkBlendMode::kSrcATop)
85BENCH(SkBlendMode::kDstATop)
86BENCH(SkBlendMode::kXor)
87
88BENCH(SkBlendMode::kPlus)
89BENCH(SkBlendMode::kModulate)
90BENCH(SkBlendMode::kScreen)
91
92BENCH(SkBlendMode::kOverlay)
93BENCH(SkBlendMode::kDarken)
94BENCH(SkBlendMode::kLighten)
95BENCH(SkBlendMode::kColorDodge)
96BENCH(SkBlendMode::kColorBurn)
97BENCH(SkBlendMode::kHardLight)
98BENCH(SkBlendMode::kSoftLight)
99BENCH(SkBlendMode::kDifference)
100BENCH(SkBlendMode::kExclusion)
101BENCH(SkBlendMode::kMultiply)
102
103BENCH(SkBlendMode::kHue)
104BENCH(SkBlendMode::kSaturation)
105BENCH(SkBlendMode::kColor)
106BENCH(SkBlendMode::kLuminosity)
107