Index: bench/ColorPrivBench.cpp |
diff --git a/bench/ColorPrivBench.cpp b/bench/ColorPrivBench.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3143ef45256f321feeb5442cd03f4630840392d9 |
--- /dev/null |
+++ b/bench/ColorPrivBench.cpp |
@@ -0,0 +1,56 @@ |
+#include "SkBenchmark.h" |
+#include "SkColorPriv.h" |
+#include "SkRandom.h" |
+#include "SkString.h" |
+ |
+template <bool kFast, bool kScale> |
+class FourByteInterpBench : public SkBenchmark { |
+public: |
+ FourByteInterpBench() { |
+ fName.set("four_byte_interp"); |
+ fName.append(kFast ? "_fast" : "_slow"); |
+ fName.append(kScale ? "_255" : "_256"); |
+ |
+ // We'll exhaustively test all scales instead of using random numbers. |
+ for (int i = 0; i <= 256; i++) { |
+ fScales[i] = i; |
+ } |
+ if (kScale) fScales[256] = 255; // We'll just do 255 twice if we're limited to [0,255]. |
+ } |
+ |
+ virtual bool isSuitableFor(Backend backend) SK_OVERRIDE { |
+ return backend == kNonRendering_Backend; |
+ } |
+ |
+ virtual const char* onGetName() SK_OVERRIDE { return fName.c_str(); } |
+ |
+ virtual void onDraw(SkCanvas*) SK_OVERRIDE { |
+ const SkPMColor src = 0xAB998877, dst = 0x66334455; |
+ volatile SkPMColor junk = 0; |
+ for (int i = 0; i < 10*this->getLoops(); ++i) { |
+ for (size_t j = 0; j <= SK_ARRAY_COUNT(fScales); j++) { |
+ const unsigned scale = fScales[j]; |
+ if (kFast && kScale) { |
+ junk ^= SkFastFourByteInterp(src, dst, scale); |
+ } else if (kFast) { |
+ junk ^= SkFastFourByteInterp256(src, dst, scale); |
+ } else if (kScale) { |
+ junk ^= SkFourByteInterp(src, dst, scale); |
+ } else { |
+ junk ^= SkFourByteInterp256(src, dst, scale); |
+ } |
+ } |
+ } |
+ } |
+ |
+private: |
+ SkString fName; |
+ unsigned fScales[257]; // We need space for [0, 256]. |
+}; |
+ |
+#define COMMA , |
+DEF_BENCH( return SkNEW(FourByteInterpBench<true COMMA true>); ) |
+DEF_BENCH( return SkNEW(FourByteInterpBench<true COMMA false>); ) |
+DEF_BENCH( return SkNEW(FourByteInterpBench<false COMMA true>); ) |
+DEF_BENCH( return SkNEW(FourByteInterpBench<false COMMA false>); ) |
+#undef COMMA |