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

#ifndef GrYUVATextureProxies_DEFINED
#define GrYUVATextureProxies_DEFINED

#include "include/core/SkYUVAInfo.h"
#include "src/core/SkYUVAInfoLocation.h"
#include "src/gpu/ganesh/GrSurfaceProxy.h"
#include "src/gpu/ganesh/GrSurfaceProxyView.h"

class GrSurfaceProxyView;

class GrYUVATextureProxies {
public:
    GrYUVATextureProxies() = default;

    /** Assumes all planes are sampled with a default "rgba" swizzle. */
    GrYUVATextureProxies(const SkYUVAInfo&,
                         sk_sp<GrSurfaceProxy>[SkYUVAInfo::kMaxPlanes],
                         GrSurfaceOrigin textureOrigin);

    /**
     * When uploading pixmaps to textures it is important that we account for how the original
     * pixmaps' channels are swizzled into the texture during upload. This will compute a swizzle
     * for each texture based on the original color types and the views' swizzles. The views must
     * all have the same origin or the result will be an invalid GrYUVATextureProxies.
     */
    GrYUVATextureProxies(const SkYUVAInfo&,
                         GrSurfaceProxyView[SkYUVAInfo::kMaxPlanes],
                         GrColorType[SkYUVAInfo::kMaxPlanes]);

    GrYUVATextureProxies(const GrYUVATextureProxies&) = default;
    GrYUVATextureProxies(GrYUVATextureProxies&&) = default;

    GrYUVATextureProxies& operator=(const GrYUVATextureProxies&) = default;
    GrYUVATextureProxies& operator=(GrYUVATextureProxies&&) = default;

    const SkYUVAInfo& yuvaInfo() const { return fYUVAInfo; }

    int numPlanes() const { return fYUVAInfo.numPlanes(); }

    GrSurfaceOrigin textureOrigin() const { return fTextureOrigin; }

    // Overall set of YUVA proxies is mip mapped if each plane is mip mapped.
    GrMipmapped mipmapped() const { return fMipmapped; }

    GrSurfaceProxy* proxy(int i) const { return fProxies[i].get(); }

    const std::array<sk_sp<GrSurfaceProxy>, SkYUVAInfo::kMaxPlanes>& proxies() const {
        return fProxies;
    }

    sk_sp<GrSurfaceProxy> refProxy(int i) const { return fProxies[i]; }

    GrSurfaceProxyView makeView(int i) const {
        return {fProxies[i], fTextureOrigin, skgpu::Swizzle::RGBA()};
    }

    bool isValid() const { return fYUVAInfo.isValid(); }

    const SkYUVAInfo::YUVALocations& yuvaLocations() const { return fYUVALocations; }

private:
    std::array<sk_sp<GrSurfaceProxy>, SkYUVAInfo::kMaxPlanes> fProxies;
    SkYUVAInfo fYUVAInfo;
    GrSurfaceOrigin fTextureOrigin = kTopLeft_GrSurfaceOrigin;
    GrMipmapped fMipmapped = GrMipmapped::kNo;
    SkYUVAInfo::YUVALocations fYUVALocations = {};
};

#endif
