2 * Copyright 2014 Google Inc.
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
14 /** This benchmark tests rendering rotated rectangles. It can optionally apply AA and/or change the
15 paint color between each rect in different ways using the ColorType enum. The xfermode used can
20 kConstantOpaque_ColorType,
21 kConstantTransparent_ColorType,
22 kChangingOpaque_ColorType,
23 kChangingTransparent_ColorType,
24 kAlternatingOpaqueAndTransparent_ColorType,
27 static inline SkColor start_color(ColorType ct) {
29 case kConstantOpaque_ColorType:
30 case kChangingOpaque_ColorType:
31 case kAlternatingOpaqueAndTransparent_ColorType:
33 case kConstantTransparent_ColorType:
34 case kChangingTransparent_ColorType:
37 SkFAIL("Shouldn't reach here.");
41 static inline SkColor advance_color(SkColor old, ColorType ct, int step) {
42 if (kAlternatingOpaqueAndTransparent_ColorType == ct) {
43 ct = (step & 0x1) ? kChangingOpaque_ColorType : kChangingTransparent_ColorType ;
46 case kConstantOpaque_ColorType:
47 case kConstantTransparent_ColorType:
49 case kChangingOpaque_ColorType:
50 return 0xFF000000 | (old + 0x00010307);
51 case kChangingTransparent_ColorType:
52 return (0x00FFFFFF & (old + 0x00010307)) | 0x80000000;
53 case kAlternatingOpaqueAndTransparent_ColorType:
54 SkFAIL("Can't get here");
56 SkFAIL("Shouldn't reach here.");
60 static SkString to_lower(const char* str) {
62 for (size_t i = 0; i < lower.size(); i++) {
63 lower[i] = tolower(lower[i]);
68 class RotRectBench: public Benchmark {
70 RotRectBench(bool aa, ColorType ct, SkBlendMode mode)
78 const char* onGetName() override { return fName.c_str(); }
80 void onDraw(int loops, SkCanvas* canvas) override {
82 paint.setAntiAlias(fAA);
83 paint.setBlendMode(fMode);
84 SkColor color = start_color(fColorType);
86 int w = this->getSize().x();
87 int h = this->getSize().y();
89 static const SkScalar kRectW = 25.1f;
90 static const SkScalar kRectH = 25.9f;
93 // This value was chosen so that we frequently hit the axis-aligned case.
94 rotate.setRotate(30.f, kRectW / 2, kRectH / 2);
97 SkScalar tx = 0, ty = 0;
99 for (int i = 0; i < loops; ++i) {
101 canvas->translate(tx, ty);
103 paint.setColor(color);
104 color = advance_color(color, fColorType, i);
106 canvas->drawRect(SkRect::MakeWH(kRectW, kRectH), paint);
118 m.postConcat(rotate);
124 fName = "rotated_rects";
130 switch (fColorType) {
131 case kConstantOpaque_ColorType:
132 fName.append("_same_opaque");
134 case kConstantTransparent_ColorType:
135 fName.append("_same_transparent");
137 case kChangingOpaque_ColorType:
138 fName.append("_changing_opaque");
140 case kChangingTransparent_ColorType:
141 fName.append("_changing_transparent");
143 case kAlternatingOpaqueAndTransparent_ColorType:
144 fName.append("_alternating_transparent_and_opaque");
147 fName.appendf("_%s", to_lower(SkXfermode::ModeName(fMode)).c_str());
151 ColorType fColorType;
155 typedef Benchmark INHERITED;
158 // Choose kSrcOver because it always allows coverage and alpha to be conflated. kSrc only allows
159 // conflation when opaque, and kDarken because it isn't possilbe with standard GL blending.
160 DEF_BENCH(return new RotRectBench(true, kConstantOpaque_ColorType, SkBlendMode::kSrcOver);)
161 DEF_BENCH(return new RotRectBench(true, kConstantTransparent_ColorType, SkBlendMode::kSrcOver);)
162 DEF_BENCH(return new RotRectBench(true, kChangingOpaque_ColorType, SkBlendMode::kSrcOver);)
163 DEF_BENCH(return new RotRectBench(true, kChangingTransparent_ColorType, SkBlendMode::kSrcOver);)
164 DEF_BENCH(return new RotRectBench(true, kAlternatingOpaqueAndTransparent_ColorType, SkBlendMode::kSrcOver);)
166 DEF_BENCH(return new RotRectBench(false, kConstantOpaque_ColorType, SkBlendMode::kSrcOver);)
167 DEF_BENCH(return new RotRectBench(false, kConstantTransparent_ColorType, SkBlendMode::kSrcOver);)
168 DEF_BENCH(return new RotRectBench(false, kChangingOpaque_ColorType, SkBlendMode::kSrcOver);)
169 DEF_BENCH(return new RotRectBench(false, kChangingTransparent_ColorType, SkBlendMode::kSrcOver);)
170 DEF_BENCH(return new RotRectBench(false, kAlternatingOpaqueAndTransparent_ColorType, SkBlendMode::kSrcOver);)
172 DEF_BENCH(return new RotRectBench(true, kConstantOpaque_ColorType, SkBlendMode::kSrc);)
173 DEF_BENCH(return new RotRectBench(true, kConstantTransparent_ColorType, SkBlendMode::kSrc);)
174 DEF_BENCH(return new RotRectBench(true, kChangingOpaque_ColorType, SkBlendMode::kSrc);)
175 DEF_BENCH(return new RotRectBench(true, kChangingTransparent_ColorType, SkBlendMode::kSrc);)
176 DEF_BENCH(return new RotRectBench(true, kAlternatingOpaqueAndTransparent_ColorType, SkBlendMode::kSrc);)
178 DEF_BENCH(return new RotRectBench(false, kConstantOpaque_ColorType, SkBlendMode::kSrc);)
179 DEF_BENCH(return new RotRectBench(false, kConstantTransparent_ColorType, SkBlendMode::kSrc);)
180 DEF_BENCH(return new RotRectBench(false, kChangingOpaque_ColorType, SkBlendMode::kSrc);)
181 DEF_BENCH(return new RotRectBench(false, kChangingTransparent_ColorType, SkBlendMode::kSrc);)
182 DEF_BENCH(return new RotRectBench(false, kAlternatingOpaqueAndTransparent_ColorType, SkBlendMode::kSrc);)
184 DEF_BENCH(return new RotRectBench(true, kConstantOpaque_ColorType, SkBlendMode::kDarken);)
185 DEF_BENCH(return new RotRectBench(true, kConstantTransparent_ColorType, SkBlendMode::kDarken);)
186 DEF_BENCH(return new RotRectBench(true, kChangingOpaque_ColorType, SkBlendMode::kDarken);)
187 DEF_BENCH(return new RotRectBench(true, kChangingTransparent_ColorType, SkBlendMode::kDarken);)
188 DEF_BENCH(return new RotRectBench(true, kAlternatingOpaqueAndTransparent_ColorType, SkBlendMode::kDarken);)
190 DEF_BENCH(return new RotRectBench(false, kConstantOpaque_ColorType, SkBlendMode::kDarken);)
191 DEF_BENCH(return new RotRectBench(false, kConstantTransparent_ColorType, SkBlendMode::kDarken);)
192 DEF_BENCH(return new RotRectBench(false, kChangingOpaque_ColorType, SkBlendMode::kDarken);)
193 DEF_BENCH(return new RotRectBench(false, kChangingTransparent_ColorType, SkBlendMode::kDarken);)
194 DEF_BENCH(return new RotRectBench(false, kAlternatingOpaqueAndTransparent_ColorType, SkBlendMode::kDarken);)