180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2011 Google Inc.
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkBenchmark.h"
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkBitmap.h"
100a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "SkCommandLineFlags.h"
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkImageDecoder.h"
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkString.h"
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
140a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEFINE_string(decodeBenchFilename, "resources/CMYK.jpeg", "Path to image for DecodeBench.");
150a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const char* gConfigName[] = {
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    "ERROR", "a1", "a8", "index8", "565", "4444", "8888"
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass DecodeBench : public SkBenchmark {
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkBitmap::Config fPrefConfig;
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkString fName;
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
240a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    DecodeBench(SkBitmap::Config c) {
2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fPrefConfig = c;
2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
270a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        const char* fname = strrchr(FLAGS_decodeBenchFilename[0], '/');
280a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        if (fname) {
290a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger            fname++; // skip the slash
3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fName.printf("decode_%s_%s", gConfigName[c], fname);
32910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger    }
33910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger
34910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger    virtual bool isSuitableFor(Backend backend) SK_OVERRIDE {
35910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger        return backend == kNonRendering_Backend;
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected:
3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual const char* onGetName() {
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return fName.c_str();
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
43910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger    virtual void onDraw(const int loops, SkCanvas*) {
44910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger        for (int i = 0; i < loops; i++) {
450a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger            SkBitmap bm;
460a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger            SkImageDecoder::DecodeFile(FLAGS_decodeBenchFilename[0],
470a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                                       &bm,
480a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                                       fPrefConfig,
490a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                                       SkImageDecoder::kDecodePixels_Mode);
5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    typedef SkBenchmark INHERITED;
5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
570a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new DecodeBench(SkBitmap::kARGB_8888_Config); )
580a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new DecodeBench(SkBitmap::kRGB_565_Config); )
590a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new DecodeBench(SkBitmap::kARGB_4444_Config); )
60