/*
 * 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 SkStuff_DEFINED
#define SkStuff_DEFINED

#include "include/core/SkImageInfo.h"
#include "include/core/SkRefCnt.h"

class SkSurface;
class SkSurfaceProps;

namespace skgpu {
    class BackendTexture;
    class Recorder;
}

// TODO: Should be in SkSurface.h
sk_sp<SkSurface> MakeGraphite(skgpu::Recorder*, const SkImageInfo&);

/**
 * Wraps a GPU-backed texture into SkSurface. Depending on the backend gpu API, the caller may be
 * required to ensure the texture is valid for the lifetime of returned SkSurface. The required
 * lifetimes for the specific apis are:
 *     Metal: Skia will call retain on the underlying MTLTexture so the caller can drop it once this
 *            call returns.
 *
 * SkSurface is returned if all parameters are valid. BackendTexture is valid if its format agrees
 * with colorSpace and context; for instance, if backendTexture has an sRGB configuration, then
 * context must support sRGB, and colorSpace must be present. Further, backendTexture width and
 * height must not exceed context capabilities, and the context must be able to support back-end
 * textures.
 *
 * If SK_ENABLE_GRAPHITE is not defined, this has no effect and returns nullptr.
 */
sk_sp<SkSurface> MakeGraphiteFromBackendTexture(skgpu::Recorder*,
                                                const skgpu::BackendTexture&,
                                                SkColorType colorType,
                                                sk_sp<SkColorSpace> colorSpace,
                                                const SkSurfaceProps* props);

#endif // SkStuff_DEFINED
