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

#include "include/codec/SkCodec.h"
#include "include/private/SkTemplates.h"
#include "src/codec/SkBmpCodec.h"

#include <cstdint>
#include <memory>

class SkStream;
struct SkEncodedInfo;

/*
 * Common base class for SkBmpStandardCodec and SkBmpMaskCodec.
 */
class SkBmpBaseCodec : public SkBmpCodec {
public:
    ~SkBmpBaseCodec() override;

    /*
     * Whether fSrcBuffer was successfully created.
     *
     * If false, this Codec must not be used.
     */
    bool didCreateSrcBuffer() const { return fSrcBuffer != nullptr; }

protected:
    SkBmpBaseCodec(SkEncodedInfo&& info, std::unique_ptr<SkStream>,
                   uint16_t bitsPerPixel, SkCodec::SkScanlineOrder rowOrder);

    uint8_t* srcBuffer() { return reinterpret_cast<uint8_t*>(fSrcBuffer.get()); }

private:
    SkAutoFree fSrcBuffer;

    using INHERITED = SkBmpCodec;
};
#endif // SkBmpBaseCodec_DEFINED
