11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc.
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
857382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed#include "SkBenchmark.h"
957382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed#include "SkBitmap.h"
1057382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed#include "SkImageDecoder.h"
1157382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed#include "SkString.h"
1257382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed
1357382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reedstatic const char* gConfigName[] = {
1457382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed    "ERROR", "a1", "a8", "index8", "565", "4444", "8888"
1557382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed};
1657382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed
1757382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reedclass DecodeBench : public SkBenchmark {
1857382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed    const char* fFilename;
1957382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed    SkBitmap::Config fPrefConfig;
2057382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed    SkString fName;
211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    enum { N = SkBENCHLOOP(10) };
2257382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reedpublic:
2357382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed    DecodeBench(void* param, SkBitmap::Config c) : SkBenchmark(param) {
2457382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed        fFilename = this->findDefine("decode-filename");
2557382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed        fPrefConfig = c;
2657382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed
2757382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed        const char* fname = NULL;
2857382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed        if (fFilename) {
2957382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed            fname = strrchr(fFilename, '/');
3057382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed            if (fname) {
3157382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed                fname += 1; // skip the slash
3257382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed            }
3357382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed        }
3457382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed        fName.printf("decode_%s_%s", gConfigName[c], fname);
3557382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed    }
3657382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed
3757382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reedprotected:
3857382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed    virtual const char* onGetName() {
3957382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed        return fName.c_str();
4057382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed    }
4157382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed
4257382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed    virtual void onDraw(SkCanvas* canvas) {
4335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger        if (fFilename) {
4435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger            for (int i = 0; i < N; i++) {
4535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger                SkBitmap bm;
4635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger                SkImageDecoder::DecodeFile(fFilename, &bm, fPrefConfig,
4735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger                                           SkImageDecoder::kDecodePixels_Mode);
4835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger            }
4957382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed        }
5057382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed    }
5157382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed
5257382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reedprivate:
5357382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed    typedef SkBenchmark INHERITED;
5457382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed};
5557382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed
5657382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reedstatic SkBenchmark* Fact0(void* p) { return new DecodeBench(p, SkBitmap::kARGB_8888_Config); }
5757382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reedstatic SkBenchmark* Fact1(void* p) { return new DecodeBench(p, SkBitmap::kRGB_565_Config); }
5857382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reedstatic SkBenchmark* Fact2(void* p) { return new DecodeBench(p, SkBitmap::kARGB_4444_Config); }
5957382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reed
6057382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reedstatic BenchRegistry gReg0(Fact0);
6157382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reedstatic BenchRegistry gReg1(Fact1);
6257382d688c1d6928b1d9bbbaf27188d54dd9e002Mike Reedstatic BenchRegistry gReg2(Fact2);
63