Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
EncodeBench.cpp
Go to the documentation of this file.
1/*
2 * Copyright 2016 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "bench/Benchmark.h"
14#include "tools/DecodeUtils.h"
15
16// Like other Benchmark subclasses, Encoder benchmarks are run by:
17// nanobench --match ^Encode_
18//
19// There is no corresponding DecodeBench class. Decoder benchmarks are run by:
20// nanobench --benchType skcodec --images your_images_directory
21
22class EncodeBench : public Benchmark {
23public:
24 using Encoder = bool (*)(SkWStream*, const SkPixmap&);
25 EncodeBench(const char* filename, Encoder encoder, const char* encoderName)
26 : fSourceFilename(filename)
27 , fEncoder(encoder)
28 , fName(SkStringPrintf("Encode_%s_%s", filename, encoderName)) {}
29
30 bool isSuitableFor(Backend backend) override { return backend == Backend::kNonRendering; }
31
32 const char* onGetName() override { return fName.c_str(); }
33
34 void onDelayedSetup() override {
35 SkAssertResult(ToolUtils::GetResourceAsBitmap(fSourceFilename, &fBitmap));
36 }
37
38 void onDraw(int loops, SkCanvas*) override {
39 while (loops-- > 0) {
40 SkPixmap pixmap;
41 SkAssertResult(fBitmap.peekPixels(&pixmap));
42 SkNullWStream dst;
43 SkAssertResult(fEncoder(&dst, pixmap));
44 SkASSERT(dst.bytesWritten() > 0);
45 }
46 }
47
48private:
49 const char* fSourceFilename;
50 Encoder fEncoder;
51 SkString fName;
52 SkBitmap fBitmap;
53};
54
55static bool encode_jpeg(SkWStream* dst, const SkPixmap& src) {
57 opts.fQuality = 90;
58 return SkJpegEncoder::Encode(dst, src, opts);
59}
60
61static bool encode_webp_lossy(SkWStream* dst, const SkPixmap& src) {
64 opts.fQuality = 90;
65 return SkWebpEncoder::Encode(dst, src, opts);
66}
67
68static bool encode_webp_lossless(SkWStream* dst, const SkPixmap& src) {
71 opts.fQuality = 90;
72 return SkWebpEncoder::Encode(dst, src, opts);
73}
74
75static bool encode_png(SkWStream* dst,
76 const SkPixmap& src,
78 int zlibLevel) {
80 opts.fFilterFlags = filters;
81 opts.fZLibLevel = zlibLevel;
82 return SkPngEncoder::Encode(dst, src, opts);
83}
84
85#define PNG(FLAG, ZLIBLEVEL) [](SkWStream* d, const SkPixmap& s) { \
86 return encode_png(d, s, SkPngEncoder::FilterFlag::FLAG, ZLIBLEVEL); }
87
88static const char* srcs[2] = {"images/mandrill_512.png", "images/color_wheel.jpg"};
89
90// The Android Photos app uses a quality of 90 on JPEG encodes
91DEF_BENCH(return new EncodeBench(srcs[0], &encode_jpeg, "JPEG"));
92DEF_BENCH(return new EncodeBench(srcs[1], &encode_jpeg, "JPEG"));
93
94// TODO: What is the appropriate quality to use to benchmark WEBP encodes?
97
98DEF_BENCH(return new EncodeBench(srcs[0], encode_webp_lossless, "WEBP_LL"));
99DEF_BENCH(return new EncodeBench(srcs[1], encode_webp_lossless, "WEBP_LL"));
100
101DEF_BENCH(return new EncodeBench(srcs[0], PNG(kAll, 6), "PNG"));
102DEF_BENCH(return new EncodeBench(srcs[0], PNG(kAll, 3), "PNG_3"));
103DEF_BENCH(return new EncodeBench(srcs[0], PNG(kAll, 1), "PNG_1"));
104
105DEF_BENCH(return new EncodeBench(srcs[0], PNG(kSub, 6), "PNG_6s"));
106DEF_BENCH(return new EncodeBench(srcs[0], PNG(kSub, 3), "PNG_3s"));
107DEF_BENCH(return new EncodeBench(srcs[0], PNG(kSub, 1), "PNG_1s"));
108
109DEF_BENCH(return new EncodeBench(srcs[0], PNG(kNone, 6), "PNG_6n"));
110DEF_BENCH(return new EncodeBench(srcs[0], PNG(kNone, 3), "PNG_3n"));
111DEF_BENCH(return new EncodeBench(srcs[0], PNG(kNone, 1), "PNG_1n"));
112
113DEF_BENCH(return new EncodeBench(srcs[1], PNG(kAll, 6), "PNG"));
114DEF_BENCH(return new EncodeBench(srcs[1], PNG(kAll, 3), "PNG_3"));
115DEF_BENCH(return new EncodeBench(srcs[1], PNG(kAll, 1), "PNG_1"));
116
117DEF_BENCH(return new EncodeBench(srcs[1], PNG(kSub, 6), "PNG_6s"));
118DEF_BENCH(return new EncodeBench(srcs[1], PNG(kSub, 3), "PNG_3s"));
119DEF_BENCH(return new EncodeBench(srcs[1], PNG(kSub, 1), "PNG_1s"));
120
121DEF_BENCH(return new EncodeBench(srcs[1], PNG(kNone, 6), "PNG_6n"));
122DEF_BENCH(return new EncodeBench(srcs[1], PNG(kNone, 3), "PNG_3n"));
123DEF_BENCH(return new EncodeBench(srcs[1], PNG(kNone, 1), "PNG_1n"));
124
125#undef PNG
#define DEF_BENCH(code)
Definition Benchmark.h:20
const char * backend
static const char * srcs[2]
static bool encode_webp_lossy(SkWStream *dst, const SkPixmap &src)
static bool encode_jpeg(SkWStream *dst, const SkPixmap &src)
#define PNG(FLAG, ZLIBLEVEL)
static bool encode_png(SkWStream *dst, const SkPixmap &src, SkPngEncoder::FilterFlag filters, int zlibLevel)
static bool encode_webp_lossless(SkWStream *dst, const SkPixmap &src)
#define SkAssertResult(cond)
Definition SkAssert.h:123
#define SkASSERT(cond)
Definition SkAssert.h:116
SK_API SkString static SkString SkStringPrintf()
Definition SkString.h:287
void onDraw(int loops, SkCanvas *) override
bool(*)(SkWStream *, const SkPixmap &) Encoder
const char * onGetName() override
bool isSuitableFor(Backend backend) override
void onDelayedSetup() override
EncodeBench(const char *filename, Encoder encoder, const char *encoderName)
bool peekPixels(SkPixmap *pixmap) const
Definition SkBitmap.cpp:635
const char * c_str() const
Definition SkString.h:133
SK_API bool Encode(SkWStream *dst, const SkPixmap &src, const Options &options)
SK_API bool Encode(SkWStream *dst, const SkPixmap &src, const Options &options)
SK_API bool Encode(SkWStream *dst, const SkPixmap &src, const Options &options)
bool GetResourceAsBitmap(const char *resource, SkBitmap *dst)
Definition DecodeUtils.h:21