1 /* 2 * Copyright 2013 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 "SkBenchmark.h" 9 #include "SkBitmap.h" 10 #include "SkData.h" 11 #include "SkForceLinking.h" 12 #include "SkImageDecoder.h" 13 #include "SkOSFile.h" 14 #include "SkStream.h" 15 #include "SkString.h" 16 17 __SK_FORCE_IMAGE_DECODER_LINKING; 18 19 class SkCanvas; 20 21 class ImageDecodeBench : public SkBenchmark { 22 public: 23 ImageDecodeBench(void* p, const char* filename) 24 : fName("image_decode_") 25 , fFilename(filename) 26 , fStream() 27 , fValid(false) { 28 fName.append(SkOSPath::SkBasename(filename)); 29 } 30 31 virtual bool isSuitableFor(Backend backend) SK_OVERRIDE { 32 return backend == kNonRendering_Backend; 33 } 34 35 protected: 36 virtual const char* onGetName() SK_OVERRIDE { 37 return fName.c_str(); 38 } 39 40 virtual void onPreDraw() SK_OVERRIDE { 41 SkFILEStream fileStream(fFilename.c_str()); 42 fValid = fileStream.isValid() && fileStream.getLength() > 0; 43 if (fValid) { 44 const size_t size = fileStream.getLength(); 45 void* data = sk_malloc_throw(size); 46 if (fileStream.read(data, size) < size) { 47 fValid = false; 48 } else { 49 SkAutoTUnref<SkData> skdata(SkData::NewFromMalloc(data, size)); 50 fStream.setData(skdata.get()); 51 } 52 } 53 } 54 55 virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { 56 #ifdef SK_DEBUG 57 if (!fValid) { 58 SkDebugf("stream was invalid: %s\n", fName.c_str()); 59 return; 60 } 61 #endif 62 // Decode a bunch of times 63 SkBitmap bm; 64 for (int i = 0; i < loops; ++i) { 65 SkDEBUGCODE(bool success =) SkImageDecoder::DecodeStream(&fStream, &bm); 66 #ifdef SK_DEBUG 67 if (!success) { 68 SkDebugf("failed to decode %s\n", fName.c_str()); 69 return; 70 } 71 #endif 72 SkDEBUGCODE(success =) fStream.rewind(); 73 #ifdef SK_DEBUG 74 if (!success) { 75 SkDebugf("failed to rewind %s\n", fName.c_str()); 76 return; 77 } 78 #endif 79 } 80 } 81 82 private: 83 SkString fName; 84 const SkString fFilename; 85 SkMemoryStream fStream; 86 bool fValid; 87 88 typedef SkBenchmark INHERITED; 89 }; 90 91 // These are files which call decodePalette 92 //DEF_BENCH( return SkNEW_ARGS(ImageDecodeBench, ("/usr/local/google/home/scroggo/Downloads/images/hal_163x90.png")); ) 93 //DEF_BENCH( return SkNEW_ARGS(ImageDecodeBench, ("/usr/local/google/home/scroggo/Downloads/images/box_19_top-left.png")); ) 94