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 "Benchmark.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 19class SkCanvas; 20 21class ImageDecodeBench : public Benchmark { 22public: 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 35protected: 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 82private: 83 SkString fName; 84 const SkString fFilename; 85 SkMemoryStream fStream; 86 bool fValid; 87 88 typedef Benchmark 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