aboutsummaryrefslogtreecommitdiffhomepage
path: root/bench/EncoderBench.cpp
diff options
context:
space:
mode:
authorGravatar msarett <msarett@google.com>2016-04-18 12:37:46 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-04-18 12:37:46 -0700
commitb92dc7ac0bd4109411851d7d3684ed3aa7108086 (patch)
treee516aedb4e6a8109f26eb50848e054a24c1eca2e /bench/EncoderBench.cpp
parent35ad0fbd41f89524e11071fd17fa286e6660bf59 (diff)
Add bench for image encodes
Diffstat (limited to 'bench/EncoderBench.cpp')
-rw-r--r--bench/EncoderBench.cpp81
1 files changed, 81 insertions, 0 deletions
diff --git a/bench/EncoderBench.cpp b/bench/EncoderBench.cpp
new file mode 100644
index 0000000000..8a82a7cf06
--- /dev/null
+++ b/bench/EncoderBench.cpp
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2016 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "Benchmark.h"
+#include "Resources.h"
+#include "SkBitmap.h"
+#include "SkData.h"
+#include "SkImageEncoder.h"
+
+class EncodeBench : public Benchmark {
+public:
+ EncodeBench(const char* filename, SkImageEncoder::Type type, int quality)
+ : fFilename(filename)
+ , fType(type)
+ , fQuality(quality)
+ {
+ // Set the name of the bench
+ SkString name("Encode_");
+ name.append(filename);
+ name.append("_");
+ switch (type) {
+ case SkImageEncoder::kJPEG_Type:
+ name.append("JPEG");
+ break;
+ case SkImageEncoder::kPNG_Type:
+ name.append("PNG");
+ break;
+ case SkImageEncoder::kWEBP_Type:
+ name.append("WEBP");
+ break;
+ default:
+ name.append("Unknown");
+ break;
+ }
+
+ fName = name;
+ }
+
+ bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
+
+ const char* onGetName() override { return fName.c_str(); }
+
+ void onPreDraw(SkCanvas*) override {
+#ifdef SK_DEBUG
+ bool result =
+#endif
+ GetResourceAsBitmap(fFilename, &fBitmap);
+ SkASSERT(result);
+ }
+
+ void onDraw(int loops, SkCanvas*) override {
+ for (int i = 0; i < loops; i++) {
+ SkAutoTUnref<SkData> data(SkImageEncoder::EncodeData(fBitmap, fType, fQuality));
+ SkASSERT(data);
+ }
+ }
+
+private:
+ const char* fFilename;
+ const SkImageEncoder::Type fType;
+ const int fQuality;
+ SkString fName;
+ SkBitmap fBitmap;
+};
+
+
+// The Android Photos app uses a quality of 90 on JPEG encodes
+DEF_BENCH(return new EncodeBench("mandrill_512.png", SkImageEncoder::kJPEG_Type, 90));
+DEF_BENCH(return new EncodeBench("color_wheel.jpg", SkImageEncoder::kJPEG_Type, 90));
+
+// PNG encodes are lossless so quality should be ignored
+DEF_BENCH(return new EncodeBench("mandrill_512.png", SkImageEncoder::kPNG_Type, 90));
+DEF_BENCH(return new EncodeBench("color_wheel.jpg", SkImageEncoder::kPNG_Type, 90));
+
+// TODO: What is the appropriate quality to use to benchmark WEBP encodes?
+DEF_BENCH(return new EncodeBench("mandrill_512.png", SkImageEncoder::kWEBP_Type, 90));
+DEF_BENCH(return new EncodeBench("color_wheel.jpg", SkImageEncoder::kWEBP_Type, 90));