/* * Copyright 2012 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkImage_DEFINED #define SkImage_DEFINED #include "include/core/SkAlphaType.h" #include "include/core/SkImageInfo.h" #include "include/core/SkRect.h" #include "include/core/SkRefCnt.h" #include "include/core/SkSize.h" #include "include/private/base/SkAPI.h" #include <cstddef> #include <cstdint> #include <memory> #include <optional> class GrDirectContext; class GrRecordingContext; class SkBitmap; class SkColorSpace; class SkData; class SkImage; class SkImageFilter; class SkImageGenerator; class SkMatrix; class SkMipmap; class SkPaint; class SkPicture; class SkPixmap; class SkShader; class SkSurfaceProps; enum SkColorType : int; enum class SkTextureCompressionType; enum class SkTileMode; struct SkIPoint; struct SkSamplingOptions; namespace skgpu::graphite { class Recorder; } namespace SkImages { /** Caller data passed to RasterReleaseProc; may be nullptr. */ ReleaseContext; /** Function called when SkImage no longer shares pixels. ReleaseContext is provided by caller when SkImage is created, and may be nullptr. */ RasterReleaseProc; /** Creates a CPU-backed SkImage from bitmap, sharing or copying bitmap pixels. If the bitmap is marked immutable, and its pixel memory is shareable, it may be shared instead of copied. SkImage is returned if bitmap is valid. Valid SkBitmap parameters include: dimensions are greater than zero; each dimension fits in 29 bits; SkColorType and SkAlphaType are valid, and SkColorType is not kUnknown_SkColorType; row bytes are large enough to hold one row of pixels; pixel address is not nullptr. @param bitmap SkImageInfo, row bytes, and pixels @return created SkImage, or nullptr */ SK_API sk_sp<SkImage> RasterFromBitmap(const SkBitmap& bitmap); /** Creates a CPU-backed SkImage from compressed data. This method will decompress the compressed data and create an image wrapping it. Any mipmap levels present in the compressed data are discarded. @param data compressed data to store in SkImage @param width width of full SkImage @param height height of full SkImage @param type type of compression used @return created SkImage, or nullptr */ SK_API sk_sp<SkImage> RasterFromCompressedTextureData(sk_sp<SkData> data, int width, int height, SkTextureCompressionType type); /** * Return a SkImage using the encoded data, but attempts to defer decoding until the * image is actually used/drawn. This deferral allows the system to cache the result, either on the * CPU or on the GPU, depending on where the image is drawn. If memory is low, the cache may * be purged, causing the next draw of the image to have to re-decode. * * If alphaType is nullopt, the image's alpha type will be chosen automatically based on the * image format. Transparent images will default to kPremul_SkAlphaType. If alphaType contains * kPremul_SkAlphaType or kUnpremul_SkAlphaType, that alpha type will be used. Forcing opaque * (passing kOpaque_SkAlphaType) is not allowed, and will return nullptr. * * If the encoded format is not supported, nullptr is returned. * * If possible, clients should use SkCodecs::DeferredImage instead. * * @param encoded the encoded data * @return created SkImage, or nullptr example: https://fiddle.skia.org/c/@Image_DeferredFromEncodedData */ SK_API sk_sp<SkImage> DeferredFromEncodedData(sk_sp<SkData> encoded, std::optional<SkAlphaType> alphaType = std::nullopt); /** Creates SkImage from data returned by imageGenerator. The image data will not be created (on either the CPU or GPU) until the image is actually drawn. Generated data is owned by SkImage and may not be shared or accessed. SkImage is returned if generator data is valid. Valid data parameters vary by type of data and platform. imageGenerator may wrap SkPicture data, codec data, or custom data. @param imageGenerator stock or custom routines to retrieve SkImage @return created SkImage, or nullptr */ SK_API sk_sp<SkImage> DeferredFromGenerator(std::unique_ptr<SkImageGenerator> imageGenerator); enum class BitDepth { … }; /** Creates SkImage from picture. Returned SkImage width and height are set by dimensions. SkImage draws picture with matrix and paint, set to bitDepth and colorSpace. The Picture data is not turned into an image (CPU or GPU) until it is drawn. If matrix is nullptr, draws with identity SkMatrix. If paint is nullptr, draws with default SkPaint. colorSpace may be nullptr. @param picture stream of drawing commands @param dimensions width and height @param matrix SkMatrix to rotate, scale, translate, and so on; may be nullptr @param paint SkPaint to apply transparency, filtering, and so on; may be nullptr @param bitDepth 8-bit integer or 16-bit float: per component @param colorSpace range of colors; may be nullptr @param props props to use when rasterizing the picture @return created SkImage, or nullptr */ SK_API sk_sp<SkImage> DeferredFromPicture(sk_sp<SkPicture> picture, const SkISize& dimensions, const SkMatrix* matrix, const SkPaint* paint, BitDepth bitDepth, sk_sp<SkColorSpace> colorSpace, SkSurfaceProps props); SK_API sk_sp<SkImage> DeferredFromPicture(sk_sp<SkPicture> picture, const SkISize& dimensions, const SkMatrix* matrix, const SkPaint* paint, BitDepth bitDepth, sk_sp<SkColorSpace> colorSpace); /** Creates a CPU-backed SkImage from pixmap, copying the pixel data. As a result, pixmap pixels may be modified or deleted without affecting SkImage. SkImage is returned if SkPixmap is valid. Valid SkPixmap parameters include: dimensions are greater than zero; each dimension fits in 29 bits; SkColorType and SkAlphaType are valid, and SkColorType is not kUnknown_SkColorType; row bytes are large enough to hold one row of pixels; pixel address is not nullptr. @param pixmap SkImageInfo, pixel address, and row bytes @return copy of SkPixmap pixels, or nullptr example: https://fiddle.skia.org/c/@Image_RasterFromPixmapCopy */ SK_API sk_sp<SkImage> RasterFromPixmapCopy(const SkPixmap& pixmap); /** Creates CPU-backed SkImage from pixmap, sharing SkPixmap pixels. Pixels must remain valid and unchanged until rasterReleaseProc is called. rasterReleaseProc is passed releaseContext when SkImage is deleted or no longer refers to pixmap pixels. Pass nullptr for rasterReleaseProc to share SkPixmap without requiring a callback when SkImage is released. Pass nullptr for releaseContext if rasterReleaseProc does not require state. SkImage is returned if pixmap is valid. Valid SkPixmap parameters include: dimensions are greater than zero; each dimension fits in 29 bits; SkColorType and SkAlphaType are valid, and SkColorType is not kUnknown_SkColorType; row bytes are large enough to hold one row of pixels; pixel address is not nullptr. @param pixmap SkImageInfo, pixel address, and row bytes @param rasterReleaseProc function called when pixels can be released; or nullptr @param releaseContext state passed to rasterReleaseProc; or nullptr @return SkImage sharing pixmap */ SK_API sk_sp<SkImage> RasterFromPixmap(const SkPixmap& pixmap, RasterReleaseProc rasterReleaseProc, ReleaseContext releaseContext); /** Creates CPU-backed SkImage from pixel data described by info. The pixels data will *not* be copied. SkImage is returned if SkImageInfo is valid. Valid SkImageInfo parameters include: dimensions are greater than zero; each dimension fits in 29 bits; SkColorType and SkAlphaType are valid, and SkColorType is not kUnknown_SkColorType; rowBytes are large enough to hold one row of pixels; pixels is not nullptr, and contains enough data for SkImage. @param info contains width, height, SkAlphaType, SkColorType, SkColorSpace @param pixels address or pixel storage @param rowBytes size of pixel row or larger @return SkImage sharing pixels, or nullptr */ SK_API sk_sp<SkImage> RasterFromData(const SkImageInfo& info, sk_sp<SkData> pixels, size_t rowBytes); /** Creates a filtered SkImage on the CPU. filter processes the src image, potentially changing the color, position, and size. subset is the bounds of src that are processed by filter. clipBounds is the expected bounds of the filtered SkImage. outSubset is required storage for the actual bounds of the filtered SkImage. offset is required storage for translation of returned SkImage. Returns nullptr a filtered result could not be created. If nullptr is returned, outSubset and offset are undefined. Useful for animation of SkImageFilter that varies size from frame to frame. outSubset describes the valid bounds of returned image. offset translates the returned SkImage to keep subsequent animation frames aligned with respect to each other. @param src the image to be filtered @param filter the image filter to be applied @param subset bounds of SkImage processed by filter @param clipBounds expected bounds of filtered SkImage @param outSubset storage for returned SkImage bounds @param offset storage for returned SkImage translation @return filtered SkImage, or nullptr */ SK_API sk_sp<SkImage> MakeWithFilter(sk_sp<SkImage> src, const SkImageFilter* filter, const SkIRect& subset, const SkIRect& clipBounds, SkIRect* outSubset, SkIPoint* offset); } // namespace SkImages /** \class SkImage SkImage describes a two dimensional array of pixels to draw. The pixels may be decoded in a raster bitmap, encoded in a SkPicture or compressed data stream, or located in GPU memory as a GPU texture. SkImage cannot be modified after it is created. SkImage may allocate additional storage as needed; for instance, an encoded SkImage may decode when drawn. SkImage width and height are greater than zero. Creating an SkImage with zero width or height returns SkImage equal to nullptr. SkImage may be created from SkBitmap, SkPixmap, SkSurface, SkPicture, encoded streams, GPU texture, YUV_ColorSpace data, or hardware buffer. Encoded streams supported include BMP, GIF, HEIF, ICO, JPEG, PNG, WBMP, WebP. Supported encoding details vary with platform. See SkImages namespace for the static factory methods to make SkImages. Clients should *not* subclass SkImage as there is a lot of internal machinery that is not publicly accessible. */ class SK_API SkImage : public SkRefCnt { … }; #endif