blob: a7ee164c454f5084ac063e595cf3e3ed38ff9dc6 [file] [log] [blame]
commit-bot@chromium.orgd7aaf602013-04-01 12:51:34 +00001/*
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
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "bench/Benchmark.h"
9#include "include/core/SkCanvas.h"
10#include "include/core/SkFont.h"
11#include "include/core/SkPaint.h"
12#include "include/core/SkString.h"
13#include "include/core/SkTextBlob.h"
14#include "include/utils/SkRandom.h"
15#include "src/core/SkBlendModePriv.h"
Mike Reedcd947ac2021-07-07 11:05:42 -040016#include "tools/Resources.h"
17
18namespace {
19enum Type {
20 kText,
21 kRect,
22 kSprite,
23};
24}
25
26const char* gTypeNames[] = {
27 "mask", "rect", "sprite",
28};
commit-bot@chromium.orgd7aaf602013-04-01 12:51:34 +000029
mtkleind0a10882015-05-13 11:54:00 -070030// Benchmark that draws non-AA rects or AA text with an SkXfermode::Mode.
tfarinaf168b862014-06-19 12:32:29 -070031class XfermodeBench : public Benchmark {
commit-bot@chromium.orgd7aaf602013-04-01 12:51:34 +000032public:
Mike Reedcd947ac2021-07-07 11:05:42 -040033 XfermodeBench(SkBlendMode mode, Type t) : fBlendMode(mode) {
34 fType = t;
35 fName.printf("blendmicro_%s_%s", gTypeNames[t], SkBlendMode_Name(mode));
commit-bot@chromium.orgd7aaf602013-04-01 12:51:34 +000036 }
37
38protected:
mtklein36352bf2015-03-25 18:17:31 -070039 const char* onGetName() override { return fName.c_str(); }
commit-bot@chromium.orgd7aaf602013-04-01 12:51:34 +000040
Mike Reedcd947ac2021-07-07 11:05:42 -040041 void onDelayedSetup() override {
42 if (fType == kSprite) {
43 fImage = GetResourceAsImage("images/color_wheel.png");
44 }
45 }
46
mtkleina1ebeb22015-10-01 09:43:39 -070047 void onDraw(int loops, SkCanvas* canvas) override {
mtkleind0a10882015-05-13 11:54:00 -070048 const char* text = "Hamburgefons";
49 size_t len = strlen(text);
Mike Reed3661bc92017-02-22 13:21:42 -050050 SkISize size = canvas->getBaseLayerSize();
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +000051 SkRandom random;
John Stiles06b6f472021-03-24 10:06:41 -040052 while (loops > 0) {
commit-bot@chromium.orgd7aaf602013-04-01 12:51:34 +000053 SkPaint paint;
reed374772b2016-10-05 17:33:02 -070054 paint.setBlendMode(fBlendMode);
commit-bot@chromium.orgd7aaf602013-04-01 12:51:34 +000055 paint.setColor(random.nextU());
Mike Reedcd947ac2021-07-07 11:05:42 -040056 switch (fType) {
57 case kText: {
58 // Draw text to exercise AA code paths.
59 SkFont font;
60 font.setSize(random.nextRangeScalar(12, 96));
61 SkScalar x = random.nextRangeScalar(0, (SkScalar)size.fWidth),
62 y = random.nextRangeScalar(0, (SkScalar)size.fHeight);
63 auto blob = SkTextBlob::MakeFromText(text, len, font, SkTextEncoding::kUTF8);
64 int iterations = std::min(1000, loops);
65 for (int j = 0; j < iterations; ++j) {
66 canvas->drawTextBlob(blob, x, y, paint);
67 }
68 loops -= iterations;
69 } break;
70 case kRect: {
71 // Draw rects to exercise non-AA code paths.
72 SkScalar w = random.nextRangeScalar(50, 100);
73 SkScalar h = random.nextRangeScalar(50, 100);
74 SkRect rect = SkRect::MakeXYWH(
75 random.nextUScalar1() * (size.fWidth - w),
76 random.nextUScalar1() * (size.fHeight - h),
77 w,
78 h
79 );
80 int iterations = std::min(1000, loops);
81 for (int j = 0; j < iterations; ++j) {
82 canvas->drawRect(rect, paint);
83 }
84 loops -= iterations;
85 } break;
86 case kSprite:
87 paint.setAlphaf(1.0f);
88 for (int i = 0; i < 10; ++i) {
89 canvas->drawImage(fImage, 0, 0, SkSamplingOptions(), &paint);
90 }
91 loops -= 1;
92 break;
reedf92ace92015-04-02 12:46:24 -070093 }
commit-bot@chromium.orgd7aaf602013-04-01 12:51:34 +000094 }
95 }
96
97private:
reed374772b2016-10-05 17:33:02 -070098 SkBlendMode fBlendMode;
99 SkString fName;
Mike Reedcd947ac2021-07-07 11:05:42 -0400100 sk_sp<SkImage> fImage;
101 Type fType;
skia.committer@gmail.com05a2ee02013-04-02 07:01:34 +0000102
John Stiles7571f9e2020-09-02 22:42:33 -0400103 using INHERITED = Benchmark;
commit-bot@chromium.orgd7aaf602013-04-01 12:51:34 +0000104};
105
106//////////////////////////////////////////////////////////////////////////////
107
Mike Reedcd947ac2021-07-07 11:05:42 -0400108#define BENCH(mode) \
109 DEF_BENCH( return new XfermodeBench(mode, kText); ) \
110 DEF_BENCH( return new XfermodeBench(mode, kRect); ) \
111 DEF_BENCH( return new XfermodeBench(mode, kSprite); )
commit-bot@chromium.orgd7aaf602013-04-01 12:51:34 +0000112
reed374772b2016-10-05 17:33:02 -0700113BENCH(SkBlendMode::kClear)
114BENCH(SkBlendMode::kSrc)
115BENCH(SkBlendMode::kDst)
116BENCH(SkBlendMode::kSrcOver)
117BENCH(SkBlendMode::kDstOver)
118BENCH(SkBlendMode::kSrcIn)
119BENCH(SkBlendMode::kDstIn)
120BENCH(SkBlendMode::kSrcOut)
121BENCH(SkBlendMode::kDstOut)
122BENCH(SkBlendMode::kSrcATop)
123BENCH(SkBlendMode::kDstATop)
124BENCH(SkBlendMode::kXor)
commit-bot@chromium.orgeaa77972013-08-23 13:13:12 +0000125
reed374772b2016-10-05 17:33:02 -0700126BENCH(SkBlendMode::kPlus)
127BENCH(SkBlendMode::kModulate)
128BENCH(SkBlendMode::kScreen)
commit-bot@chromium.orgeaa77972013-08-23 13:13:12 +0000129
reed374772b2016-10-05 17:33:02 -0700130BENCH(SkBlendMode::kOverlay)
131BENCH(SkBlendMode::kDarken)
132BENCH(SkBlendMode::kLighten)
133BENCH(SkBlendMode::kColorDodge)
134BENCH(SkBlendMode::kColorBurn)
135BENCH(SkBlendMode::kHardLight)
136BENCH(SkBlendMode::kSoftLight)
137BENCH(SkBlendMode::kDifference)
138BENCH(SkBlendMode::kExclusion)
139BENCH(SkBlendMode::kMultiply)
commit-bot@chromium.orgeaa77972013-08-23 13:13:12 +0000140
reed374772b2016-10-05 17:33:02 -0700141BENCH(SkBlendMode::kHue)
142BENCH(SkBlendMode::kSaturation)
143BENCH(SkBlendMode::kColor)
144BENCH(SkBlendMode::kLuminosity)