/*
 * 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 BitmapRegionDecoder_DEFINED
#define BitmapRegionDecoder_DEFINED

#include "client_utils/android/BRDAllocator.h"
#include "include/codec/SkAndroidCodec.h"
#include "include/core/SkBitmap.h"
#include "include/core/SkData.h"

namespace android {
namespace skia {

class BitmapRegionDecoder final {
public:
    static std::unique_ptr<BitmapRegionDecoder> Make(sk_sp<SkData> data);

    bool decodeRegion(SkBitmap* bitmap,
                      BRDAllocator* allocator,
                      const SkIRect& desiredSubset,
                      int sampleSize,
                      SkColorType colorType,
                      bool requireUnpremul,
                      sk_sp<SkColorSpace> prefColorSpace);

    SkEncodedImageFormat getEncodedFormat() { return fCodec->getEncodedFormat(); }

    SkColorType computeOutputColorType(SkColorType requestedColorType) {
        return fCodec->computeOutputColorType(requestedColorType);
    }

    sk_sp<SkColorSpace> computeOutputColorSpace(SkColorType outputColorType,
                                                sk_sp<SkColorSpace> prefColorSpace = nullptr) {
        return fCodec->computeOutputColorSpace(outputColorType, std::move(prefColorSpace));
    }

    int width() const;
    int height() const;

    bool getAndroidGainmap(SkGainmapInfo* outInfo,
                           std::unique_ptr<SkStream>* outGainmapImageStream) {
        return fCodec->getAndroidGainmap(outInfo, outGainmapImageStream);
    }

    bool getGainmapBitmapRegionDecoder(SkGainmapInfo* outInfo,
                                       std::unique_ptr<BitmapRegionDecoder>* outDecoder) {
        std::unique_ptr<SkAndroidCodec> codec;
        if (!fCodec->getGainmapAndroidCodec(outInfo, &codec)) {
            return false;
        }

        *outDecoder = std::unique_ptr<BitmapRegionDecoder>(
                new BitmapRegionDecoder(std::move(codec)));
        return true;
    }

private:
    explicit BitmapRegionDecoder(std::unique_ptr<SkAndroidCodec> codec);

    std::unique_ptr<SkAndroidCodec> fCodec;
};

}  // namespace skia
}  // namespace android
#endif  // BitmapRegionDecoder_DEFINED
