blob: 9285fd49b1deb5c0773f16368daf20ca60de6e66 [file] [log] [blame]
Cary Clarka560c472017-11-27 10:44:06 -05001#Topic Image
Cary Clark137b8742018-05-30 09:21:49 -04002#Alias Image_Reference ##
Cary Clarka560c472017-11-27 10:44:06 -05003
4#Class SkImage
5
Cary Clark61313f32018-10-08 14:57:48 -04006#Code
7#Populate
8##
9
Cary Clark61ca7c52018-01-02 11:34:14 -050010Image describes a two dimensional array of pixels to draw. The pixels may be
Cary Clark4855f782018-02-06 09:41:53 -050011decoded in a Raster_Bitmap, encoded in a Picture or compressed data stream,
Cary Clark61ca7c52018-01-02 11:34:14 -050012or located in GPU memory as a GPU_Texture.
13
14Image cannot be modified after it is created. Image may allocate additional
15storage as needed; for instance, an encoded Image may decode when drawn.
16
17Image width and height are greater than zero. Creating an Image with zero width
18or height returns Image equal to nullptr.
19
20Image may be created from Bitmap, Pixmap, Surface, Picture, encoded streams,
21GPU_Texture, YUV_ColorSpace data, or hardware buffer. Encoded streams supported
Cary Clark4855f782018-02-06 09:41:53 -050022include BMP, GIF, HEIF, ICO, JPEG, PNG, WBMP, WebP. Supported encoding details
Cary Clark61ca7c52018-01-02 11:34:14 -050023vary with platform.
24
Cary Clark08895c42018-02-01 09:37:32 -050025#Subtopic Raster_Image
Cary Clark137b8742018-05-30 09:21:49 -040026#Alias Raster_Image ##
Cary Clark4855f782018-02-06 09:41:53 -050027#Line # pixels decoded in Raster_Bitmap ##
28Raster_Image pixels are decoded in a Raster_Bitmap. These pixels may be read
Cary Clark61ca7c52018-01-02 11:34:14 -050029directly and in most cases written to, although edited pixels may not be drawn
30if Image has been copied internally.
31##
32
Cary Clark08895c42018-02-01 09:37:32 -050033#Subtopic Texture_Image
34#Line # pixels located on GPU ##
Cary Clark61ca7c52018-01-02 11:34:14 -050035Texture_Image are located on GPU and pixels are not accessible. Texture_Image
36are allocated optimally for best performance. Raster_Image may
37be drawn to GPU_Surface, but pixels are uploaded from CPU to GPU downgrading
38performance.
39##
40
Cary Clark08895c42018-02-01 09:37:32 -050041#Subtopic Lazy_Image
42#Line # deferred pixel buffer ##
Cary Clark61ca7c52018-01-02 11:34:14 -050043Lazy_Image defer allocating buffer for Image pixels and decoding stream until
44Image is drawn. Lazy_Image caches result if possible to speed up repeated
45drawing.
46##
Cary Clarka560c472017-11-27 10:44:06 -050047
Cary Clarka560c472017-11-27 10:44:06 -050048# ------------------------------------------------------------------------------
49
50#Method static sk_sp<SkImage> MakeRasterCopy(const SkPixmap& pixmap)
Cary Clark61313f32018-10-08 14:57:48 -040051#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -050052#Line # creates Image from Pixmap and copied pixels ##
Cary Clark2f466242017-12-11 16:03:17 -050053Creates Image from Pixmap and copy of pixels. Since pixels are copied, Pixmap
54pixels may be modified or deleted without affecting Image.
Cary Clarka560c472017-11-27 10:44:06 -050055
Cary Clark3cd22cc2017-12-01 11:49:58 -050056Image is returned if Pixmap is valid. Valid Pixmap parameters include:
57dimensions are greater than zero;
58each dimension fits in 29 bits;
59Color_Type and Alpha_Type are valid, and Color_Type is not kUnknown_SkColorType;
60row bytes are large enough to hold one row of pixels;
61pixel address is not nullptr.
62
63#Param pixmap Image_Info, pixel address, and row bytes ##
64
65#Return copy of Pixmap pixels, or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -050066
67#Example
Cary Clark2f466242017-12-11 16:03:17 -050068#Height 50
69#Description
70Draw a five by five bitmap, and draw a copy in an Image. Editing the pixmap
71alters the bitmap draw, but does not alter the Image draw since the Image
72contains a copy of the pixels.
73##
74 uint8_t storage[][5] = {{ 0xCA, 0xDA, 0xCA, 0xC9, 0xA3 },
75 { 0xAC, 0xA8, 0x89, 0xA7, 0x87 },
76 { 0x9B, 0xB5, 0xE5, 0x95, 0x46 },
77 { 0x90, 0x81, 0xC5, 0x71, 0x33 },
78 { 0x75, 0x55, 0x44, 0x40, 0x30 }};
79 SkImageInfo imageInfo = SkImageInfo::Make(5, 5, kGray_8_SkColorType, kOpaque_SkAlphaType);
80 SkPixmap pixmap(imageInfo, storage[0], sizeof(storage) / 5);
81 SkBitmap bitmap;
82 bitmap.installPixels(pixmap);
83 sk_sp<SkImage> image = SkImage::MakeRasterCopy(pixmap);
84 *pixmap.writable_addr8(2, 2) = 0x00;
85 canvas->scale(10, 10);
86 canvas->drawBitmap(bitmap, 0, 0);
87 canvas->drawImage(image, 10, 0);
Cary Clarka560c472017-11-27 10:44:06 -050088##
89
Cary Clark3cd22cc2017-12-01 11:49:58 -050090#SeeAlso MakeRasterData MakeFromGenerator
Cary Clarka560c472017-11-27 10:44:06 -050091
92#Method ##
93
94# ------------------------------------------------------------------------------
95
Cary Clarkcc45cc72018-05-15 16:06:12 -040096#Method static sk_sp<SkImage> MakeRasterData(const SkImageInfo& info, sk_sp<SkData> pixels, size_t rowBytes)
Cary Clark61313f32018-10-08 14:57:48 -040097#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -050098#Line # creates Image from Image_Info and shared pixels ##
Cary Clark3cd22cc2017-12-01 11:49:58 -050099Creates Image from Image_Info, sharing pixels.
Cary Clarka560c472017-11-27 10:44:06 -0500100
Cary Clark3cd22cc2017-12-01 11:49:58 -0500101Image is returned if Image_Info is valid. Valid Image_Info parameters include:
102dimensions are greater than zero;
103each dimension fits in 29 bits;
104Color_Type and Alpha_Type are valid, and Color_Type is not kUnknown_SkColorType;
105rowBytes are large enough to hold one row of pixels;
106pixels is not nullptr, and contains enough data for Image.
107
108#Param info contains width, height, Alpha_Type, Color_Type, Color_Space ##
109#Param pixels address or pixel storage ##
110#Param rowBytes size of pixel row or larger ##
111
112#Return Image sharing pixels, or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -0500113
114#Example
Cary Clark0c5f5462017-12-15 11:21:51 -0500115#Image 3
116 size_t rowBytes = image->width() * SkColorTypeBytesPerPixel(kRGBA_8888_SkColorType);
117 sk_sp<SkData> data = SkData::MakeUninitialized(rowBytes * image->height());
Cary Clark682c58d2018-05-16 07:07:07 -0400118 SkImageInfo dstInfo = SkImageInfo::MakeN32(image->width(), image->height(),
Cary Clark0c5f5462017-12-15 11:21:51 -0500119 kPremul_SkAlphaType);
120 image->readPixels(dstInfo, data->writable_data(), rowBytes, 0, 0, SkImage::kAllow_CachingHint);
121 sk_sp<SkImage> raw = SkImage::MakeRasterData(dstInfo.makeColorType(kRGBA_8888_SkColorType),
122 data, rowBytes);
123 canvas->drawImage(image, 0, 0);
124 canvas->drawImage(raw.get(), 128, 0);
Cary Clarka560c472017-11-27 10:44:06 -0500125##
126
Cary Clark3cd22cc2017-12-01 11:49:58 -0500127#SeeAlso MakeRasterCopy MakeFromGenerator
Cary Clarka560c472017-11-27 10:44:06 -0500128
129#Method ##
130
131# ------------------------------------------------------------------------------
132
Cary Clark3cd22cc2017-12-01 11:49:58 -0500133#Typedef void* ReleaseContext
Cary Clark682c58d2018-05-16 07:07:07 -0400134#Line # parameter type for MakeFromRaster ##
Cary Clarkffb3d682018-05-17 12:17:28 -0400135
136#Code
Cary Clarka90ea222018-10-16 10:30:28 -0400137#Populate
Cary Clarkffb3d682018-05-17 12:17:28 -0400138##
139
Cary Clark3cd22cc2017-12-01 11:49:58 -0500140Caller data passed to RasterReleaseProc; may be nullptr.
141
142#SeeAlso MakeFromRaster RasterReleaseProc
143
144##
145
Cary Clarka560c472017-11-27 10:44:06 -0500146#Typedef void (*RasterReleaseProc)(const void* pixels, ReleaseContext)
Cary Clark682c58d2018-05-16 07:07:07 -0400147#Line # parameter type for MakeFromRaster ##
Cary Clarkffb3d682018-05-17 12:17:28 -0400148
149#Code
Cary Clarka90ea222018-10-16 10:30:28 -0400150#Populate
Cary Clarkffb3d682018-05-17 12:17:28 -0400151##
152
Cary Clark3cd22cc2017-12-01 11:49:58 -0500153Function called when Image no longer shares pixels. ReleaseContext is
Cary Clark682c58d2018-05-16 07:07:07 -0400154provided by caller when Image is created, and may be nullptr.
Cary Clark3cd22cc2017-12-01 11:49:58 -0500155
156#SeeAlso ReleaseContext MakeFromRaster
157
Cary Clarka560c472017-11-27 10:44:06 -0500158##
159
160#Method static sk_sp<SkImage> MakeFromRaster(const SkPixmap& pixmap,
161 RasterReleaseProc rasterReleaseProc,
162 ReleaseContext releaseContext)
Cary Clark61313f32018-10-08 14:57:48 -0400163#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -0500164#Line # creates Image from Pixmap, with release ##
Cary Clarka560c472017-11-27 10:44:06 -0500165
Cary Clark0c5f5462017-12-15 11:21:51 -0500166Creates Image from pixmap, sharing Pixmap pixels. Pixels must remain valid and
Cary Clark3cd22cc2017-12-01 11:49:58 -0500167unchanged until rasterReleaseProc is called. rasterReleaseProc is passed
168releaseContext when Image is deleted or no longer refers to pixmap pixels.
Cary Clarka560c472017-11-27 10:44:06 -0500169
Cary Clark0c5f5462017-12-15 11:21:51 -0500170Pass nullptr for rasterReleaseProc to share Pixmap without requiring a callback
171when Image is released. Pass nullptr for releaseContext if rasterReleaseProc
172does not require state.
173
Cary Clark3cd22cc2017-12-01 11:49:58 -0500174Image is returned if pixmap is valid. Valid Pixmap parameters include:
175dimensions are greater than zero;
176each dimension fits in 29 bits;
177Color_Type and Alpha_Type are valid, and Color_Type is not kUnknown_SkColorType;
178row bytes are large enough to hold one row of pixels;
179pixel address is not nullptr.
180
181#Param pixmap Image_Info, pixel address, and row bytes ##
Cary Clark0c5f5462017-12-15 11:21:51 -0500182#Param rasterReleaseProc function called when pixels can be released; or nullptr ##
183#Param releaseContext state passed to rasterReleaseProc; or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -0500184
Cary Clark0c5f5462017-12-15 11:21:51 -0500185#Return Image sharing pixmap ##
Cary Clarka560c472017-11-27 10:44:06 -0500186
187#Example
Cary Clark0c5f5462017-12-15 11:21:51 -0500188#Function
189static void releaseProc(const void* pixels, SkImage::ReleaseContext context) {
190 int* countPtr = static_cast<int*>(context);
191 *countPtr += 1;
192}
193##
194
195void draw(SkCanvas* canvas) {
196 SkColor color = 0;
197 SkPixmap pixmap(SkImageInfo::MakeN32(1, 1, kPremul_SkAlphaType), &color, 4);
198 int releaseCount = 0;
199 sk_sp<SkImage> image(SkImage::MakeFromRaster(pixmap, releaseProc, &releaseCount));
200 SkDebugf("before reset: %d\n", releaseCount);
201 image.reset();
202 SkDebugf("after reset: %d\n", releaseCount);
203}
204#StdOut
205before reset: 0
206after reset: 1
207##
Cary Clarka560c472017-11-27 10:44:06 -0500208##
209
Cary Clark3cd22cc2017-12-01 11:49:58 -0500210#SeeAlso MakeRasterCopy MakeRasterData MakeFromGenerator RasterReleaseProc ReleaseContext
Cary Clarka560c472017-11-27 10:44:06 -0500211
212#Method ##
213
214# ------------------------------------------------------------------------------
215
216#Method static sk_sp<SkImage> MakeFromBitmap(const SkBitmap& bitmap)
Cary Clark61313f32018-10-08 14:57:48 -0400217#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -0500218#Line # creates Image from Bitmap, sharing or copying pixels ##
Cary Clark682c58d2018-05-16 07:07:07 -0400219Creates Image from bitmap, sharing or copying bitmap pixels. If the bitmap
Cary Clark3cd22cc2017-12-01 11:49:58 -0500220is marked immutable, and its pixel memory is shareable, it may be shared
221instead of copied.
Cary Clarka560c472017-11-27 10:44:06 -0500222
Cary Clark3cd22cc2017-12-01 11:49:58 -0500223Image is returned if bitmap is valid. Valid Bitmap parameters include:
224dimensions are greater than zero;
225each dimension fits in 29 bits;
226Color_Type and Alpha_Type are valid, and Color_Type is not kUnknown_SkColorType;
227row bytes are large enough to hold one row of pixels;
228pixel address is not nullptr.
Cary Clarka560c472017-11-27 10:44:06 -0500229
Cary Clark3cd22cc2017-12-01 11:49:58 -0500230#Param bitmap Image_Info, row bytes, and pixels ##
231
232#Return created Image, or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -0500233
234#Example
Cary Clark0c5f5462017-12-15 11:21:51 -0500235#Description
236The first Bitmap is shared; writing to the pixel memory changes the first
237Image.
238The second Bitmap is marked immutable, and is copied; writing to the pixel
239memory does not alter the second Image.
240##
241#Height 50
242 uint8_t storage[][5] = {{ 0xCA, 0xDA, 0xCA, 0xC9, 0xA3 },
243 { 0xAC, 0xA8, 0x89, 0xA7, 0x87 },
244 { 0x9B, 0xB5, 0xE5, 0x95, 0x46 },
245 { 0x90, 0x81, 0xC5, 0x71, 0x33 },
246 { 0x75, 0x55, 0x44, 0x40, 0x30 }};
247 SkImageInfo imageInfo = SkImageInfo::Make(5, 5, kGray_8_SkColorType, kOpaque_SkAlphaType);
248 SkPixmap pixmap(imageInfo, storage[0], sizeof(storage) / 5);
249 SkBitmap bitmap;
250 bitmap.installPixels(pixmap);
251 sk_sp<SkImage> image1 = SkImage::MakeFromBitmap(bitmap);
252 bitmap.setImmutable();
253 sk_sp<SkImage> image2 = SkImage::MakeFromBitmap(bitmap);
254 *pixmap.writable_addr8(2, 2) = 0x00;
255 canvas->scale(10, 10);
256 canvas->drawImage(image1, 0, 0);
257 canvas->drawImage(image2, 10, 0);
Cary Clarka560c472017-11-27 10:44:06 -0500258##
259
Cary Clark3cd22cc2017-12-01 11:49:58 -0500260#SeeAlso MakeFromRaster MakeRasterCopy MakeFromGenerator MakeRasterData
Cary Clarka560c472017-11-27 10:44:06 -0500261
262#Method ##
263
264# ------------------------------------------------------------------------------
265
266#Method static sk_sp<SkImage> MakeFromGenerator(std::unique_ptr<SkImageGenerator> imageGenerator,
267 const SkIRect* subset = nullptr)
Cary Clark61313f32018-10-08 14:57:48 -0400268#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -0500269#Line # creates Image from a stream of data ##
Cary Clarka560c472017-11-27 10:44:06 -0500270
Cary Clark0c5f5462017-12-15 11:21:51 -0500271Creates Image from data returned by imageGenerator. Generated data is owned by Image and may not
272be shared or accessed.
Cary Clarka560c472017-11-27 10:44:06 -0500273
Cary Clark0c5f5462017-12-15 11:21:51 -0500274subset allows selecting a portion of the full image. Pass nullptr to select the entire image;
275otherwise, subset must be contained by image bounds.
276
277Image is returned if generator data is valid. Valid data parameters vary by type of data
278and platform.
Cary Clarka560c472017-11-27 10:44:06 -0500279
Cary Clark3cd22cc2017-12-01 11:49:58 -0500280imageGenerator may wrap Picture data, codec data, or custom data.
281
282#Param imageGenerator stock or custom routines to retrieve Image ##
283#Param subset bounds of returned Image; may be nullptr ##
284
285#Return created Image, or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -0500286
287#Example
Cary Clarkac47b882018-01-11 10:35:44 -0500288#Height 128
Cary Clark0c5f5462017-12-15 11:21:51 -0500289#Description
290The generator returning Picture cannot be shared; std::move transfers ownership to generated Image.
291##
292 SkPictureRecorder recorder;
293 recorder.beginRecording(100, 100)->drawColor(SK_ColorRED);
294 auto picture = recorder.finishRecordingAsPicture();
295 auto gen = SkImageGenerator::MakeFromPicture({100, 100}, picture, nullptr, nullptr,
296 SkImage::BitDepth::kU8, SkColorSpace::MakeSRGB());
297 sk_sp<SkImage> image = SkImage::MakeFromGenerator(std::move(gen));
298 canvas->drawImage(image, 0, 0);
Cary Clarka560c472017-11-27 10:44:06 -0500299##
300
Cary Clark3cd22cc2017-12-01 11:49:58 -0500301#SeeAlso MakeFromEncoded
Cary Clarka560c472017-11-27 10:44:06 -0500302
303#Method ##
304
305# ------------------------------------------------------------------------------
306
307#Method static sk_sp<SkImage> MakeFromEncoded(sk_sp<SkData> encoded, const SkIRect* subset = nullptr)
Cary Clark61313f32018-10-08 14:57:48 -0400308#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -0500309#Line # creates Image from encoded data ##
Cary Clark682c58d2018-05-16 07:07:07 -0400310Creates Image from encoded data.
Cary Clark0c5f5462017-12-15 11:21:51 -0500311subset allows selecting a portion of the full image. Pass nullptr to select the entire image;
312otherwise, subset must be contained by image bounds.
Cary Clarka560c472017-11-27 10:44:06 -0500313
Cary Clark3cd22cc2017-12-01 11:49:58 -0500314Image is returned if format of the encoded data is recognized and supported.
Cary Clark4855f782018-02-06 09:41:53 -0500315Recognized formats vary by platform.
Cary Clarka560c472017-11-27 10:44:06 -0500316
Cary Clark3cd22cc2017-12-01 11:49:58 -0500317#Param encoded data of Image to decode ##
318#Param subset bounds of returned Image; may be nullptr ##
319
320#Return created Image, or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -0500321
Cary Clark61ca7c52018-01-02 11:34:14 -0500322#Example
323#Image 3
324int x = 0;
325for (int quality : { 100, 50, 10, 1} ) {
326 sk_sp<SkData> encodedData = image->encodeToData(SkEncodedImageFormat::kJPEG, quality);
327 sk_sp<SkImage> image = SkImage::MakeFromEncoded(encodedData);
328 canvas->drawImage(image, x, 0);
329 x += 64;
330}
Cary Clarka560c472017-11-27 10:44:06 -0500331##
332
Cary Clark3cd22cc2017-12-01 11:49:58 -0500333#SeeAlso MakeFromGenerator
Cary Clarka560c472017-11-27 10:44:06 -0500334
335#Method ##
336
337# ------------------------------------------------------------------------------
338
339#Typedef void (*TextureReleaseProc)(ReleaseContext releaseContext)
Cary Clark682c58d2018-05-16 07:07:07 -0400340#Line # parameter type for MakeFromTexture ##
Cary Clarkffb3d682018-05-17 12:17:28 -0400341
342#Code
Cary Clarka90ea222018-10-16 10:30:28 -0400343#Populate
Cary Clarkffb3d682018-05-17 12:17:28 -0400344##
345
Cary Clark682c58d2018-05-16 07:07:07 -0400346User function called when supplied texture may be deleted.
347#SeeAlso MakeFromTexture
Cary Clarka560c472017-11-27 10:44:06 -0500348##
349
350#Method static sk_sp<SkImage> MakeFromTexture(GrContext* context,
351 const GrBackendTexture& backendTexture,
352 GrSurfaceOrigin origin,
Cary Clark61ca7c52018-01-02 11:34:14 -0500353 SkColorType colorType,
354 SkAlphaType alphaType,
355 sk_sp<SkColorSpace> colorSpace)
Cary Clark61313f32018-10-08 14:57:48 -0400356#In Constructors
Cary Clarkf895a422018-02-27 09:54:21 -0500357#Line # creates Image from GPU_Texture ##
Cary Clark61ca7c52018-01-02 11:34:14 -0500358Creates Image from GPU_Texture associated with context. Caller is responsible for
359managing the lifetime of GPU_Texture.
360
361Image is returned if format of backendTexture is recognized and supported.
362Recognized formats vary by GPU back-end.
363
364#Param context GPU_Context ##
365#Param backendTexture texture residing on GPU ##
366#Param origin one of: kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin ##
Cary Clark1a8d7622018-03-05 13:26:16 -0500367#Param colorType one of: #list_of_color_types#
Cary Clark61ca7c52018-01-02 11:34:14 -0500368##
Cary Clark681287e2018-03-16 11:34:15 -0400369#Param alphaType one of: #list_of_alpha_types#
Cary Clark61ca7c52018-01-02 11:34:14 -0500370##
371#Param colorSpace range of colors; may be nullptr ##
Cary Clark3cd22cc2017-12-01 11:49:58 -0500372
373#Return created Image, or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -0500374
375#Example
Cary Clark0c5f5462017-12-15 11:21:51 -0500376#Image 3
377#Platform gpu
378#Height 128
379#Description
380A back-end texture has been created and uploaded to the GPU outside of this example.
381##
382GrContext* context = canvas->getGrContext();
383if (!context) {
384 return;
385}
386canvas->scale(.25f, .25f);
387int x = 0;
388for (auto origin : { kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin } ) {
Cary Clarkac47b882018-01-11 10:35:44 -0500389 sk_sp<SkImage> image = SkImage::MakeFromTexture(context, backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -0400390 origin, kRGBA_8888_SkColorType, kOpaque_SkAlphaType, nullptr);
Cary Clark0c5f5462017-12-15 11:21:51 -0500391 canvas->drawImage(image, x, 0);
392x += 512;
393}
Cary Clarka560c472017-11-27 10:44:06 -0500394##
395
Cary Clark3cd22cc2017-12-01 11:49:58 -0500396#SeeAlso MakeFromAdoptedTexture SkSurface::MakeFromBackendTexture
Cary Clarka560c472017-11-27 10:44:06 -0500397
398#Method ##
399
400# ------------------------------------------------------------------------------
401
402#Method static sk_sp<SkImage> MakeFromTexture(GrContext* context,
403 const GrBackendTexture& backendTexture,
404 GrSurfaceOrigin origin,
Cary Clark61ca7c52018-01-02 11:34:14 -0500405 SkColorType colorType,
Cary Clarka560c472017-11-27 10:44:06 -0500406 SkAlphaType alphaType,
407 sk_sp<SkColorSpace> colorSpace,
408 TextureReleaseProc textureReleaseProc,
409 ReleaseContext releaseContext)
410
Cary Clark61ca7c52018-01-02 11:34:14 -0500411Creates Image from GPU_Texture associated with context. GPU_Texture must stay
Cary Clark3cd22cc2017-12-01 11:49:58 -0500412valid and unchanged until textureReleaseProc is called. textureReleaseProc is
413passed releaseContext when Image is deleted or no longer refers to texture.
Cary Clarka560c472017-11-27 10:44:06 -0500414
Cary Clark3cd22cc2017-12-01 11:49:58 -0500415Image is returned if format of backendTexture is recognized and supported.
416Recognized formats vary by GPU back-end.
Cary Clarka560c472017-11-27 10:44:06 -0500417
Cary Clark3cd22cc2017-12-01 11:49:58 -0500418#Param context GPU_Context ##
419#Param backendTexture texture residing on GPU ##
420#Param origin one of: kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin ##
Cary Clark1a8d7622018-03-05 13:26:16 -0500421#Param colorType one of: #list_of_color_types#
Cary Clark61ca7c52018-01-02 11:34:14 -0500422##
Cary Clark681287e2018-03-16 11:34:15 -0400423#Param alphaType one of: #list_of_alpha_types#
Cary Clark3cd22cc2017-12-01 11:49:58 -0500424##
Cary Clark61ca7c52018-01-02 11:34:14 -0500425#Param colorSpace range of colors; may be nullptr ##
Cary Clark3cd22cc2017-12-01 11:49:58 -0500426#Param textureReleaseProc function called when texture can be released ##
427#Param releaseContext state passed to textureReleaseProc ##
428
429#Return created Image, or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -0500430
Cary Clark0c5f5462017-12-15 11:21:51 -0500431#ToDo
432This doesn't do anything clever with TextureReleaseProc because it may not get called
Cary Clark61ca7c52018-01-02 11:34:14 -0500433fwithin the lifetime of the example
Cary Clark0c5f5462017-12-15 11:21:51 -0500434##
435
Cary Clarka560c472017-11-27 10:44:06 -0500436#Example
Cary Clarkac47b882018-01-11 10:35:44 -0500437#Platform gpu
438#Image 4
Cary Clark0c5f5462017-12-15 11:21:51 -0500439GrContext* context = canvas->getGrContext();
440if (!context) {
441 return;
442}
Cary Clarkac47b882018-01-11 10:35:44 -0500443auto debugster = [](SkImage::ReleaseContext releaseContext) -> void {
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400444 // broken
Cary Clark08417bc2018-10-03 10:44:13 -0400445 // *((int *) releaseContext) += 128;
Cary Clark0c5f5462017-12-15 11:21:51 -0500446};
447int x = 0;
448for (auto origin : { kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin } ) {
Cary Clarkac47b882018-01-11 10:35:44 -0500449 sk_sp<SkImage> image = SkImage::MakeFromTexture(context, backEndTexture,
Cary Clark61ca7c52018-01-02 11:34:14 -0500450 origin, kRGBA_8888_SkColorType, kOpaque_SkAlphaType, nullptr, debugster, &x);
Cary Clark0c5f5462017-12-15 11:21:51 -0500451 canvas->drawImage(image, x, 0);
452 x += 128;
453}
Cary Clarka560c472017-11-27 10:44:06 -0500454##
455
Cary Clark3cd22cc2017-12-01 11:49:58 -0500456#SeeAlso MakeFromAdoptedTexture SkSurface::MakeFromBackendTexture
Cary Clarka560c472017-11-27 10:44:06 -0500457
458#Method ##
459
460# ------------------------------------------------------------------------------
461
462#Method static sk_sp<SkImage> MakeCrossContextFromEncoded(GrContext* context, sk_sp<SkData> data,
463 bool buildMips,
Brian Osman584b5012018-04-13 15:48:26 -0400464 SkColorSpace* dstColorSpace,
465 bool limitToMaxTextureSize = false)
Cary Clark61313f32018-10-08 14:57:48 -0400466#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -0500467#Line # creates Image from encoded data, and uploads to GPU ##
Cary Clarka560c472017-11-27 10:44:06 -0500468
Cary Clark682c58d2018-05-16 07:07:07 -0400469Creates Image from encoded data. Image is uploaded to GPU back-end using context.
Cary Clark3cd22cc2017-12-01 11:49:58 -0500470
471Created Image is available to other GPU contexts, and is available across thread
Cary Clark682c58d2018-05-16 07:07:07 -0400472boundaries. All contexts must be in the same GPU_Share_Group, or otherwise
Cary Clark3cd22cc2017-12-01 11:49:58 -0500473share resources.
474
475When Image is no longer referenced, context releases texture memory
Cary Clarka560c472017-11-27 10:44:06 -0500476asynchronously.
Cary Clarka560c472017-11-27 10:44:06 -0500477
Cary Clark3cd22cc2017-12-01 11:49:58 -0500478Texture decoded from data is uploaded to match Surface created with
479dstColorSpace. Color_Space of Image is determined by encoded data.
Cary Clarka560c472017-11-27 10:44:06 -0500480
Cary Clark3cd22cc2017-12-01 11:49:58 -0500481Image is returned if format of data is recognized and supported, and if context
482supports moving resources. Recognized formats vary by platform and GPU back-end.
483
Cary Clark61ca7c52018-01-02 11:34:14 -0500484Image is returned using MakeFromEncoded if context is nullptr or does not support
485moving resources between contexts.
486
Cary Clark3cd22cc2017-12-01 11:49:58 -0500487#Param context GPU_Context ##
488#Param data Image to decode ##
489#Param buildMips create Image as Mip_Map if true ##
490#Param dstColorSpace range of colors of matching Surface on GPU ##
Brian Osman584b5012018-04-13 15:48:26 -0400491#Param limitToMaxTextureSize downscale image to GPU maximum texture size, if necessary ##
Cary Clark3cd22cc2017-12-01 11:49:58 -0500492
493#Return created Image, or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -0500494
495#Example
Cary Clark61ca7c52018-01-02 11:34:14 -0500496#Image 4
Cary Clarkac47b882018-01-11 10:35:44 -0500497#Height 64
Cary Clark61ca7c52018-01-02 11:34:14 -0500498GrContext* context = canvas->getGrContext();
499sk_sp<SkData> encodedData = image->encodeToData(SkEncodedImageFormat::kJPEG, 100);
500sk_sp<SkImage> image = SkImage::MakeCrossContextFromEncoded(context,
501 encodedData, false, nullptr);
502canvas->drawImage(image, 0, 0);
Cary Clarka560c472017-11-27 10:44:06 -0500503##
504
Cary Clark3cd22cc2017-12-01 11:49:58 -0500505#SeeAlso MakeCrossContextFromPixmap
506
507#Method ##
508
509# ------------------------------------------------------------------------------
510
511#Method static sk_sp<SkImage> MakeCrossContextFromPixmap(GrContext* context, const SkPixmap& pixmap,
512 bool buildMips,
Brian Osman584b5012018-04-13 15:48:26 -0400513 SkColorSpace* dstColorSpace,
514 bool limitToMaxTextureSize = false)
Cary Clark61313f32018-10-08 14:57:48 -0400515#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -0500516#Line # creates Image from Pixmap, and uploads to GPU ##
Cary Clark3cd22cc2017-12-01 11:49:58 -0500517
Cary Clark682c58d2018-05-16 07:07:07 -0400518Creates Image from pixmap. Image is uploaded to GPU back-end using context.
Cary Clark3cd22cc2017-12-01 11:49:58 -0500519
520Created Image is available to other GPU contexts, and is available across thread
Cary Clark682c58d2018-05-16 07:07:07 -0400521boundaries. All contexts must be in the same GPU_Share_Group, or otherwise
Cary Clark3cd22cc2017-12-01 11:49:58 -0500522share resources.
523
524When Image is no longer referenced, context releases texture memory
525asynchronously.
526
527Texture created from pixmap is uploaded to match Surface created with
528dstColorSpace. Color_Space of Image is determined by pixmap.colorSpace().
529
Cary Clark682c58d2018-05-16 07:07:07 -0400530Image is returned referring to GPU back-end if context is not nullptr,
Cary Clark61ca7c52018-01-02 11:34:14 -0500531format of data is recognized and supported, and if context supports moving
532resources between contexts. Otherwise, pixmap pixel data is copied and Image
533as returned in raster format if possible; nullptr may be returned.
534Recognized GPU formats vary by platform and GPU back-end.
Cary Clark3cd22cc2017-12-01 11:49:58 -0500535
536#Param context GPU_Context ##
537#Param pixmap Image_Info, pixel address, and row bytes ##
538#Param buildMips create Image as Mip_Map if true ##
539#Param dstColorSpace range of colors of matching Surface on GPU ##
Brian Osman584b5012018-04-13 15:48:26 -0400540#Param limitToMaxTextureSize downscale image to GPU maximum texture size, if necessary ##
Cary Clark3cd22cc2017-12-01 11:49:58 -0500541
542#Return created Image, or nullptr ##
543
544#Example
Cary Clark61ca7c52018-01-02 11:34:14 -0500545#Image 4
Cary Clarkac47b882018-01-11 10:35:44 -0500546#Height 64
Cary Clark61ca7c52018-01-02 11:34:14 -0500547GrContext* context = canvas->getGrContext();
548SkPixmap pixmap;
549if (source.peekPixels(&pixmap)) {
550 sk_sp<SkImage> image = SkImage::MakeCrossContextFromPixmap(context, pixmap,
551 false, nullptr);
552 canvas->drawImage(image, 0, 0);
553}
Cary Clark3cd22cc2017-12-01 11:49:58 -0500554##
555
556#SeeAlso MakeCrossContextFromEncoded
Cary Clarka560c472017-11-27 10:44:06 -0500557
558#Method ##
559
560# ------------------------------------------------------------------------------
561
562#Method static sk_sp<SkImage> MakeFromAdoptedTexture(GrContext* context,
563 const GrBackendTexture& backendTexture,
564 GrSurfaceOrigin surfaceOrigin,
Cary Clark61ca7c52018-01-02 11:34:14 -0500565 SkColorType colorType,
566 SkAlphaType alphaType = kPremul_SkAlphaType,
567 sk_sp<SkColorSpace> colorSpace = nullptr)
Cary Clark61313f32018-10-08 14:57:48 -0400568#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -0500569#Line # creates Image from GPU_Texture, managed internally ##
Cary Clark3cd22cc2017-12-01 11:49:58 -0500570Creates Image from backendTexture associated with context. backendTexture and
571returned Image are managed internally, and are released when no longer needed.
Cary Clarka560c472017-11-27 10:44:06 -0500572
Cary Clark3cd22cc2017-12-01 11:49:58 -0500573Image is returned if format of backendTexture is recognized and supported.
574Recognized formats vary by GPU back-end.
Cary Clarka560c472017-11-27 10:44:06 -0500575
Cary Clark3cd22cc2017-12-01 11:49:58 -0500576#Param context GPU_Context ##
577#Param backendTexture texture residing on GPU ##
578#Param surfaceOrigin one of: kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin ##
Cary Clark1a8d7622018-03-05 13:26:16 -0500579#Param colorType one of: #list_of_color_types#
Cary Clark61ca7c52018-01-02 11:34:14 -0500580##
Cary Clark681287e2018-03-16 11:34:15 -0400581#Param alphaType one of: #list_of_alpha_types#
Cary Clark3cd22cc2017-12-01 11:49:58 -0500582##
Cary Clark61ca7c52018-01-02 11:34:14 -0500583#Param colorSpace range of colors; may be nullptr ##
Cary Clark3cd22cc2017-12-01 11:49:58 -0500584
585#Return created Image, or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -0500586
587#Example
Cary Clarkac47b882018-01-11 10:35:44 -0500588#Image 5
589#Platform gpu
Cary Clark61ca7c52018-01-02 11:34:14 -0500590 if (!canvas->getGrContext()) {
591 return;
592 }
593 canvas->scale(.5f, .5f);
594 canvas->clear(0x7f3f5f7f);
595 int x = 0, y = 0;
596 for (auto origin : { kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin } ) {
597 for (auto alpha : { kOpaque_SkAlphaType, kPremul_SkAlphaType, kUnpremul_SkAlphaType } ) {
598 sk_sp<SkImage> image = SkImage::MakeFromAdoptedTexture(canvas->getGrContext(),
Cary Clark682c58d2018-05-16 07:07:07 -0400599 backEndTexture, origin,
Cary Clark61ca7c52018-01-02 11:34:14 -0500600 kRGBA_8888_SkColorType, alpha);
601 canvas->drawImage(image, x, y);
602 x += 160;
603 }
604 x -= 160 * 3;
605 y += 256;
606 }
Cary Clarka560c472017-11-27 10:44:06 -0500607##
608
Cary Clark61ca7c52018-01-02 11:34:14 -0500609#SeeAlso MakeFromTexture MakeFromYUVTexturesCopy
Cary Clarka560c472017-11-27 10:44:06 -0500610
611#Method ##
612
613# ------------------------------------------------------------------------------
614
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400615#Method static sk_sp<SkImage> MakeFromYUVATexturesCopy(GrContext* context,
616 SkYUVColorSpace yuvColorSpace,
617 const GrBackendTexture yuvaTextures[],
618 const SkYUVAIndex yuvaIndices[4],
619 SkISize imageSize,
620 GrSurfaceOrigin imageOrigin,
621 sk_sp<SkColorSpace> imageColorSpace = nullptr)
622#In Constructor
623#Line # creates Image from YUV_ColorSpace data ##
Cary Clark61313f32018-10-08 14:57:48 -0400624Creates an SkImage by flattening the specified YUVA planes into a single,
625interleaved RGBA image.
626yuvaTextures points to array of up to four YUVA textures which reside on GPU.
627YUVA textures contain YUVA planes which may be interleaved.
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400628
629#Param context GPU context ##
Cary Clark61313f32018-10-08 14:57:48 -0400630#Param yuvColorSpace one of: kJPEG_SkYUVColorSpace, kRec601_SkYUVColorSpace,
631 kRec709_SkYUVColorSpace
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400632##
Cary Clark61313f32018-10-08 14:57:48 -0400633#Param yuvaTextures array of YUVA textures ##
634#Param yuvaIndices array indicating yuvaTextures element and channel
635 that map to Y, U, V, and A
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400636##
637#Param imageSize size of the resulting image ##
Cary Clark61313f32018-10-08 14:57:48 -0400638#Param imageOrigin one of: kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin ##
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400639#Param imageColorSpace range of colors of the resulting image; may be nullptr ##
640
641#Return created SkImage, or nullptr ##
642
643# seems too complicated to create an example for this
644#ToDo
645should this be moved to chrome only?
646##
647
648#NoExample
649##
650
651#SeeAlso MakeFromYUVATexturesCopyWithExternalBackend
652
653#Method ##
654
655# ------------------------------------------------------------------------------
656
657#Method static sk_sp<SkImage> MakeFromYUVATexturesCopyWithExternalBackend(
658 GrContext* context,
659 SkYUVColorSpace yuvColorSpace,
660 const GrBackendTexture yuvaTextures[],
661 const SkYUVAIndex yuvaIndices[4],
662 SkISize imageSize,
663 GrSurfaceOrigin imageOrigin,
664 const GrBackendTexture& backendTexture,
665 sk_sp<SkColorSpace> imageColorSpace = nullptr)
666#In Constructor
667#Line # creates Image from planar YUV_ColorSpace, stored in texture ##
668
Cary Clark61313f32018-10-08 14:57:48 -0400669Creates an SkImage by flattening the specified YUVA planes into a single,
670interleaved RGBA image. backendTexture is used to store the result of flattening.
671yuvaTextures points to array of up to four YUVA textures which reside on GPU.
672YUVA textures contain YUVA planes which may be interleaved.
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400673
674#Param context GPU context ##
Cary Clark61313f32018-10-08 14:57:48 -0400675#Param yuvColorSpace one of: kJPEG_SkYUVColorSpace, kRec601_SkYUVColorSpace,
676 kRec709_SkYUVColorSpace
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400677##
Cary Clark61313f32018-10-08 14:57:48 -0400678#Param yuvaTextures array of YUVA textures ##
679#Param yuvaIndices array indicating yuvaTextures element and channel
680 that map to Y, U, V, and A
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400681##
682#Param imageSize size of the resulting image ##
Cary Clark61313f32018-10-08 14:57:48 -0400683#Param imageOrigin one of: kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin ##
684#Param backendTexture resource that stores the final pixels ##
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400685#Param imageColorSpace range of colors of the resulting image; may be nullptr ##
686
687#Return created SkImage, or nullptr ##
688
689# seems too complicated to create an example for this
690#ToDo
691should this be moved to chrome only?
692##
693
694#NoExample
695##
696
697#SeeAlso MakeFromYUVATexturesCopy
698
699#Method ##
700
Cary Clarka560c472017-11-27 10:44:06 -0500701#Method static sk_sp<SkImage> MakeFromYUVTexturesCopy(GrContext* context, SkYUVColorSpace yuvColorSpace,
Brian Salomon6a426c12018-03-15 12:16:02 -0400702 const GrBackendTexture yuvTextures[3],
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400703 GrSurfaceOrigin imageOrigin,
704 sk_sp<SkColorSpace> imageColorSpace = nullptr)
Cary Clark61313f32018-10-08 14:57:48 -0400705#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -0500706#Line # creates Image from YUV_ColorSpace data in three planes ##
Cary Clarka560c472017-11-27 10:44:06 -0500707
Brian Salomon6a426c12018-03-15 12:16:02 -0400708Creates Image from copy of yuvTextures, an array of textures on GPU.
709yuvTextures contain pixels for YUV planes of Image. Returned Image has the dimensions
710yuvTextures[0]. yuvColorSpace describes how YUV colors convert to RGB colors.
Cary Clarka560c472017-11-27 10:44:06 -0500711
Cary Clark61ca7c52018-01-02 11:34:14 -0500712#Param context GPU_Context ##
713#Param yuvColorSpace one of: kJPEG_SkYUVColorSpace, kRec601_SkYUVColorSpace,
714 kRec709_SkYUVColorSpace
715##
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400716#Param yuvTextures array of YUV textures on GPU ##
717#Param imageOrigin one of: kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin ##
718#Param imageColorSpace range of colors; may be nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -0500719
Cary Clark61ca7c52018-01-02 11:34:14 -0500720#Return created Image, or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -0500721
Cary Clark61ca7c52018-01-02 11:34:14 -0500722# seems too complicated to create an example for this
723#ToDo
724should this be moved to chrome only?
Cary Clarka560c472017-11-27 10:44:06 -0500725##
726
Cary Clark61ca7c52018-01-02 11:34:14 -0500727#NoExample
728##
729
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400730#SeeAlso MakeFromYUVTexturesCopyWithExternalBackend MakeFromNV12TexturesCopy MakeFromYUVATexturesCopy
Cary Clarkcdc371a2018-09-18 07:31:37 -0400731
732#Method ##
733
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400734# ------------------------------------------------------------------------------
735
Cary Clarkcdc371a2018-09-18 07:31:37 -0400736#Method static sk_sp<SkImage> MakeFromYUVTexturesCopyWithExternalBackend(
737 GrContext* context, SkYUVColorSpace yuvColorSpace,
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400738 const GrBackendTexture yuvTextures[3], GrSurfaceOrigin imageOrigin,
739 const GrBackendTexture& backendTexture, sk_sp<SkColorSpace> imageColorSpace = nullptr);
Cary Clark61313f32018-10-08 14:57:48 -0400740#In Constructors
Cary Clarkcdc371a2018-09-18 07:31:37 -0400741#Line # creates Image from planar YUV_ColorSpace, stored in texture ##
742
743Creates Image from copy of yuvTextures, an array of textures on GPU.
744yuvTextures contain pixels for YUV planes of Image. Returned Image has the dimensions
745yuvTextures[0] and stores pixels in backendTexture. yuvColorSpace describes how YUV colors
746convert to RGB colors.
747
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400748#Param context GPU_Context ##
749#Param yuvColorSpace one of: kJPEG_SkYUVColorSpace, kRec601_SkYUVColorSpace,
750 kRec709_SkYUVColorSpace
Cary Clarkcdc371a2018-09-18 07:31:37 -0400751##
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400752#Param yuvTextures array of YUV textures on GPU ##
753#Param imageOrigin one of: kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin ##
Cary Clark61313f32018-10-08 14:57:48 -0400754#Param backendTexture resource that stores final pixels ##
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400755#Param imageColorSpace range of colors; may be nullptr ##
Cary Clarkcdc371a2018-09-18 07:31:37 -0400756
757#Return created SkImage, or nullptr ##
758
759# seems too complicated to create an example for this
760#ToDo
761should this be moved to chrome only?
762##
763
764#NoExample
765##
766
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400767#SeeAlso MakeFromYUVTexturesCopy MakeFromNV12TexturesCopy MakeFromYUVATexturesCopyWithExternalBackend
Cary Clark61ca7c52018-01-02 11:34:14 -0500768
769#Method ##
770
771# ------------------------------------------------------------------------------
772
Cary Clarka560c472017-11-27 10:44:06 -0500773#Method static sk_sp<SkImage> MakeFromNV12TexturesCopy(GrContext* context,
774 SkYUVColorSpace yuvColorSpace,
Brian Salomon6a426c12018-03-15 12:16:02 -0400775 const GrBackendTexture nv12Textures[2],
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400776 GrSurfaceOrigin imageOrigin,
777 sk_sp<SkColorSpace> imageColorSpace = nullptr)
Cary Clark61313f32018-10-08 14:57:48 -0400778#In Constructors
Brian Salomon6a426c12018-03-15 12:16:02 -0400779#Line # creates Image from YUV_ColorSpace data in three planes ##
Cary Clarka560c472017-11-27 10:44:06 -0500780
Cary Clark681287e2018-03-16 11:34:15 -0400781Creates Image from copy of nv12Textures, an array of textures on GPU.
Brian Salomon6a426c12018-03-15 12:16:02 -0400782nv12Textures[0] contains pixels for YUV_Component_Y plane.
783nv12Textures[1] contains pixels for YUV_Component_U plane,
Cary Clark61ca7c52018-01-02 11:34:14 -0500784followed by pixels for YUV_Component_V plane.
Cary Clark681287e2018-03-16 11:34:15 -0400785Returned Image has the dimensions nv12Textures[2].
786yuvColorSpace describes how YUV colors convert to RGB colors.
Cary Clarka560c472017-11-27 10:44:06 -0500787
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400788#Param context GPU_Context ##
789#Param yuvColorSpace one of: kJPEG_SkYUVColorSpace, kRec601_SkYUVColorSpace,
790 kRec709_SkYUVColorSpace
Cary Clark61ca7c52018-01-02 11:34:14 -0500791##
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400792#Param nv12Textures array of YUV textures on GPU ##
793#Param imageOrigin one of: kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin ##
794#Param imageColorSpace range of colors; may be nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -0500795
Cary Clark61ca7c52018-01-02 11:34:14 -0500796#Return created Image, or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -0500797
Cary Clark61ca7c52018-01-02 11:34:14 -0500798# seems too complicated to create an example for this
799#ToDo
800should this be moved to chrome only?
Cary Clarka560c472017-11-27 10:44:06 -0500801##
802
Cary Clark61ca7c52018-01-02 11:34:14 -0500803#NoExample
804##
805
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400806#SeeAlso MakeFromNV12TexturesCopyWithExternalBackend MakeFromYUVTexturesCopy MakeFromYUVATexturesCopy
Cary Clarkcdc371a2018-09-18 07:31:37 -0400807
808#Method ##
809
810#Method static sk_sp<SkImage> MakeFromNV12TexturesCopyWithExternalBackend(
811 GrContext* context,
812 SkYUVColorSpace yuvColorSpace,
813 const GrBackendTexture nv12Textures[2],
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400814 GrSurfaceOrigin imageOrigin,
815 const GrBackendTexture& backendTexture,
816 sk_sp<SkColorSpace> imageColorSpace = nullptr);
Cary Clark61313f32018-10-08 14:57:48 -0400817#In Constructors
Cary Clarkcdc371a2018-09-18 07:31:37 -0400818#Line # creates Image from planar YUV_ColorSpace, stored in texture ##
819
820Creates Image from copy of nv12Textures, an array of textures on GPU.
821nv12Textures[0] contains pixels for YUV_Component_Y plane.
822nv12Textures[1] contains pixels for YUV_Component_U plane,
823followed by pixels for YUV_Component_V plane.
824Returned Image has the dimensions nv12Textures[2] and stores pixels in backendTexture.
825yuvColorSpace describes how YUV colors convert to RGB colors.
826
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400827#Param context GPU_Context ##
828#Param yuvColorSpace one of: kJPEG_SkYUVColorSpace, kRec601_SkYUVColorSpace,
829 kRec709_SkYUVColorSpace
Cary Clarkcdc371a2018-09-18 07:31:37 -0400830##
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400831#Param nv12Textures array of YUV textures on GPU ##
832#Param imageOrigin one of: kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin ##
Cary Clark61313f32018-10-08 14:57:48 -0400833#Param backendTexture resource that stores final pixels ##
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400834#Param imageColorSpace range of colors; may be nullptr ##
Cary Clarkcdc371a2018-09-18 07:31:37 -0400835
836#Return created Image, or nullptr ##
837
838# seems too complicated to create an example for this
839#ToDo
840should this be moved to chrome only?
841##
842
843#NoExample
844##
845
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400846#SeeAlso MakeFromNV12TexturesCopy MakeFromYUVTexturesCopy MakeFromYUVATexturesCopyWithExternalBackend
Cary Clarka560c472017-11-27 10:44:06 -0500847
848#Method ##
849
850# ------------------------------------------------------------------------------
851
Cary Clark4855f782018-02-06 09:41:53 -0500852# currently uncalled by any test or client ##
Cary Clark61ca7c52018-01-02 11:34:14 -0500853#Bug 7424
Cary Clark61ca7c52018-01-02 11:34:14 -0500854
Cary Clark56356312018-02-08 14:45:18 -0500855#EnumClass BitDepth
Cary Clark682c58d2018-05-16 07:07:07 -0400856#Line # options for MakeFromPicture ##
Cary Clarka560c472017-11-27 10:44:06 -0500857#Code
Cary Clarka90ea222018-10-16 10:30:28 -0400858#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500859##
860
861#Const kU8 0
Cary Clark682c58d2018-05-16 07:07:07 -0400862#Line # uses 8-bit unsigned int per Color component ##
Cary Clarkffb3d682018-05-17 12:17:28 -0400863Use 8 bits per ARGB component using unsigned integer format.
Cary Clarka560c472017-11-27 10:44:06 -0500864##
865#Const kF16 1
Cary Clark682c58d2018-05-16 07:07:07 -0400866#Line # uses 16-bit float per Color component ##
Cary Clarkffb3d682018-05-17 12:17:28 -0400867Use 16 bits per ARGB component using half-precision floating point format.
Cary Clarka560c472017-11-27 10:44:06 -0500868##
869
Cary Clark61ca7c52018-01-02 11:34:14 -0500870#NoExample
Cary Clarka560c472017-11-27 10:44:06 -0500871##
872
Cary Clark61ca7c52018-01-02 11:34:14 -0500873#SeeAlso MakeFromPicture
Cary Clarka560c472017-11-27 10:44:06 -0500874
Cary Clark56356312018-02-08 14:45:18 -0500875#EnumClass ##
Cary Clarka560c472017-11-27 10:44:06 -0500876
877# ------------------------------------------------------------------------------
878
879#Method static sk_sp<SkImage> MakeFromPicture(sk_sp<SkPicture> picture, const SkISize& dimensions,
880 const SkMatrix* matrix, const SkPaint* paint,
881 BitDepth bitDepth,
882 sk_sp<SkColorSpace> colorSpace)
Cary Clark61313f32018-10-08 14:57:48 -0400883#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -0500884#Line # creates Image from Picture ##
Cary Clarka560c472017-11-27 10:44:06 -0500885
Cary Clark61ca7c52018-01-02 11:34:14 -0500886Creates Image from picture. Returned Image width and height are set by dimensions.
887Image draws picture with matrix and paint, set to bitDepth and colorSpace.
Cary Clarka560c472017-11-27 10:44:06 -0500888
Cary Clark61ca7c52018-01-02 11:34:14 -0500889If matrix is nullptr, draws with identity Matrix. If paint is nullptr, draws
Cary Clark682c58d2018-05-16 07:07:07 -0400890with default Paint. colorSpace may be nullptr.
Cary Clarka560c472017-11-27 10:44:06 -0500891
Cary Clark61ca7c52018-01-02 11:34:14 -0500892#Param picture stream of drawing commands ##
893#Param dimensions width and height ##
894#Param matrix Matrix to rotate, scale, translate, and so on; may be nullptr ##
895#Param paint Paint to apply transparency, filtering, and so on; may be nullptr ##
Cary Clark682c58d2018-05-16 07:07:07 -0400896#Param bitDepth 8-bit integer or 16-bit float: per component ##
Cary Clark61ca7c52018-01-02 11:34:14 -0500897#Param colorSpace range of colors; may be nullptr ##
898
899#Return created Image, or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -0500900
901#Example
Cary Clark61ca7c52018-01-02 11:34:14 -0500902 SkPaint paint;
903 SkPictureRecorder recorder;
904 SkCanvas* recordingCanvas = recorder.beginRecording(50, 50);
905 for (auto color : { SK_ColorRED, SK_ColorBLUE, 0xff007f00 } ) {
906 paint.setColor(color);
907 recordingCanvas->drawRect({10, 10, 30, 40}, paint);
908 recordingCanvas->translate(10, 10);
909 recordingCanvas->scale(1.2f, 1.4f);
910 }
911 sk_sp<SkPicture> playback = recorder.finishRecordingAsPicture();
912 int x = 0, y = 0;
913 for (auto alpha : { 70, 140, 210 } ) {
914 paint.setAlpha(alpha);
915 auto srgbColorSpace = SkColorSpace::MakeSRGB();
916 sk_sp<SkImage> image = SkImage::MakeFromPicture(playback, {50, 50}, nullptr, &paint,
917 SkImage::BitDepth::kU8, srgbColorSpace);
918 canvas->drawImage(image, x, y);
919 x += 70; y += 70;
920 }
Cary Clarka560c472017-11-27 10:44:06 -0500921##
922
Cary Clark61ca7c52018-01-02 11:34:14 -0500923#SeeAlso SkCanvas::drawPicture
Cary Clarka560c472017-11-27 10:44:06 -0500924
925#Method ##
926
927# ------------------------------------------------------------------------------
928
Cary Clark9548ea92018-09-13 15:26:33 -0400929#Method static sk_sp<SkImage> MakeFromAHardwareBuffer(
930 AHardwareBuffer* hardwareBuffer,
931 SkAlphaType alphaType = kPremul_SkAlphaType,
932 sk_sp<SkColorSpace> colorSpace = nullptr,
933 GrSurfaceOrigin surfaceOrigin = kTopLeft_GrSurfaceOrigin)
Cary Clark61313f32018-10-08 14:57:48 -0400934#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -0500935#Line # creates Image from Android hardware buffer ##
Cary Clarka560c472017-11-27 10:44:06 -0500936
Cary Clark4855f782018-02-06 09:41:53 -0500937#Bug 7447
Cary Clarka560c472017-11-27 10:44:06 -0500938
Cary Clark61ca7c52018-01-02 11:34:14 -0500939Creates Image from Android hardware buffer.
940Returned Image takes a reference on the buffer.
Cary Clarka560c472017-11-27 10:44:06 -0500941
Cary Clark61ca7c52018-01-02 11:34:14 -0500942Only available on Android, when __ANDROID_API__ is defined to be 26 or greater.
Cary Clarka560c472017-11-27 10:44:06 -0500943
Cary Clark61ca7c52018-01-02 11:34:14 -0500944#Param hardwareBuffer AHardwareBuffer Android hardware buffer ##
Cary Clark681287e2018-03-16 11:34:15 -0400945#Param alphaType one of: #list_of_alpha_types#
Cary Clark61ca7c52018-01-02 11:34:14 -0500946##
947#Param colorSpace range of colors; may be nullptr ##
Cary Clark9548ea92018-09-13 15:26:33 -0400948#Param surfaceOrigin one of: kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin ##
Cary Clarka560c472017-11-27 10:44:06 -0500949
Cary Clark61ca7c52018-01-02 11:34:14 -0500950#Return created Image, or nullptr ##
951
952#NoExample
Cary Clarka560c472017-11-27 10:44:06 -0500953##
954
Cary Clark61ca7c52018-01-02 11:34:14 -0500955#SeeAlso MakeFromRaster
Cary Clarka560c472017-11-27 10:44:06 -0500956
957#Method ##
958
959# ------------------------------------------------------------------------------
Cary Clark4855f782018-02-06 09:41:53 -0500960#Subtopic Property
Cary Clark4855f782018-02-06 09:41:53 -0500961#Line # values and attributes ##
962##
Cary Clarka560c472017-11-27 10:44:06 -0500963
964#Method int width() const
Cary Clark4855f782018-02-06 09:41:53 -0500965#In Property
966#Line # returns pixel column count ##
Cary Clark61ca7c52018-01-02 11:34:14 -0500967Returns pixel count in each row.
968
969#Return pixel width in Image ##
Cary Clarka560c472017-11-27 10:44:06 -0500970
971#Example
Cary Clark61ca7c52018-01-02 11:34:14 -0500972#Image 4
Cary Clarkac47b882018-01-11 10:35:44 -0500973#Height 96
Cary Clark61ca7c52018-01-02 11:34:14 -0500974 canvas->translate(10, 10);
975 canvas->drawImage(image, 0, 0);
976 canvas->translate(0, image->height());
977 SkPaint paint;
Cary Clark61ca7c52018-01-02 11:34:14 -0500978 canvas->drawLine(0, 10, image->width(), 10, paint);
Cary Clark14768f62018-10-29 20:33:51 -0400979 canvas->drawString("width", image->width() / 2 - 15, 25, paint);
Cary Clarka560c472017-11-27 10:44:06 -0500980##
981
Cary Clark61ca7c52018-01-02 11:34:14 -0500982#SeeAlso dimensions() height()
Cary Clarka560c472017-11-27 10:44:06 -0500983
984#Method ##
985
986# ------------------------------------------------------------------------------
987
988#Method int height() const
Cary Clark4855f782018-02-06 09:41:53 -0500989#In Property
990#Line # returns pixel row count ##
Cary Clark2f466242017-12-11 16:03:17 -0500991Returns pixel row count.
992
Cary Clark61ca7c52018-01-02 11:34:14 -0500993#Return pixel height in Image ##
Cary Clarka560c472017-11-27 10:44:06 -0500994
995#Example
Cary Clark61ca7c52018-01-02 11:34:14 -0500996#Image 4
Cary Clarkac47b882018-01-11 10:35:44 -0500997#Height 96
Cary Clark61ca7c52018-01-02 11:34:14 -0500998 canvas->translate(10, 10);
999 canvas->drawImage(image, 0, 0);
1000 canvas->translate(image->width(), 0);
1001 SkPaint paint;
Cary Clark61ca7c52018-01-02 11:34:14 -05001002 canvas->drawLine(10, 0, 10, image->height(), paint);
Cary Clark92694be2018-10-25 08:15:36 -04001003 canvas->drawString("height", 34, image->height() / 2, paint);
Cary Clarkac47b882018-01-11 10:35:44 -05001004##
Cary Clarka560c472017-11-27 10:44:06 -05001005
Cary Clark61ca7c52018-01-02 11:34:14 -05001006#SeeAlso dimensions() width()
Cary Clarka560c472017-11-27 10:44:06 -05001007
1008#Method ##
1009
1010# ------------------------------------------------------------------------------
1011
1012#Method SkISize dimensions() const
Cary Clark4855f782018-02-06 09:41:53 -05001013#In Property
1014#Line # returns width() and height() ##
Cary Clark681287e2018-03-16 11:34:15 -04001015
Cary Clark2f466242017-12-11 16:03:17 -05001016Returns ISize { width(), height() }.
1017
1018#Return integral size of width() and height() ##
Cary Clarka560c472017-11-27 10:44:06 -05001019
1020#Example
Cary Clark61ca7c52018-01-02 11:34:14 -05001021#Image 4
1022 SkISize dimensions = image->dimensions();
1023 SkIRect bounds = image->bounds();
1024 SkIRect dimensionsAsBounds = SkIRect::MakeSize(dimensions);
1025 SkDebugf("dimensionsAsBounds %c= bounds\n", dimensionsAsBounds == bounds ? '=' : '!');
Cary Clark681287e2018-03-16 11:34:15 -04001026#StdOut
1027dimensionsAsBounds == bounds
1028##
Cary Clarka560c472017-11-27 10:44:06 -05001029##
1030
Cary Clark61ca7c52018-01-02 11:34:14 -05001031#SeeAlso height() width() bounds()
Cary Clarka560c472017-11-27 10:44:06 -05001032
1033#Method ##
1034
1035# ------------------------------------------------------------------------------
1036
1037#Method SkIRect bounds() const
Cary Clark4855f782018-02-06 09:41:53 -05001038#In Property
1039#Line # returns width() and height() as Rectangle ##
Cary Clark2f466242017-12-11 16:03:17 -05001040Returns IRect { 0, 0, width(), height() }.
1041
1042#Return integral rectangle from origin to width() and height() ##
Cary Clarka560c472017-11-27 10:44:06 -05001043
1044#Example
Cary Clark61ca7c52018-01-02 11:34:14 -05001045#Height 128
1046#Image 4
Cary Clark61ca7c52018-01-02 11:34:14 -05001047 SkIRect bounds = image->bounds();
Cary Clarkac47b882018-01-11 10:35:44 -05001048 for (int x : { 0, bounds.width() } ) {
1049 for (int y : { 0, bounds.height() } ) {
Cary Clark61ca7c52018-01-02 11:34:14 -05001050 canvas->drawImage(image, x, y);
1051 }
1052 }
Cary Clarka560c472017-11-27 10:44:06 -05001053##
1054
Cary Clark682c58d2018-05-16 07:07:07 -04001055#SeeAlso dimensions()
Cary Clarka560c472017-11-27 10:44:06 -05001056
1057#Method ##
1058
1059# ------------------------------------------------------------------------------
1060
1061#Method uint32_t uniqueID() const
Cary Clark4855f782018-02-06 09:41:53 -05001062#In Property
Cary Clark682c58d2018-05-16 07:07:07 -04001063#Line # returns identifier for Image ##
Cary Clark61ca7c52018-01-02 11:34:14 -05001064Returns value unique to image. Image contents cannot change after Image is
1065created. Any operation to create a new Image will receive generate a new
1066unique number.
1067
1068#Return unique identifier ##
Cary Clarka560c472017-11-27 10:44:06 -05001069
1070#Example
Cary Clark61ca7c52018-01-02 11:34:14 -05001071#Image 5
1072#Height 156
1073 sk_sp<SkImage> subset = image->makeSubset({10, 20, 90, 100});
1074 canvas->drawImage(image, 0, 0);
1075 canvas->drawImage(subset, 128, 0);
1076 SkPaint paint;
1077 SkString s;
1078 s.printf("original id: %d", image->uniqueID());
1079 canvas->drawString(s, 20, image->height() + 20, paint);
1080 s.printf("subset id: %d", subset->uniqueID());
1081 canvas->drawString(s, 148, subset->height() + 20, paint);
Cary Clarka560c472017-11-27 10:44:06 -05001082##
1083
Cary Clark61ca7c52018-01-02 11:34:14 -05001084#SeeAlso isLazyGenerated
Cary Clarka560c472017-11-27 10:44:06 -05001085
1086#Method ##
1087
1088# ------------------------------------------------------------------------------
1089
1090#Method SkAlphaType alphaType() const
Cary Clark4855f782018-02-06 09:41:53 -05001091#In Property
1092#Line # returns Alpha_Type ##
Cary Clark681287e2018-03-16 11:34:15 -04001093Returns Alpha_Type, one of: #list_of_alpha_types#.
Cary Clark61ca7c52018-01-02 11:34:14 -05001094
1095Alpha_Type returned was a parameter to an Image constructor,
1096or was parsed from encoded data.
1097
1098#Return Alpha_Type in Image ##
Cary Clarka560c472017-11-27 10:44:06 -05001099
1100#Example
Cary Clark61ca7c52018-01-02 11:34:14 -05001101#Image 4
Cary Clarkac47b882018-01-11 10:35:44 -05001102#Height 96
Cary Clark61ca7c52018-01-02 11:34:14 -05001103 const char* alphaTypeStr[] = { "Unknown", "Opaque", "Premul", "Unpremul" };
1104 SkAlphaType alphaType = image->alphaType();
Cary Clarkac47b882018-01-11 10:35:44 -05001105 canvas->drawImage(image, 16, 0);
Cary Clarkffb3d682018-05-17 12:17:28 -04001106 canvas->drawString(alphaTypeStr[(int) alphaType], 20, image->height() + 20, SkPaint());
Cary Clarka560c472017-11-27 10:44:06 -05001107##
1108
Cary Clark61ca7c52018-01-02 11:34:14 -05001109#SeeAlso SkImageInfo::alphaType
Cary Clarka560c472017-11-27 10:44:06 -05001110
1111#Method ##
1112
1113# ------------------------------------------------------------------------------
1114
Greg Daniel56008aa2018-03-14 15:33:42 -04001115#Method SkColorType colorType() const
1116#In Property
1117#Line # returns Color_Type ##
1118
1119Returns Color_Type if known; otherwise, returns kUnknown_SkColorType.
1120
1121#Return Color_Type of Image ##
1122
1123#Example
Cary Clarkffb3d682018-05-17 12:17:28 -04001124#Image 4
1125#Height 96
1126 const char* colors[] = { "Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x",
1127 "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16" };
1128 SkColorType colorType = image->colorType();
1129 canvas->drawImage(image, 16, 0);
1130 canvas->drawString(colors[(int) colorType], 20, image->height() + 20, SkPaint());
Greg Daniel56008aa2018-03-14 15:33:42 -04001131##
1132
1133#SeeAlso SkImageInfo::colorType
1134
1135#Method ##
1136
1137# ------------------------------------------------------------------------------
1138
Cary Clarka560c472017-11-27 10:44:06 -05001139#Method SkColorSpace* colorSpace() const
Cary Clark4855f782018-02-06 09:41:53 -05001140#In Property
1141#Line # returns Color_Space ##
Cary Clark2f466242017-12-11 16:03:17 -05001142Returns Color_Space, the range of colors, associated with Image. The
1143reference count of Color_Space is unchanged. The returned Color_Space is
1144immutable.
Cary Clarka560c472017-11-27 10:44:06 -05001145
Cary Clark61dfc3a2018-01-03 08:37:53 -05001146Color_Space returned was passed to an Image constructor,
1147or was parsed from encoded data. Color_Space returned may be ignored when Image
1148is drawn, depending on the capabilities of the Surface receiving the drawing.
Cary Clark2f466242017-12-11 16:03:17 -05001149
1150#Return Color_Space in Image, or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -05001151
1152#Example
Cary Clark61dfc3a2018-01-03 08:37:53 -05001153#Image 3
1154#Set sRGB
1155 SkPixmap pixmap;
1156 source.peekPixels(&pixmap);
1157 canvas->scale(.25f, .25f);
1158 int y = 0;
1159 for (auto gamma : { SkColorSpace::kLinear_RenderTargetGamma,
1160 SkColorSpace::kSRGB_RenderTargetGamma } ) {
1161 int x = 0;
1162 sk_sp<SkColorSpace> colorSpace = SkColorSpace::MakeRGB(gamma, SkColorSpace::kSRGB_Gamut);
1163 for (int index = 0; index < 2; ++index) {
1164 pixmap.setColorSpace(colorSpace);
1165 sk_sp<SkImage> image = SkImage::MakeRasterCopy(pixmap);
1166 canvas->drawImage(image, x, y);
1167 colorSpace = image->colorSpace()->makeColorSpin();
1168 x += 512;
1169 }
1170 y += 512;
1171 }
Cary Clarka560c472017-11-27 10:44:06 -05001172##
1173
Cary Clark61dfc3a2018-01-03 08:37:53 -05001174#SeeAlso refColorSpace makeColorSpace
Cary Clarka560c472017-11-27 10:44:06 -05001175
1176#Method ##
1177
1178# ------------------------------------------------------------------------------
1179
1180#Method sk_sp<SkColorSpace> refColorSpace() const
Cary Clark4855f782018-02-06 09:41:53 -05001181#In Property
1182#Line # returns Image_Info Color_Space ##
Cary Clark61dfc3a2018-01-03 08:37:53 -05001183Returns a smart pointer to Color_Space, the range of colors, associated with
1184Image. The smart pointer tracks the number of objects sharing this
1185SkColorSpace reference so the memory is released when the owners destruct.
1186
1187The returned SkColorSpace is immutable.
1188
1189Color_Space returned was passed to an Image constructor,
1190or was parsed from encoded data. Color_Space returned may be ignored when Image
1191is drawn, depending on the capabilities of the Surface receiving the drawing.
1192
1193#Return Color_Space in Image, or nullptr, wrapped in a smart pointer ##
Cary Clarka560c472017-11-27 10:44:06 -05001194
1195#Example
Cary Clark61dfc3a2018-01-03 08:37:53 -05001196#Image 3
1197#Set sRGB
1198 SkPixmap pixmap;
1199 source.peekPixels(&pixmap);
1200 canvas->scale(.25f, .25f);
1201 int y = 0;
1202 for (auto gamma : { SkColorSpace::kLinear_RenderTargetGamma,
1203 SkColorSpace::kSRGB_RenderTargetGamma } ) {
1204 int x = 0;
1205 sk_sp<SkColorSpace> colorSpace = SkColorSpace::MakeRGB(gamma, SkColorSpace::kSRGB_Gamut);
1206 for (int index = 0; index < 2; ++index) {
1207 pixmap.setColorSpace(colorSpace);
1208 sk_sp<SkImage> image = SkImage::MakeRasterCopy(pixmap);
1209 canvas->drawImage(image, x, y);
1210 colorSpace = image->refColorSpace()->makeColorSpin();
1211 x += 512;
1212 }
1213 y += 512;
1214 }
Cary Clarka560c472017-11-27 10:44:06 -05001215##
1216
Cary Clark61dfc3a2018-01-03 08:37:53 -05001217#SeeAlso colorSpace makeColorSpace
Cary Clarka560c472017-11-27 10:44:06 -05001218
1219#Method ##
1220
1221# ------------------------------------------------------------------------------
1222
1223#Method bool isAlphaOnly() const
Cary Clark4855f782018-02-06 09:41:53 -05001224#In Property
1225#Line # returns if pixels represent a transparency mask ##
Cary Clark2f466242017-12-11 16:03:17 -05001226Returns true if Image pixels represent transparency only. If true, each pixel
1227is packed in 8 bits as defined by kAlpha_8_SkColorType.
Cary Clarka560c472017-11-27 10:44:06 -05001228
Cary Clark2f466242017-12-11 16:03:17 -05001229#Return true if pixels represent a transparency mask ##
Cary Clarka560c472017-11-27 10:44:06 -05001230
1231#Example
Cary Clark61dfc3a2018-01-03 08:37:53 -05001232 uint8_t pmColors = 0;
1233 sk_sp<SkImage> image = SkImage::MakeRasterCopy({SkImageInfo::MakeA8(1, 1), &pmColors, 1});
1234 SkDebugf("alphaOnly = %s\n", image->isAlphaOnly() ? "true" : "false");
1235#StdOut
1236alphaOnly = true
1237##
Cary Clarka560c472017-11-27 10:44:06 -05001238##
1239
Cary Clark61dfc3a2018-01-03 08:37:53 -05001240#SeeAlso alphaType isOpaque
Cary Clarka560c472017-11-27 10:44:06 -05001241
1242#Method ##
1243
1244# ------------------------------------------------------------------------------
1245
1246#Method bool isOpaque() const
Cary Clark4855f782018-02-06 09:41:53 -05001247#In Property
1248#Line # returns if Alpha_Type is kOpaque_SkAlphaType ##
Cary Clark61dfc3a2018-01-03 08:37:53 -05001249Returns true if pixels ignore their Alpha value and are treated as fully opaque.
Cary Clark2f466242017-12-11 16:03:17 -05001250
1251#Return true if Alpha_Type is kOpaque_SkAlphaType ##
Cary Clarka560c472017-11-27 10:44:06 -05001252
1253#Example
Cary Clark61dfc3a2018-01-03 08:37:53 -05001254 auto check_isopaque = [](const SkImageInfo& imageInfo) -> void {
1255 auto surface(SkSurface::MakeRaster(imageInfo));
1256 auto image(surface->makeImageSnapshot());
1257 SkDebugf("isOpaque = %s\n", image->isOpaque() ? "true" : "false");
1258 };
1259
1260 check_isopaque(SkImageInfo::MakeN32Premul(5, 5));
1261 check_isopaque(SkImageInfo::MakeN32(5, 5, kOpaque_SkAlphaType));
1262#StdOut
1263isOpaque = false
1264isOpaque = true
1265##
Cary Clarka560c472017-11-27 10:44:06 -05001266##
1267
Cary Clark61dfc3a2018-01-03 08:37:53 -05001268#SeeAlso alphaType isAlphaOnly
Cary Clarka560c472017-11-27 10:44:06 -05001269
1270#Method ##
1271
1272# ------------------------------------------------------------------------------
1273
1274#Method sk_sp<SkShader> makeShader(SkShader::TileMode tileMode1, SkShader::TileMode tileMode2,
1275 const SkMatrix* localMatrix = nullptr) const
Cary Clark61313f32018-10-08 14:57:48 -04001276#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05001277#Line # creates Shader, Paint element that can tile Image ##
Cary Clarka560c472017-11-27 10:44:06 -05001278
Cary Clark61dfc3a2018-01-03 08:37:53 -05001279Creates Shader from Image. Shader dimensions are taken from Image. Shader uses
1280SkShader::TileMode rules to fill drawn area outside Image. localMatrix permits
1281transforming Image before Canvas_Matrix is applied.
Cary Clarka560c472017-11-27 10:44:06 -05001282
Cary Clark5538c132018-06-14 12:28:14 -04001283#Param tileMode1 tiling on x-axis, one of: SkShader::kClamp_TileMode,
1284 SkShader::kRepeat_TileMode, SkShader::kMirror_TileMode
Cary Clark61dfc3a2018-01-03 08:37:53 -05001285##
Cary Clark5538c132018-06-14 12:28:14 -04001286#Param tileMode2 tiling on y-axis, one of: SkShader::kClamp_TileMode,
1287 SkShader::kRepeat_TileMode, SkShader::kMirror_TileMode
Cary Clark61dfc3a2018-01-03 08:37:53 -05001288##
1289#Param localMatrix Image transformation, or nullptr ##
1290
1291#Return Shader containing Image ##
Cary Clarka560c472017-11-27 10:44:06 -05001292
1293#Example
Cary Clark61dfc3a2018-01-03 08:37:53 -05001294#Image 4
1295SkMatrix matrix;
1296matrix.setRotate(45);
1297SkPaint paint;
1298paint.setShader(image->makeShader(SkShader::kRepeat_TileMode, SkShader::kMirror_TileMode,
1299 &matrix));
1300canvas->drawPaint(paint);
Cary Clarka560c472017-11-27 10:44:06 -05001301##
1302
Cary Clark61dfc3a2018-01-03 08:37:53 -05001303#SeeAlso scalePixels
Cary Clarka560c472017-11-27 10:44:06 -05001304
1305#Method ##
1306
1307# ------------------------------------------------------------------------------
1308
1309#Method sk_sp<SkShader> makeShader(const SkMatrix* localMatrix = nullptr) const
1310
Cary Clark61dfc3a2018-01-03 08:37:53 -05001311Creates Shader from Image. Shader dimensions are taken from Image. Shader uses
1312SkShader::kClamp_TileMode to fill drawn area outside Image. localMatrix permits
1313transforming Image before Canvas_Matrix is applied.
Cary Clarka560c472017-11-27 10:44:06 -05001314
Cary Clark61dfc3a2018-01-03 08:37:53 -05001315#Param localMatrix Image transformation, or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -05001316
Cary Clark61dfc3a2018-01-03 08:37:53 -05001317#Return Shader containing Image ##
Cary Clarka560c472017-11-27 10:44:06 -05001318
1319#Example
Cary Clark61dfc3a2018-01-03 08:37:53 -05001320#Image 5
1321SkMatrix matrix;
1322matrix.setRotate(45);
1323matrix.postTranslate(125, 30);
1324SkPaint paint;
1325paint.setShader(image->makeShader(&matrix));
1326canvas->drawPaint(paint);
Cary Clarka560c472017-11-27 10:44:06 -05001327##
1328
Cary Clarkf5404bb2018-01-05 12:10:09 -05001329#SeeAlso scalePixels
Cary Clarka560c472017-11-27 10:44:06 -05001330
1331#Method ##
1332
1333# ------------------------------------------------------------------------------
Cary Clark78de7512018-02-07 07:27:09 -05001334#Subtopic Pixels
Cary Clark78de7512018-02-07 07:27:09 -05001335#Line # read and write pixel values ##
1336##
Cary Clarka560c472017-11-27 10:44:06 -05001337
1338#Method bool peekPixels(SkPixmap* pixmap) const
Cary Clark78de7512018-02-07 07:27:09 -05001339#In Pixels
Cary Clark4855f782018-02-06 09:41:53 -05001340#Line # returns Pixmap if possible ##
Cary Clarkf5404bb2018-01-05 12:10:09 -05001341Copies Image pixel address, row bytes, and Image_Info to pixmap, if address
1342is available, and returns true. If pixel address is not available, return
1343false and leave pixmap unchanged.
Cary Clarka560c472017-11-27 10:44:06 -05001344
Cary Clarkf5404bb2018-01-05 12:10:09 -05001345#Param pixmap storage for pixel state if pixels are readable; otherwise, ignored ##
Cary Clarka560c472017-11-27 10:44:06 -05001346
Cary Clarkf5404bb2018-01-05 12:10:09 -05001347#Return true if Image has direct access to pixels ##
Cary Clarka560c472017-11-27 10:44:06 -05001348
1349#Example
Cary Clarkf5404bb2018-01-05 12:10:09 -05001350 SkBitmap bitmap;
1351 bitmap.allocPixels(SkImageInfo::MakeN32Premul(12, 11));
1352 SkCanvas offscreen(bitmap);
1353 offscreen.clear(SK_ColorWHITE);
1354 SkPaint paint;
1355 offscreen.drawString("%", 1, 10, paint);
1356 sk_sp<SkImage> image = SkImage::MakeFromBitmap(bitmap);
1357 SkPixmap pixmap;
1358 if (image->peekPixels(&pixmap)) {
1359 const SkPMColor* pixels = pixmap.addr32();
1360 SkPMColor pmWhite = pixels[0];
1361 for (int y = 0; y < image->height(); ++y) {
1362 for (int x = 0; x < image->width(); ++x) {
1363 SkDebugf("%c", *pixels++ == pmWhite ? '-' : 'x');
1364 }
1365 SkDebugf("\n");
1366 }
1367 }
1368#StdOut
1369------------
1370--xx----x---
1371-x--x--x----
1372-x--x--x----
1373-x--x-x-----
1374--xx-xx-xx--
1375-----x-x--x-
1376----x--x--x-
1377----x--x--x-
1378---x----xx--
1379------------
1380##
Cary Clarka560c472017-11-27 10:44:06 -05001381##
1382
Cary Clarkf5404bb2018-01-05 12:10:09 -05001383#SeeAlso readPixels
Cary Clarka560c472017-11-27 10:44:06 -05001384
1385#Method ##
1386
1387# ------------------------------------------------------------------------------
1388
1389#Method GrTexture* getTexture() const
Cary Clark682c58d2018-05-16 07:07:07 -04001390#Deprecated
Cary Clarka560c472017-11-27 10:44:06 -05001391#Method ##
1392
1393# ------------------------------------------------------------------------------
1394
1395#Method bool isTextureBacked() const
Cary Clark78de7512018-02-07 07:27:09 -05001396#In Property
Cary Clark4855f782018-02-06 09:41:53 -05001397#Line # returns if Image was created from GPU_Texture ##
Cary Clarkf5404bb2018-01-05 12:10:09 -05001398Returns true the contents of Image was created on or uploaded to GPU memory,
1399and is available as a GPU_Texture.
Cary Clarka560c472017-11-27 10:44:06 -05001400
Cary Clarkf5404bb2018-01-05 12:10:09 -05001401#Return true if Image is a GPU_Texture ##
Cary Clarka560c472017-11-27 10:44:06 -05001402
1403#Example
Cary Clarkf5404bb2018-01-05 12:10:09 -05001404#Image 5
1405#Platform gpu
1406auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {
1407 if (nullptr == image) {
1408 return;
1409 }
1410 SkPaint paint;
1411 paint.setAntiAlias(true);
Cary Clarkf5404bb2018-01-05 12:10:09 -05001412 canvas->drawImage(image, 0, 0);
Cary Clark14768f62018-10-29 20:33:51 -04001413 canvas->drawString(label, 30, image->height() / 4, paint);
Cary Clarkf5404bb2018-01-05 12:10:09 -05001414 canvas->drawString(image->isTextureBacked() ? "is GPU texture" : "not GPU texture",
Cary Clark14768f62018-10-29 20:33:51 -04001415 20, image->height() * 3 / 4, paint);
Cary Clarkf5404bb2018-01-05 12:10:09 -05001416};
1417sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
1418sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04001419 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
1420 kOpaque_SkAlphaType, nullptr));
Cary Clarkf5404bb2018-01-05 12:10:09 -05001421drawImage(image, "image");
1422canvas->translate(image->width(), 0);
1423drawImage(bitmapImage, "source");
1424canvas->translate(-image->width(), image->height());
1425drawImage(textureImage, "backEndTexture");
Cary Clarka560c472017-11-27 10:44:06 -05001426##
1427
Cary Clarkf5404bb2018-01-05 12:10:09 -05001428#SeeAlso MakeFromTexture isValid
Cary Clarka560c472017-11-27 10:44:06 -05001429
1430#Method ##
1431
1432# ------------------------------------------------------------------------------
1433
1434#Method bool isValid(GrContext* context) const
Cary Clark4855f782018-02-06 09:41:53 -05001435#In Property
1436#Line # returns if Image can draw to Raster_Surface or GPU_Context ##
Cary Clarkf5404bb2018-01-05 12:10:09 -05001437Returns true if Image can be drawn on either Raster_Surface or GPU_Surface.
1438If context is nullptr, tests if Image draws on Raster_Surface;
1439otherwise, tests if Image draws on GPU_Surface associated with context.
Cary Clarka560c472017-11-27 10:44:06 -05001440
Cary Clarkf5404bb2018-01-05 12:10:09 -05001441Image backed by GPU_Texture may become invalid if associated GrContext is
1442invalid. Lazy_Image may be invalid and may not draw to Raster_Surface or
1443GPU_Surface or both.
Cary Clarka560c472017-11-27 10:44:06 -05001444
Cary Clark61ca7c52018-01-02 11:34:14 -05001445#Param context GPU_Context ##
Cary Clarka560c472017-11-27 10:44:06 -05001446
Cary Clarkf5404bb2018-01-05 12:10:09 -05001447#Return true if Image can be drawn ##
Cary Clarka560c472017-11-27 10:44:06 -05001448
1449#Example
Cary Clarkf5404bb2018-01-05 12:10:09 -05001450#Image 5
1451#Platform gpu
1452auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {
1453 if (nullptr == image) {
1454 return;
1455 }
1456 SkPaint paint;
1457 paint.setAntiAlias(true);
Cary Clarkf5404bb2018-01-05 12:10:09 -05001458 canvas->drawImage(image, 0, 0);
1459 canvas->drawString(label, image->width() / 2, image->height() / 4, paint);
1460 if (canvas->getGrContext()) {
1461 canvas->drawString(image->isValid(canvas->getGrContext()) ? "is valid on GPU" :
Cary Clark14768f62018-10-29 20:33:51 -04001462 "not valid on GPU", 20, image->height() * 5 / 8, paint);
Cary Clarkf5404bb2018-01-05 12:10:09 -05001463 }
1464 canvas->drawString(image->isValid(nullptr) ? "is valid on CPU" :
Cary Clark14768f62018-10-29 20:33:51 -04001465 "not valid on CPU", 20, image->height() * 7 / 8, paint);
Cary Clarkf5404bb2018-01-05 12:10:09 -05001466};
1467sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
1468sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04001469 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
1470 kOpaque_SkAlphaType, nullptr));
Cary Clarkf5404bb2018-01-05 12:10:09 -05001471drawImage(image, "image");
1472canvas->translate(image->width(), 0);
1473drawImage(bitmapImage, "source");
1474canvas->translate(-image->width(), image->height());
1475drawImage(textureImage, "backEndTexture");
Cary Clarka560c472017-11-27 10:44:06 -05001476##
1477
Cary Clarkf5404bb2018-01-05 12:10:09 -05001478#SeeAlso isTextureBacked isLazyGenerated
Cary Clarka560c472017-11-27 10:44:06 -05001479
1480#Method ##
1481
1482# ------------------------------------------------------------------------------
1483
Robert Phillipsc5509952018-04-04 15:54:55 -04001484#Method GrBackendTexture getBackendTexture(bool flushPendingGrContextIO,
1485 GrSurfaceOrigin* origin = nullptr) const
1486#In Property
1487#Line # returns GPU reference to Image as texture ##
1488
Cary Clark682c58d2018-05-16 07:07:07 -04001489Retrieves the back-end texture. If Image has no back-end texture, an invalid
Cary Clarkba75aee2018-04-05 08:18:41 -04001490object is returned. Call GrBackendTexture::isValid to determine if the result
1491is valid.
1492
1493If flushPendingGrContextIO is true, completes deferred I/O operations.
Robert Phillipsc5509952018-04-04 15:54:55 -04001494
1495If origin in not nullptr, copies location of content drawn into Image.
1496
1497#Param flushPendingGrContextIO flag to flush outstanding requests ##
1498#Param origin storage for one of: kTopLeft_GrSurfaceOrigin,
1499 kBottomLeft_GrSurfaceOrigin; or nullptr
1500##
1501
Cary Clarkba75aee2018-04-05 08:18:41 -04001502#Return back-end API texture handle; invalid on failure ##
Robert Phillipsc5509952018-04-04 15:54:55 -04001503
Cary Clarkba75aee2018-04-05 08:18:41 -04001504#Example
1505#Image 3
1506#Platform gpu
Brian Osman584b5012018-04-13 15:48:26 -04001507 GrContext* grContext = canvas->getGrContext();
1508 if (!grContext) {
1509 canvas->drawString("GPU only!", 20, 40, SkPaint());
1510 return;
1511 }
1512 sk_sp<SkImage> imageFromBackend = SkImage::MakeFromAdoptedTexture(grContext, backEndTexture,
1513 kBottomLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType, kOpaque_SkAlphaType);
1514 GrBackendTexture textureFromImage = imageFromBackend->getBackendTexture(false);
1515 if (!textureFromImage.isValid()) {
1516 return;
1517 }
1518 sk_sp<SkImage> imageFromTexture = SkImage::MakeFromAdoptedTexture(grContext, textureFromImage,
1519 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType, kOpaque_SkAlphaType);
1520 canvas->drawImage(imageFromTexture, 0, 0);
Cary Clarkba75aee2018-04-05 08:18:41 -04001521 canvas->drawImage(imageFromBackend, 128, 128);
Robert Phillipsc5509952018-04-04 15:54:55 -04001522##
1523
1524#SeeAlso MakeFromTexture isTextureBacked
1525
1526#Method ##
1527
1528# ------------------------------------------------------------------------------
1529
Cary Clarka560c472017-11-27 10:44:06 -05001530#Enum CachingHint
Cary Clark682c58d2018-05-16 07:07:07 -04001531#Line # options for readPixels and scalePixels ##
Cary Clarka560c472017-11-27 10:44:06 -05001532#Code
Cary Clarka90ea222018-10-16 10:30:28 -04001533#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001534##
1535
Cary Clarkac47b882018-01-11 10:35:44 -05001536CachingHint selects whether Skia may internally cache Bitmaps generated by
1537decoding Image, or by copying Image from GPU to CPU. The default behavior
Cary Clark682c58d2018-05-16 07:07:07 -04001538allows caching Bitmaps.
Cary Clarkac47b882018-01-11 10:35:44 -05001539
1540Choose kDisallow_CachingHint if Image pixels are to be used only once, or
1541if Image pixels reside in a cache outside of Skia, or to reduce memory pressure.
1542
1543Choosing kAllow_CachingHint does not ensure that pixels will be cached.
1544Image pixels may not be cached if memory requirements are too large or
1545pixels are not accessible.
Cary Clarka560c472017-11-27 10:44:06 -05001546
1547#Const kAllow_CachingHint 0
Cary Clark682c58d2018-05-16 07:07:07 -04001548#Line # allows internally caching decoded and copied pixels ##
Cary Clarka560c472017-11-27 10:44:06 -05001549##
1550#Const kDisallow_CachingHint 1
Cary Clark682c58d2018-05-16 07:07:07 -04001551#Line # disallows internally caching decoded and copied pixels ##
Cary Clarka560c472017-11-27 10:44:06 -05001552##
1553
Cary Clarkac47b882018-01-11 10:35:44 -05001554#NoExample
Cary Clarka560c472017-11-27 10:44:06 -05001555##
1556
Cary Clarkac47b882018-01-11 10:35:44 -05001557#SeeAlso readPixels scalePixels
Cary Clarka560c472017-11-27 10:44:06 -05001558
1559#Enum ##
1560
1561# ------------------------------------------------------------------------------
1562
1563#Method bool readPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRowBytes,
1564 int srcX, int srcY, CachingHint cachingHint = kAllow_CachingHint) const
Cary Clark78de7512018-02-07 07:27:09 -05001565#In Pixels
Cary Clark4855f782018-02-06 09:41:53 -05001566#Line # copies and converts pixels ##
Cary Clarka560c472017-11-27 10:44:06 -05001567
Cary Clarkac47b882018-01-11 10:35:44 -05001568Copies Rect of pixels from Image to dstPixels. Copy starts at offset (srcX, srcY),
Cary Clark682c58d2018-05-16 07:07:07 -04001569and does not exceed Image (width(), height()).
Cary Clarkac47b882018-01-11 10:35:44 -05001570
1571dstInfo specifies width, height, Color_Type, Alpha_Type, and Color_Space of
1572destination. dstRowBytes specifics the gap from one destination row to the next.
1573Returns true if pixels are copied. Returns false if:
1574#List
1575# dstInfo.addr() equals nullptr ##
1576# dstRowBytes is less than dstInfo.minRowBytes ##
1577# Pixel_Ref is nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -05001578##
1579
Cary Clarkac47b882018-01-11 10:35:44 -05001580Pixels are copied only if pixel conversion is possible. If Image Color_Type is
1581kGray_8_SkColorType, or kAlpha_8_SkColorType; dstInfo.colorType must match.
1582If Image Color_Type is kGray_8_SkColorType, dstInfo.colorSpace must match.
1583If Image Alpha_Type is kOpaque_SkAlphaType, dstInfo.alphaType must
1584match. If Image Color_Space is nullptr, dstInfo.colorSpace must match. Returns
1585false if pixel conversion is not possible.
Cary Clarka560c472017-11-27 10:44:06 -05001586
Cary Clarkac47b882018-01-11 10:35:44 -05001587srcX and srcY may be negative to copy only top or left of source. Returns
Cary Clark682c58d2018-05-16 07:07:07 -04001588false if width() or height() is zero or negative.
Cary Clark2be81cf2018-09-13 12:04:30 -04001589Returns false if #Formula # abs(srcX) >= Image width() ##, or if #Formula # abs(srcY) >= Image height() ##.
Cary Clarka560c472017-11-27 10:44:06 -05001590
Cary Clarkac47b882018-01-11 10:35:44 -05001591If cachingHint is kAllow_CachingHint, pixels may be retained locally.
1592If cachingHint is kDisallow_CachingHint, pixels are not added to the local cache.
1593
1594#Param dstInfo destination width, height, Color_Type, Alpha_Type, Color_Space ##
1595#Param dstPixels destination pixel storage ##
1596#Param dstRowBytes destination row length ##
1597#Param srcX column index whose absolute value is less than width() ##
1598#Param srcY row index whose absolute value is less than height() ##
1599#Param cachingHint one of: kAllow_CachingHint, kDisallow_CachingHint ##
1600
1601#Return true if pixels are copied to dstPixels ##
Cary Clarka560c472017-11-27 10:44:06 -05001602
1603#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001604#Image 3
1605 canvas->scale(.5f, .5f);
1606 const int width = 32;
1607 const int height = 32;
1608 std::vector<int32_t> dstPixels;
1609 dstPixels.resize(height * width * 4);
1610 SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);
1611 for (int y = 0; y < 512; y += height ) {
1612 for (int x = 0; x < 512; x += width ) {
1613 if (image->readPixels(info, &dstPixels.front(), width * 4, x, y)) {
1614 SkPixmap dstPixmap(info, &dstPixels.front(), width * 4);
1615 SkBitmap bitmap;
1616 bitmap.installPixels(dstPixmap);
1617 canvas->drawBitmap(bitmap, 0, 0);
1618 }
1619 canvas->translate(48, 0);
1620 }
1621 canvas->translate(-16 * 48, 48);
1622 }
Cary Clarka560c472017-11-27 10:44:06 -05001623##
1624
Cary Clarkac47b882018-01-11 10:35:44 -05001625#SeeAlso scalePixels SkBitmap::readPixels SkPixmap::readPixels SkCanvas::readPixels SkSurface::readPixels
Cary Clarka560c472017-11-27 10:44:06 -05001626
1627#Method ##
1628
1629# ------------------------------------------------------------------------------
1630
1631#Method bool readPixels(const SkPixmap& dst, int srcX, int srcY,
1632 CachingHint cachingHint = kAllow_CachingHint) const
1633
Cary Clarkac47b882018-01-11 10:35:44 -05001634Copies a Rect of pixels from Image to dst. Copy starts at (srcX, srcY), and
Cary Clark682c58d2018-05-16 07:07:07 -04001635does not exceed Image (width(), height()).
Cary Clarka560c472017-11-27 10:44:06 -05001636
Cary Clarkac47b882018-01-11 10:35:44 -05001637dst specifies width, height, Color_Type, Alpha_Type, Color_Space, pixel storage,
1638and row bytes of destination. dst.rowBytes specifics the gap from one destination
1639row to the next. Returns true if pixels are copied. Returns false if:
1640#List
1641# dst pixel storage equals nullptr ##
1642# dst.rowBytes is less than SkImageInfo::minRowBytes ##
1643# Pixel_Ref is nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -05001644##
1645
Cary Clarkac47b882018-01-11 10:35:44 -05001646Pixels are copied only if pixel conversion is possible. If Image Color_Type is
1647kGray_8_SkColorType, or kAlpha_8_SkColorType; dst.colorType must match.
1648If Image Color_Type is kGray_8_SkColorType, dst.colorSpace must match.
1649If Image Alpha_Type is kOpaque_SkAlphaType, dst.alphaType must
1650match. If Image Color_Space is nullptr, dst.colorSpace must match. Returns
1651false if pixel conversion is not possible.
Cary Clark682c58d2018-05-16 07:07:07 -04001652
Cary Clarkac47b882018-01-11 10:35:44 -05001653srcX and srcY may be negative to copy only top or left of source. Returns
Cary Clark682c58d2018-05-16 07:07:07 -04001654false if width() or height() is zero or negative.
Cary Clark2be81cf2018-09-13 12:04:30 -04001655Returns false if #Formula # abs(srcX) >= Image width() ##, or if #Formula # abs(srcY) >= Image height() ##.
Cary Clarkac47b882018-01-11 10:35:44 -05001656
1657If cachingHint is kAllow_CachingHint, pixels may be retained locally.
1658If cachingHint is kDisallow_CachingHint, pixels are not added to the local cache.
1659
1660#Param dst destination Pixmap: Image_Info, pixels, row bytes ##
1661#Param srcX column index whose absolute value is less than width() ##
1662#Param srcY row index whose absolute value is less than height() ##
1663#Param cachingHint one of: kAllow_CachingHint, kDisallow_CachingHint ##
1664
1665#Return true if pixels are copied to dst ##
1666
1667#Example
1668#Image 3
1669 std::vector<int32_t> srcPixels;
1670 int rowBytes = image->width() * 4;
1671 int quarterWidth = image->width() / 4;
1672 int quarterHeight = image->height() / 4;
1673 srcPixels.resize(image->height() * rowBytes);
1674 for (int y = 0; y < 4; ++y) {
1675 for (int x = 0; x < 4; ++x) {
1676 SkPixmap pixmap(SkImageInfo::MakeN32Premul(quarterWidth, quarterHeight),
1677 &srcPixels.front() + x * image->height() * quarterWidth +
1678 y * quarterWidth, rowBytes);
1679 image->readPixels(pixmap, x * quarterWidth, y * quarterHeight);
1680 }
1681 }
1682 canvas->scale(.5f, .5f);
1683 SkBitmap bitmap;
1684 bitmap.installPixels(SkImageInfo::MakeN32Premul(image->width(), image->height()),
1685 &srcPixels.front(), rowBytes);
1686 canvas->drawBitmap(bitmap, 0, 0);
1687##
1688
1689#SeeAlso scalePixels SkBitmap::readPixels SkPixmap::readPixels SkCanvas::readPixels SkSurface::readPixels
Cary Clarka560c472017-11-27 10:44:06 -05001690
1691#Method ##
1692
1693# ------------------------------------------------------------------------------
1694
1695#Method bool scalePixels(const SkPixmap& dst, SkFilterQuality filterQuality,
1696 CachingHint cachingHint = kAllow_CachingHint) const
Cary Clark78de7512018-02-07 07:27:09 -05001697#In Pixels
Cary Clark4855f782018-02-06 09:41:53 -05001698#Line # scales and converts one Image to another ##
Cary Clarka560c472017-11-27 10:44:06 -05001699
Cary Clarkac47b882018-01-11 10:35:44 -05001700Copies Image to dst, scaling pixels to fit dst.width() and dst.height(), and
1701converting pixels to match dst.colorType and dst.alphaType. Returns true if
1702pixels are copied. Returns false if dst.addr() is nullptr, or dst.rowBytes is
1703less than dst SkImageInfo::minRowBytes.
Cary Clarka560c472017-11-27 10:44:06 -05001704
Cary Clarkac47b882018-01-11 10:35:44 -05001705Pixels are copied only if pixel conversion is possible. If Image Color_Type is
1706kGray_8_SkColorType, or kAlpha_8_SkColorType; dst.colorType must match.
1707If Image Color_Type is kGray_8_SkColorType, dst.colorSpace must match.
1708If Image Alpha_Type is kOpaque_SkAlphaType, dst.alphaType must
1709match. If Image Color_Space is nullptr, dst.colorSpace must match. Returns
1710false if pixel conversion is not possible.
Cary Clarka560c472017-11-27 10:44:06 -05001711
Cary Clarkac47b882018-01-11 10:35:44 -05001712Scales the image, with filterQuality, to match dst.width() and dst.height().
1713filterQuality kNone_SkFilterQuality is fastest, typically implemented with
1714Filter_Quality_Nearest_Neighbor. kLow_SkFilterQuality is typically implemented with
1715Filter_Quality_Bilerp. kMedium_SkFilterQuality is typically implemented with
1716Filter_Quality_Bilerp, and Filter_Quality_MipMap when size is reduced.
1717kHigh_SkFilterQuality is slowest, typically implemented with Filter_Quality_BiCubic.
1718
1719If cachingHint is kAllow_CachingHint, pixels may be retained locally.
1720If cachingHint is kDisallow_CachingHint, pixels are not added to the local cache.
1721
1722#Param dst destination Pixmap: Image_Info, pixels, row bytes ##
1723#Param filterQuality one of: kNone_SkFilterQuality, kLow_SkFilterQuality,
1724 kMedium_SkFilterQuality, kHigh_SkFilterQuality
1725##
1726#Param cachingHint one of: kAllow_CachingHint, kDisallow_CachingHint ##
1727
1728#Return true if pixels are scaled to fit dst ##
Cary Clarka560c472017-11-27 10:44:06 -05001729
1730#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001731#Image 3
1732#Height 128
1733 std::vector<int32_t> srcPixels;
1734 int quarterWidth = image->width() / 16;
1735 int rowBytes = quarterWidth * 4;
1736 int quarterHeight = image->height() / 16;
1737 srcPixels.resize(quarterHeight * rowBytes);
1738 SkPixmap pixmap(SkImageInfo::MakeN32Premul(quarterWidth, quarterHeight),
1739 &srcPixels.front(), rowBytes);
1740 canvas->scale(4, 4);
1741 SkFilterQuality qualities[] = { kNone_SkFilterQuality, kLow_SkFilterQuality,
1742 kMedium_SkFilterQuality, kHigh_SkFilterQuality };
1743 for (unsigned index = 0; index < SK_ARRAY_COUNT(qualities); ++index) {
1744 image->scalePixels(pixmap, qualities[index]);
1745 sk_sp<SkImage> filtered = SkImage::MakeFromRaster(pixmap, nullptr, nullptr);
1746 canvas->drawImage(filtered, 16 * index, 0);
1747 }
Cary Clarka560c472017-11-27 10:44:06 -05001748##
1749
Cary Clarkac47b882018-01-11 10:35:44 -05001750#SeeAlso SkCanvas::drawImage readPixels SkPixmap::scalePixels
Cary Clarka560c472017-11-27 10:44:06 -05001751
1752#Method ##
1753
1754# ------------------------------------------------------------------------------
1755
1756#Method sk_sp<SkData> encodeToData(SkEncodedImageFormat encodedImageFormat, int quality) const
Cary Clark78de7512018-02-07 07:27:09 -05001757#In Utility
Cary Clark4855f782018-02-06 09:41:53 -05001758#Line # returns encoded Image as SkData ##
Cary Clark682c58d2018-05-16 07:07:07 -04001759Encodes Image pixels, returning result as SkData.
Cary Clark2f466242017-12-11 16:03:17 -05001760
Cary Clarkac47b882018-01-11 10:35:44 -05001761Returns nullptr if encoding fails, or if encodedImageFormat is not supported.
Cary Clarka560c472017-11-27 10:44:06 -05001762
Cary Clarkac47b882018-01-11 10:35:44 -05001763Image encoding in a format requires both building with one or more of:
1764SK_HAS_JPEG_LIBRARY, SK_HAS_PNG_LIBRARY, SK_HAS_WEBP_LIBRARY; and platform support
1765for the encoded format.
1766
1767If SK_BUILD_FOR_MAC or SK_BUILD_FOR_IOS is defined, encodedImageFormat can
1768additionally be one of: SkEncodedImageFormat::kICO, SkEncodedImageFormat::kBMP,
1769SkEncodedImageFormat::kGIF.
1770
1771quality is a platform and format specific metric trading off size and encoding
1772error. When used, quality equaling 100 encodes with the least error. quality may
1773be ignored by the encoder.
1774
1775#Param encodedImageFormat one of: SkEncodedImageFormat::kJPEG, SkEncodedImageFormat::kPNG,
1776 SkEncodedImageFormat::kWEBP
1777 ##
1778#Param quality encoder specific metric with 100 equaling best ##
Cary Clarka560c472017-11-27 10:44:06 -05001779
Cary Clark2f466242017-12-11 16:03:17 -05001780#Return encoded Image, or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -05001781
1782#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001783#Image 3
1784 canvas->scale(4, 4);
1785 SkIRect subset = {0, 0, 16, 64};
1786 int x = 0;
1787 for (int quality : { 0, 10, 50, 100 } ) {
1788 sk_sp<SkData> data(image->encodeToData(SkEncodedImageFormat::kJPEG, quality));
1789 sk_sp<SkImage> filtered = SkImage::MakeFromEncoded(data, &subset);
1790 canvas->drawImage(filtered, x, 0);
1791 x += 16;
1792 }
Cary Clarka560c472017-11-27 10:44:06 -05001793##
1794
Cary Clarkac47b882018-01-11 10:35:44 -05001795#SeeAlso refEncodedData MakeFromEncoded
Cary Clarka560c472017-11-27 10:44:06 -05001796
1797#Method ##
1798
1799# ------------------------------------------------------------------------------
1800
Cary Clark61ca7c52018-01-02 11:34:14 -05001801#Method sk_sp<SkData> encodeToData() const
Cary Clarka560c472017-11-27 10:44:06 -05001802
Cary Clarkac47b882018-01-11 10:35:44 -05001803Encodes Image pixels, returning result as SkData. Returns existing encoded data
1804if present; otherwise, Image is encoded with SkEncodedImageFormat::kPNG. Skia
1805must be built with SK_HAS_PNG_LIBRARY to encode Image.
Cary Clarka560c472017-11-27 10:44:06 -05001806
Cary Clark682c58d2018-05-16 07:07:07 -04001807Returns nullptr if existing encoded data is missing or invalid, and
Cary Clarka560c472017-11-27 10:44:06 -05001808encoding fails.
1809
Cary Clarkac47b882018-01-11 10:35:44 -05001810#Return encoded Image, or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -05001811
1812#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001813#Image 3
1814 canvas->scale(4, 4);
1815 SkIRect subset = {136, 32, 200, 96};
1816 sk_sp<SkData> data(image->encodeToData());
1817 sk_sp<SkImage> eye = SkImage::MakeFromEncoded(data, &subset);
1818 canvas->drawImage(eye, 0, 0);
Cary Clarka560c472017-11-27 10:44:06 -05001819##
1820
Cary Clarkac47b882018-01-11 10:35:44 -05001821#SeeAlso refEncodedData MakeFromEncoded
Cary Clarka560c472017-11-27 10:44:06 -05001822
1823#Method ##
1824
1825# ------------------------------------------------------------------------------
1826
1827#Method sk_sp<SkData> refEncodedData() const
Cary Clark78de7512018-02-07 07:27:09 -05001828#In Utility
Cary Clark4855f782018-02-06 09:41:53 -05001829#Line # returns Image encoded in SkData if present ##
Cary Clarkac47b882018-01-11 10:35:44 -05001830Returns encoded Image pixels as SkData, if Image was created from supported
1831encoded stream format. Platform support for formats vary and may require building
1832with one or more of: SK_HAS_JPEG_LIBRARY, SK_HAS_PNG_LIBRARY, SK_HAS_WEBP_LIBRARY.
Cary Clarka560c472017-11-27 10:44:06 -05001833
Cary Clarkac47b882018-01-11 10:35:44 -05001834Returns nullptr if Image contents are not encoded.
Cary Clarka560c472017-11-27 10:44:06 -05001835
Cary Clarkac47b882018-01-11 10:35:44 -05001836#Return encoded Image, or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -05001837
1838#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001839#Image 3
1840#Platform gpu
1841 struct {
1842 const char* name;
1843 sk_sp<SkImage> image;
1844 } tests[] = { { "image", image }, { "bitmap", SkImage::MakeFromBitmap(source) },
1845 { "texture", SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04001846 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
1847 kOpaque_SkAlphaType, nullptr) } };
Cary Clarkac47b882018-01-11 10:35:44 -05001848 SkString string;
1849 SkPaint paint;
1850 for (const auto& test : tests ) {
1851 if (!test.image) {
1852 string.printf("no %s", test.name);
1853 } else {
1854 string.printf("%s" "encoded %s", test.image->refEncodedData() ? "" : "no ", test.name);
1855 }
1856 canvas->drawString(string, 10, 20, paint);
1857 canvas->translate(0, 20);
1858 }
Cary Clarka560c472017-11-27 10:44:06 -05001859##
1860
Cary Clarkac47b882018-01-11 10:35:44 -05001861#SeeAlso encodeToData MakeFromEncoded
Cary Clarka560c472017-11-27 10:44:06 -05001862
1863#Method ##
1864
1865# ------------------------------------------------------------------------------
Cary Clark4855f782018-02-06 09:41:53 -05001866#Subtopic Utility
Cary Clark4855f782018-02-06 09:41:53 -05001867#Line # rarely called management functions ##
1868##
Cary Clarka560c472017-11-27 10:44:06 -05001869
Cary Clarka560c472017-11-27 10:44:06 -05001870#Method sk_sp<SkImage> makeSubset(const SkIRect& subset) const
Cary Clark61313f32018-10-08 14:57:48 -04001871#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05001872#Line # creates Image containing part of original ##
Cary Clarkac47b882018-01-11 10:35:44 -05001873Returns subset of Image. subset must be fully contained by Image dimensions().
1874The implementation may share pixels, or may copy them.
Cary Clarka560c472017-11-27 10:44:06 -05001875
Cary Clarkac47b882018-01-11 10:35:44 -05001876Returns nullptr if subset is empty, or subset is not contained by bounds, or
1877pixels in Image could not be read or copied.
Cary Clarka560c472017-11-27 10:44:06 -05001878
Cary Clarkac47b882018-01-11 10:35:44 -05001879#Param subset bounds of returned Image ##
1880
1881#Return partial or full Image, or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -05001882
1883#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001884#Image 3
1885 canvas->scale(.5f, .5f);
Cary Clarkc30382f2018-07-24 08:09:27 -04001886 const int width = 64;
1887 const int height = 64;
Cary Clarkac47b882018-01-11 10:35:44 -05001888 for (int y = 0; y < 512; y += height ) {
1889 for (int x = 0; x < 512; x += width ) {
1890 sk_sp<SkImage> subset(image->makeSubset({x, y, x + width, y + height}));
1891 canvas->drawImage(subset, x * 3 / 2, y * 3 / 2);
1892 }
1893 }
Cary Clarka560c472017-11-27 10:44:06 -05001894##
1895
Cary Clarkac47b882018-01-11 10:35:44 -05001896#SeeAlso MakeFromEncoded
Cary Clarka560c472017-11-27 10:44:06 -05001897
1898#Method ##
1899
1900# ------------------------------------------------------------------------------
1901
Greg Daniel5f4b09d2018-06-12 16:39:59 -04001902#Method sk_sp<SkImage> makeTextureImage(GrContext* context, SkColorSpace* dstColorSpace,
1903 GrMipMapped mipMapped = GrMipMapped::kNo) const
Cary Clark61313f32018-10-08 14:57:48 -04001904#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05001905#Line # creates Image matching Color_Space if possible ##
Cary Clarkac47b882018-01-11 10:35:44 -05001906Returns Image backed by GPU_Texture associated with context. Returned Image is
Cary Clark5538c132018-06-14 12:28:14 -04001907compatible with Surface created with dstColorSpace. The returned Image respects
1908mipMapped setting; if mipMapped equals GrMipMapped::kYes, the backing texture
1909allocates Mip_Map levels. Returns original Image if context
1910and dstColorSpace match and mipMapped is compatible with backing GPU_Texture.
Cary Clarkac47b882018-01-11 10:35:44 -05001911
1912Returns nullptr if context is nullptr, or if Image was created with another
1913GrContext.
Cary Clarka560c472017-11-27 10:44:06 -05001914
Cary Clark61ca7c52018-01-02 11:34:14 -05001915#Param context GPU_Context ##
Cary Clarkac47b882018-01-11 10:35:44 -05001916#Param dstColorSpace range of colors of matching Surface on GPU ##
Cary Clark5538c132018-06-14 12:28:14 -04001917#Param mipMapped whether created Image texture must allocate Mip_Map levels ##
Cary Clarka560c472017-11-27 10:44:06 -05001918
Cary Clarkac47b882018-01-11 10:35:44 -05001919#Return created Image, or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -05001920
1921#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001922#Platform gpu
1923#Image 5
1924 auto drawImage = [=](sk_sp<SkImage> image, GrContext* context, const char* label) -> void {
1925 if (nullptr == image || nullptr == context) {
1926 return;
1927 }
1928 SkPaint paint;
1929 paint.setAntiAlias(true);
Cary Clarkac47b882018-01-11 10:35:44 -05001930 sk_sp<SkImage> texture(image->makeTextureImage(context, nullptr));
1931 canvas->drawImage(texture, 0, 0);
Cary Clark14768f62018-10-29 20:33:51 -04001932 canvas->drawString(label, 20, texture->height() / 4, paint);
Cary Clarkac47b882018-01-11 10:35:44 -05001933 };
1934 sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
1935 GrContext* context = canvas->getGrContext();
1936 sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(context, backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04001937 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
1938 kOpaque_SkAlphaType, nullptr));
Cary Clarkac47b882018-01-11 10:35:44 -05001939 drawImage(image, context, "image");
1940 canvas->translate(image->width(), 0);
1941 drawImage(bitmapImage, context, "source");
1942 canvas->translate(-image->width(), image->height());
1943 drawImage(textureImage, context, "backEndTexture");
Cary Clarka560c472017-11-27 10:44:06 -05001944##
1945
Cary Clarkac47b882018-01-11 10:35:44 -05001946#SeeAlso MakeFromTexture
Cary Clarka560c472017-11-27 10:44:06 -05001947
1948#Method ##
1949
1950# ------------------------------------------------------------------------------
1951
1952#Method sk_sp<SkImage> makeNonTextureImage() const
Cary Clark61313f32018-10-08 14:57:48 -04001953#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05001954#Line # creates Image without dependency on GPU_Texture ##
Cary Clarkac47b882018-01-11 10:35:44 -05001955Returns Raster_Image or Lazy_Image. Copies Image backed by GPU_Texture into
Cary Clark4855f782018-02-06 09:41:53 -05001956CPU memory if needed. Returns original Image if decoded in Raster_Bitmap,
Cary Clarkac47b882018-01-11 10:35:44 -05001957or if encoded in a stream.
Cary Clark61ca7c52018-01-02 11:34:14 -05001958
Cary Clarkac47b882018-01-11 10:35:44 -05001959Returns nullptr if backed by GPU_Texture and copy fails.
1960
1961#Return Raster_Image, Lazy_Image, or nullptr ##
Cary Clark61ca7c52018-01-02 11:34:14 -05001962
1963#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001964#Image 5
1965#Platform gpu
1966 auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {
1967 if (nullptr == image) {
1968 return;
1969 }
1970 SkPaint paint;
1971 paint.setAntiAlias(true);
Cary Clarkac47b882018-01-11 10:35:44 -05001972 sk_sp<SkImage> nonTexture(image->makeNonTextureImage());
1973 canvas->drawImage(nonTexture, 0, 0);
Cary Clark14768f62018-10-29 20:33:51 -04001974 canvas->drawString(label, 20, nonTexture->height() / 4, paint);
Cary Clarkac47b882018-01-11 10:35:44 -05001975 };
1976 sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
1977 sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04001978 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
1979 kOpaque_SkAlphaType, nullptr));
Cary Clarkac47b882018-01-11 10:35:44 -05001980 drawImage(image, "image");
1981 canvas->translate(image->width(), 0);
1982 drawImage(bitmapImage, "source");
1983 canvas->translate(-image->width(), image->height());
1984 drawImage(textureImage, "backEndTexture");
Cary Clark61ca7c52018-01-02 11:34:14 -05001985##
1986
Cary Clark56356312018-02-08 14:45:18 -05001987#SeeAlso makeTextureImage makeRasterImage MakeBackendTextureFromSkImage
Cary Clark61ca7c52018-01-02 11:34:14 -05001988
1989#Method ##
1990
1991# ------------------------------------------------------------------------------
1992
1993#Method sk_sp<SkImage> makeRasterImage() const
Cary Clark61313f32018-10-08 14:57:48 -04001994#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05001995#Line # creates Image compatible with Raster_Surface if possible ##
Cary Clarkac47b882018-01-11 10:35:44 -05001996Returns Raster_Image. Copies Image backed by GPU_Texture into CPU memory,
Cary Clark4855f782018-02-06 09:41:53 -05001997or decodes Image from Lazy_Image. Returns original Image if decoded in
Cary Clarkac47b882018-01-11 10:35:44 -05001998Raster_Bitmap.
Cary Clarka560c472017-11-27 10:44:06 -05001999
Cary Clarkac47b882018-01-11 10:35:44 -05002000Returns nullptr if copy, decode, or pixel read fails.
Cary Clarka560c472017-11-27 10:44:06 -05002001
Cary Clarkac47b882018-01-11 10:35:44 -05002002#Return Raster_Image, or nullptr ##
2003
Cary Clark4855f782018-02-06 09:41:53 -05002004#Bug 7479
Cary Clarka560c472017-11-27 10:44:06 -05002005#Example
Cary Clarkac47b882018-01-11 10:35:44 -05002006#Image 5
2007#Platform gpu
2008 auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {
2009 if (nullptr == image) {
2010 return;
2011 }
2012 SkPaint paint;
2013 paint.setAntiAlias(true);
Cary Clarkac47b882018-01-11 10:35:44 -05002014 sk_sp<SkImage> raster(image->makeRasterImage());
2015 canvas->drawImage(raster, 0, 0);
Cary Clark14768f62018-10-29 20:33:51 -04002016 canvas->drawString(label, 20, raster->height() / 4, paint);
Cary Clarkac47b882018-01-11 10:35:44 -05002017 };
2018 sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
2019 sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04002020 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
2021 kOpaque_SkAlphaType, nullptr));
Cary Clarkac47b882018-01-11 10:35:44 -05002022 drawImage(image, "image");
2023 canvas->translate(image->width(), 0);
2024 drawImage(bitmapImage, "source");
2025 canvas->translate(-image->width(), image->height());
2026 drawImage(textureImage, "backEndTexture");
Cary Clarka560c472017-11-27 10:44:06 -05002027##
2028
Cary Clarkac47b882018-01-11 10:35:44 -05002029#SeeAlso isTextureBacked isLazyGenerated MakeFromRaster
Cary Clarka560c472017-11-27 10:44:06 -05002030
2031#Method ##
2032
2033# ------------------------------------------------------------------------------
2034
2035#Method sk_sp<SkImage> makeWithFilter(const SkImageFilter* filter, const SkIRect& subset,
2036 const SkIRect& clipBounds, SkIRect* outSubset,
2037 SkIPoint* offset) const
Cary Clark61313f32018-10-08 14:57:48 -04002038#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05002039#Line # creates filtered, clipped Image ##
Cary Clarka560c472017-11-27 10:44:06 -05002040
Cary Clarkac47b882018-01-11 10:35:44 -05002041Creates filtered Image. filter processes original Image, potentially changing
2042color, position, and size. subset is the bounds of original Image processed
2043by filter. clipBounds is the expected bounds of the filtered Image. outSubset
2044is required storage for the actual bounds of the filtered Image. offset is
2045required storage for translation of returned Image.
Cary Clarka560c472017-11-27 10:44:06 -05002046
Cary Clarkac47b882018-01-11 10:35:44 -05002047Returns nullptr if Image could not be created. If nullptr is returned, outSubset
2048and offset are undefined.
2049
Cary Clark56356312018-02-08 14:45:18 -05002050Useful for animation of SkImageFilter that varies size from frame to frame.
2051Returned Image is created larger than required by filter so that GPU_Texture
2052can be reused with different sized effects. outSubset describes the valid bounds
2053of GPU_Texture returned. offset translates the returned Image to keep subsequent
2054animation frames aligned with respect to each other.
Cary Clarkac47b882018-01-11 10:35:44 -05002055
2056#Param filter how Image is sampled when transformed ##
Cary Clark56356312018-02-08 14:45:18 -05002057#Param subset bounds of Image processed by filter ##
2058#Param clipBounds expected bounds of filtered Image ##
2059#Param outSubset storage for returned Image bounds ##
2060#Param offset storage for returned Image translation ##
Cary Clarka560c472017-11-27 10:44:06 -05002061
Cary Clarkac47b882018-01-11 10:35:44 -05002062#Return filtered Image, or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -05002063
Cary Clark5717e822018-09-21 11:36:41 -04002064# Duration 5 breaks fiddlecli
Cary Clarka560c472017-11-27 10:44:06 -05002065#Example
Cary Clarkac47b882018-01-11 10:35:44 -05002066#Description
2067In each frame of the animation, filtered Image is drawn in a different location.
2068By translating canvas by returned offset, Image appears stationary.
2069##
2070#Image 5
2071#Platform gpu
Cary Clark5717e822018-09-21 11:36:41 -04002072#Duration 1
Cary Clarkac47b882018-01-11 10:35:44 -05002073 sk_sp<SkImageFilter> shadowFilter = SkDropShadowImageFilter::Make(
2074 -10.0f * frame, 5.0f * frame, 3.0f, 3.0f, SK_ColorBLUE,
2075 SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode,
2076 nullptr);
2077 sk_sp<SkImageFilter> offsetFilter = SkOffsetImageFilter::Make(40, 40, shadowFilter, nullptr);
2078 SkIRect subset = image->bounds();
2079 SkIRect clipBounds = image->bounds();
2080 clipBounds.outset(60, 60);
2081 SkIRect outSubset;
2082 SkIPoint offset;
2083 sk_sp<SkImage> filtered(image->makeWithFilter(offsetFilter.get(), subset, clipBounds,
2084 &outSubset, &offset));
2085 SkPaint paint;
2086 paint.setAntiAlias(true);
2087 paint.setStyle(SkPaint::kStroke_Style);
2088 canvas->drawLine(0, 0, offset.fX, offset.fY, paint);
2089 canvas->translate(offset.fX, offset.fY);
2090 canvas->drawImage(filtered, 0, 0);
Cary Clark681287e2018-03-16 11:34:15 -04002091 canvas->drawRect(SkRect::Make(outSubset), paint);
Cary Clarka560c472017-11-27 10:44:06 -05002092##
2093
Cary Clark56356312018-02-08 14:45:18 -05002094#SeeAlso makeShader SkPaint::setImageFilter
Cary Clarka560c472017-11-27 10:44:06 -05002095
2096#Method ##
2097
2098# ------------------------------------------------------------------------------
2099
Cary Clarka560c472017-11-27 10:44:06 -05002100#Typedef std::function<void(GrBackendTexture)> BackendTextureReleaseProc
Cary Clark682c58d2018-05-16 07:07:07 -04002101#Line # parameter type for MakeBackendTextureFromSkImage ##
Cary Clarkffb3d682018-05-17 12:17:28 -04002102
2103#Code
Cary Clarka90ea222018-10-16 10:30:28 -04002104#Populate
Cary Clarkffb3d682018-05-17 12:17:28 -04002105##
2106
Cary Clark0d225392018-06-07 09:59:07 -04002107Defines a callback function, taking one parameter of type GrBackendTexture with
2108no return value. Function is called when back-end texture is to be released.
Cary Clarka560c472017-11-27 10:44:06 -05002109##
2110
2111# ------------------------------------------------------------------------------
2112
2113#Method static bool MakeBackendTextureFromSkImage(GrContext* context,
2114 sk_sp<SkImage> image,
2115 GrBackendTexture* backendTexture,
2116 BackendTextureReleaseProc* backendTextureReleaseProc)
Cary Clark61313f32018-10-08 14:57:48 -04002117#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05002118#Line # creates GPU_Texture from Image ##
Cary Clarka560c472017-11-27 10:44:06 -05002119
Cary Clark56356312018-02-08 14:45:18 -05002120Creates a GrBackendTexture from the provided SkImage. Returns true and
2121stores result in backendTexture and backendTextureReleaseProc if
2122texture is created; otherwise, returns false and leaves
2123backendTexture and backendTextureReleaseProc unmodified.
Cary Clarka560c472017-11-27 10:44:06 -05002124
Cary Clark56356312018-02-08 14:45:18 -05002125Call backendTextureReleaseProc after deleting backendTexture.
2126backendTextureReleaseProc cleans up auxiliary data related to returned
2127backendTexture. The caller must delete returned backendTexture after use.
Cary Clarka560c472017-11-27 10:44:06 -05002128
Cary Clark56356312018-02-08 14:45:18 -05002129If Image is both texture backed and singly referenced, image is returned in
2130backendTexture without conversion or making a copy. Image is singly referenced
2131if its was transferred solely using std::move().
2132
2133If Image is not texture backed, returns texture with Image contents.
Cary Clarka560c472017-11-27 10:44:06 -05002134
Cary Clark61ca7c52018-01-02 11:34:14 -05002135#Param context GPU_Context ##
Cary Clark56356312018-02-08 14:45:18 -05002136#Param image Image used for texture ##
Cary Clark682c58d2018-05-16 07:07:07 -04002137#Param backendTexture storage for back-end texture ##
Cary Clark56356312018-02-08 14:45:18 -05002138#Param backendTextureReleaseProc storage for clean up function ##
Cary Clarka560c472017-11-27 10:44:06 -05002139
Cary Clark682c58d2018-05-16 07:07:07 -04002140#Return true if back-end texture was created ##
Cary Clarka560c472017-11-27 10:44:06 -05002141
2142#Example
Cary Clark56356312018-02-08 14:45:18 -05002143#Platform gpu
2144#Height 64
2145#Function
Brian Salomon67f85842018-02-09 08:50:22 -05002146static sk_sp<SkImage> create_gpu_image(GrContext* grContext) {
2147 const SkImageInfo info = SkImageInfo::MakeN32(20, 20, kOpaque_SkAlphaType);
2148 auto surface(SkSurface::MakeRenderTarget(grContext, SkBudgeted::kNo, info));
2149 SkCanvas* canvas = surface->getCanvas();
2150 canvas->clear(SK_ColorWHITE);
2151 SkPaint paint;
2152 paint.setColor(SK_ColorBLACK);
2153 canvas->drawRect(SkRect::MakeXYWH(5, 5, 10, 10), paint);
2154 return surface->makeImageSnapshot();
2155}
2156##
2157
Cary Clark682c58d2018-05-16 07:07:07 -04002158void draw(SkCanvas* canvas) {
Brian Salomon67f85842018-02-09 08:50:22 -05002159 GrContext* grContext = canvas->getGrContext();
2160 if (!grContext) {
2161 return;
2162 }
2163 sk_sp<SkImage> backEndImage = create_gpu_image(grContext);
2164 canvas->drawImage(backEndImage, 0, 0);
2165 GrBackendTexture texture;
2166 SkImage::BackendTextureReleaseProc proc;
2167 if (!SkImage::MakeBackendTextureFromSkImage(grContext, std::move(backEndImage),
2168 &texture, &proc)) {
2169 return;
2170 }
2171 sk_sp<SkImage> i2 = SkImage::MakeFromTexture(grContext, texture, kTopLeft_GrSurfaceOrigin,
2172 kN32_SkColorType, kOpaque_SkAlphaType, nullptr);
2173 canvas->drawImage(i2, 30, 30);
Cary Clark56356312018-02-08 14:45:18 -05002174}
Cary Clarka560c472017-11-27 10:44:06 -05002175##
2176
Cary Clark56356312018-02-08 14:45:18 -05002177#SeeAlso MakeFromTexture makeTextureImage
Cary Clarka560c472017-11-27 10:44:06 -05002178
2179#Method ##
2180
2181# ------------------------------------------------------------------------------
2182
2183#Enum LegacyBitmapMode
Cary Clark56356312018-02-08 14:45:18 -05002184#Deprecated soon
Cary Clarka560c472017-11-27 10:44:06 -05002185#Code
Cary Clarka90ea222018-10-16 10:30:28 -04002186#Populate
Cary Clarka560c472017-11-27 10:44:06 -05002187##
2188
Cary Clarka560c472017-11-27 10:44:06 -05002189#Const kRO_LegacyBitmapMode 0
Cary Clark682c58d2018-05-16 07:07:07 -04002190#Line # returned bitmap is read-only and immutable ##
Cary Clarka560c472017-11-27 10:44:06 -05002191##
Cary Clarka560c472017-11-27 10:44:06 -05002192
2193#Enum ##
2194
2195# ------------------------------------------------------------------------------
2196
Cary Clark56356312018-02-08 14:45:18 -05002197#Method bool asLegacyBitmap(SkBitmap* bitmap, LegacyBitmapMode legacyBitmapMode = kRO_LegacyBitmapMode) const
Cary Clark61313f32018-10-08 14:57:48 -04002198#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05002199#Line # returns as Raster_Bitmap ##
Cary Clarkac47b882018-01-11 10:35:44 -05002200Creates raster Bitmap with same pixels as Image. If legacyBitmapMode is
2201kRO_LegacyBitmapMode, returned bitmap is read-only and immutable.
2202Returns true if Bitmap is stored in bitmap. Returns false and resets bitmap if
2203Bitmap write did not succeed.
Cary Clarka560c472017-11-27 10:44:06 -05002204
Cary Clark3cd22cc2017-12-01 11:49:58 -05002205#Param bitmap storage for legacy Bitmap ##
Cary Clark56356312018-02-08 14:45:18 -05002206#Param legacyBitmapMode to be deprecated ##
Cary Clarka560c472017-11-27 10:44:06 -05002207
Cary Clark3cd22cc2017-12-01 11:49:58 -05002208#Return true if Bitmap was created ##
Cary Clarka560c472017-11-27 10:44:06 -05002209
Cary Clarkae957c42018-06-07 17:07:17 -04002210#Example
Cary Clark56356312018-02-08 14:45:18 -05002211#Image 4
2212#Platform gpu
Brian Salomon67f85842018-02-09 08:50:22 -05002213 SkBitmap bitImage;
2214 if (image->asLegacyBitmap(&bitImage, SkImage::kRO_LegacyBitmapMode)) {
2215 canvas->drawBitmap(bitImage, 0, 0);
2216 }
2217 GrContext* grContext = canvas->getGrContext();
2218 if (!grContext) {
2219 return;
2220 }
2221 sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(grContext, backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04002222 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
2223 kOpaque_SkAlphaType, nullptr));
Brian Salomon67f85842018-02-09 08:50:22 -05002224 canvas->drawImage(textureImage, 45, 45);
2225 if (textureImage->asLegacyBitmap(&bitImage, SkImage::kRO_LegacyBitmapMode)) {
2226 canvas->drawBitmap(bitImage, 90, 90);
2227 }
Cary Clarka560c472017-11-27 10:44:06 -05002228##
2229
Cary Clark56356312018-02-08 14:45:18 -05002230#SeeAlso MakeRasterData makeRasterImage makeNonTextureImage
Cary Clarka560c472017-11-27 10:44:06 -05002231
2232#Method ##
2233
2234# ------------------------------------------------------------------------------
2235
2236#Method bool isLazyGenerated() const
Cary Clark4855f782018-02-06 09:41:53 -05002237#In Property
2238#Line # returns if Image is created as needed ##
Cary Clarka560c472017-11-27 10:44:06 -05002239Returns true if Image is backed by an image-generator or other service that creates
2240and caches its pixels or texture on-demand.
2241
Cary Clark2f466242017-12-11 16:03:17 -05002242#Return true if Image is created as needed ##
Cary Clarka560c472017-11-27 10:44:06 -05002243
2244#Example
Cary Clark2f466242017-12-11 16:03:17 -05002245#Height 80
2246#Function
2247class TestImageGenerator : public SkImageGenerator {
2248public:
2249 TestImageGenerator() : SkImageGenerator(SkImageInfo::MakeN32Premul(10, 10)) {}
2250 ~TestImageGenerator() override {}
2251protected:
2252 bool onGetPixels(const SkImageInfo& info, void* pixelPtr, size_t rowBytes,
2253 const Options& options) override {
2254 SkPMColor* pixels = static_cast<SkPMColor*>(pixelPtr);
2255 for (int y = 0; y < info.height(); ++y) {
2256 for (int x = 0; x < info.width(); ++x) {
2257 pixels[y * info.width() + x] = 0xff223344 + y * 0x000C0811;
2258 }
2259 }
2260 return true;
2261 }
2262};
2263##
2264void draw(SkCanvas* canvas) {
2265 auto gen = std::unique_ptr<TestImageGenerator>(new TestImageGenerator());
2266 sk_sp<SkImage> image(SkImage::MakeFromGenerator(std::move(gen)));
2267 SkString lazy(image->isLazyGenerated() ? "is lazy" : "not lazy");
2268 canvas->scale(8, 8);
2269 canvas->drawImage(image, 0, 0, nullptr);
2270 SkPaint paint;
2271 paint.setTextSize(4);
2272 canvas->drawString(lazy, 2, 5, paint);
2273}
Cary Clarka560c472017-11-27 10:44:06 -05002274##
2275
Cary Clarkf5404bb2018-01-05 12:10:09 -05002276#Example
2277#Image 5
2278#Platform gpu
2279void draw(SkCanvas* canvas) {
2280 auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {
2281 if (nullptr == image) {
2282 return;
2283 }
2284 SkPaint paint;
2285 paint.setAntiAlias(true);
Cary Clarkf5404bb2018-01-05 12:10:09 -05002286 canvas->drawImage(image, 0, 0);
Cary Clark14768f62018-10-29 20:33:51 -04002287 canvas->drawString(label, 30, image->height() / 4, paint);
Cary Clarkf5404bb2018-01-05 12:10:09 -05002288 canvas->drawString(
2289 image->isLazyGenerated() ? "is lazily generated" : "not lazily generated",
Cary Clark14768f62018-10-29 20:33:51 -04002290 20, image->height() * 3 / 4, paint);
Cary Clarkf5404bb2018-01-05 12:10:09 -05002291 };
2292 sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
2293 sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04002294 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
2295 kOpaque_SkAlphaType, nullptr));
Cary Clarkf5404bb2018-01-05 12:10:09 -05002296 drawImage(image, "image");
2297 canvas->translate(image->width(), 0);
2298 drawImage(bitmapImage, "source");
2299 canvas->translate(-image->width(), image->height());
2300 drawImage(textureImage, "backEndTexture");
2301}
2302##
2303
Cary Clarkac47b882018-01-11 10:35:44 -05002304#SeeAlso isTextureBacked MakeNonTextureImage
Cary Clarka560c472017-11-27 10:44:06 -05002305
2306#Method ##
2307
2308# ------------------------------------------------------------------------------
2309
Cary Clarke80cd442018-07-17 13:19:56 -04002310#Method sk_sp<SkImage> makeColorSpace(sk_sp<SkColorSpace> target) const
Cary Clark61313f32018-10-08 14:57:48 -04002311#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05002312#Line # creates Image matching Color_Space if possible ##
Cary Clarka560c472017-11-27 10:44:06 -05002313
Cary Clarkac47b882018-01-11 10:35:44 -05002314Creates Image in target Color_Space.
2315Returns nullptr if Image could not be created.
Cary Clarka560c472017-11-27 10:44:06 -05002316
Cary Clarkac47b882018-01-11 10:35:44 -05002317Returns original Image if it is in target Color_Space.
2318Otherwise, converts pixels from Image Color_Space to target Color_Space.
2319If Image colorSpace returns nullptr, Image Color_Space is assumed to be sRGB.
2320
Cary Clarkac47b882018-01-11 10:35:44 -05002321#Param target Color_Space describing color range of returned Image ##
Cary Clarka560c472017-11-27 10:44:06 -05002322
Cary Clarkac47b882018-01-11 10:35:44 -05002323#Return created Image in target Color_Space ##
2324
2325#Example
2326#Image 5
2327#Set sRGB
2328 sk_sp<SkColorSpace> normalColorSpace = SkColorSpace::MakeRGB(
2329 SkColorSpace::kSRGB_RenderTargetGamma, SkColorSpace::kSRGB_Gamut);
2330 sk_sp<SkColorSpace> wackyColorSpace = normalColorSpace->makeColorSpin();
2331 for (auto colorSpace : { normalColorSpace, wackyColorSpace } ) {
Cary Clarkc3c1c312018-07-18 09:25:15 -04002332 sk_sp<SkImage> colorSpaced = image->makeColorSpace(colorSpace);
2333 canvas->drawImage(colorSpaced, 0, 0);
2334 canvas->translate(128, 0);
Cary Clarkac47b882018-01-11 10:35:44 -05002335 }
2336##
2337
2338#SeeAlso MakeFromPixture MakeFromTexture
Cary Clarka560c472017-11-27 10:44:06 -05002339
2340#Method ##
2341
2342#Class SkImage ##
2343
2344#Topic Image ##