/*
 * 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/GrCanvas.h"

#include "include/android/SkCanvasAndroid.h"
#include "include/core/SkRect.h"
#include "include/gpu/ganesh/GrBackendSurface.h"
#include "src/core/SkCanvasPriv.h"
#include "src/core/SkDevice.h"
#include "src/gpu/ganesh/Device.h"
#include "src/gpu/ganesh/GrRenderTarget.h"
#include "src/gpu/ganesh/GrRenderTargetProxy.h"

namespace skgpu::ganesh {

SurfaceDrawContext* TopDeviceSurfaceDrawContext(const SkCanvas* canvas) {
    if (auto gpuDevice = SkCanvasPriv::TopDevice(canvas)->asGaneshDevice()) {
        return gpuDevice->surfaceDrawContext();
    }
    return nullptr;
}

SurfaceFillContext* TopDeviceSurfaceFillContext(const SkCanvas* canvas) {
    if (auto gpuDevice = SkCanvasPriv::TopDevice(canvas)->asGaneshDevice()) {
        return gpuDevice->surfaceFillContext();
    }
    return nullptr;
}

GrRenderTargetProxy* TopDeviceTargetProxy(const SkCanvas* canvas) {
    if (auto gpuDevice = SkCanvasPriv::TopDevice(canvas)->asGaneshDevice()) {
        return gpuDevice->targetProxy();
    }
    return nullptr;
}

SkIRect TopLayerBounds(const SkCanvas* canvas) {
    return SkCanvasPriv::TopDevice(canvas)->getGlobalBounds();
}

GrBackendRenderTarget TopLayerBackendRenderTarget(const SkCanvas* canvas) {
    auto proxy = TopDeviceTargetProxy(canvas);
    if (!proxy) {
        return {};
    }
    const GrRenderTarget* renderTarget = proxy->peekRenderTarget();
    return renderTarget ? renderTarget->getBackendRenderTarget() : GrBackendRenderTarget();
}

}  // namespace skgpu::ganesh
