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

#include "src/gpu/ganesh/image/SkImage_LazyTexture.h"

#include "include/core/SkColorSpace.h"
#include "include/core/SkImage.h"
#include "include/core/SkImageGenerator.h"
#include "include/core/SkImageInfo.h"
#include "include/core/SkPixmap.h"
#include "include/gpu/GpuTypes.h"
#include "include/gpu/GrDirectContext.h"
#include "include/gpu/GrTypes.h"
#include "include/gpu/ganesh/SkImageGanesh.h"
#include "include/private/gpu/ganesh/GrTextureGenerator.h" // IWYU pragma: keep
#include "src/gpu/ganesh/GrColorInfo.h"
#include "src/gpu/ganesh/GrDirectContextPriv.h"
#include "src/gpu/ganesh/GrSurfaceProxyView.h"
#include "src/gpu/ganesh/SkGr.h"
#include "src/gpu/ganesh/SurfaceContext.h"
#include "src/gpu/ganesh/image/GrImageUtils.h"

#include <cstddef>
#include <memory>
#include <utility>

enum class GrColorType;

sk_sp<SkImage> SkImage_LazyTexture::onMakeSubset(GrDirectContext* direct,
                                                 const SkIRect& subset) const {
    auto pixels = direct ? SkImages::TextureFromImage(direct, this) :
                           this->makeRasterImage(nullptr);
    return pixels ? pixels->makeSubset(direct, subset) : nullptr;
}

bool SkImage_LazyTexture::readPixelsProxy(GrDirectContext* ctx, const SkPixmap& pixmap) const {
    if (!ctx) {
        return false;
    }
    GrSurfaceProxyView view = skgpu::ganesh::LockTextureProxyView(ctx,
                                                                  this,
                                                                  GrImageTexGenPolicy::kDraw,
                                                                  GrMipmapped::kNo);

    if (!view) {
        return false;
    }

    GrColorType ct = skgpu::ganesh::ColorTypeOfLockTextureProxy(ctx->priv().caps(),
                                                                this->colorType());
    GrColorInfo colorInfo(ct, this->alphaType(), this->refColorSpace());
    auto sContext = ctx->priv().makeSC(std::move(view), colorInfo);
    if (!sContext) {
        return false;
    }
    size_t rowBytes = this->imageInfo().minRowBytes();
    return sContext->readPixels(ctx, {this->imageInfo(), pixmap.writable_addr(), rowBytes}, {0, 0});
}

namespace SkImages {
sk_sp<SkImage> DeferredFromTextureGenerator(std::unique_ptr<GrTextureGenerator> generator) {
    SkImage_Lazy::Validator validator(
            SharedGenerator::Make(std::move(generator)), nullptr, nullptr);

    return validator ? sk_make_sp<SkImage_LazyTexture>(&validator) : nullptr;
}
}
