From b92dc7ac0bd4109411851d7d3684ed3aa7108086 Mon Sep 17 00:00:00 2001 From: msarett Date: Mon, 18 Apr 2016 12:37:46 -0700 Subject: [PATCH] Add bench for image encodes BUG=skia: GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1890643003 Review URL: https://codereview.chromium.org/1890643003 --- bench/EncoderBench.cpp | 81 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 bench/EncoderBench.cpp 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 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));