Index: bench/RotatedRectBench.cpp |
diff --git a/bench/RotatedRectBench.cpp b/bench/RotatedRectBench.cpp |
index 522d358c3b4653f443c4988a0d095e4c55fededc..ea8654a344c05e79ccdeccad7cc2de7f8da1e667 100644 |
--- a/bench/RotatedRectBench.cpp |
+++ b/bench/RotatedRectBench.cpp |
@@ -9,13 +9,68 @@ |
#include "SkCanvas.h" |
#include "SkPaint.h" |
+#include <ctype.h> |
+ |
/** This benchmark tests rendering rotated rectangles. It can optionally apply AA and/or change the |
- paint color between each rect. */ |
+ paint color between each rect in different ways using the ColorType enum. The xfermode used can |
+ be specified as well. |
+ */ |
+ |
+enum ColorType { |
+ kConstantOpaque_ColorType, |
+ kConstantTransparent_ColorType, |
+ kChangingOpaque_ColorType, |
+ kChangingTransparent_ColorType, |
+ kAlternatingOpaqueAndTransparent_ColorType, |
+}; |
+ |
+static inline SkColor start_color(ColorType ct) { |
+ switch (ct) { |
+ case kConstantOpaque_ColorType: |
+ case kChangingOpaque_ColorType: |
+ case kAlternatingOpaqueAndTransparent_ColorType: |
+ return 0xFFA07040; |
+ case kConstantTransparent_ColorType: |
+ case kChangingTransparent_ColorType: |
+ return 0x80A07040; |
+ } |
+ SkFAIL("Shouldn't reach here."); |
+ return 0; |
+} |
+ |
+static inline SkColor advance_color(SkColor old, ColorType ct, int step) { |
+ if (kAlternatingOpaqueAndTransparent_ColorType == ct) { |
+ ct = (step & 0x1) ? kChangingOpaque_ColorType : kChangingTransparent_ColorType ; |
+ } |
+ switch (ct) { |
+ case kConstantOpaque_ColorType: |
+ case kConstantTransparent_ColorType: |
+ return old; |
+ case kChangingOpaque_ColorType: |
+ return 0xFF000000 | (old + 0x00010307); |
+ case kChangingTransparent_ColorType: |
+ return (0x00FFFFFF & (old + 0x00010307)) | 0x80000000; |
+ case kAlternatingOpaqueAndTransparent_ColorType: |
+ SkFAIL("Can't get here"); |
+ } |
+ SkFAIL("Shouldn't reach here."); |
+ return 0; |
+} |
+ |
+static SkString to_lower(const char* str) { |
+ SkString lower(str); |
+ for (size_t i = 0; i < lower.size(); i++) { |
+ lower[i] = tolower(lower[i]); |
+ } |
+ return lower; |
+} |
+ |
class RotRectBench: public Benchmark { |
public: |
- RotRectBench(bool aa, bool changeColor) |
+ RotRectBench(bool aa, ColorType ct, SkXfermode::Mode mode) |
: fAA(aa) |
- , fChangeColor(changeColor) { |
+ , fColorType(ct) |
+ , fMode(mode) { |
this->makeName(); |
} |
@@ -25,7 +80,8 @@ protected: |
virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE { |
SkPaint paint; |
paint.setAntiAlias(fAA); |
- SkColor color = 0xFF000000; |
+ paint.setXfermodeMode(fMode); |
+ SkColor color = start_color(fColorType); |
int w = canvas->getBaseLayerSize().width(); |
int h = canvas->getBaseLayerSize().height(); |
@@ -45,10 +101,8 @@ protected: |
canvas->translate(tx, ty); |
canvas->concat(m); |
paint.setColor(color); |
- if (fChangeColor) { |
- color += 0x010203; |
- color |= 0xFF000000; |
- } |
+ color = advance_color(color, fColorType, i); |
+ |
canvas->drawRect(SkRect::MakeWH(kRectW, kRectH), paint); |
canvas->restore(); |
@@ -73,21 +127,68 @@ private: |
} else { |
fName.append("_bw"); |
} |
- if (fChangeColor) { |
- fName.append("_change_color"); |
- } else { |
- fName.append("_same_color"); |
+ switch (fColorType) { |
+ case kConstantOpaque_ColorType: |
+ fName.append("_same_opaque"); |
+ break; |
+ case kConstantTransparent_ColorType: |
+ fName.append("_same_transparent"); |
+ break; |
+ case kChangingOpaque_ColorType: |
+ fName.append("_changing_opaque"); |
+ break; |
+ case kChangingTransparent_ColorType: |
+ fName.append("_changing_transparent"); |
+ break; |
+ case kAlternatingOpaqueAndTransparent_ColorType: |
+ fName.append("_alternating_transparent_and_opaque"); |
+ break; |
} |
+ fName.appendf("_%s", to_lower(SkXfermode::ModeName(fMode)).c_str()); |
} |
- bool fAA; |
- bool fChangeColor; |
- SkString fName; |
+ bool fAA; |
+ ColorType fColorType; |
+ SkXfermode::Mode fMode; |
+ SkString fName; |
typedef Benchmark INHERITED; |
}; |
-DEF_BENCH(return new RotRectBench(true, true);) |
-DEF_BENCH(return new RotRectBench(true, false);) |
-DEF_BENCH(return new RotRectBench(false, true);) |
-DEF_BENCH(return new RotRectBench(false, false);) |
+// Choose kSrcOver because it always allows coverage and alpha to be conflated. kSrc only allows |
+// conflation when opaque, and kDarken because it isn't possilbe with standard GL blending. |
+DEF_BENCH(return new RotRectBench(true, kConstantOpaque_ColorType, SkXfermode::kSrcOver_Mode);) |
+DEF_BENCH(return new RotRectBench(true, kConstantTransparent_ColorType, SkXfermode::kSrcOver_Mode);) |
+DEF_BENCH(return new RotRectBench(true, kChangingOpaque_ColorType, SkXfermode::kSrcOver_Mode);) |
+DEF_BENCH(return new RotRectBench(true, kChangingTransparent_ColorType, SkXfermode::kSrcOver_Mode);) |
+DEF_BENCH(return new RotRectBench(true, kAlternatingOpaqueAndTransparent_ColorType, SkXfermode::kSrcOver_Mode);) |
+ |
+DEF_BENCH(return new RotRectBench(false, kConstantOpaque_ColorType, SkXfermode::kSrcOver_Mode);) |
+DEF_BENCH(return new RotRectBench(false, kConstantTransparent_ColorType, SkXfermode::kSrcOver_Mode);) |
+DEF_BENCH(return new RotRectBench(false, kChangingOpaque_ColorType, SkXfermode::kSrcOver_Mode);) |
+DEF_BENCH(return new RotRectBench(false, kChangingTransparent_ColorType, SkXfermode::kSrcOver_Mode);) |
+DEF_BENCH(return new RotRectBench(false, kAlternatingOpaqueAndTransparent_ColorType, SkXfermode::kSrcOver_Mode);) |
+ |
+DEF_BENCH(return new RotRectBench(true, kConstantOpaque_ColorType, SkXfermode::kSrc_Mode);) |
+DEF_BENCH(return new RotRectBench(true, kConstantTransparent_ColorType, SkXfermode::kSrc_Mode);) |
+DEF_BENCH(return new RotRectBench(true, kChangingOpaque_ColorType, SkXfermode::kSrc_Mode);) |
+DEF_BENCH(return new RotRectBench(true, kChangingTransparent_ColorType, SkXfermode::kSrc_Mode);) |
+DEF_BENCH(return new RotRectBench(true, kAlternatingOpaqueAndTransparent_ColorType, SkXfermode::kSrc_Mode);) |
+ |
+DEF_BENCH(return new RotRectBench(false, kConstantOpaque_ColorType, SkXfermode::kSrc_Mode);) |
+DEF_BENCH(return new RotRectBench(false, kConstantTransparent_ColorType, SkXfermode::kSrc_Mode);) |
+DEF_BENCH(return new RotRectBench(false, kChangingOpaque_ColorType, SkXfermode::kSrc_Mode);) |
+DEF_BENCH(return new RotRectBench(false, kChangingTransparent_ColorType, SkXfermode::kSrc_Mode);) |
+DEF_BENCH(return new RotRectBench(false, kAlternatingOpaqueAndTransparent_ColorType, SkXfermode::kSrc_Mode);) |
+ |
+DEF_BENCH(return new RotRectBench(true, kConstantOpaque_ColorType, SkXfermode::kDarken_Mode);) |
+DEF_BENCH(return new RotRectBench(true, kConstantTransparent_ColorType, SkXfermode::kDarken_Mode);) |
+DEF_BENCH(return new RotRectBench(true, kChangingOpaque_ColorType, SkXfermode::kDarken_Mode);) |
+DEF_BENCH(return new RotRectBench(true, kChangingTransparent_ColorType, SkXfermode::kDarken_Mode);) |
+DEF_BENCH(return new RotRectBench(true, kAlternatingOpaqueAndTransparent_ColorType, SkXfermode::kDarken_Mode);) |
+ |
+DEF_BENCH(return new RotRectBench(false, kConstantOpaque_ColorType, SkXfermode::kDarken_Mode);) |
+DEF_BENCH(return new RotRectBench(false, kConstantTransparent_ColorType, SkXfermode::kDarken_Mode);) |
+DEF_BENCH(return new RotRectBench(false, kChangingOpaque_ColorType, SkXfermode::kDarken_Mode);) |
+DEF_BENCH(return new RotRectBench(false, kChangingTransparent_ColorType, SkXfermode::kDarken_Mode);) |
+DEF_BENCH(return new RotRectBench(false, kAlternatingOpaqueAndTransparent_ColorType, SkXfermode::kDarken_Mode);) |