/*
 * Copyright 2015 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef BitmapRegionDecoderBench_DEFINED
#define BitmapRegionDecoderBench_DEFINED

#include "Benchmark.h"
#include "SkBitmapRegionDecoder.h"
#include "SkData.h"
#include "SkImageInfo.h"
#include "SkRefCnt.h"
#include "SkString.h"

/**
 *  Benchmark Android's BitmapRegionDecoder for a particular colorType, sampleSize, and subset.
 *
 *  fStrategy determines which of various implementations is to be used.
 *
 *  nanobench.cpp handles creating benchmarks for interesting scaled subsets.  We strive to test
 *  on real use cases.
 */
class BitmapRegionDecoderBench : public Benchmark {
public:
    // Calls encoded->ref()
    BitmapRegionDecoderBench(const char* basename, SkData* encoded,
            SkBitmapRegionDecoder::Strategy strategy, SkColorType colorType,
            uint32_t sampleSize, const SkIRect& subset);

protected:
    const char* onGetName() override;
    bool isSuitableFor(Backend backend) override;
    void onDraw(int n, SkCanvas* canvas) override;
    void onDelayedSetup() override;

private:
    SkString                                       fName;
    SkAutoTDelete<SkBitmapRegionDecoder>           fBRD;
    SkAutoTUnref<SkData>                           fData;
    const SkBitmapRegionDecoder::Strategy          fStrategy;
    const SkColorType                              fColorType;
    const uint32_t                                 fSampleSize;
    const SkIRect                                  fSubset;
    typedef Benchmark INHERITED;
};
#endif // BitmapRegionDecoderBench_DEFINED
