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 "Benchmark.h" 9 #include "Resources.h" 10 #include "SkBitmap.h" 11 #include "SkData.h" 12 #include "SkImageEncoder.h" 13 14 #include "sk_tool_utils.h" 15 16 class EncodeBench : public Benchmark { 17 public: 18 EncodeBench(const char* filename, SkEncodedImageFormat type, int quality) 19 : fFilename(filename) 20 , fType(type) 21 , fQuality(quality) 22 { 23 // Set the name of the bench 24 SkString name("Encode_"); 25 name.append(filename); 26 name.append("_"); 27 switch (type) { 28 case SkEncodedImageFormat::kJPEG: 29 name.append("JPEG"); 30 break; 31 case SkEncodedImageFormat::kPNG: 32 name.append("PNG"); 33 break; 34 case SkEncodedImageFormat::kWEBP: 35 name.append("WEBP"); 36 break; 37 default: 38 name.append("Unknown"); 39 break; 40 } 41 42 fName = name; 43 } 44 45 bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; } 46 47 const char* onGetName() override { return fName.c_str(); } 48 49 void onPreDraw(SkCanvas*) override { 50 #ifdef SK_DEBUG 51 bool result = 52 #endif 53 GetResourceAsBitmap(fFilename, &fBitmap); 54 SkASSERT(result); 55 } 56 57 void onDraw(int loops, SkCanvas*) override { 58 for (int i = 0; i < loops; i++) { 59 sk_sp<SkData> data(sk_tool_utils::EncodeImageToData(fBitmap, fType, fQuality)); 60 SkASSERT(data); 61 } 62 } 63 64 private: 65 const char* fFilename; 66 const SkEncodedImageFormat fType; 67 const int fQuality; 68 SkString fName; 69 SkBitmap fBitmap; 70 }; 71 72 73 // The Android Photos app uses a quality of 90 on JPEG encodes 74 DEF_BENCH(return new EncodeBench("mandrill_512.png", SkEncodedImageFormat::kJPEG, 90)); 75 DEF_BENCH(return new EncodeBench("color_wheel.jpg", SkEncodedImageFormat::kJPEG, 90)); 76 77 // PNG encodes are lossless so quality should be ignored 78 DEF_BENCH(return new EncodeBench("mandrill_512.png", SkEncodedImageFormat::kPNG, 90)); 79 DEF_BENCH(return new EncodeBench("color_wheel.jpg", SkEncodedImageFormat::kPNG, 90)); 80 81 // TODO: What is the appropriate quality to use to benchmark WEBP encodes? 82 DEF_BENCH(return new EncodeBench("mandrill_512.png", SkEncodedImageFormat::kWEBP, 90)); 83 DEF_BENCH(return new EncodeBench("color_wheel.jpg", SkEncodedImageFormat::kWEBP, 90)); 84