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 "GrTypes.h"
12 #include "SkFilterQuality.h"
13 #include "SkImageInfo.h"
14 #include "SkImageEncoder.h"
15 #include "SkRefCnt.h"
16 #include "SkScalar.h"
17 #include "SkShader.h"
18 
19 #if defined(SK_BUILD_FOR_ANDROID) && __ANDROID_API__ >= 26
20 #include <android/hardware_buffer.h>
21 #endif
22 
23 class SkData;
24 class SkCanvas;
25 class SkImageFilter;
26 class SkImageGenerator;
27 class SkPaint;
28 class SkPicture;
29 class SkString;
30 class SkSurface;
31 class GrBackendTexture;
32 class GrContext;
33 class GrContextThreadSafeProxy;
34 class GrTexture;
35 
36 /** \class SkImage
37     SkImage describes a two dimensional array of pixels to draw. The pixels may be
38     decoded in a raster bitmap, encoded in a SkPicture or compressed data stream,
39     or located in GPU memory as a GPU texture.
40 
41     SkImage cannot be modified after it is created. SkImage may allocate additional
42     storage as needed; for instance, an encoded SkImage may decode when drawn.
43 
44     SkImage width and height are greater than zero. Creating an SkImage with zero width
45     or height returns SkImage equal to nullptr.
46 
47     SkImage may be created from SkBitmap, SkPixmap, SkSurface, SkPicture, encoded streams,
48     GPU texture, YUV_ColorSpace data, or hardware buffer. Encoded streams supported
49     include BMP, GIF, HEIF, ICO, JPEG, PNG, WBMP, WebP. Supported encoding details
50     vary with platform.
51 */
52 class SK_API SkImage : public SkRefCnt {
53 public:
54     typedef SkImageInfo Info;
55     typedef void* ReleaseContext;
56 
57     /** Creates SkImage from SkPixmap and copy of pixels. Since pixels are copied, SkPixmap
58         pixels may be modified or deleted without affecting SkImage.
59 
60         SkImage is returned if SkPixmap is valid. Valid SkPixmap parameters include:
61         dimensions are greater than zero;
62         each dimension fits in 29 bits;
63         SkColorType and SkAlphaType are valid, and SkColorType is not kUnknown_SkColorType;
64         row bytes are large enough to hold one row of pixels;
65         pixel address is not nullptr.
66 
67         @param pixmap  SkImageInfo, pixel address, and row bytes
68         @return        copy of SkPixmap pixels, or nullptr
69     */
70     static sk_sp<SkImage> MakeRasterCopy(const SkPixmap& pixmap);
71 
72     /** Creates SkImage from SkImageInfo, sharing pixels.
73 
74         SkImage is returned if SkImageInfo is valid. Valid SkImageInfo parameters include:
75         dimensions are greater than zero;
76         each dimension fits in 29 bits;
77         SkColorType and SkAlphaType are valid, and SkColorType is not kUnknown_SkColorType;
78         rowBytes are large enough to hold one row of pixels;
79         pixels is not nullptr, and contains enough data for SkImage.
80 
81         @param info      contains width, height, SkAlphaType, SkColorType, SkColorSpace
82         @param pixels    address or pixel storage
83         @param rowBytes  size of pixel row or larger
84         @return          SkImage sharing pixels, or nullptr
85     */
86     static sk_sp<SkImage> MakeRasterData(const Info& info, sk_sp<SkData> pixels, size_t rowBytes);
87 
88     typedef void (*RasterReleaseProc)(const void* pixels, ReleaseContext);
89 
90     /** Creates SkImage from pixmap, sharing SkPixmap pixels. Pixels must remain valid and
91         unchanged until rasterReleaseProc is called. rasterReleaseProc is passed
92         releaseContext when SkImage is deleted or no longer refers to pixmap pixels.
93 
94         Pass nullptr for rasterReleaseProc to share SkPixmap without requiring a callback
95         when SkImage is released. Pass nullptr for releaseContext if rasterReleaseProc
96         does not require state.
97 
98         SkImage is returned if pixmap is valid. Valid SkPixmap parameters include:
99         dimensions are greater than zero;
100         each dimension fits in 29 bits;
101         SkColorType and SkAlphaType are valid, and SkColorType is not kUnknown_SkColorType;
102         row bytes are large enough to hold one row of pixels;
103         pixel address is not nullptr.
104 
105         @param pixmap             SkImageInfo, pixel address, and row bytes
106         @param rasterReleaseProc  function called when pixels can be released; or nullptr
107         @param releaseContext     state passed to rasterReleaseProc; or nullptr
108         @return                   SkImage sharing pixmap
109     */
110     static sk_sp<SkImage> MakeFromRaster(const SkPixmap& pixmap,
111                                          RasterReleaseProc rasterReleaseProc,
112                                          ReleaseContext releaseContext);
113 
114     /** Creates SkImage from bitmap, sharing or copying bitmap pixels. If the bitmap
115         is marked immutable, and its pixel memory is shareable, it may be shared
116         instead of copied.
117 
118         SkImage is returned if bitmap is valid. Valid SkBitmap parameters include:
119         dimensions are greater than zero;
120         each dimension fits in 29 bits;
121         SkColorType and SkAlphaType are valid, and SkColorType is not kUnknown_SkColorType;
122         row bytes are large enough to hold one row of pixels;
123         pixel address is not nullptr.
124 
125         @param bitmap  SkImageInfo, row bytes, and pixels
126         @return        created SkImage, or nullptr
127     */
128     static sk_sp<SkImage> MakeFromBitmap(const SkBitmap& bitmap);
129 
130     /** Creates SkImage from data returned by imageGenerator. Generated data is owned by SkImage and may not
131         be shared or accessed.
132 
133         subset allows selecting a portion of the full image. Pass nullptr to select the entire image;
134         otherwise, subset must be contained by image bounds.
135 
136         SkImage is returned if generator data is valid. Valid data parameters vary by type of data
137         and platform.
138 
139         imageGenerator may wrap SkPicture data, codec data, or custom data.
140 
141         @param imageGenerator  stock or custom routines to retrieve SkImage
142         @param subset          bounds of returned SkImage; may be nullptr
143         @return                created SkImage, or nullptr
144     */
145     static sk_sp<SkImage> MakeFromGenerator(std::unique_ptr<SkImageGenerator> imageGenerator,
146                                             const SkIRect* subset = nullptr);
147 
148     /** Creates SkImage from encoded data.
149         subset allows selecting a portion of the full image. Pass nullptr to select the entire image;
150         otherwise, subset must be contained by image bounds.
151 
152         SkImage is returned if format of the encoded data is recognized and supported.
153         Recognized formats vary by platform.
154 
155         @param encoded  data of SkImage to decode
156         @param subset   bounds of returned SkImage; may be nullptr
157         @return         created SkImage, or nullptr
158     */
159     static sk_sp<SkImage> MakeFromEncoded(sk_sp<SkData> encoded, const SkIRect* subset = nullptr);
160 
161     typedef void (*TextureReleaseProc)(ReleaseContext releaseContext);
162 
163     /** Deprecated.
164     */
MakeFromTexture(GrContext * context,const GrBackendTexture & backendTexture,GrSurfaceOrigin origin,SkAlphaType alphaType,sk_sp<SkColorSpace> colorSpace)165     static sk_sp<SkImage> MakeFromTexture(GrContext* context,
166                                           const GrBackendTexture& backendTexture,
167                                           GrSurfaceOrigin origin,
168                                           SkAlphaType alphaType,
169                                           sk_sp<SkColorSpace> colorSpace) {
170         return MakeFromTexture(context, backendTexture, origin, alphaType, colorSpace, nullptr,
171                                nullptr);
172     }
173 
174     /** Deprecated.
175     */
176     static sk_sp<SkImage> MakeFromTexture(GrContext* context,
177                                           const GrBackendTexture& backendTexture,
178                                           GrSurfaceOrigin origin,
179                                           SkAlphaType alphaType,
180                                           sk_sp<SkColorSpace> colorSpace,
181                                           TextureReleaseProc textureReleaseProc,
182                                           ReleaseContext releaseContext);
183 
184     /** Creates SkImage from GPU texture associated with context. Caller is responsible for
185         managing the lifetime of GPU texture.
186 
187         SkImage is returned if format of backendTexture is recognized and supported.
188         Recognized formats vary by GPU back-end.
189 
190         @param context         GPU context
191         @param backendTexture  texture residing on GPU
192         @param origin          one of: kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin
193         @param colorType       one of: kUnknown_SkColorType, kAlpha_8_SkColorType,
194                                kRGB_565_SkColorType, kARGB_4444_SkColorType,
195                                kRGBA_8888_SkColorType, kBGRA_8888_SkColorType,
196                                kGray_8_SkColorType, kRGBA_F16_SkColorType
197         @param alphaType       one of: kUnknown_SkAlphaType, kOpaque_SkAlphaType,
198                                kPremul_SkAlphaType, kUnpremul_SkAlphaType
199         @param colorSpace      range of colors; may be nullptr
200         @return                created SkImage, or nullptr
201     */
MakeFromTexture(GrContext * context,const GrBackendTexture & backendTexture,GrSurfaceOrigin origin,SkColorType colorType,SkAlphaType alphaType,sk_sp<SkColorSpace> colorSpace)202     static sk_sp<SkImage> MakeFromTexture(GrContext* context,
203                                           const GrBackendTexture& backendTexture,
204                                           GrSurfaceOrigin origin,
205                                           SkColorType colorType,
206                                           SkAlphaType alphaType,
207                                           sk_sp<SkColorSpace> colorSpace) {
208         return MakeFromTexture(context, backendTexture, origin, colorType, alphaType, colorSpace,
209                                nullptr, nullptr);
210     }
211 
212     /** Creates SkImage from GPU texture associated with context. GPU texture must stay
213         valid and unchanged until textureReleaseProc is called. textureReleaseProc is
214         passed releaseContext when SkImage is deleted or no longer refers to texture.
215 
216         SkImage is returned if format of backendTexture is recognized and supported.
217         Recognized formats vary by GPU back-end.
218 
219         @param context             GPU context
220         @param backendTexture      texture residing on GPU
221         @param origin              one of: kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin
222         @param colorType           one of: kUnknown_SkColorType, kAlpha_8_SkColorType,
223                                    kRGB_565_SkColorType, kARGB_4444_SkColorType,
224                                    kRGBA_8888_SkColorType, kBGRA_8888_SkColorType,
225                                    kGray_8_SkColorType, kRGBA_F16_SkColorType
226         @param alphaType           one of: kUnknown_SkAlphaType, kOpaque_SkAlphaType,
227                                    kPremul_SkAlphaType, kUnpremul_SkAlphaType
228         @param colorSpace          range of colors; may be nullptr
229         @param textureReleaseProc  function called when texture can be released
230         @param releaseContext      state passed to textureReleaseProc
231         @return                    created SkImage, or nullptr
232     */
233     static sk_sp<SkImage> MakeFromTexture(GrContext* context,
234                                           const GrBackendTexture& backendTexture,
235                                           GrSurfaceOrigin origin,
236                                           SkColorType colorType,
237                                           SkAlphaType alphaType,
238                                           sk_sp<SkColorSpace> colorSpace,
239                                           TextureReleaseProc textureReleaseProc,
240                                           ReleaseContext releaseContext);
241 
242     /** Creates SkImage from encoded data. SkImage is uploaded to GPU back-end using context.
243 
244         Created SkImage is available to other GPU contexts, and is available across thread
245         boundaries. All contexts must be in the same GPU_Share_Group, or otherwise
246         share resources.
247 
248         When SkImage is no longer referenced, context releases texture memory
249         asynchronously.
250 
251         GrBackendTexture decoded from data is uploaded to match SkSurface created with
252         dstColorSpace. SkColorSpace of SkImage is determined by encoded data.
253 
254         SkImage is returned if format of data is recognized and supported, and if context
255         supports moving resources. Recognized formats vary by platform and GPU back-end.
256 
257         SkImage is returned using MakeFromEncoded() if context is nullptr or does not support
258         moving resources between contexts.
259 
260         @param context        GPU context
261         @param data           SkImage to decode
262         @param buildMips      create SkImage as Mip_Map if true
263         @param dstColorSpace  range of colors of matching SkSurface on GPU
264         @return               created SkImage, or nullptr
265     */
266     static sk_sp<SkImage> MakeCrossContextFromEncoded(GrContext* context, sk_sp<SkData> data,
267                                                       bool buildMips, SkColorSpace* dstColorSpace);
268 
269     /** Creates SkImage from pixmap. SkImage is uploaded to GPU back-end using context.
270 
271         Created SkImage is available to other GPU contexts, and is available across thread
272         boundaries. All contexts must be in the same GPU_Share_Group, or otherwise
273         share resources.
274 
275         When SkImage is no longer referenced, context releases texture memory
276         asynchronously.
277 
278         GrBackendTexture created from pixmap is uploaded to match SkSurface created with
279         dstColorSpace. SkColorSpace of SkImage is determined by pixmap.colorSpace().
280 
281         SkImage is returned referring to GPU back-end if context is not nullptr,
282         format of data is recognized and supported, and if context supports moving
283         resources between contexts. Otherwise, pixmap pixel data is copied and SkImage
284         as returned in raster format if possible; nullptr may be returned.
285         Recognized GPU formats vary by platform and GPU back-end.
286 
287         @param context        GPU context
288         @param pixmap         SkImageInfo, pixel address, and row bytes
289         @param buildMips      create SkImage as Mip_Map if true
290         @param dstColorSpace  range of colors of matching SkSurface on GPU
291         @return               created SkImage, or nullptr
292     */
293     static sk_sp<SkImage> MakeCrossContextFromPixmap(GrContext* context, const SkPixmap& pixmap,
294                                                      bool buildMips, SkColorSpace* dstColorSpace);
295 
296     /** Deprecated.
297     */
298     static sk_sp<SkImage> MakeFromAdoptedTexture(GrContext* context,
299                                                  const GrBackendTexture& backendTexture,
300                                                  GrSurfaceOrigin surfaceOrigin,
301                                                  SkAlphaType alphaType = kPremul_SkAlphaType,
302                                                  sk_sp<SkColorSpace> colorSpace = nullptr);
303 
304     /** Creates SkImage from backendTexture associated with context. backendTexture and
305         returned SkImage are managed internally, and are released when no longer needed.
306 
307         SkImage is returned if format of backendTexture is recognized and supported.
308         Recognized formats vary by GPU back-end.
309 
310         @param context         GPU context
311         @param backendTexture  texture residing on GPU
312         @param surfaceOrigin   one of: kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin
313         @param colorType       one of: kUnknown_SkColorType, kAlpha_8_SkColorType,
314                                kRGB_565_SkColorType, kARGB_4444_SkColorType,
315                                kRGBA_8888_SkColorType, kBGRA_8888_SkColorType,
316                                kGray_8_SkColorType, kRGBA_F16_SkColorType
317         @param alphaType       one of: kUnknown_SkAlphaType, kOpaque_SkAlphaType,
318                                kPremul_SkAlphaType, kUnpremul_SkAlphaType
319         @param colorSpace      range of colors; may be nullptr
320         @return                created SkImage, or nullptr
321     */
322     static sk_sp<SkImage> MakeFromAdoptedTexture(GrContext* context,
323                                                  const GrBackendTexture& backendTexture,
324                                                  GrSurfaceOrigin surfaceOrigin,
325                                                  SkColorType colorType,
326                                                  SkAlphaType alphaType = kPremul_SkAlphaType,
327                                                  sk_sp<SkColorSpace> colorSpace = nullptr);
328 
329     /** Creates SkImage from copy of yuvTextureHandles, an array of textures on GPU.
330         yuvTextureHandles contain pixels for YUV planes of SkImage.
331         yuvSizes contain dimensions for each pixel plane. Dimensions must be greater than
332         zero but may differ from plane to plane. Returned SkImage has the dimensions
333         yuvSizes[0]. yuvColorSpace describes how YUV colors convert to RGB colors.
334 
335         @param context            GPU context
336         @param yuvColorSpace      one of: kJPEG_SkYUVColorSpace, kRec601_SkYUVColorSpace,
337                                   kRec709_SkYUVColorSpace
338         @param yuvTextureHandles  array of YUV textures on GPU
339         @param yuvSizes           dimensions of YUV textures
340         @param surfaceOrigin      one of: kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin
341         @param colorSpace         range of colors; may be nullptr
342         @return                   created SkImage, or nullptr
343     */
344     static sk_sp<SkImage> MakeFromYUVTexturesCopy(GrContext* context, SkYUVColorSpace yuvColorSpace,
345                                                   const GrBackendObject yuvTextureHandles[3],
346                                                   const SkISize yuvSizes[3],
347                                                   GrSurfaceOrigin surfaceOrigin,
348                                                   sk_sp<SkColorSpace> colorSpace = nullptr);
349 
350     /** Creates SkImage from copy of nv12TextureHandles, an array of textures on GPU.
351         nv12TextureHandles[0] contains pixels for YUV_Component_Y plane.
352         nv12TextureHandles[1] contains pixels for YUV_Component_U plane,
353         followed by pixels for YUV_Component_V plane.
354         nv12Sizes contain dimensions for each pixel plane. Dimensions must be greater than
355         zero but may differ from plane to plane. Returned SkImage has the dimensions
356         nv12Sizes[0]. yuvColorSpace describes how YUV colors convert to RGB colors.
357 
358         @param context             GPU context
359         @param yuvColorSpace       one of: kJPEG_SkYUVColorSpace, kRec601_SkYUVColorSpace,
360                                    kRec709_SkYUVColorSpace
361         @param nv12TextureHandles  array of YUV textures on GPU
362         @param nv12Sizes           dimensions of YUV textures
363         @param surfaceOrigin       one of: kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin
364         @param colorSpace          range of colors; may be nullptr
365         @return                    created SkImage, or nullptr
366     */
367     static sk_sp<SkImage> MakeFromNV12TexturesCopy(GrContext* context,
368                                                    SkYUVColorSpace yuvColorSpace,
369                                                    const GrBackendObject nv12TextureHandles[2],
370                                                    const SkISize nv12Sizes[2],
371                                                    GrSurfaceOrigin surfaceOrigin,
372                                                    sk_sp<SkColorSpace> colorSpace = nullptr);
373 
374     /** Creates SkImage from copy of yuvTextureHandles, an array of textures on GPU.
375         yuvTextureHandles contain pixels for YUV planes of SkImage.
376         yuvSizes contain dimensions for each pixel plane. Dimensions must be greater than
377         zero but may differ from plane to plane. Returned SkImage has the dimensions
378         yuvSizes[0]. yuvColorSpace describes how YUV colors convert to RGB colors.
379 
380         @param context            GPU context
381         @param yuvColorSpace      one of: kJPEG_SkYUVColorSpace, kRec601_SkYUVColorSpace,
382                                   kRec709_SkYUVColorSpace
383         @param yuvTextureHandles  array of YUV textures on GPU
384         @param yuvSizes           dimensions of YUV textures
385         @param surfaceOrigin      one of: kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin
386         @param colorSpace         range of colors; may be nullptr
387         @return                   created SkImage, or nullptr
388     */
389     static sk_sp<SkImage> MakeFromYUVTexturesCopy(GrContext* context, SkYUVColorSpace yuvColorSpace,
390                                                   const GrBackendTexture yuvTextureHandles[3],
391                                                   const SkISize yuvSizes[3],
392                                                   GrSurfaceOrigin surfaceOrigin,
393                                                   sk_sp<SkColorSpace> colorSpace = nullptr);
394 
395     /** Creates SkImage from copy of nv12TextureHandles, an array of textures on GPU.
396         nv12TextureHandles[0] contains pixels for YUV_Component_Y plane.
397         nv12TextureHandles[1] contains pixels for YUV_Component_U plane,
398         followed by pixels for YUV_Component_V plane.
399         nv12Sizes contain dimensions for each pixel plane. Dimensions must be greater than
400         zero but may differ from plane to plane. Returned SkImage has the dimensions
401         nv12Sizes[0]. yuvColorSpace describes how YUV colors convert to RGB colors.
402 
403         @param context             GPU context
404         @param yuvColorSpace       one of: kJPEG_SkYUVColorSpace, kRec601_SkYUVColorSpace,
405                                    kRec709_SkYUVColorSpace
406         @param nv12TextureHandles  array of YUV textures on GPU
407         @param nv12Sizes           dimensions of YUV textures
408         @param surfaceOrigin       one of: kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin
409         @param colorSpace          range of colors; may be nullptr
410         @return                    created SkImage, or nullptr
411     */
412     static sk_sp<SkImage> MakeFromNV12TexturesCopy(GrContext* context,
413                                                    SkYUVColorSpace yuvColorSpace,
414                                                    const GrBackendTexture nv12TextureHandles[2],
415                                                    const SkISize nv12Sizes[2],
416                                                    GrSurfaceOrigin surfaceOrigin,
417                                                    sk_sp<SkColorSpace> colorSpace = nullptr);
418 
419     enum class BitDepth {
420         kU8,  //!< Use 8 bits per ARGB component using unsigned integer format.
421         kF16, //!< Use 16 bits per ARGB component using half-precision floating point format.
422     };
423 
424     /** Creates SkImage from picture. Returned SkImage width and height are set by dimensions.
425         SkImage draws picture with matrix and paint, set to bitDepth and colorSpace.
426 
427         If matrix is nullptr, draws with identity SkMatrix. If paint is nullptr, draws
428         with default SkPaint. colorSpace may be nullptr.
429 
430         @param picture     stream of drawing commands
431         @param dimensions  width and height
432         @param matrix      SkMatrix to rotate, scale, translate, and so on; may be nullptr
433         @param paint       SkPaint to apply transparency, filtering, and so on; may be nullptr
434         @param bitDepth    8 bit integer or 16 bit float: per component
435         @param colorSpace  range of colors; may be nullptr
436         @return            created SkImage, or nullptr
437     */
438     static sk_sp<SkImage> MakeFromPicture(sk_sp<SkPicture> picture, const SkISize& dimensions,
439                                           const SkMatrix* matrix, const SkPaint* paint,
440                                           BitDepth bitDepth,
441                                           sk_sp<SkColorSpace> colorSpace);
442 
443 #if defined(SK_BUILD_FOR_ANDROID) && __ANDROID_API__ >= 26
444     /** (see skbug.com/7447)
445         Creates SkImage from Android hardware buffer.
446         Returned SkImage takes a reference on the buffer.
447 
448         Only available on Android, when __ANDROID_API__ is defined to be 26 or greater.
449 
450         @param hardwareBuffer  AHardwareBuffer Android hardware buffer
451         @param alphaType       one of: kUnknown_SkAlphaType, kOpaque_SkAlphaType,
452                                kPremul_SkAlphaType, kUnpremul_SkAlphaType
453         @param colorSpace      range of colors; may be nullptr
454         @return                created SkImage, or nullptr
455     */
456     static sk_sp<SkImage> MakeFromAHardwareBuffer(AHardwareBuffer* hardwareBuffer,
457                                                  SkAlphaType alphaType = kPremul_SkAlphaType,
458                                                  sk_sp<SkColorSpace> colorSpace = nullptr);
459 #endif
460 
461     /** Returns pixel count in each row.
462 
463         @return  pixel width in SkImage
464     */
width()465     int width() const { return fWidth; }
466 
467     /** Returns pixel row count.
468 
469         @return  pixel height in SkImage
470     */
height()471     int height() const { return fHeight; }
472 
473     /** Returns SkISize { width(), height() }.
474 
475         @return  integral size of width() and height()
476     */
dimensions()477     SkISize dimensions() const { return SkISize::Make(fWidth, fHeight); }
478 
479     /** Returns SkIRect { 0, 0, width(), height() }.
480 
481         @return  integral rectangle from origin to width() and height()
482     */
bounds()483     SkIRect bounds() const { return SkIRect::MakeWH(fWidth, fHeight); }
484 
485     /** Returns value unique to image. SkImage contents cannot change after SkImage is
486         created. Any operation to create a new SkImage will receive generate a new
487         unique number.
488 
489         @return  unique identifier
490     */
uniqueID()491     uint32_t uniqueID() const { return fUniqueID; }
492 
493     /** Returns SkAlphaType, one of: kUnknown_SkAlphaType, kOpaque_SkAlphaType,
494         kPremul_SkAlphaType, kUnpremul_SkAlphaType.
495 
496         SkAlphaType returned was a parameter to an SkImage constructor,
497         or was parsed from encoded data.
498 
499         @return  SkAlphaType in SkImage
500     */
501     SkAlphaType alphaType() const;
502 
503     /** Returns SkColorSpace, the range of colors, associated with SkImage.  The
504         reference count of SkColorSpace is unchanged. The returned SkColorSpace is
505         immutable.
506 
507         SkColorSpace returned was passed to an SkImage constructor,
508         or was parsed from encoded data. SkColorSpace returned may be ignored when SkImage
509         is drawn, depending on the capabilities of the SkSurface receiving the drawing.
510 
511         @return  SkColorSpace in SkImage, or nullptr
512     */
513     SkColorSpace* colorSpace() const;
514 
515     /** Returns a smart pointer to SkColorSpace, the range of colors, associated with
516         SkImage.  The smart pointer tracks the number of objects sharing this
517         SkColorSpace reference so the memory is released when the owners destruct.
518 
519         The returned SkColorSpace is immutable.
520 
521         SkColorSpace returned was passed to an SkImage constructor,
522         or was parsed from encoded data. SkColorSpace returned may be ignored when SkImage
523         is drawn, depending on the capabilities of the SkSurface receiving the drawing.
524 
525         @return  SkColorSpace in SkImage, or nullptr, wrapped in a smart pointer
526     */
527     sk_sp<SkColorSpace> refColorSpace() const;
528 
529     /** Returns true if SkImage pixels represent transparency only. If true, each pixel
530         is packed in 8 bits as defined by kAlpha_8_SkColorType.
531 
532         @return  true if pixels represent a transparency mask
533     */
534     bool isAlphaOnly() const;
535 
536     /** Returns true if pixels ignore their alpha value and are treated as fully opaque.
537 
538         @return  true if SkAlphaType is kOpaque_SkAlphaType
539     */
isOpaque()540     bool isOpaque() const { return SkAlphaTypeIsOpaque(this->alphaType()); }
541 
542     /** Creates SkShader from SkImage. SkShader dimensions are taken from SkImage. SkShader uses
543         SkShader::TileMode rules to fill drawn area outside SkImage. localMatrix permits
544         transforming SkImage before SkCanvas matrix is applied.
545 
546         @param tileMode1    tiling in x, one of: SkShader::kClamp_TileMode, SkShader::kRepeat_TileMode,
547                             SkShader::kMirror_TileMode
548         @param tileMode2    tiling in y, one of: SkShader::kClamp_TileMode, SkShader::kRepeat_TileMode,
549                             SkShader::kMirror_TileMode
550         @param localMatrix  SkImage transformation, or nullptr
551         @return             SkShader containing SkImage
552     */
553     sk_sp<SkShader> makeShader(SkShader::TileMode tileMode1, SkShader::TileMode tileMode2,
554                                const SkMatrix* localMatrix = nullptr) const;
555 
556     /** Creates SkShader from SkImage. SkShader dimensions are taken from SkImage. SkShader uses
557         SkShader::kClamp_TileMode to fill drawn area outside SkImage. localMatrix permits
558         transforming SkImage before SkCanvas matrix is applied.
559 
560         @param localMatrix  SkImage transformation, or nullptr
561         @return             SkShader containing SkImage
562     */
563     sk_sp<SkShader> makeShader(const SkMatrix* localMatrix = nullptr) const {
564         return this->makeShader(SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, localMatrix);
565     }
566 
567     /** Copies SkImage pixel address, row bytes, and SkImageInfo to pixmap, if address
568         is available, and returns true. If pixel address is not available, return
569         false and leave pixmap unchanged.
570 
571         @param pixmap  storage for pixel state if pixels are readable; otherwise, ignored
572         @return        true if SkImage has direct access to pixels
573     */
574     bool peekPixels(SkPixmap* pixmap) const;
575 
576     /** Deprecated.
577     */
578     GrTexture* getTexture() const;
579 
580     /** Returns true the contents of SkImage was created on or uploaded to GPU memory,
581         and is available as a GPU texture.
582 
583         @return  true if SkImage is a GPU texture
584     */
585     bool isTextureBacked() const;
586 
587     /** Returns true if SkImage can be drawn on either raster surface or GPU surface.
588         If context is nullptr, tests if SkImage draws on raster surface;
589         otherwise, tests if SkImage draws on GPU surface associated with context.
590 
591         SkImage backed by GPU texture may become invalid if associated GrContext is
592         invalid. lazy image may be invalid and may not draw to raster surface or
593         GPU surface or both.
594 
595         @param context  GPU context
596         @return         true if SkImage can be drawn
597     */
598     bool isValid(GrContext* context) const;
599 
600     /** Retrieves the back-end API handle of texture. If flushPendingGrContextIO is true,
601         complete deferred I/O operations.
602 
603         If origin in not nullptr, copies location of content drawn into SkImage.
604 
605         @param flushPendingGrContextIO  flag to flush outstanding requests
606         @param origin                   storage for one of: kTopLeft_GrSurfaceOrigin,
607                                         kBottomLeft_GrSurfaceOrigin; or nullptr
608         @return                         back-end API texture handle, or nullptr
609     */
610     GrBackendObject getTextureHandle(bool flushPendingGrContextIO,
611                                      GrSurfaceOrigin* origin = nullptr) const;
612 
613     /** \enum SkImage::CachingHint
614         CachingHint selects whether Skia may internally cache SkBitmap generated by
615         decoding SkImage, or by copying SkImage from GPU to CPU. The default behavior
616         allows caching SkBitmap.
617 
618         Choose kDisallow_CachingHint if SkImage pixels are to be used only once, or
619         if SkImage pixels reside in a cache outside of Skia, or to reduce memory pressure.
620 
621         Choosing kAllow_CachingHint does not ensure that pixels will be cached.
622         SkImage pixels may not be cached if memory requirements are too large or
623         pixels are not accessible.
624     */
625     enum CachingHint {
626         kAllow_CachingHint,    //!< Allows Skia to internally cache decoded and copied pixels.
627 
628         /** Disallows Skia from internally caching decoded and copied pixels. */
629         kDisallow_CachingHint,
630     };
631 
632     /** Copies SkRect of pixels from SkImage to dstPixels. Copy starts at offset (srcX, srcY),
633         and does not exceed SkImage (width(), height()).
634 
635         dstInfo specifies width, height, SkColorType, SkAlphaType, and SkColorSpace of
636         destination. dstRowBytes specifics the gap from one destination row to the next.
637         Returns true if pixels are copied. Returns false if:
638         - dstInfo.addr() equals nullptr
639         - dstRowBytes is less than dstInfo.minRowBytes()
640         - SkPixelRef is nullptr
641 
642         Pixels are copied only if pixel conversion is possible. If SkImage SkColorType is
643         kGray_8_SkColorType, or kAlpha_8_SkColorType; dstInfo.colorType() must match.
644         If SkImage SkColorType is kGray_8_SkColorType, dstInfo.colorSpace() must match.
645         If SkImage SkAlphaType is kOpaque_SkAlphaType, dstInfo.alphaType() must
646         match. If SkImage SkColorSpace is nullptr, dstInfo.colorSpace() must match. Returns
647         false if pixel conversion is not possible.
648 
649         srcX and srcY may be negative to copy only top or left of source. Returns
650         false if width() or height() is zero or negative.
651         Returns false if abs(srcX) >= Image width(), or if abs(srcY) >= Image height().
652 
653         If cachingHint is kAllow_CachingHint, pixels may be retained locally.
654         If cachingHint is kDisallow_CachingHint, pixels are not added to the local cache.
655 
656         @param dstInfo      destination width, height, SkColorType, SkAlphaType, SkColorSpace
657         @param dstPixels    destination pixel storage
658         @param dstRowBytes  destination row length
659         @param srcX         column index whose absolute value is less than width()
660         @param srcY         row index whose absolute value is less than height()
661         @param cachingHint  one of: kAllow_CachingHint, kDisallow_CachingHint
662         @return             true if pixels are copied to dstPixels
663     */
664     bool readPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRowBytes,
665                     int srcX, int srcY, CachingHint cachingHint = kAllow_CachingHint) const;
666 
667     /** Copies a SkRect of pixels from SkImage to dst. Copy starts at (srcX, srcY), and
668         does not exceed SkImage (width(), height()).
669 
670         dst specifies width, height, SkColorType, SkAlphaType, SkColorSpace, pixel storage,
671         and row bytes of destination. dst.rowBytes() specifics the gap from one destination
672         row to the next. Returns true if pixels are copied. Returns false if:
673         - dst pixel storage equals nullptr
674         - dst.rowBytes is less than SkImageInfo::minRowBytes
675         - SkPixelRef is nullptr
676 
677         Pixels are copied only if pixel conversion is possible. If SkImage SkColorType is
678         kGray_8_SkColorType, or kAlpha_8_SkColorType; dst.colorType() must match.
679         If SkImage SkColorType is kGray_8_SkColorType, dst.colorSpace() must match.
680         If SkImage SkAlphaType is kOpaque_SkAlphaType, dst.alphaType() must
681         match. If SkImage SkColorSpace is nullptr, dst.colorSpace() must match. Returns
682         false if pixel conversion is not possible.
683 
684         srcX and srcY may be negative to copy only top or left of source. Returns
685         false if width() or height() is zero or negative.
686         Returns false if abs(srcX) >= Image width(), or if abs(srcY) >= Image height().
687 
688         If cachingHint is kAllow_CachingHint, pixels may be retained locally.
689         If cachingHint is kDisallow_CachingHint, pixels are not added to the local cache.
690 
691         @param dst          destination SkPixmap: SkImageInfo, pixels, row bytes
692         @param srcX         column index whose absolute value is less than width()
693         @param srcY         row index whose absolute value is less than height()
694         @param cachingHint  one of: kAllow_CachingHint, kDisallow_CachingHint
695         @return             true if pixels are copied to dst
696     */
697     bool readPixels(const SkPixmap& dst, int srcX, int srcY,
698                     CachingHint cachingHint = kAllow_CachingHint) const;
699 
700     /** Copies SkImage to dst, scaling pixels to fit dst.width() and dst.height(), and
701         converting pixels to match dst.colorType() and dst.alphaType(). Returns true if
702         pixels are copied. Returns false if dst.addr() is nullptr, or dst.rowBytes() is
703         less than dst SkImageInfo::minRowBytes.
704 
705         Pixels are copied only if pixel conversion is possible. If SkImage SkColorType is
706         kGray_8_SkColorType, or kAlpha_8_SkColorType; dst.colorType() must match.
707         If SkImage SkColorType is kGray_8_SkColorType, dst.colorSpace() must match.
708         If SkImage SkAlphaType is kOpaque_SkAlphaType, dst.alphaType() must
709         match. If SkImage SkColorSpace is nullptr, dst.colorSpace() must match. Returns
710         false if pixel conversion is not possible.
711 
712         Scales the image, with filterQuality, to match dst.width() and dst.height().
713         filterQuality kNone_SkFilterQuality is fastest, typically implemented with
714         nearest neighbor filter. kLow_SkFilterQuality is typically implemented with
715         bilerp filter. kMedium_SkFilterQuality is typically implemented with
716         bilerp filter, and Filter_Quality_MipMap when size is reduced.
717         kHigh_SkFilterQuality is slowest, typically implemented with Filter_Quality_BiCubic.
718 
719         If cachingHint is kAllow_CachingHint, pixels may be retained locally.
720         If cachingHint is kDisallow_CachingHint, pixels are not added to the local cache.
721 
722         @param dst            destination SkPixmap: SkImageInfo, pixels, row bytes
723         @param filterQuality  one of: kNone_SkFilterQuality, kLow_SkFilterQuality,
724                               kMedium_SkFilterQuality, kHigh_SkFilterQuality
725         @param cachingHint    one of: kAllow_CachingHint, kDisallow_CachingHint
726         @return               true if pixels are scaled to fit dst
727     */
728     bool scalePixels(const SkPixmap& dst, SkFilterQuality filterQuality,
729                      CachingHint cachingHint = kAllow_CachingHint) const;
730 
731     /** Encodes SkImage pixels, returning result as SkData.
732 
733         Returns nullptr if encoding fails, or if encodedImageFormat is not supported.
734 
735         SkImage encoding in a format requires both building with one or more of:
736         SK_HAS_JPEG_LIBRARY, SK_HAS_PNG_LIBRARY, SK_HAS_WEBP_LIBRARY; and platform support
737         for the encoded format.
738 
739         If SK_BUILD_FOR_MAC or SK_BUILD_FOR_IOS is defined, encodedImageFormat can
740         additionally be one of: SkEncodedImageFormat::kICO, SkEncodedImageFormat::kBMP,
741         SkEncodedImageFormat::kGIF.
742 
743         quality is a platform and format specific metric trading off size and encoding
744         error. When used, quality equaling 100 encodes with the least error. quality may
745         be ignored by the encoder.
746 
747         @param encodedImageFormat  one of: SkEncodedImageFormat::kJPEG, SkEncodedImageFormat::kPNG,
748                                    SkEncodedImageFormat::kWEBP
749         @param quality             encoder specific metric with 100 equaling best
750         @return                    encoded SkImage, or nullptr
751     */
752     sk_sp<SkData> encodeToData(SkEncodedImageFormat encodedImageFormat, int quality) const;
753 
754     /** Encodes SkImage pixels, returning result as SkData. Returns existing encoded data
755         if present; otherwise, SkImage is encoded with SkEncodedImageFormat::kPNG. Skia
756         must be built with SK_HAS_PNG_LIBRARY to encode SkImage.
757 
758         Returns nullptr if existing encoded data is missing or invalid, and
759         encoding fails.
760 
761         @return  encoded SkImage, or nullptr
762     */
763     sk_sp<SkData> encodeToData() const;
764 
765     /** Returns encoded SkImage pixels as SkData, if SkImage was created from supported
766         encoded stream format. Platform support for formats vary and may require building
767         with one or more of: SK_HAS_JPEG_LIBRARY, SK_HAS_PNG_LIBRARY, SK_HAS_WEBP_LIBRARY.
768 
769         Returns nullptr if SkImage contents are not encoded.
770 
771         @return  encoded SkImage, or nullptr
772     */
773     sk_sp<SkData> refEncodedData() const;
774 
775     /** Appends SkImage description to string, including unique ID, width, height, and
776         whether the image is opaque.
777 
778         @param string  storage for description; existing content is preserved
779         @return        string appended with SkImage description
780     */
781     const char* toString(SkString* string) const;
782 
783     /** Returns subset of SkImage. subset must be fully contained by SkImage dimensions().
784         The implementation may share pixels, or may copy them.
785 
786         Returns nullptr if subset is empty, or subset is not contained by bounds, or
787         pixels in SkImage could not be read or copied.
788 
789         @param subset  bounds of returned SkImage
790         @return        partial or full SkImage, or nullptr
791     */
792     sk_sp<SkImage> makeSubset(const SkIRect& subset) const;
793 
794     /** Returns SkImage backed by GPU texture associated with context. Returned SkImage is
795         compatible with SkSurface created with dstColorSpace. Returns original
796         SkImage if context and dstColorSpace match.
797 
798         Returns nullptr if context is nullptr, or if SkImage was created with another
799         GrContext.
800 
801         @param context        GPU context
802         @param dstColorSpace  range of colors of matching SkSurface on GPU
803         @return               created SkImage, or nullptr
804     */
805     sk_sp<SkImage> makeTextureImage(GrContext* context, SkColorSpace* dstColorSpace) const;
806 
807     /** Returns raster image or lazy image. Copies SkImage backed by GPU texture into
808         CPU memory if needed. Returns original SkImage if decoded in raster bitmap,
809         or if encoded in a stream.
810 
811         Returns nullptr if backed by GPU texture and copy fails.
812 
813         @return  raster image, lazy image, or nullptr
814     */
815     sk_sp<SkImage> makeNonTextureImage() const;
816 
817     /** Returns raster image. Copies SkImage backed by GPU texture into CPU memory,
818         or decodes SkImage from lazy image. Returns original SkImage if decoded in
819         raster bitmap.
820 
821         Returns nullptr if copy, decode, or pixel read fails.
822 
823         @return  raster image, or nullptr
824     */
825     sk_sp<SkImage> makeRasterImage() const;
826 
827     /** Creates filtered SkImage. filter processes original SkImage, potentially changing
828         color, position, and size. subset is the bounds of original SkImage processed
829         by filter. clipBounds is the expected bounds of the filtered SkImage. outSubset
830         is required storage for the actual bounds of the filtered SkImage. offset is
831         required storage for translation of returned SkImage.
832 
833         Returns nullptr if SkImage could not be created. If nullptr is returned, outSubset
834         and offset are undefined.
835 
836         Useful for animation of SkImageFilter that varies size from frame to frame.
837         Returned SkImage is created larger than required by filter so that GPU texture
838         can be reused with different sized effects. outSubset describes the valid bounds
839         of GPU texture returned. offset translates the returned SkImage to keep subsequent
840         animation frames aligned with respect to each other.
841 
842         @param filter      how SkImage is sampled when transformed
843         @param subset      bounds of SkImage processed by filter
844         @param clipBounds  expected bounds of filtered SkImage
845         @param outSubset   storage for returned SkImage bounds
846         @param offset      storage for returned SkImage translation
847         @return            filtered SkImage, or nullptr
848     */
849     sk_sp<SkImage> makeWithFilter(const SkImageFilter* filter, const SkIRect& subset,
850                                   const SkIRect& clipBounds, SkIRect* outSubset,
851                                   SkIPoint* offset) const;
852 
853     typedef std::function<void(GrBackendTexture)> BackendTextureReleaseProc;
854 
855     /** Creates a GrBackendTexture from the provided SkImage. Returns true and
856         stores result in backendTexture and backendTextureReleaseProc if
857         texture is created; otherwise, returns false and leaves
858         backendTexture and backendTextureReleaseProc unmodified.
859 
860         Call backendTextureReleaseProc after deleting backendTexture.
861         backendTextureReleaseProc cleans up auxiliary data related to returned
862         backendTexture. The caller must delete returned backendTexture after use.
863 
864         If SkImage is both texture backed and singly referenced, image is returned in
865         backendTexture without conversion or making a copy. SkImage is singly referenced
866         if its was transferred solely using std::move().
867 
868         If SkImage is not texture backed, returns texture with SkImage contents.
869 
870         @param context                    GPU context
871         @param image                      SkImage used for texture
872         @param backendTexture             storage for backend texture
873         @param backendTextureReleaseProc  storage for clean up function
874         @return                           true if backend texture was created
875     */
876     static bool MakeBackendTextureFromSkImage(GrContext* context,
877                                               sk_sp<SkImage> image,
878                                               GrBackendTexture* backendTexture,
879                                               BackendTextureReleaseProc* backendTextureReleaseProc);
880 
881     enum LegacyBitmapMode {
882         kRO_LegacyBitmapMode, //!< Returned bitmap is read-only and immutable.
883     };
884 
885     /** Creates raster SkBitmap with same pixels as SkImage. If legacyBitmapMode is
886         kRO_LegacyBitmapMode, returned bitmap is read-only and immutable.
887         Returns true if SkBitmap is stored in bitmap. Returns false and resets bitmap if
888         SkBitmap write did not succeed.
889 
890         @param bitmap            storage for legacy SkBitmap
891         @param legacyBitmapMode  to be deprecated
892         @return                  true if SkBitmap was created
893     */
894     bool asLegacyBitmap(SkBitmap* bitmap, LegacyBitmapMode legacyBitmapMode = kRO_LegacyBitmapMode) const;
895 
896     /** Returns true if SkImage is backed by an image-generator or other service that creates
897         and caches its pixels or texture on-demand.
898 
899         @return  true if SkImage is created as needed
900     */
901     bool isLazyGenerated() const;
902 
903     /** Creates SkImage in target SkColorSpace.
904         Returns nullptr if SkImage could not be created.
905 
906         Returns original SkImage if it is in target SkColorSpace.
907         Otherwise, converts pixels from SkImage SkColorSpace to target SkColorSpace.
908         If SkImage colorSpace() returns nullptr, SkImage SkColorSpace is assumed to be sRGB.
909 
910         SkTransferFunctionBehavior is to be deprecated.
911 
912         Set premulBehavior to SkTransferFunctionBehavior::kRespect to convert SkImage
913         pixels to a linear space, before converting to destination SkColorType
914         and SkColorSpace.
915 
916         Set premulBehavior to SkTransferFunctionBehavior::kIgnore to treat SkImage
917         pixels as linear, when converting to destination SkColorType
918         and SkColorSpace, ignoring pixel encoding.
919 
920         @param target          SkColorSpace describing color range of returned SkImage
921         @param premulBehavior  one of: SkTransferFunctionBehavior::kRespect,
922                                SkTransferFunctionBehavior::kIgnore
923         @return                created SkImage in target SkColorSpace
924     */
925     sk_sp<SkImage> makeColorSpace(sk_sp<SkColorSpace> target,
926                                   SkTransferFunctionBehavior premulBehavior) const;
927 
928 private:
929     SkImage(int width, int height, uint32_t uniqueID);
930     friend class SkImage_Base;
931 
932     const int       fWidth;
933     const int       fHeight;
934     const uint32_t  fUniqueID;
935 
936     typedef SkRefCnt INHERITED;
937 };
938 
939 #endif
940