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

#ifndef YUVUtils_DEFINED
#define YUVUtils_DEFINED

#include "include/core/SkColorSpace.h"
#include "include/core/SkImage.h"
#include "include/core/SkYUVAPixmaps.h"
#include "include/gpu/GrBackendSurface.h"
#include "src/base/SkAutoMalloc.h"

#include <tuple>

class SkData;
#if defined(SK_GRAPHITE)
namespace skgpu::graphite { class Recorder; }
#endif

namespace sk_gpu_test {

// Splits an input image into A8 YUV[A] planes using the passed subsampling and YUV color space. If
// the src image is opaque there will be three planes (Y, U, and V) and if not there will be a
// fourth A plane. The planes are returned along with a SkYUVAInfo describing the resulting planar
// image. Images are made as textures if GrRecordingContext is not null, otherwise as cpu images.
std::tuple<std::array<sk_sp<SkImage>, SkYUVAInfo::kMaxPlanes>, SkYUVAInfo>
MakeYUVAPlanesAsA8(SkImage*,
                   SkYUVColorSpace,
                   SkYUVAInfo::Subsampling,
                   GrRecordingContext*);

// Utility that decodes a JPEG but preserves the YUVA8 planes in the image, and uses
// MakeFromYUVAPixmaps to create a GPU multiplane YUVA image for a context. It extracts the planar
// data once, and lazily creates the actual SkImage when the GrContext is provided (and refreshes
// the image if the context has changed, as in Viewer)
class LazyYUVImage {
public:
    // Returns null if the data could not be extracted into YUVA planes
    static std::unique_ptr<LazyYUVImage> Make(sk_sp<SkData> data,
                                              GrMipmapped = GrMipmapped::kNo,
                                              sk_sp<SkColorSpace> = nullptr);
    static std::unique_ptr<LazyYUVImage> Make(SkYUVAPixmaps,
                                              GrMipmapped = GrMipmapped::kNo,
                                              sk_sp<SkColorSpace> = nullptr);

    enum class Type { kFromPixmaps, kFromGenerator, kFromTextures };

    SkISize dimensions() const { return fPixmaps.yuvaInfo().dimensions(); }

    sk_sp<SkImage> refImage(GrRecordingContext* rContext, Type);
#if defined(SK_GRAPHITE)
    sk_sp<SkImage> refImage(skgpu::graphite::Recorder* recorder, Type);
#endif

private:
    // Decoded YUV data
    SkYUVAPixmaps fPixmaps;

    GrMipmapped fMipmapped;

    sk_sp<SkColorSpace> fColorSpace;

    // Memoized SkImages formed with planes, one for each Type.
    sk_sp<SkImage> fYUVImage[4];

    LazyYUVImage() = default;

    bool reset(sk_sp<SkData> data, GrMipmapped, sk_sp<SkColorSpace>);
    bool reset(SkYUVAPixmaps pixmaps, GrMipmapped, sk_sp<SkColorSpace>);

    bool ensureYUVImage(GrRecordingContext* rContext, Type type);
#if defined(SK_GRAPHITE)
    bool ensureYUVImage(skgpu::graphite::Recorder* recorder, Type type);
#endif
};

} // namespace sk_gpu_test

#endif // YUVUtils_DEFINED
