157382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed#include "SkBenchmark.h" 257382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed#include "SkBitmap.h" 357382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed#include "SkImageDecoder.h" 457382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed#include "SkString.h" 557382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed 657382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reedstatic const char* gConfigName[] = { 757382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed "ERROR", "a1", "a8", "index8", "565", "4444", "8888" 857382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed}; 957382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed 1057382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reedclass DecodeBench : public SkBenchmark { 1157382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed const char* fFilename; 1257382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed SkBitmap::Config fPrefConfig; 1357382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed SkString fName; 1457382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed enum { N = 10 }; 1557382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reedpublic: 1657382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed DecodeBench(void* param, SkBitmap::Config c) : SkBenchmark(param) { 1757382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed fFilename = this->findDefine("decode-filename"); 1857382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed fPrefConfig = c; 1957382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed 2057382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed const char* fname = NULL; 2157382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed if (fFilename) { 2257382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed fname = strrchr(fFilename, '/'); 2357382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed if (fname) { 2457382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed fname += 1; // skip the slash 2557382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed } 2657382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed } 2757382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed fName.printf("decode_%s_%s", gConfigName[c], fname); 2857382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed } 2957382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed 3057382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reedprotected: 3157382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed virtual const char* onGetName() { 3257382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed return fName.c_str(); 3357382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed } 3457382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed 3557382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed virtual void onDraw(SkCanvas* canvas) { 3657382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed for (int i = 0; i < N; i++) { 3757382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed SkBitmap bm; 3857382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed SkImageDecoder::DecodeFile(fFilename, &bm, fPrefConfig, 3957382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed SkImageDecoder::kDecodePixels_Mode); 4057382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed } 4157382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed } 4257382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed 4357382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reedprivate: 4457382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed typedef SkBenchmark INHERITED; 4557382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed}; 4657382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed 4757382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reedstatic SkBenchmark* Fact0(void* p) { return new DecodeBench(p, SkBitmap::kARGB_8888_Config); } 4857382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reedstatic SkBenchmark* Fact1(void* p) { return new DecodeBench(p, SkBitmap::kRGB_565_Config); } 4957382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reedstatic SkBenchmark* Fact2(void* p) { return new DecodeBench(p, SkBitmap::kARGB_4444_Config); } 5057382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed 5157382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reedstatic BenchRegistry gReg0(Fact0); 5257382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reedstatic BenchRegistry gReg1(Fact1); 5357382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reedstatic BenchRegistry gReg2(Fact2); 54