101 lines
3.9 KiB
C++
101 lines
3.9 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 SkImageAndroid_DEFINED
|
|
#define SkImageAndroid_DEFINED
|
|
|
|
#include "include/core/SkImage.h"
|
|
#include "include/core/SkRefCnt.h"
|
|
#include "include/gpu/ganesh/GrTypes.h"
|
|
|
|
class SkColorSpace;
|
|
class GrDirectContext;
|
|
class GrRecordingContext;
|
|
class SkPixmap;
|
|
struct AHardwareBuffer;
|
|
|
|
namespace SkImages {
|
|
|
|
/** (See skbug.com/40038695)
|
|
Creates SkImage from Android hardware buffer.
|
|
Returned SkImage takes a reference on the buffer.
|
|
Only available on Android, when __ANDROID_API__ is defined to be 26 or greater.
|
|
@param hardwareBuffer AHardwareBuffer Android hardware buffer
|
|
@param colorSpace range of colors; may be nullptr
|
|
@return created SkImage, or nullptr
|
|
*/
|
|
SK_API sk_sp<SkImage> DeferredFromAHardwareBuffer(AHardwareBuffer* hardwareBuffer,
|
|
SkAlphaType alphaType = kPremul_SkAlphaType);
|
|
SK_API sk_sp<SkImage> DeferredFromAHardwareBuffer(
|
|
AHardwareBuffer* hardwareBuffer,
|
|
SkAlphaType alphaType,
|
|
sk_sp<SkColorSpace> colorSpace,
|
|
GrSurfaceOrigin surfaceOrigin = kTopLeft_GrSurfaceOrigin);
|
|
|
|
/** Creates SkImage from Android hardware buffer and uploads the data from the SkPixmap to it.
|
|
Returned SkImage takes a reference on the buffer.
|
|
Only available on Android, when __ANDROID_API__ is defined to be 26 or greater.
|
|
@param context GPU context
|
|
@param pixmap SkPixmap that contains data to be uploaded to the AHardwareBuffer
|
|
@param hardwareBuffer AHardwareBuffer Android hardware buffer
|
|
@param surfaceOrigin surface origin for resulting image
|
|
@return created SkImage, or nullptr
|
|
*/
|
|
SK_API sk_sp<SkImage> TextureFromAHardwareBufferWithData(
|
|
GrDirectContext* context,
|
|
const SkPixmap& pixmap,
|
|
AHardwareBuffer* hardwareBuffer,
|
|
GrSurfaceOrigin surfaceOrigin = kTopLeft_GrSurfaceOrigin);
|
|
|
|
/**
|
|
* Like SkImage::MakeFromBitmap, except this can be pinned using
|
|
* skgpu::ganesh::PinAsTexture and Skia will *not* copy the bitmap.
|
|
*/
|
|
SK_API sk_sp<SkImage> PinnableRasterFromBitmap(const SkBitmap&);
|
|
|
|
/**
|
|
* Like SkImage::MakeFromBitmap, except and Skia will *not* copy the bitmap.
|
|
*/
|
|
SK_API sk_sp<SkImage> RasterFromBitmapNoCopy(const SkBitmap&);
|
|
|
|
} // namespace SkImages
|
|
|
|
namespace skgpu::ganesh {
|
|
/**
|
|
* Will attempt to upload and lock the contents of the image as a texture, so that subsequent
|
|
* draws to a gpu-target will come from that texture (and not by looking at the original image
|
|
* src). In particular this is intended to use the texture even if the image's original content
|
|
* changes subsequent to this call (i.e. the src is mutable!).
|
|
*
|
|
* Only compatible with SkImages created from SkImages::PinnableRasterFromBitmap.
|
|
*
|
|
* All successful calls must be balanced by an equal number of calls to UnpinTexture().
|
|
*
|
|
* Once in this "pinned" state, the image has all of the same thread restrictions that exist
|
|
* for a natively created gpu image (e.g. SkImage::MakeFromTexture)
|
|
* - all drawing, pinning, unpinning must happen in the same thread as the GrContext.
|
|
*
|
|
* @return true if the image was successfully uploaded and locked into a texture
|
|
*/
|
|
bool PinAsTexture(GrRecordingContext*, SkImage*);
|
|
|
|
/**
|
|
* The balancing call to a successful invocation of PinAsTexture. When a balanced
|
|
* number of calls have been made, then the "pinned" texture is free to be purged, etc. This
|
|
* also means that a subsequent "pin" call will look at the original content again, and if
|
|
* its uniqueID/generationID has changed, then a newer texture will be uploaded/pinned.
|
|
*
|
|
* Only compatible with SkImages created from SkImages::PinnableRasterFromBitmap.
|
|
*
|
|
* The context passed to unpin must match the one passed to pin.
|
|
*/
|
|
void UnpinTexture(GrRecordingContext*, SkImage*);
|
|
|
|
} // namespace skgpu::ganesh
|
|
|
|
#endif
|