Index: bench/BitmapScaleBench.cpp |
diff --git a/bench/BitmapScaleBench.cpp b/bench/BitmapScaleBench.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..45ea1b46ef19f68da9bb894bfc70363fa1986e6f |
--- /dev/null |
+++ b/bench/BitmapScaleBench.cpp |
@@ -0,0 +1,135 @@ |
+/* |
+ * Copyright 2013 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#include "SkBenchmark.h" |
+#include "SkCanvas.h" |
+#include "SkPaint.h" |
+#include "SkRandom.h" |
+#include "SkShader.h" |
+#include "SkString.h" |
+#include "SkBlurMask.h" |
+ |
+class BitmapScaleBench: public SkBenchmark { |
+ int fLoopCount; |
+ int fInputSize; |
+ int fOutputSize; |
+ SkString fName; |
+ |
+public: |
+ BitmapScaleBench(void *param, int is, int os) : INHERITED(param) { |
+ fInputSize = is; |
+ fOutputSize = os; |
+ |
+ fLoopCount = 100; |
+ } |
+ |
+protected: |
+ |
+ SkBitmap fInputBitmap, fOutputBitmap; |
+ SkMatrix fMatrix; |
+ |
+ virtual const char* onGetName() { |
+ return fName.c_str(); |
+ } |
+ |
+ int inputSize() const { |
+ return fInputSize; |
+ } |
+ |
+ int outputSize() const { |
+ return fOutputSize; |
+ } |
+ |
+ float scale() const { |
+ return float(outputSize())/inputSize(); |
+ } |
+ |
+ SkIPoint onGetSize() SK_OVERRIDE { |
+ return SkIPoint::Make( fOutputSize, fOutputSize ); |
+ } |
+ |
+ void setName(const char * name) { |
+ fName.printf( "bitmap_scale_%s_%d_%d", name, fInputSize, fOutputSize ); |
+ } |
+ |
+ virtual void onPreDraw() { |
+ fInputBitmap.setConfig(SkBitmap::kARGB_8888_Config, fInputSize, fInputSize); |
+ fInputBitmap.allocPixels(); |
+ fInputBitmap.eraseColor(SK_ColorWHITE); |
+ fInputBitmap.setIsOpaque(true); |
+ |
+ fOutputBitmap.setConfig(SkBitmap::kARGB_8888_Config, fOutputSize, fOutputSize); |
+ fOutputBitmap.allocPixels(); |
+ fOutputBitmap.setIsOpaque(true); |
+ |
+ fMatrix.setScale( scale(), scale() ); |
+ } |
+ |
+ virtual void onDraw(SkCanvas*) { |
+ SkPaint paint; |
+ this->setupPaint(&paint); |
+ |
+ preBenchSetup(); |
+ |
+ for (int i = 0; i < SkBENCHLOOP(fLoopCount); i++) { |
+ doScaleImage(); |
+ } |
+ } |
+ |
+ virtual void doScaleImage() = 0; |
+ virtual void preBenchSetup() {} |
+private: |
+ typedef SkBenchmark INHERITED; |
+}; |
+ |
+class BitmapFilterScaleBench: public BitmapScaleBench { |
+ public: |
+ BitmapFilterScaleBench(void *param, int is, int os) : INHERITED(param, is, os) { |
+ setName( "filter" ); |
+ } |
+protected: |
+ virtual void doScaleImage() SK_OVERRIDE { |
+ SkCanvas canvas( fOutputBitmap ); |
+ SkPaint paint; |
+ |
+ paint.setFlags( SkPaint::kHighQualityFilterBitmap_Flag | SkPaint::kFilterBitmap_Flag ); |
+ |
+ canvas.drawBitmapMatrix( fInputBitmap, fMatrix, &paint ); |
+ } |
+private: |
+ typedef BitmapScaleBench INHERITED; |
+}; |
+ |
+class BitmapDirectScaleBench: public BitmapScaleBench { |
+ public: |
+ BitmapDirectScaleBench(void *param, int is, int os) : INHERITED(param, is, os) { |
+ setName( "direct" ); |
+ } |
+protected: |
+ virtual void doScaleImage() SK_OVERRIDE { |
+ fInputBitmap.scale( &fOutputBitmap ); |
+ } |
+private: |
+ typedef BitmapScaleBench INHERITED; |
+}; |
+ |
+ |
+DEF_BENCH(return new BitmapFilterScaleBench(p, 10, 90);) |
+DEF_BENCH(return new BitmapFilterScaleBench(p, 30, 90);) |
+DEF_BENCH(return new BitmapFilterScaleBench(p, 80, 90);) |
+// DEF_BENCH(return new BitmapFilterScaleBench(p, 90, 90);) |
+// DEF_BENCH(return new BitmapFilterScaleBench(p, 90, 80);) |
+// DEF_BENCH(return new BitmapFilterScaleBench(p, 90, 30);) |
+// DEF_BENCH(return new BitmapFilterScaleBench(p, 90, 10);) |
+ |
+DEF_BENCH(return new BitmapDirectScaleBench(p, 10, 90);) |
+DEF_BENCH(return new BitmapDirectScaleBench(p, 30, 90);) |
+DEF_BENCH(return new BitmapDirectScaleBench(p, 80, 90);) |
+// DEF_BENCH(return new BitmapDirectScaleBench(p, 90, 90);) |
+// DEF_BENCH(return new BitmapDirectScaleBench(p, 90, 80);) |
+// DEF_BENCH(return new BitmapDirectScaleBench(p, 90, 30);) |
+// DEF_BENCH(return new BitmapDirectScaleBench(p, 90, 10);) |