blob: cc33422f5f90f3d3dd8f8a00716320fc60bdf352 [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
Mike Reedcd947ac2021-07-07 11:05:42 -040097 bool isSuitableFor(Backend backend) override {
98 return backend == kRaster_Backend;
99 }
100
commit-bot@chromium.orgd7aaf602013-04-01 12:51:34 +0000101private:
reed374772b2016-10-05 17:33:02 -0700102 SkBlendMode fBlendMode;
103 SkString fName;
Mike Reedcd947ac2021-07-07 11:05:42 -0400104 sk_sp<SkImage> fImage;
105 Type fType;
skia.committer@gmail.com05a2ee02013-04-02 07:01:34 +0000106
John Stiles7571f9e2020-09-02 22:42:33 -0400107 using INHERITED = Benchmark;
commit-bot@chromium.orgd7aaf602013-04-01 12:51:34 +0000108};
109
110//////////////////////////////////////////////////////////////////////////////
111
Mike Reedcd947ac2021-07-07 11:05:42 -0400112#define BENCH(mode) \
113 DEF_BENCH( return new XfermodeBench(mode, kText); ) \
114 DEF_BENCH( return new XfermodeBench(mode, kRect); ) \
115 DEF_BENCH( return new XfermodeBench(mode, kSprite); )
commit-bot@chromium.orgd7aaf602013-04-01 12:51:34 +0000116
reed374772b2016-10-05 17:33:02 -0700117BENCH(SkBlendMode::kClear)
118BENCH(SkBlendMode::kSrc)
119BENCH(SkBlendMode::kDst)
120BENCH(SkBlendMode::kSrcOver)
121BENCH(SkBlendMode::kDstOver)
122BENCH(SkBlendMode::kSrcIn)
123BENCH(SkBlendMode::kDstIn)
124BENCH(SkBlendMode::kSrcOut)
125BENCH(SkBlendMode::kDstOut)
126BENCH(SkBlendMode::kSrcATop)
127BENCH(SkBlendMode::kDstATop)
128BENCH(SkBlendMode::kXor)
commit-bot@chromium.orgeaa77972013-08-23 13:13:12 +0000129
reed374772b2016-10-05 17:33:02 -0700130BENCH(SkBlendMode::kPlus)
131BENCH(SkBlendMode::kModulate)
132BENCH(SkBlendMode::kScreen)
commit-bot@chromium.orgeaa77972013-08-23 13:13:12 +0000133
reed374772b2016-10-05 17:33:02 -0700134BENCH(SkBlendMode::kOverlay)
135BENCH(SkBlendMode::kDarken)
136BENCH(SkBlendMode::kLighten)
137BENCH(SkBlendMode::kColorDodge)
138BENCH(SkBlendMode::kColorBurn)
139BENCH(SkBlendMode::kHardLight)
140BENCH(SkBlendMode::kSoftLight)
141BENCH(SkBlendMode::kDifference)
142BENCH(SkBlendMode::kExclusion)
143BENCH(SkBlendMode::kMultiply)
commit-bot@chromium.orgeaa77972013-08-23 13:13:12 +0000144
reed374772b2016-10-05 17:33:02 -0700145BENCH(SkBlendMode::kHue)
146BENCH(SkBlendMode::kSaturation)
147BENCH(SkBlendMode::kColor)
148BENCH(SkBlendMode::kLuminosity)