118 lines
6.3 KiB
C++
118 lines
6.3 KiB
C++
/*
|
|
* Copyright 2023 Google LLC
|
|
*
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
|
|
#ifndef SkImageChromium_DEFINED
|
|
#define SkImageChromium_DEFINED
|
|
|
|
#include "include/core/SkRefCnt.h"
|
|
#include "include/private/base/SkAPI.h"
|
|
|
|
class GrBackendFormat;
|
|
class GrContextThreadSafeProxy;
|
|
class GrPromiseImageTexture;
|
|
class GrDirectContext;
|
|
class GrYUVABackendTextureInfo;
|
|
class SkColorSpace;
|
|
class SkImage;
|
|
enum SkAlphaType : int;
|
|
enum SkColorType : int;
|
|
enum GrSurfaceOrigin : int;
|
|
namespace skgpu {
|
|
enum class Mipmapped : bool;
|
|
}
|
|
struct SkISize;
|
|
|
|
/**
|
|
* These functions expose features that are only for external use in Chromium.
|
|
*/
|
|
|
|
namespace SkImages {
|
|
|
|
using PromiseImageTextureContext = void*;
|
|
using PromiseImageTextureFulfillProc = sk_sp<GrPromiseImageTexture> (*)(PromiseImageTextureContext);
|
|
using PromiseImageTextureReleaseProc = void (*)(PromiseImageTextureContext);
|
|
|
|
/** Create a new GPU-backed SkImage that is very similar to an SkImage created by BorrowTextureFrom.
|
|
The difference is that the caller need not have created the texture nor populated it with the
|
|
image pixel data. Moreover, the SkImage may be created on a thread as the creation of the
|
|
image does not require access to the backend API or GrDirectContext. Instead of passing a
|
|
GrBackendTexture the client supplies a description of the texture consisting of
|
|
GrBackendFormat, width, height, and skgpu::Mipmapped state. The resulting SkImage can be drawn
|
|
to a GrDeferredDisplayListRecorder or directly to a GPU-backed SkSurface.
|
|
When the actual texture is required to perform a backend API draw, textureFulfillProc will
|
|
be called to receive a GrBackendTexture. The properties of the GrBackendTexture must match
|
|
those set during the SkImage creation, and it must refer to a valid existing texture in the
|
|
backend API context/device, and be populated with the image pixel data. The texture cannot
|
|
be deleted until textureReleaseProc is called.
|
|
There is at most one call to each of textureFulfillProc and textureReleaseProc.
|
|
textureReleaseProc is always called even if image creation fails or if the
|
|
image is never fulfilled (e.g. it is never drawn or all draws are clipped out)
|
|
@param gpuContextProxy the thread-safe proxy of the gpu context. required.
|
|
@param backendFormat format of promised gpu texture
|
|
@param dimensions width & height of promised gpu texture
|
|
@param mipmapped mip mapped state of promised gpu texture
|
|
@param origin surface origin of promised gpu texture
|
|
@param colorType color type of promised gpu texture
|
|
@param alphaType alpha type of promised gpu texture
|
|
@param colorSpace range of colors; may be nullptr
|
|
@param textureFulfillProc function called to get actual gpu texture
|
|
@param textureReleaseProc function called when texture can be deleted
|
|
@param textureContext state passed to textureFulfillProc and textureReleaseProc
|
|
@return created SkImage, or nullptr
|
|
*/
|
|
SK_API sk_sp<SkImage> PromiseTextureFrom(sk_sp<GrContextThreadSafeProxy> gpuContextProxy,
|
|
const GrBackendFormat& backendFormat,
|
|
SkISize dimensions,
|
|
skgpu::Mipmapped mipmapped,
|
|
GrSurfaceOrigin origin,
|
|
SkColorType colorType,
|
|
SkAlphaType alphaType,
|
|
sk_sp<SkColorSpace> colorSpace,
|
|
PromiseImageTextureFulfillProc textureFulfillProc,
|
|
PromiseImageTextureReleaseProc textureReleaseProc,
|
|
PromiseImageTextureContext textureContext);
|
|
|
|
/** This is similar to 'PromiseTextureFrom' but it creates a GPU-backed SkImage from YUV[A] data.
|
|
The source data may be planar (i.e. spread across multiple textures). In
|
|
the extreme Y, U, V, and A are all in different planes and thus the image is specified by
|
|
four textures. 'backendTextureInfo' describes the planar arrangement, texture formats,
|
|
conversion to RGB, and origin of the textures. Separate 'textureFulfillProc' and
|
|
'textureReleaseProc' calls are made for each texture. Each texture has its own
|
|
PromiseImageTextureContext. If 'backendTextureInfo' is not valid then no release proc
|
|
calls are made. Otherwise, the calls will be made even on failure. 'textureContexts' has one
|
|
entry for each of the up to four textures, as indicated by 'backendTextureInfo'.
|
|
Currently the mip mapped property of 'backendTextureInfo' is ignored. However, in the
|
|
near future it will be required that if it is kYes then textureFulfillProc must return
|
|
a mip mapped texture for each plane in order to successfully draw the image.
|
|
@param gpuContextProxy the thread-safe proxy of the gpu context. required.
|
|
@param backendTextureInfo info about the promised yuva gpu texture
|
|
@param imageColorSpace range of colors; may be nullptr
|
|
@param textureFulfillProc function called to get actual gpu texture
|
|
@param textureReleaseProc function called when texture can be deleted
|
|
@param textureContexts state passed to textureFulfillProc and textureReleaseProc
|
|
@return created SkImage, or nullptr
|
|
*/
|
|
SK_API sk_sp<SkImage> PromiseTextureFromYUVA(sk_sp<GrContextThreadSafeProxy> gpuContextProxy,
|
|
const GrYUVABackendTextureInfo& backendTextureInfo,
|
|
sk_sp<SkColorSpace> imageColorSpace,
|
|
PromiseImageTextureFulfillProc textureFulfillProc,
|
|
PromiseImageTextureReleaseProc textureReleaseProc,
|
|
PromiseImageTextureContext textureContexts[]);
|
|
|
|
/** Returns the GPU context associated with this image or nullptr if the image is not Ganesh-backed.
|
|
We expose this only to help transition certain API calls and do not intend for this to stick
|
|
around forever.
|
|
*/
|
|
SK_API GrDirectContext* GetContext(const SkImage* src);
|
|
inline GrDirectContext* GetContext(const sk_sp<const SkImage>& src) {
|
|
return GetContext(src.get());
|
|
}
|
|
|
|
} // namespace SkImages
|
|
|
|
#endif
|