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