1 /* 2 * Copyright 2012 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef SkImage_DEFINED 9 #define SkImage_DEFINED 10 11 #include "include/core/SkImageEncoder.h" 12 #include "include/core/SkImageInfo.h" 13 #include "include/core/SkM44.h" 14 #include "include/core/SkRefCnt.h" 15 #include "include/core/SkSamplingOptions.h" 16 #include "include/core/SkScalar.h" 17 #include "include/core/SkShader.h" 18 #include "include/core/SkTileMode.h" 19 #if SK_SUPPORT_GPU 20 #include "include/gpu/GrTypes.h" 21 #endif 22 #include <functional> // std::function 23 24 #if defined(SK_BUILD_FOR_ANDROID) && __ANDROID_API__ >= 26 25 #include <android/hardware_buffer.h> 26 #endif 27 28 class SkData; 29 class SkCanvas; 30 class SkImage; 31 class SkImageFilter; 32 class SkImageGenerator; 33 class SkMipmap; 34 class SkPaint; 35 class SkPicture; 36 class SkPromiseImageTexture; 37 class SkSurface; 38 class SkYUVAPixmaps; 39 class GrBackendFormat; 40 class GrBackendTexture; 41 class GrDirectContext; 42 class GrRecordingContext; 43 class GrContextThreadSafeProxy; 44 class GrYUVABackendTextureInfo; 45 class GrYUVABackendTextures; 46 47 /** \class SkImage 48 SkImage describes a two dimensional array of pixels to draw. The pixels may be 49 decoded in a raster bitmap, encoded in a SkPicture or compressed data stream, 50 or located in GPU memory as a GPU texture. 51 52 SkImage cannot be modified after it is created. SkImage may allocate additional 53 storage as needed; for instance, an encoded SkImage may decode when drawn. 54 55 SkImage width and height are greater than zero. Creating an SkImage with zero width 56 or height returns SkImage equal to nullptr. 57 58 SkImage may be created from SkBitmap, SkPixmap, SkSurface, SkPicture, encoded streams, 59 GPU texture, YUV_ColorSpace data, or hardware buffer. Encoded streams supported 60 include BMP, GIF, HEIF, ICO, JPEG, PNG, WBMP, WebP. Supported encoding details 61 vary with platform. 62 */ 63 class SK_API SkImage : public SkRefCnt { 64 public: 65 66 /** Caller data passed to RasterReleaseProc; may be nullptr. 67 */ 68 typedef void* ReleaseContext; 69 70 /** Creates SkImage from SkPixmap and copy of pixels. Since pixels are copied, SkPixmap 71 pixels may be modified or deleted without affecting SkImage. 72 73 SkImage is returned if SkPixmap is valid. Valid SkPixmap parameters include: 74 dimensions are greater than zero; 75 each dimension fits in 29 bits; 76 SkColorType and SkAlphaType are valid, and SkColorType is not kUnknown_SkColorType; 77 row bytes are large enough to hold one row of pixels; 78 pixel address is not nullptr. 79 80 @param pixmap SkImageInfo, pixel address, and row bytes 81 @return copy of SkPixmap pixels, or nullptr 82 83 example: https://fiddle.skia.org/c/@Image_MakeRasterCopy 84 */ 85 static sk_sp<SkImage> MakeRasterCopy(const SkPixmap& pixmap); 86 87 /** Creates SkImage from SkImageInfo, sharing pixels. 88 89 SkImage is returned if SkImageInfo is valid. Valid SkImageInfo parameters include: 90 dimensions are greater than zero; 91 each dimension fits in 29 bits; 92 SkColorType and SkAlphaType are valid, and SkColorType is not kUnknown_SkColorType; 93 rowBytes are large enough to hold one row of pixels; 94 pixels is not nullptr, and contains enough data for SkImage. 95 96 @param info contains width, height, SkAlphaType, SkColorType, SkColorSpace 97 @param pixels address or pixel storage 98 @param rowBytes size of pixel row or larger 99 @return SkImage sharing pixels, or nullptr 100 */ 101 static sk_sp<SkImage> MakeRasterData(const SkImageInfo& info, sk_sp<SkData> pixels, 102 size_t rowBytes); 103 104 /** Function called when SkImage no longer shares pixels. ReleaseContext is 105 provided by caller when SkImage is created, and may be nullptr. 106 */ 107 typedef void (*RasterReleaseProc)(const void* pixels, ReleaseContext); 108 109 /** Creates SkImage from pixmap, sharing SkPixmap pixels. Pixels must remain valid and 110 unchanged until rasterReleaseProc is called. rasterReleaseProc is passed 111 releaseContext when SkImage is deleted or no longer refers to pixmap pixels. 112 113 Pass nullptr for rasterReleaseProc to share SkPixmap without requiring a callback 114 when SkImage is released. Pass nullptr for releaseContext if rasterReleaseProc 115 does not require state. 116 117 SkImage is returned if pixmap is valid. Valid SkPixmap parameters include: 118 dimensions are greater than zero; 119 each dimension fits in 29 bits; 120 SkColorType and SkAlphaType are valid, and SkColorType is not kUnknown_SkColorType; 121 row bytes are large enough to hold one row of pixels; 122 pixel address is not nullptr. 123 124 @param pixmap SkImageInfo, pixel address, and row bytes 125 @param rasterReleaseProc function called when pixels can be released; or nullptr 126 @param releaseContext state passed to rasterReleaseProc; or nullptr 127 @return SkImage sharing pixmap 128 */ 129 static sk_sp<SkImage> MakeFromRaster(const SkPixmap& pixmap, 130 RasterReleaseProc rasterReleaseProc, 131 ReleaseContext releaseContext); 132 133 /** Creates SkImage from bitmap, sharing or copying bitmap pixels. If the bitmap 134 is marked immutable, and its pixel memory is shareable, it may be shared 135 instead of copied. 136 137 SkImage is returned if bitmap is valid. Valid SkBitmap parameters include: 138 dimensions are greater than zero; 139 each dimension fits in 29 bits; 140 SkColorType and SkAlphaType are valid, and SkColorType is not kUnknown_SkColorType; 141 row bytes are large enough to hold one row of pixels; 142 pixel address is not nullptr. 143 144 @param bitmap SkImageInfo, row bytes, and pixels 145 @return created SkImage, or nullptr 146 147 example: https://fiddle.skia.org/c/@Image_MakeFromBitmap 148 */ 149 static sk_sp<SkImage> MakeFromBitmap(const SkBitmap& bitmap); 150 151 /** Creates SkImage from data returned by imageGenerator. Generated data is owned by SkImage and 152 may not be shared or accessed. 153 154 SkImage is returned if generator data is valid. Valid data parameters vary by type of data 155 and platform. 156 157 imageGenerator may wrap SkPicture data, codec data, or custom data. 158 159 @param imageGenerator stock or custom routines to retrieve SkImage 160 @return created SkImage, or nullptr 161 */ 162 static sk_sp<SkImage> MakeFromGenerator(std::unique_ptr<SkImageGenerator> imageGenerator); 163 164 /** 165 * Return an image backed by the encoded data, but attempt to defer decoding until the image 166 * is actually used/drawn. This deferral allows the system to cache the result, either on the 167 * CPU or on the GPU, depending on where the image is drawn. If memory is low, the cache may 168 * be purged, causing the next draw of the image to have to re-decode. 169 * 170 * The subset parameter specifies a area within the decoded image to create the image from. 171 * If subset is null, then the entire image is returned. 172 * 173 * This is similar to DecodeTo[Raster,Texture], but this method will attempt to defer the 174 * actual decode, while the DecodeTo... method explicitly decode and allocate the backend 175 * when the call is made. 176 * 177 * If the encoded format is not supported, or subset is outside of the bounds of the decoded 178 * image, nullptr is returned. 179 * 180 * @param encoded the encoded data 181 * @param length the number of bytes of encoded data 182 * @return created SkImage, or nullptr 183 184 example: https://fiddle.skia.org/c/@Image_MakeFromEncoded 185 */ 186 static sk_sp<SkImage> MakeFromEncoded(sk_sp<SkData> encoded); 187 188 /* 189 * Experimental: 190 * Skia | GL_COMPRESSED_* | MTLPixelFormat* | VK_FORMAT_*_BLOCK 191 * -------------------------------------------------------------------------------------- 192 * kETC2_RGB8_UNORM | ETC1_RGB8 | ETC2_RGB8 (iOS-only) | ETC2_R8G8B8_UNORM 193 * | RGB8_ETC2 | | 194 * -------------------------------------------------------------------------------------- 195 * kBC1_RGB8_UNORM | RGB_S3TC_DXT1_EXT | N/A | BC1_RGB_UNORM 196 * -------------------------------------------------------------------------------------- 197 * kBC1_RGBA8_UNORM | RGBA_S3TC_DXT1_EXT | BC1_RGBA (macOS-only)| BC1_RGBA_UNORM 198 */ 199 enum class CompressionType { 200 kNone, 201 kETC2_RGB8_UNORM, // the same as ETC1 202 203 kBC1_RGB8_UNORM, 204 kBC1_RGBA8_UNORM, 205 kLast = kBC1_RGBA8_UNORM, 206 }; 207 208 static constexpr int kCompressionTypeCount = static_cast<int>(CompressionType::kLast) + 1; 209 210 static const CompressionType kETC1_CompressionType = CompressionType::kETC2_RGB8_UNORM; 211 212 /** Creates a CPU-backed SkImage from compressed data. 213 214 This method will decompress the compressed data and create an image wrapping 215 it. Any mipmap levels present in the compressed data are discarded. 216 217 @param data compressed data to store in SkImage 218 @param width width of full SkImage 219 @param height height of full SkImage 220 @param type type of compression used 221 @return created SkImage, or nullptr 222 */ 223 static sk_sp<SkImage> MakeRasterFromCompressed(sk_sp<SkData> data, 224 int width, int height, 225 CompressionType type); 226 227 enum class BitDepth { 228 kU8, //!< uses 8-bit unsigned int per color component 229 kF16, //!< uses 16-bit float per color component 230 }; 231 232 /** Creates SkImage from picture. Returned SkImage width and height are set by dimensions. 233 SkImage draws picture with matrix and paint, set to bitDepth and colorSpace. 234 235 If matrix is nullptr, draws with identity SkMatrix. If paint is nullptr, draws 236 with default SkPaint. colorSpace may be nullptr. 237 238 @param picture stream of drawing commands 239 @param dimensions width and height 240 @param matrix SkMatrix to rotate, scale, translate, and so on; may be nullptr 241 @param paint SkPaint to apply transparency, filtering, and so on; may be nullptr 242 @param bitDepth 8-bit integer or 16-bit float: per component 243 @param colorSpace range of colors; may be nullptr 244 @return created SkImage, or nullptr 245 */ 246 static sk_sp<SkImage> MakeFromPicture(sk_sp<SkPicture> picture, const SkISize& dimensions, 247 const SkMatrix* matrix, const SkPaint* paint, 248 BitDepth bitDepth, 249 sk_sp<SkColorSpace> colorSpace); 250 251 #if SK_SUPPORT_GPU 252 /** Creates a GPU-backed SkImage from compressed data. 253 254 This method will return an SkImage representing the compressed data. 255 If the GPU doesn't support the specified compression method, the data 256 will be decompressed and then wrapped in a GPU-backed image. 257 258 Note: one can query the supported compression formats via 259 GrRecordingContext::compressedBackendFormat. 260 261 @param context GPU context 262 @param data compressed data to store in SkImage 263 @param width width of full SkImage 264 @param height height of full SkImage 265 @param type type of compression used 266 @param mipMapped does 'data' contain data for all the mipmap levels? 267 @param isProtected do the contents of 'data' require DRM protection (on Vulkan)? 268 @return created SkImage, or nullptr 269 */ 270 static sk_sp<SkImage> MakeTextureFromCompressed(GrDirectContext* direct, 271 sk_sp<SkData> data, 272 int width, int height, 273 CompressionType type, 274 GrMipmapped mipMapped = GrMipmapped::kNo, 275 GrProtected isProtected = GrProtected::kNo); 276 277 /** User function called when supplied texture may be deleted. 278 */ 279 typedef void (*TextureReleaseProc)(ReleaseContext releaseContext); 280 281 /** Creates SkImage from GPU texture associated with context. GPU texture must stay 282 valid and unchanged until textureReleaseProc is called. textureReleaseProc is 283 passed releaseContext when SkImage is deleted or no longer refers to texture. 284 285 SkImage is returned if format of backendTexture is recognized and supported. 286 Recognized formats vary by GPU back-end. 287 288 @note When using a DDL recording context, textureReleaseProc will be called on the 289 GPU thread after the DDL is played back on the direct context. 290 291 @param context GPU context 292 @param backendTexture texture residing on GPU 293 @param colorSpace This describes the color space of this image's contents, as 294 seen after sampling. In general, if the format of the backend 295 texture is SRGB, some linear colorSpace should be supplied 296 (e.g., SkColorSpace::MakeSRGBLinear()). If the format of the 297 backend texture is linear, then the colorSpace should include 298 a description of the transfer function as 299 well (e.g., SkColorSpace::MakeSRGB()). 300 @param textureReleaseProc function called when texture can be released 301 @param releaseContext state passed to textureReleaseProc 302 @return created SkImage, or nullptr 303 */ 304 static sk_sp<SkImage> MakeFromTexture(GrRecordingContext* context, 305 const GrBackendTexture& backendTexture, 306 GrSurfaceOrigin origin, 307 SkColorType colorType, 308 SkAlphaType alphaType, 309 sk_sp<SkColorSpace> colorSpace, 310 TextureReleaseProc textureReleaseProc = nullptr, 311 ReleaseContext releaseContext = nullptr); 312 313 /** Creates an SkImage from a GPU backend texture. The backend texture must stay 314 valid and unchanged until textureReleaseProc is called. The textureReleaseProc is 315 called when the SkImage is deleted or no longer refers to the texture and will be 316 passed the releaseContext. 317 318 An SkImage is returned if the format of backendTexture is recognized and supported. 319 Recognized formats vary by GPU back-end. 320 321 @note When using a DDL recording context, textureReleaseProc will be called on the 322 GPU thread after the DDL is played back on the direct context. 323 324 @param context the GPU context 325 @param backendTexture a texture already allocated by the GPU 326 @param alphaType This characterizes the nature of the alpha values in the 327 backend texture. For opaque compressed formats (e.g., ETC1) 328 this should usually be set to kOpaque_SkAlphaType. 329 @param colorSpace This describes the color space of this image's contents, as 330 seen after sampling. In general, if the format of the backend 331 texture is SRGB, some linear colorSpace should be supplied 332 (e.g., SkColorSpace::MakeSRGBLinear()). If the format of the 333 backend texture is linear, then the colorSpace should include 334 a description of the transfer function as 335 well (e.g., SkColorSpace::MakeSRGB()). 336 @param textureReleaseProc function called when the backend texture can be released 337 @param releaseContext state passed to textureReleaseProc 338 @return created SkImage, or nullptr 339 */ 340 static sk_sp<SkImage> MakeFromCompressedTexture(GrRecordingContext* context, 341 const GrBackendTexture& backendTexture, 342 GrSurfaceOrigin origin, 343 SkAlphaType alphaType, 344 sk_sp<SkColorSpace> colorSpace, 345 TextureReleaseProc textureReleaseProc = nullptr, 346 ReleaseContext releaseContext = nullptr); 347 348 /** Creates SkImage from pixmap. SkImage is uploaded to GPU back-end using context. 349 350 Created SkImage is available to other GPU contexts, and is available across thread 351 boundaries. All contexts must be in the same GPU share group, or otherwise 352 share resources. 353 354 When SkImage is no longer referenced, context releases texture memory 355 asynchronously. 356 357 GrBackendTexture created from pixmap is uploaded to match SkSurface created with 358 dstColorSpace. SkColorSpace of SkImage is determined by pixmap.colorSpace(). 359 360 SkImage is returned referring to GPU back-end if context is not nullptr, 361 format of data is recognized and supported, and if context supports moving 362 resources between contexts. Otherwise, pixmap pixel data is copied and SkImage 363 as returned in raster format if possible; nullptr may be returned. 364 Recognized GPU formats vary by platform and GPU back-end. 365 366 @param context GPU context 367 @param pixmap SkImageInfo, pixel address, and row bytes 368 @param buildMips create SkImage as mip map if true 369 @param dstColorSpace range of colors of matching SkSurface on GPU 370 @param limitToMaxTextureSize downscale image to GPU maximum texture size, if necessary 371 @return created SkImage, or nullptr 372 */ 373 static sk_sp<SkImage> MakeCrossContextFromPixmap(GrDirectContext* context, 374 const SkPixmap& pixmap, 375 bool buildMips, 376 bool limitToMaxTextureSize = false); 377 378 /** Creates SkImage from backendTexture associated with context. backendTexture and 379 returned SkImage are managed internally, and are released when no longer needed. 380 381 SkImage is returned if format of backendTexture is recognized and supported. 382 Recognized formats vary by GPU back-end. 383 384 @param context GPU context 385 @param backendTexture texture residing on GPU 386 @param textureOrigin origin of backendTexture 387 @param colorType color type of the resulting image 388 @param alphaType alpha type of the resulting image 389 @param colorSpace range of colors; may be nullptr 390 @return created SkImage, or nullptr 391 */ 392 static sk_sp<SkImage> MakeFromAdoptedTexture(GrRecordingContext* context, 393 const GrBackendTexture& backendTexture, 394 GrSurfaceOrigin textureOrigin, 395 SkColorType colorType, 396 SkAlphaType alphaType = kPremul_SkAlphaType, 397 sk_sp<SkColorSpace> colorSpace = nullptr); 398 399 /** Creates an SkImage from YUV[A] planar textures. This requires that the textures stay valid 400 for the lifetime of the image. The ReleaseContext can be used to know when it is safe to 401 either delete or overwrite the textures. If ReleaseProc is provided it is also called before 402 return on failure. 403 404 @param context GPU context 405 @param yuvaTextures A set of textures containing YUVA data and a description of the 406 data and transformation to RGBA. 407 @param imageColorSpace range of colors of the resulting image after conversion to RGB; 408 may be nullptr 409 @param textureReleaseProc called when the backend textures can be released 410 @param releaseContext state passed to textureReleaseProc 411 @return created SkImage, or nullptr 412 */ 413 static sk_sp<SkImage> MakeFromYUVATextures(GrRecordingContext* context, 414 const GrYUVABackendTextures& yuvaTextures, 415 sk_sp<SkColorSpace> imageColorSpace = nullptr, 416 TextureReleaseProc textureReleaseProc = nullptr, 417 ReleaseContext releaseContext = nullptr); 418 419 /** Creates SkImage from SkYUVAPixmaps. 420 421 The image will remain planar with each plane converted to a texture using the passed 422 GrRecordingContext. 423 424 SkYUVAPixmaps has a SkYUVAInfo which specifies the transformation from YUV to RGB. 425 The SkColorSpace of the resulting RGB values is specified by imageColorSpace. This will 426 be the SkColorSpace reported by the image and when drawn the RGB values will be converted 427 from this space into the destination space (if the destination is tagged). 428 429 Currently, this is only supported using the GPU backend and will fail if context is nullptr. 430 431 SkYUVAPixmaps does not need to remain valid after this returns. 432 433 @param context GPU context 434 @param pixmaps The planes as pixmaps with supported SkYUVAInfo that 435 specifies conversion to RGB. 436 @param buildMips create internal YUVA textures as mip map if kYes. This is 437 silently ignored if the context does not support mip maps. 438 @param limitToMaxTextureSize downscale image to GPU maximum texture size, if necessary 439 @param imageColorSpace range of colors of the resulting image; may be nullptr 440 @return created SkImage, or nullptr 441 */ 442 static sk_sp<SkImage> MakeFromYUVAPixmaps(GrRecordingContext* context, 443 const SkYUVAPixmaps& pixmaps, 444 GrMipMapped buildMips = GrMipmapped::kNo, 445 bool limitToMaxTextureSize = false, 446 sk_sp<SkColorSpace> imageColorSpace = nullptr); 447 448 using PromiseImageTextureContext = void*; 449 using PromiseImageTextureFulfillProc = 450 sk_sp<SkPromiseImageTexture> (*)(PromiseImageTextureContext); 451 using PromiseImageTextureReleaseProc = void (*)(PromiseImageTextureContext); 452 453 /** Create a new SkImage that is very similar to an SkImage created by MakeFromTexture. The 454 difference is that the caller need not have created the texture nor populated it with the 455 image pixel data. Moreover, the SkImage may be created on a thread as the creation of the 456 image does not require access to the backend API or GrDirectContext. Instead of passing a 457 GrBackendTexture the client supplies a description of the texture consisting of 458 GrBackendFormat, width, height, and GrMipmapped state. The resulting SkImage can be drawn 459 to a SkDeferredDisplayListRecorder or directly to a GPU-backed SkSurface. 460 461 When the actual texture is required to perform a backend API draw, textureFulfillProc will 462 be called to receive a GrBackendTexture. The properties of the GrBackendTexture must match 463 those set during the SkImage creation, and it must refer to a valid existing texture in the 464 backend API context/device, and be populated with the image pixel data. The texture cannot 465 be deleted until textureReleaseProc is called. 466 467 There is at most one call to each of textureFulfillProc and textureReleaseProc. 468 textureReleaseProc is always called even if image creation fails or if the 469 image is never fulfilled (e.g. it is never drawn or all draws are clipped out) 470 471 @param gpuContextProxy the thread-safe proxy of the gpu context. required. 472 @param backendFormat format of promised gpu texture 473 @param dimensions width & height of promised gpu texture 474 @param mipMapped mip mapped state of promised gpu texture 475 @param origin surface origin of promised gpu texture 476 @param colorType color type of promised gpu texture 477 @param alphaType alpha type of promised gpu texture 478 @param colorSpace range of colors; may be nullptr 479 @param textureFulfillProc function called to get actual gpu texture 480 @param textureReleaseProc function called when texture can be deleted 481 @param textureContext state passed to textureFulfillProc and textureReleaseProc 482 @return created SkImage, or nullptr 483 */ 484 static sk_sp<SkImage> MakePromiseTexture(sk_sp<GrContextThreadSafeProxy> gpuContextProxy, 485 const GrBackendFormat& backendFormat, 486 SkISize dimensions, 487 GrMipmapped mipMapped, 488 GrSurfaceOrigin origin, 489 SkColorType colorType, 490 SkAlphaType alphaType, 491 sk_sp<SkColorSpace> colorSpace, 492 PromiseImageTextureFulfillProc textureFulfillProc, 493 PromiseImageTextureReleaseProc textureReleaseProc, 494 PromiseImageTextureContext textureContext); 495 496 /** This entry point operates like 'MakePromiseTexture' but it is used to construct a SkImage 497 from YUV[A] data. The source data may be planar (i.e. spread across multiple textures). In 498 the extreme Y, U, V, and A are all in different planes and thus the image is specified by 499 four textures. 'backendTextureInfo' describes the planar arrangement, texture formats, 500 conversion to RGB, and origin of the textures. Separate 'textureFulfillProc' and 501 'textureReleaseProc' calls are made for each texture. Each texture has its own 502 PromiseImageTextureContext. If 'backendTextureInfo' is not valid then no release proc 503 calls are made. Otherwise, the calls will be made even on failure. 'textureContexts' has one 504 entry for each of the up to four textures, as indicated by 'backendTextureInfo'. 505 506 Currently the mip mapped property of 'backendTextureInfo' is ignored. However, in the 507 near future it will be required that if it is kYes then textureFulfillProc must return 508 a mip mapped texture for each plane in order to successfully draw the image. 509 510 @param gpuContextProxy the thread-safe proxy of the gpu context. required. 511 @param backendTextureInfo info about the promised yuva gpu texture 512 @param imageColorSpace range of colors; may be nullptr 513 @param textureFulfillProc function called to get actual gpu texture 514 @param textureReleaseProc function called when texture can be deleted 515 @param textureContexts state passed to textureFulfillProc and textureReleaseProc 516 @return created SkImage, or nullptr 517 */ 518 static sk_sp<SkImage> MakePromiseYUVATexture(sk_sp<GrContextThreadSafeProxy> gpuContextProxy, 519 const GrYUVABackendTextureInfo& backendTextureInfo, 520 sk_sp<SkColorSpace> imageColorSpace, 521 PromiseImageTextureFulfillProc textureFulfillProc, 522 PromiseImageTextureReleaseProc textureReleaseProc, 523 PromiseImageTextureContext textureContexts[]); 524 525 #endif // SK_SUPPORT_GPU 526 527 #if defined(SK_BUILD_FOR_ANDROID) && __ANDROID_API__ >= 26 528 /** (See Skia bug 7447) 529 Creates SkImage from Android hardware buffer. 530 Returned SkImage takes a reference on the buffer. 531 532 Only available on Android, when __ANDROID_API__ is defined to be 26 or greater. 533 534 @param hardwareBuffer AHardwareBuffer Android hardware buffer 535 @param colorSpace range of colors; may be nullptr 536 @return created SkImage, or nullptr 537 */ 538 static sk_sp<SkImage> MakeFromAHardwareBuffer( 539 AHardwareBuffer* hardwareBuffer, 540 SkAlphaType alphaType = kPremul_SkAlphaType, 541 sk_sp<SkColorSpace> colorSpace = nullptr, 542 GrSurfaceOrigin surfaceOrigin = kTopLeft_GrSurfaceOrigin); 543 544 /** Creates SkImage from Android hardware buffer and uploads the data from the SkPixmap to it. 545 Returned SkImage takes a reference on the buffer. 546 547 Only available on Android, when __ANDROID_API__ is defined to be 26 or greater. 548 549 @param context GPU context 550 @param pixmap SkPixmap that contains data to be uploaded to the AHardwareBuffer 551 @param hardwareBuffer AHardwareBuffer Android hardware buffer 552 @param surfaceOrigin surface origin for resulting image 553 @return created SkImage, or nullptr 554 */ 555 static sk_sp<SkImage> MakeFromAHardwareBufferWithData( 556 GrDirectContext* context, 557 const SkPixmap& pixmap, 558 AHardwareBuffer* hardwareBuffer, 559 GrSurfaceOrigin surfaceOrigin = kTopLeft_GrSurfaceOrigin); 560 #endif 561 562 /** Returns a SkImageInfo describing the width, height, color type, alpha type, and color space 563 of the SkImage. 564 565 @return image info of SkImage. 566 */ imageInfo()567 const SkImageInfo& imageInfo() const { return fInfo; } 568 569 /** Returns pixel count in each row. 570 571 @return pixel width in SkImage 572 */ width()573 int width() const { return fInfo.width(); } 574 575 /** Returns pixel row count. 576 577 @return pixel height in SkImage 578 */ height()579 int height() const { return fInfo.height(); } 580 581 /** Returns SkISize { width(), height() }. 582 583 @return integral size of width() and height() 584 */ dimensions()585 SkISize dimensions() const { return SkISize::Make(fInfo.width(), fInfo.height()); } 586 587 /** Returns SkIRect { 0, 0, width(), height() }. 588 589 @return integral rectangle from origin to width() and height() 590 */ bounds()591 SkIRect bounds() const { return SkIRect::MakeWH(fInfo.width(), fInfo.height()); } 592 593 /** Returns value unique to image. SkImage contents cannot change after SkImage is 594 created. Any operation to create a new SkImage will receive generate a new 595 unique number. 596 597 @return unique identifier 598 */ uniqueID()599 uint32_t uniqueID() const { return fUniqueID; } 600 601 /** Returns SkAlphaType. 602 603 SkAlphaType returned was a parameter to an SkImage constructor, 604 or was parsed from encoded data. 605 606 @return SkAlphaType in SkImage 607 608 example: https://fiddle.skia.org/c/@Image_alphaType 609 */ 610 SkAlphaType alphaType() const; 611 612 /** Returns SkColorType if known; otherwise, returns kUnknown_SkColorType. 613 614 @return SkColorType of SkImage 615 616 example: https://fiddle.skia.org/c/@Image_colorType 617 */ 618 SkColorType colorType() const; 619 620 /** Returns SkColorSpace, the range of colors, associated with SkImage. The 621 reference count of SkColorSpace is unchanged. The returned SkColorSpace is 622 immutable. 623 624 SkColorSpace returned was passed to an SkImage constructor, 625 or was parsed from encoded data. SkColorSpace returned may be ignored when SkImage 626 is drawn, depending on the capabilities of the SkSurface receiving the drawing. 627 628 @return SkColorSpace in SkImage, or nullptr 629 630 example: https://fiddle.skia.org/c/@Image_colorSpace 631 */ 632 SkColorSpace* colorSpace() const; 633 634 /** Returns a smart pointer to SkColorSpace, the range of colors, associated with 635 SkImage. The smart pointer tracks the number of objects sharing this 636 SkColorSpace reference so the memory is released when the owners destruct. 637 638 The returned SkColorSpace is immutable. 639 640 SkColorSpace returned was passed to an SkImage constructor, 641 or was parsed from encoded data. SkColorSpace returned may be ignored when SkImage 642 is drawn, depending on the capabilities of the SkSurface receiving the drawing. 643 644 @return SkColorSpace in SkImage, or nullptr, wrapped in a smart pointer 645 646 example: https://fiddle.skia.org/c/@Image_refColorSpace 647 */ 648 sk_sp<SkColorSpace> refColorSpace() const; 649 650 /** Returns true if SkImage pixels represent transparency only. If true, each pixel 651 is packed in 8 bits as defined by kAlpha_8_SkColorType. 652 653 @return true if pixels represent a transparency mask 654 655 example: https://fiddle.skia.org/c/@Image_isAlphaOnly 656 */ 657 bool isAlphaOnly() const; 658 659 /** Returns true if pixels ignore their alpha value and are treated as fully opaque. 660 661 @return true if SkAlphaType is kOpaque_SkAlphaType 662 */ isOpaque()663 bool isOpaque() const { return SkAlphaTypeIsOpaque(this->alphaType()); } 664 665 /** 666 * Make a shader with the specified tiling and mipmap sampling. 667 */ 668 sk_sp<SkShader> makeShader(SkTileMode tmx, SkTileMode tmy, const SkSamplingOptions&, 669 const SkMatrix* localMatrix = nullptr) const; 670 makeShader(SkTileMode tmx,SkTileMode tmy,const SkSamplingOptions & sampling,const SkMatrix & lm)671 sk_sp<SkShader> makeShader(SkTileMode tmx, SkTileMode tmy, const SkSamplingOptions& sampling, 672 const SkMatrix& lm) const { 673 return this->makeShader(tmx, tmy, sampling, &lm); 674 } makeShader(const SkSamplingOptions & sampling,const SkMatrix & lm)675 sk_sp<SkShader> makeShader(const SkSamplingOptions& sampling, const SkMatrix& lm) const { 676 return this->makeShader(SkTileMode::kClamp, SkTileMode::kClamp, sampling, &lm); 677 } 678 sk_sp<SkShader> makeShader(const SkSamplingOptions& sampling, 679 const SkMatrix* lm = nullptr) const { 680 return this->makeShader(SkTileMode::kClamp, SkTileMode::kClamp, sampling, lm); 681 } 682 683 using CubicResampler = SkCubicResampler; 684 685 /** Copies SkImage pixel address, row bytes, and SkImageInfo to pixmap, if address 686 is available, and returns true. If pixel address is not available, return 687 false and leave pixmap unchanged. 688 689 @param pixmap storage for pixel state if pixels are readable; otherwise, ignored 690 @return true if SkImage has direct access to pixels 691 692 example: https://fiddle.skia.org/c/@Image_peekPixels 693 */ 694 bool peekPixels(SkPixmap* pixmap) const; 695 696 /** Returns true the contents of SkImage was created on or uploaded to GPU memory, 697 and is available as a GPU texture. 698 699 @return true if SkImage is a GPU texture 700 701 example: https://fiddle.skia.org/c/@Image_isTextureBacked 702 */ 703 bool isTextureBacked() const; 704 705 /** Returns an approximation of the amount of texture memory used by the image. Returns 706 zero if the image is not texture backed or if the texture has an external format. 707 */ 708 size_t textureSize() const; 709 710 /** Returns true if SkImage can be drawn on either raster surface or GPU surface. 711 If context is nullptr, tests if SkImage draws on raster surface; 712 otherwise, tests if SkImage draws on GPU surface associated with context. 713 714 SkImage backed by GPU texture may become invalid if associated context is 715 invalid. lazy image may be invalid and may not draw to raster surface or 716 GPU surface or both. 717 718 @param context GPU context 719 @return true if SkImage can be drawn 720 721 example: https://fiddle.skia.org/c/@Image_isValid 722 */ 723 bool isValid(GrRecordingContext* context) const; 724 725 #if SK_SUPPORT_GPU 726 /** Flushes any pending uses of texture-backed images in the GPU backend. If the image is not 727 texture-backed (including promise texture images) or if the GrDirectContext does not 728 have the same context ID as the context backing the image then this is a no-op. 729 730 If the image was not used in any non-culled draws in the current queue of work for the 731 passed GrDirectContext then this is a no-op unless the GrFlushInfo contains semaphores or 732 a finish proc. Those are respected even when the image has not been used. 733 734 @param context the context on which to flush pending usages of the image. 735 @param info flush options 736 */ 737 GrSemaphoresSubmitted flush(GrDirectContext* context, const GrFlushInfo& flushInfo) const; 738 flush(GrDirectContext * context)739 void flush(GrDirectContext* context) const { this->flush(context, {}); } 740 741 /** Version of flush() that uses a default GrFlushInfo. Also submits the flushed work to the 742 GPU. 743 */ 744 void flushAndSubmit(GrDirectContext*) const; 745 746 /** Retrieves the back-end texture. If SkImage has no back-end texture, an invalid 747 object is returned. Call GrBackendTexture::isValid to determine if the result 748 is valid. 749 750 If flushPendingGrContextIO is true, completes deferred I/O operations. 751 752 If origin in not nullptr, copies location of content drawn into SkImage. 753 754 @param flushPendingGrContextIO flag to flush outstanding requests 755 @return back-end API texture handle; invalid on failure 756 */ 757 GrBackendTexture getBackendTexture(bool flushPendingGrContextIO, 758 GrSurfaceOrigin* origin = nullptr) const; 759 #endif // SK_SUPPORT_GPU 760 761 /** \enum SkImage::CachingHint 762 CachingHint selects whether Skia may internally cache SkBitmap generated by 763 decoding SkImage, or by copying SkImage from GPU to CPU. The default behavior 764 allows caching SkBitmap. 765 766 Choose kDisallow_CachingHint if SkImage pixels are to be used only once, or 767 if SkImage pixels reside in a cache outside of Skia, or to reduce memory pressure. 768 769 Choosing kAllow_CachingHint does not ensure that pixels will be cached. 770 SkImage pixels may not be cached if memory requirements are too large or 771 pixels are not accessible. 772 */ 773 enum CachingHint { 774 kAllow_CachingHint, //!< allows internally caching decoded and copied pixels 775 kDisallow_CachingHint, //!< disallows internally caching decoded and copied pixels 776 }; 777 778 /** Copies SkRect of pixels from SkImage to dstPixels. Copy starts at offset (srcX, srcY), 779 and does not exceed SkImage (width(), height()). 780 781 dstInfo specifies width, height, SkColorType, SkAlphaType, and SkColorSpace of 782 destination. dstRowBytes specifies the gap from one destination row to the next. 783 Returns true if pixels are copied. Returns false if: 784 - dstInfo.addr() equals nullptr 785 - dstRowBytes is less than dstInfo.minRowBytes() 786 - SkPixelRef is nullptr 787 788 Pixels are copied only if pixel conversion is possible. If SkImage SkColorType is 789 kGray_8_SkColorType, or kAlpha_8_SkColorType; dstInfo.colorType() must match. 790 If SkImage SkColorType is kGray_8_SkColorType, dstInfo.colorSpace() must match. 791 If SkImage SkAlphaType is kOpaque_SkAlphaType, dstInfo.alphaType() must 792 match. If SkImage SkColorSpace is nullptr, dstInfo.colorSpace() must match. Returns 793 false if pixel conversion is not possible. 794 795 srcX and srcY may be negative to copy only top or left of source. Returns 796 false if width() or height() is zero or negative. 797 Returns false if abs(srcX) >= Image width(), or if abs(srcY) >= Image height(). 798 799 If cachingHint is kAllow_CachingHint, pixels may be retained locally. 800 If cachingHint is kDisallow_CachingHint, pixels are not added to the local cache. 801 802 @param context the GrDirectContext in play, if it exists 803 @param dstInfo destination width, height, SkColorType, SkAlphaType, SkColorSpace 804 @param dstPixels destination pixel storage 805 @param dstRowBytes destination row length 806 @param srcX column index whose absolute value is less than width() 807 @param srcY row index whose absolute value is less than height() 808 @param cachingHint whether the pixels should be cached locally 809 @return true if pixels are copied to dstPixels 810 */ 811 bool readPixels(GrDirectContext* context, 812 const SkImageInfo& dstInfo, 813 void* dstPixels, 814 size_t dstRowBytes, 815 int srcX, int srcY, 816 CachingHint cachingHint = kAllow_CachingHint) const; 817 818 /** Copies a SkRect of pixels from SkImage to dst. Copy starts at (srcX, srcY), and 819 does not exceed SkImage (width(), height()). 820 821 dst specifies width, height, SkColorType, SkAlphaType, SkColorSpace, pixel storage, 822 and row bytes of destination. dst.rowBytes() specifics the gap from one destination 823 row to the next. Returns true if pixels are copied. Returns false if: 824 - dst pixel storage equals nullptr 825 - dst.rowBytes is less than SkImageInfo::minRowBytes 826 - SkPixelRef is nullptr 827 828 Pixels are copied only if pixel conversion is possible. If SkImage SkColorType is 829 kGray_8_SkColorType, or kAlpha_8_SkColorType; dst.colorType() must match. 830 If SkImage SkColorType is kGray_8_SkColorType, dst.colorSpace() must match. 831 If SkImage SkAlphaType is kOpaque_SkAlphaType, dst.alphaType() must 832 match. If SkImage SkColorSpace is nullptr, dst.colorSpace() must match. Returns 833 false if pixel conversion is not possible. 834 835 srcX and srcY may be negative to copy only top or left of source. Returns 836 false if width() or height() is zero or negative. 837 Returns false if abs(srcX) >= Image width(), or if abs(srcY) >= Image height(). 838 839 If cachingHint is kAllow_CachingHint, pixels may be retained locally. 840 If cachingHint is kDisallow_CachingHint, pixels are not added to the local cache. 841 842 @param context the GrDirectContext in play, if it exists 843 @param dst destination SkPixmap: SkImageInfo, pixels, row bytes 844 @param srcX column index whose absolute value is less than width() 845 @param srcY row index whose absolute value is less than height() 846 @param cachingHint whether the pixels should be cached locallyZ 847 @return true if pixels are copied to dst 848 */ 849 bool readPixels(GrDirectContext* context, 850 const SkPixmap& dst, 851 int srcX, 852 int srcY, 853 CachingHint cachingHint = kAllow_CachingHint) const; 854 855 #ifndef SK_IMAGE_READ_PIXELS_DISABLE_LEGACY_API 856 /** Deprecated. Use the variants that accept a GrDirectContext. */ 857 bool readPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRowBytes, 858 int srcX, int srcY, CachingHint cachingHint = kAllow_CachingHint) const; 859 bool readPixels(const SkPixmap& dst, int srcX, int srcY, 860 CachingHint cachingHint = kAllow_CachingHint) const; 861 #endif 862 863 /** The result from asyncRescaleAndReadPixels() or asyncRescaleAndReadPixelsYUV420(). */ 864 class AsyncReadResult { 865 public: 866 AsyncReadResult(const AsyncReadResult&) = delete; 867 AsyncReadResult(AsyncReadResult&&) = delete; 868 AsyncReadResult& operator=(const AsyncReadResult&) = delete; 869 AsyncReadResult& operator=(AsyncReadResult&&) = delete; 870 871 virtual ~AsyncReadResult() = default; 872 virtual int count() const = 0; 873 virtual const void* data(int i) const = 0; 874 virtual size_t rowBytes(int i) const = 0; 875 876 protected: 877 AsyncReadResult() = default; 878 }; 879 880 /** Client-provided context that is passed to client-provided ReadPixelsContext. */ 881 using ReadPixelsContext = void*; 882 883 /** Client-provided callback to asyncRescaleAndReadPixels() or 884 asyncRescaleAndReadPixelsYUV420() that is called when read result is ready or on failure. 885 */ 886 using ReadPixelsCallback = void(ReadPixelsContext, std::unique_ptr<const AsyncReadResult>); 887 888 enum class RescaleGamma : bool { kSrc, kLinear }; 889 890 enum class RescaleMode { 891 kNearest, 892 kRepeatedLinear, 893 kRepeatedCubic, 894 }; 895 896 /** Makes image pixel data available to caller, possibly asynchronously. It can also rescale 897 the image pixels. 898 899 Currently asynchronous reads are only supported on the GPU backend and only when the 900 underlying 3D API supports transfer buffers and CPU/GPU synchronization primitives. In all 901 other cases this operates synchronously. 902 903 Data is read from the source sub-rectangle, is optionally converted to a linear gamma, is 904 rescaled to the size indicated by 'info', is then converted to the color space, color type, 905 and alpha type of 'info'. A 'srcRect' that is not contained by the bounds of the image 906 causes failure. 907 908 When the pixel data is ready the caller's ReadPixelsCallback is called with a 909 AsyncReadResult containing pixel data in the requested color type, alpha type, and color 910 space. The AsyncReadResult will have count() == 1. Upon failure the callback is called with 911 nullptr for AsyncReadResult. For a GPU image this flushes work but a submit must occur to 912 guarantee a finite time before the callback is called. 913 914 The data is valid for the lifetime of AsyncReadResult with the exception that if the SkImage 915 is GPU-backed the data is immediately invalidated if the context is abandoned or 916 destroyed. 917 918 @param info info of the requested pixels 919 @param srcRect subrectangle of image to read 920 @param rescaleGamma controls whether rescaling is done in the image's gamma or whether 921 the source data is transformed to a linear gamma before rescaling. 922 @param rescaleMode controls the technique (and cost) of the rescaling 923 @param callback function to call with result of the read 924 @param context passed to callback 925 */ 926 void asyncRescaleAndReadPixels(const SkImageInfo& info, 927 const SkIRect& srcRect, 928 RescaleGamma rescaleGamma, 929 RescaleMode rescaleMode, 930 ReadPixelsCallback callback, 931 ReadPixelsContext context) const; 932 933 /** 934 Similar to asyncRescaleAndReadPixels but performs an additional conversion to YUV. The 935 RGB->YUV conversion is controlled by 'yuvColorSpace'. The YUV data is returned as three 936 planes ordered y, u, v. The u and v planes are half the width and height of the resized 937 rectangle. The y, u, and v values are single bytes. Currently this fails if 'dstSize' 938 width and height are not even. A 'srcRect' that is not contained by the bounds of the 939 image causes failure. 940 941 When the pixel data is ready the caller's ReadPixelsCallback is called with a 942 AsyncReadResult containing the planar data. The AsyncReadResult will have count() == 3. 943 Upon failure the callback is called with nullptr for AsyncReadResult. For a GPU image this 944 flushes work but a submit must occur to guarantee a finite time before the callback is 945 called. 946 947 The data is valid for the lifetime of AsyncReadResult with the exception that if the SkImage 948 is GPU-backed the data is immediately invalidated if the context is abandoned or 949 destroyed. 950 951 @param yuvColorSpace The transformation from RGB to YUV. Applied to the resized image 952 after it is converted to dstColorSpace. 953 @param dstColorSpace The color space to convert the resized image to, after rescaling. 954 @param srcRect The portion of the image to rescale and convert to YUV planes. 955 @param dstSize The size to rescale srcRect to 956 @param rescaleGamma controls whether rescaling is done in the image's gamma or whether 957 the source data is transformed to a linear gamma before rescaling. 958 @param rescaleMode controls the technique (and cost) of the rescaling 959 @param callback function to call with the planar read result 960 @param context passed to callback 961 */ 962 void asyncRescaleAndReadPixelsYUV420(SkYUVColorSpace yuvColorSpace, 963 sk_sp<SkColorSpace> dstColorSpace, 964 const SkIRect& srcRect, 965 const SkISize& dstSize, 966 RescaleGamma rescaleGamma, 967 RescaleMode rescaleMode, 968 ReadPixelsCallback callback, 969 ReadPixelsContext context) const; 970 971 /** Copies SkImage to dst, scaling pixels to fit dst.width() and dst.height(), and 972 converting pixels to match dst.colorType() and dst.alphaType(). Returns true if 973 pixels are copied. Returns false if dst.addr() is nullptr, or dst.rowBytes() is 974 less than dst SkImageInfo::minRowBytes. 975 976 Pixels are copied only if pixel conversion is possible. If SkImage SkColorType is 977 kGray_8_SkColorType, or kAlpha_8_SkColorType; dst.colorType() must match. 978 If SkImage SkColorType is kGray_8_SkColorType, dst.colorSpace() must match. 979 If SkImage SkAlphaType is kOpaque_SkAlphaType, dst.alphaType() must 980 match. If SkImage SkColorSpace is nullptr, dst.colorSpace() must match. Returns 981 false if pixel conversion is not possible. 982 983 If cachingHint is kAllow_CachingHint, pixels may be retained locally. 984 If cachingHint is kDisallow_CachingHint, pixels are not added to the local cache. 985 986 @param dst destination SkPixmap: SkImageInfo, pixels, row bytes 987 @return true if pixels are scaled to fit dst 988 */ 989 bool scalePixels(const SkPixmap& dst, const SkSamplingOptions&, 990 CachingHint cachingHint = kAllow_CachingHint) const; 991 992 /** Encodes SkImage pixels, returning result as SkData. 993 994 Returns nullptr if encoding fails, or if encodedImageFormat is not supported. 995 996 SkImage encoding in a format requires both building with one or more of: 997 SK_ENCODE_JPEG, SK_ENCODE_PNG, SK_ENCODE_WEBP; and platform support 998 for the encoded format. 999 1000 If SK_BUILD_FOR_MAC or SK_BUILD_FOR_IOS is defined, encodedImageFormat can 1001 additionally be one of: SkEncodedImageFormat::kICO, SkEncodedImageFormat::kBMP, 1002 SkEncodedImageFormat::kGIF. 1003 1004 quality is a platform and format specific metric trading off size and encoding 1005 error. When used, quality equaling 100 encodes with the least error. quality may 1006 be ignored by the encoder. 1007 1008 @param encodedImageFormat one of: SkEncodedImageFormat::kJPEG, SkEncodedImageFormat::kPNG, 1009 SkEncodedImageFormat::kWEBP 1010 @param quality encoder specific metric with 100 equaling best 1011 @return encoded SkImage, or nullptr 1012 1013 example: https://fiddle.skia.org/c/@Image_encodeToData 1014 */ 1015 sk_sp<SkData> encodeToData(SkEncodedImageFormat encodedImageFormat, int quality) const; 1016 1017 /** Encodes SkImage pixels, returning result as SkData. Returns existing encoded data 1018 if present; otherwise, SkImage is encoded with SkEncodedImageFormat::kPNG. Skia 1019 must be built with SK_ENCODE_PNG to encode SkImage. 1020 1021 Returns nullptr if existing encoded data is missing or invalid, and 1022 encoding fails. 1023 1024 @return encoded SkImage, or nullptr 1025 1026 example: https://fiddle.skia.org/c/@Image_encodeToData_2 1027 */ 1028 sk_sp<SkData> encodeToData() const; 1029 1030 /** Returns encoded SkImage pixels as SkData, if SkImage was created from supported 1031 encoded stream format. Platform support for formats vary and may require building 1032 with one or more of: SK_ENCODE_JPEG, SK_ENCODE_PNG, SK_ENCODE_WEBP. 1033 1034 Returns nullptr if SkImage contents are not encoded. 1035 1036 @return encoded SkImage, or nullptr 1037 1038 example: https://fiddle.skia.org/c/@Image_refEncodedData 1039 */ 1040 sk_sp<SkData> refEncodedData() const; 1041 1042 /** Returns subset of this image. 1043 1044 Returns nullptr if any of the following are true: 1045 - Subset is empty 1046 - Subset is not contained inside the image's bounds 1047 - Pixels in the image could not be read or copied 1048 1049 If this image is texture-backed, the context parameter is required and must match the 1050 context of the source image. If the context parameter is provided, and the image is 1051 raster-backed, the subset will be converted to texture-backed. 1052 1053 @param subset bounds of returned SkImage 1054 @param context the GrDirectContext in play, if it exists 1055 @return the subsetted image, or nullptr 1056 1057 example: https://fiddle.skia.org/c/@Image_makeSubset 1058 */ 1059 sk_sp<SkImage> makeSubset(const SkIRect& subset, GrDirectContext* direct = nullptr) const; 1060 1061 /** 1062 * Returns true if the image has mipmap levels. 1063 */ 1064 bool hasMipmaps() const; 1065 1066 /** 1067 * Returns an image with the same "base" pixels as the this image, but with mipmap levels 1068 * automatically generated and attached. 1069 */ 1070 sk_sp<SkImage> withDefaultMipmaps() const; 1071 1072 #if SK_SUPPORT_GPU 1073 /** Returns SkImage backed by GPU texture associated with context. Returned SkImage is 1074 compatible with SkSurface created with dstColorSpace. The returned SkImage respects 1075 mipMapped setting; if mipMapped equals GrMipmapped::kYes, the backing texture 1076 allocates mip map levels. 1077 1078 The mipMapped parameter is effectively treated as kNo if MIP maps are not supported by the 1079 GPU. 1080 1081 Returns original SkImage if the image is already texture-backed, the context matches, and 1082 mipMapped is compatible with the backing GPU texture. SkBudgeted is ignored in this case. 1083 1084 Returns nullptr if context is nullptr, or if SkImage was created with another 1085 GrDirectContext. 1086 1087 @param GrDirectContext the GrDirectContext in play, if it exists 1088 @param GrMipmapped whether created SkImage texture must allocate mip map levels 1089 @param SkBudgeted whether to count a newly created texture for the returned image 1090 counts against the context's budget. 1091 @return created SkImage, or nullptr 1092 */ 1093 sk_sp<SkImage> makeTextureImage(GrDirectContext*, 1094 GrMipmapped = GrMipmapped::kNo, 1095 SkBudgeted = SkBudgeted::kYes) const; 1096 #endif 1097 1098 /** Returns raster image or lazy image. Copies SkImage backed by GPU texture into 1099 CPU memory if needed. Returns original SkImage if decoded in raster bitmap, 1100 or if encoded in a stream. 1101 1102 Returns nullptr if backed by GPU texture and copy fails. 1103 1104 @return raster image, lazy image, or nullptr 1105 1106 example: https://fiddle.skia.org/c/@Image_makeNonTextureImage 1107 */ 1108 sk_sp<SkImage> makeNonTextureImage() const; 1109 1110 /** Returns raster image. Copies SkImage backed by GPU texture into CPU memory, 1111 or decodes SkImage from lazy image. Returns original SkImage if decoded in 1112 raster bitmap. 1113 1114 Returns nullptr if copy, decode, or pixel read fails. 1115 1116 If cachingHint is kAllow_CachingHint, pixels may be retained locally. 1117 If cachingHint is kDisallow_CachingHint, pixels are not added to the local cache. 1118 1119 @return raster image, or nullptr 1120 1121 example: https://fiddle.skia.org/c/@Image_makeRasterImage 1122 */ 1123 sk_sp<SkImage> makeRasterImage(CachingHint cachingHint = kDisallow_CachingHint) const; 1124 1125 /** Creates filtered SkImage. filter processes original SkImage, potentially changing 1126 color, position, and size. subset is the bounds of original SkImage processed 1127 by filter. clipBounds is the expected bounds of the filtered SkImage. outSubset 1128 is required storage for the actual bounds of the filtered SkImage. offset is 1129 required storage for translation of returned SkImage. 1130 1131 Returns nullptr if SkImage could not be created or if the recording context provided doesn't 1132 match the GPU context in which the image was created. If nullptr is returned, outSubset 1133 and offset are undefined. 1134 1135 Useful for animation of SkImageFilter that varies size from frame to frame. 1136 Returned SkImage is created larger than required by filter so that GPU texture 1137 can be reused with different sized effects. outSubset describes the valid bounds 1138 of GPU texture returned. offset translates the returned SkImage to keep subsequent 1139 animation frames aligned with respect to each other. 1140 1141 @param context the GrRecordingContext in play - if it exists 1142 @param filter how SkImage is sampled when transformed 1143 @param subset bounds of SkImage processed by filter 1144 @param clipBounds expected bounds of filtered SkImage 1145 @param outSubset storage for returned SkImage bounds 1146 @param offset storage for returned SkImage translation 1147 @return filtered SkImage, or nullptr 1148 */ 1149 sk_sp<SkImage> makeWithFilter(GrRecordingContext* context, 1150 const SkImageFilter* filter, const SkIRect& subset, 1151 const SkIRect& clipBounds, SkIRect* outSubset, 1152 SkIPoint* offset) const; 1153 1154 /** Defines a callback function, taking one parameter of type GrBackendTexture with 1155 no return value. Function is called when back-end texture is to be released. 1156 */ 1157 typedef std::function<void(GrBackendTexture)> BackendTextureReleaseProc; 1158 1159 #if SK_SUPPORT_GPU 1160 /** Creates a GrBackendTexture from the provided SkImage. Returns true and 1161 stores result in backendTexture and backendTextureReleaseProc if 1162 texture is created; otherwise, returns false and leaves 1163 backendTexture and backendTextureReleaseProc unmodified. 1164 1165 Call backendTextureReleaseProc after deleting backendTexture. 1166 backendTextureReleaseProc cleans up auxiliary data related to returned 1167 backendTexture. The caller must delete returned backendTexture after use. 1168 1169 If SkImage is both texture backed and singly referenced, image is returned in 1170 backendTexture without conversion or making a copy. SkImage is singly referenced 1171 if its was transferred solely using std::move(). 1172 1173 If SkImage is not texture backed, returns texture with SkImage contents. 1174 1175 @param context GPU context 1176 @param image SkImage used for texture 1177 @param backendTexture storage for back-end texture 1178 @param backendTextureReleaseProc storage for clean up function 1179 @return true if back-end texture was created 1180 */ 1181 static bool MakeBackendTextureFromSkImage(GrDirectContext* context, 1182 sk_sp<SkImage> image, 1183 GrBackendTexture* backendTexture, 1184 BackendTextureReleaseProc* backendTextureReleaseProc); 1185 #endif 1186 /** Deprecated. 1187 */ 1188 enum LegacyBitmapMode { 1189 kRO_LegacyBitmapMode, //!< returned bitmap is read-only and immutable 1190 }; 1191 1192 /** Deprecated. 1193 Creates raster SkBitmap with same pixels as SkImage. If legacyBitmapMode is 1194 kRO_LegacyBitmapMode, returned bitmap is read-only and immutable. 1195 Returns true if SkBitmap is stored in bitmap. Returns false and resets bitmap if 1196 SkBitmap write did not succeed. 1197 1198 @param bitmap storage for legacy SkBitmap 1199 @param legacyBitmapMode bitmap is read-only and immutable 1200 @return true if SkBitmap was created 1201 */ 1202 bool asLegacyBitmap(SkBitmap* bitmap, 1203 LegacyBitmapMode legacyBitmapMode = kRO_LegacyBitmapMode) const; 1204 1205 /** Returns true if SkImage is backed by an image-generator or other service that creates 1206 and caches its pixels or texture on-demand. 1207 1208 @return true if SkImage is created as needed 1209 1210 example: https://fiddle.skia.org/c/@Image_isLazyGenerated_a 1211 example: https://fiddle.skia.org/c/@Image_isLazyGenerated_b 1212 */ 1213 bool isLazyGenerated() const; 1214 1215 /** Creates SkImage in target SkColorSpace. 1216 Returns nullptr if SkImage could not be created. 1217 1218 Returns original SkImage if it is in target SkColorSpace. 1219 Otherwise, converts pixels from SkImage SkColorSpace to target SkColorSpace. 1220 If SkImage colorSpace() returns nullptr, SkImage SkColorSpace is assumed to be sRGB. 1221 1222 If this image is texture-backed, the context parameter is required and must match the 1223 context of the source image. 1224 1225 @param target SkColorSpace describing color range of returned SkImage 1226 @param direct The GrDirectContext in play, if it exists 1227 @return created SkImage in target SkColorSpace 1228 1229 example: https://fiddle.skia.org/c/@Image_makeColorSpace 1230 */ 1231 sk_sp<SkImage> makeColorSpace(sk_sp<SkColorSpace> target, 1232 GrDirectContext* direct = nullptr) const; 1233 1234 /** Experimental. 1235 Creates SkImage in target SkColorType and SkColorSpace. 1236 Returns nullptr if SkImage could not be created. 1237 1238 Returns original SkImage if it is in target SkColorType and SkColorSpace. 1239 1240 If this image is texture-backed, the context parameter is required and must match the 1241 context of the source image. 1242 1243 @param targetColorType SkColorType of returned SkImage 1244 @param targetColorSpace SkColorSpace of returned SkImage 1245 @param direct The GrDirectContext in play, if it exists 1246 @return created SkImage in target SkColorType and SkColorSpace 1247 */ 1248 sk_sp<SkImage> makeColorTypeAndColorSpace(SkColorType targetColorType, 1249 sk_sp<SkColorSpace> targetColorSpace, 1250 GrDirectContext* direct = nullptr) const; 1251 1252 /** Creates a new SkImage identical to this one, but with a different SkColorSpace. 1253 This does not convert the underlying pixel data, so the resulting image will draw 1254 differently. 1255 */ 1256 sk_sp<SkImage> reinterpretColorSpace(sk_sp<SkColorSpace> newColorSpace) const; 1257 1258 private: 1259 SkImage(const SkImageInfo& info, uint32_t uniqueID); 1260 1261 friend class SkBitmap; 1262 friend class SkImage_Base; 1263 friend class SkMipmapBuilder; 1264 1265 SkImageInfo fInfo; 1266 const uint32_t fUniqueID; 1267 1268 sk_sp<SkImage> withMipmaps(sk_sp<SkMipmap>) const; 1269 1270 using INHERITED = SkRefCnt; 1271 }; 1272 1273 #endif 1274