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

#include <cstddef>
#include <cstdint>

#include <optional>
#include "include/core/SkImageInfo.h"
#include "include/core/SkSpan.h"
#include "include/encode/SkEncoder.h"
#include "include/private/SkEncodedInfo.h"

class SkPixmap;

// This class implements functionality shared between `SkPngEncoderImpl` and
// `SkPngRustEncoderImpl`.
class SkPngEncoderBase : public SkEncoder {
public:
    struct TargetInfo {
        std::optional<SkImageInfo> fSrcRowInfo;
        std::optional<SkImageInfo> fDstRowInfo;
        SkEncodedInfo fDstInfo;
        size_t fDstRowSize;
    };

    // Gets the `fDstRowInfo` that `fSrcRowInfo` should be converted into before
    // encoding and uses SkConvertPixels to transform source rows into
    // ready-to-encode rows (and the `fDstRowSize` of such rows).
    //
    // For example, `kRGBA_F32_SkColorType` source will be encoded as
    // `SkEncodedInfo::kRGBA_Color` with 16 `bitsPerComponent`.
    //
    // 'fDstInfo' stores extra information for libpng.
    //
    // Returns `std::nullopt` if `srcInfo` is not supported by the PNG encoder.
    static std::optional<TargetInfo> getTargetInfo(const SkImageInfo& srcInfo);

protected:
    SkPngEncoderBase(TargetInfo targetInfo, const SkPixmap& src);

    // SkEncoder override:
    bool onEncodeRows(int numRows) final;

    // Called from `onEncodeRows` to encode the given `row` (in `dstInfo` format
    // that was passed to the `SkPngEncoderBase`'s constructor).
    virtual bool onEncodeRow(SkSpan<const uint8_t> row) = 0;

    // Called from `onEncodeRows` to finalize the encoded PNG (e.g. write the
    // `IEND` chunk).
    virtual bool onFinishEncoding() = 0;

    const TargetInfo& targetInfo() const { return fTargetInfo; }

private:
    TargetInfo fTargetInfo;
    bool fFinishedEncoding = false;
};

#endif  // SkPngEncoderBase_DEFINED
