blob: 7ca584ab43e5d8d0645414b99fb2b0c6ff6eea61 [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;
978 paint.setTextAlign(SkPaint::kCenter_Align);
979 canvas->drawLine(0, 10, image->width(), 10, paint);
980 canvas->drawString("width", image->width() / 2, 25, paint);
Cary Clarka560c472017-11-27 10:44:06 -0500981##
982
Cary Clark61ca7c52018-01-02 11:34:14 -0500983#SeeAlso dimensions() height()
Cary Clarka560c472017-11-27 10:44:06 -0500984
985#Method ##
986
987# ------------------------------------------------------------------------------
988
989#Method int height() const
Cary Clark4855f782018-02-06 09:41:53 -0500990#In Property
991#Line # returns pixel row count ##
Cary Clark2f466242017-12-11 16:03:17 -0500992Returns pixel row count.
993
Cary Clark61ca7c52018-01-02 11:34:14 -0500994#Return pixel height in Image ##
Cary Clarka560c472017-11-27 10:44:06 -0500995
996#Example
Cary Clark61ca7c52018-01-02 11:34:14 -0500997#Image 4
Cary Clarkac47b882018-01-11 10:35:44 -0500998#Height 96
Cary Clark61ca7c52018-01-02 11:34:14 -0500999 canvas->translate(10, 10);
1000 canvas->drawImage(image, 0, 0);
1001 canvas->translate(image->width(), 0);
1002 SkPaint paint;
1003 paint.setTextAlign(SkPaint::kCenter_Align);
1004 paint.setVerticalText(true);
1005 canvas->drawLine(10, 0, 10, image->height(), paint);
Cary Clarkac47b882018-01-11 10:35:44 -05001006 canvas->drawString("height", 25, image->height() / 2, paint);
1007##
Cary Clarka560c472017-11-27 10:44:06 -05001008
Cary Clark61ca7c52018-01-02 11:34:14 -05001009#SeeAlso dimensions() width()
Cary Clarka560c472017-11-27 10:44:06 -05001010
1011#Method ##
1012
1013# ------------------------------------------------------------------------------
1014
1015#Method SkISize dimensions() const
Cary Clark4855f782018-02-06 09:41:53 -05001016#In Property
1017#Line # returns width() and height() ##
Cary Clark681287e2018-03-16 11:34:15 -04001018
Cary Clark2f466242017-12-11 16:03:17 -05001019Returns ISize { width(), height() }.
1020
1021#Return integral size of width() and height() ##
Cary Clarka560c472017-11-27 10:44:06 -05001022
1023#Example
Cary Clark61ca7c52018-01-02 11:34:14 -05001024#Image 4
1025 SkISize dimensions = image->dimensions();
1026 SkIRect bounds = image->bounds();
1027 SkIRect dimensionsAsBounds = SkIRect::MakeSize(dimensions);
1028 SkDebugf("dimensionsAsBounds %c= bounds\n", dimensionsAsBounds == bounds ? '=' : '!');
Cary Clark681287e2018-03-16 11:34:15 -04001029#StdOut
1030dimensionsAsBounds == bounds
1031##
Cary Clarka560c472017-11-27 10:44:06 -05001032##
1033
Cary Clark61ca7c52018-01-02 11:34:14 -05001034#SeeAlso height() width() bounds()
Cary Clarka560c472017-11-27 10:44:06 -05001035
1036#Method ##
1037
1038# ------------------------------------------------------------------------------
1039
1040#Method SkIRect bounds() const
Cary Clark4855f782018-02-06 09:41:53 -05001041#In Property
1042#Line # returns width() and height() as Rectangle ##
Cary Clark2f466242017-12-11 16:03:17 -05001043Returns IRect { 0, 0, width(), height() }.
1044
1045#Return integral rectangle from origin to width() and height() ##
Cary Clarka560c472017-11-27 10:44:06 -05001046
1047#Example
Cary Clark61ca7c52018-01-02 11:34:14 -05001048#Height 128
1049#Image 4
Cary Clark61ca7c52018-01-02 11:34:14 -05001050 SkIRect bounds = image->bounds();
Cary Clarkac47b882018-01-11 10:35:44 -05001051 for (int x : { 0, bounds.width() } ) {
1052 for (int y : { 0, bounds.height() } ) {
Cary Clark61ca7c52018-01-02 11:34:14 -05001053 canvas->drawImage(image, x, y);
1054 }
1055 }
Cary Clarka560c472017-11-27 10:44:06 -05001056##
1057
Cary Clark682c58d2018-05-16 07:07:07 -04001058#SeeAlso dimensions()
Cary Clarka560c472017-11-27 10:44:06 -05001059
1060#Method ##
1061
1062# ------------------------------------------------------------------------------
1063
1064#Method uint32_t uniqueID() const
Cary Clark4855f782018-02-06 09:41:53 -05001065#In Property
Cary Clark682c58d2018-05-16 07:07:07 -04001066#Line # returns identifier for Image ##
Cary Clark61ca7c52018-01-02 11:34:14 -05001067Returns value unique to image. Image contents cannot change after Image is
1068created. Any operation to create a new Image will receive generate a new
1069unique number.
1070
1071#Return unique identifier ##
Cary Clarka560c472017-11-27 10:44:06 -05001072
1073#Example
Cary Clark61ca7c52018-01-02 11:34:14 -05001074#Image 5
1075#Height 156
1076 sk_sp<SkImage> subset = image->makeSubset({10, 20, 90, 100});
1077 canvas->drawImage(image, 0, 0);
1078 canvas->drawImage(subset, 128, 0);
1079 SkPaint paint;
1080 SkString s;
1081 s.printf("original id: %d", image->uniqueID());
1082 canvas->drawString(s, 20, image->height() + 20, paint);
1083 s.printf("subset id: %d", subset->uniqueID());
1084 canvas->drawString(s, 148, subset->height() + 20, paint);
Cary Clarka560c472017-11-27 10:44:06 -05001085##
1086
Cary Clark61ca7c52018-01-02 11:34:14 -05001087#SeeAlso isLazyGenerated
Cary Clarka560c472017-11-27 10:44:06 -05001088
1089#Method ##
1090
1091# ------------------------------------------------------------------------------
1092
1093#Method SkAlphaType alphaType() const
Cary Clark4855f782018-02-06 09:41:53 -05001094#In Property
1095#Line # returns Alpha_Type ##
Cary Clark681287e2018-03-16 11:34:15 -04001096Returns Alpha_Type, one of: #list_of_alpha_types#.
Cary Clark61ca7c52018-01-02 11:34:14 -05001097
1098Alpha_Type returned was a parameter to an Image constructor,
1099or was parsed from encoded data.
1100
1101#Return Alpha_Type in Image ##
Cary Clarka560c472017-11-27 10:44:06 -05001102
1103#Example
Cary Clark61ca7c52018-01-02 11:34:14 -05001104#Image 4
Cary Clarkac47b882018-01-11 10:35:44 -05001105#Height 96
Cary Clark61ca7c52018-01-02 11:34:14 -05001106 const char* alphaTypeStr[] = { "Unknown", "Opaque", "Premul", "Unpremul" };
1107 SkAlphaType alphaType = image->alphaType();
Cary Clarkac47b882018-01-11 10:35:44 -05001108 canvas->drawImage(image, 16, 0);
Cary Clarkffb3d682018-05-17 12:17:28 -04001109 canvas->drawString(alphaTypeStr[(int) alphaType], 20, image->height() + 20, SkPaint());
Cary Clarka560c472017-11-27 10:44:06 -05001110##
1111
Cary Clark61ca7c52018-01-02 11:34:14 -05001112#SeeAlso SkImageInfo::alphaType
Cary Clarka560c472017-11-27 10:44:06 -05001113
1114#Method ##
1115
1116# ------------------------------------------------------------------------------
1117
Greg Daniel56008aa2018-03-14 15:33:42 -04001118#Method SkColorType colorType() const
1119#In Property
1120#Line # returns Color_Type ##
1121
1122Returns Color_Type if known; otherwise, returns kUnknown_SkColorType.
1123
1124#Return Color_Type of Image ##
1125
1126#Example
Cary Clarkffb3d682018-05-17 12:17:28 -04001127#Image 4
1128#Height 96
1129 const char* colors[] = { "Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x",
1130 "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16" };
1131 SkColorType colorType = image->colorType();
1132 canvas->drawImage(image, 16, 0);
1133 canvas->drawString(colors[(int) colorType], 20, image->height() + 20, SkPaint());
Greg Daniel56008aa2018-03-14 15:33:42 -04001134##
1135
1136#SeeAlso SkImageInfo::colorType
1137
1138#Method ##
1139
1140# ------------------------------------------------------------------------------
1141
Cary Clarka560c472017-11-27 10:44:06 -05001142#Method SkColorSpace* colorSpace() const
Cary Clark4855f782018-02-06 09:41:53 -05001143#In Property
1144#Line # returns Color_Space ##
Cary Clark2f466242017-12-11 16:03:17 -05001145Returns Color_Space, the range of colors, associated with Image. The
1146reference count of Color_Space is unchanged. The returned Color_Space is
1147immutable.
Cary Clarka560c472017-11-27 10:44:06 -05001148
Cary Clark61dfc3a2018-01-03 08:37:53 -05001149Color_Space returned was passed to an Image constructor,
1150or was parsed from encoded data. Color_Space returned may be ignored when Image
1151is drawn, depending on the capabilities of the Surface receiving the drawing.
Cary Clark2f466242017-12-11 16:03:17 -05001152
1153#Return Color_Space in Image, or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -05001154
1155#Example
Cary Clark61dfc3a2018-01-03 08:37:53 -05001156#Image 3
1157#Set sRGB
1158 SkPixmap pixmap;
1159 source.peekPixels(&pixmap);
1160 canvas->scale(.25f, .25f);
1161 int y = 0;
1162 for (auto gamma : { SkColorSpace::kLinear_RenderTargetGamma,
1163 SkColorSpace::kSRGB_RenderTargetGamma } ) {
1164 int x = 0;
1165 sk_sp<SkColorSpace> colorSpace = SkColorSpace::MakeRGB(gamma, SkColorSpace::kSRGB_Gamut);
1166 for (int index = 0; index < 2; ++index) {
1167 pixmap.setColorSpace(colorSpace);
1168 sk_sp<SkImage> image = SkImage::MakeRasterCopy(pixmap);
1169 canvas->drawImage(image, x, y);
1170 colorSpace = image->colorSpace()->makeColorSpin();
1171 x += 512;
1172 }
1173 y += 512;
1174 }
Cary Clarka560c472017-11-27 10:44:06 -05001175##
1176
Cary Clark61dfc3a2018-01-03 08:37:53 -05001177#SeeAlso refColorSpace makeColorSpace
Cary Clarka560c472017-11-27 10:44:06 -05001178
1179#Method ##
1180
1181# ------------------------------------------------------------------------------
1182
1183#Method sk_sp<SkColorSpace> refColorSpace() const
Cary Clark4855f782018-02-06 09:41:53 -05001184#In Property
1185#Line # returns Image_Info Color_Space ##
Cary Clark61dfc3a2018-01-03 08:37:53 -05001186Returns a smart pointer to Color_Space, the range of colors, associated with
1187Image. The smart pointer tracks the number of objects sharing this
1188SkColorSpace reference so the memory is released when the owners destruct.
1189
1190The returned SkColorSpace is immutable.
1191
1192Color_Space returned was passed to an Image constructor,
1193or was parsed from encoded data. Color_Space returned may be ignored when Image
1194is drawn, depending on the capabilities of the Surface receiving the drawing.
1195
1196#Return Color_Space in Image, or nullptr, wrapped in a smart pointer ##
Cary Clarka560c472017-11-27 10:44:06 -05001197
1198#Example
Cary Clark61dfc3a2018-01-03 08:37:53 -05001199#Image 3
1200#Set sRGB
1201 SkPixmap pixmap;
1202 source.peekPixels(&pixmap);
1203 canvas->scale(.25f, .25f);
1204 int y = 0;
1205 for (auto gamma : { SkColorSpace::kLinear_RenderTargetGamma,
1206 SkColorSpace::kSRGB_RenderTargetGamma } ) {
1207 int x = 0;
1208 sk_sp<SkColorSpace> colorSpace = SkColorSpace::MakeRGB(gamma, SkColorSpace::kSRGB_Gamut);
1209 for (int index = 0; index < 2; ++index) {
1210 pixmap.setColorSpace(colorSpace);
1211 sk_sp<SkImage> image = SkImage::MakeRasterCopy(pixmap);
1212 canvas->drawImage(image, x, y);
1213 colorSpace = image->refColorSpace()->makeColorSpin();
1214 x += 512;
1215 }
1216 y += 512;
1217 }
Cary Clarka560c472017-11-27 10:44:06 -05001218##
1219
Cary Clark61dfc3a2018-01-03 08:37:53 -05001220#SeeAlso colorSpace makeColorSpace
Cary Clarka560c472017-11-27 10:44:06 -05001221
1222#Method ##
1223
1224# ------------------------------------------------------------------------------
1225
1226#Method bool isAlphaOnly() const
Cary Clark4855f782018-02-06 09:41:53 -05001227#In Property
1228#Line # returns if pixels represent a transparency mask ##
Cary Clark2f466242017-12-11 16:03:17 -05001229Returns true if Image pixels represent transparency only. If true, each pixel
1230is packed in 8 bits as defined by kAlpha_8_SkColorType.
Cary Clarka560c472017-11-27 10:44:06 -05001231
Cary Clark2f466242017-12-11 16:03:17 -05001232#Return true if pixels represent a transparency mask ##
Cary Clarka560c472017-11-27 10:44:06 -05001233
1234#Example
Cary Clark61dfc3a2018-01-03 08:37:53 -05001235 uint8_t pmColors = 0;
1236 sk_sp<SkImage> image = SkImage::MakeRasterCopy({SkImageInfo::MakeA8(1, 1), &pmColors, 1});
1237 SkDebugf("alphaOnly = %s\n", image->isAlphaOnly() ? "true" : "false");
1238#StdOut
1239alphaOnly = true
1240##
Cary Clarka560c472017-11-27 10:44:06 -05001241##
1242
Cary Clark61dfc3a2018-01-03 08:37:53 -05001243#SeeAlso alphaType isOpaque
Cary Clarka560c472017-11-27 10:44:06 -05001244
1245#Method ##
1246
1247# ------------------------------------------------------------------------------
1248
1249#Method bool isOpaque() const
Cary Clark4855f782018-02-06 09:41:53 -05001250#In Property
1251#Line # returns if Alpha_Type is kOpaque_SkAlphaType ##
Cary Clark61dfc3a2018-01-03 08:37:53 -05001252Returns true if pixels ignore their Alpha value and are treated as fully opaque.
Cary Clark2f466242017-12-11 16:03:17 -05001253
1254#Return true if Alpha_Type is kOpaque_SkAlphaType ##
Cary Clarka560c472017-11-27 10:44:06 -05001255
1256#Example
Cary Clark61dfc3a2018-01-03 08:37:53 -05001257 auto check_isopaque = [](const SkImageInfo& imageInfo) -> void {
1258 auto surface(SkSurface::MakeRaster(imageInfo));
1259 auto image(surface->makeImageSnapshot());
1260 SkDebugf("isOpaque = %s\n", image->isOpaque() ? "true" : "false");
1261 };
1262
1263 check_isopaque(SkImageInfo::MakeN32Premul(5, 5));
1264 check_isopaque(SkImageInfo::MakeN32(5, 5, kOpaque_SkAlphaType));
1265#StdOut
1266isOpaque = false
1267isOpaque = true
1268##
Cary Clarka560c472017-11-27 10:44:06 -05001269##
1270
Cary Clark61dfc3a2018-01-03 08:37:53 -05001271#SeeAlso alphaType isAlphaOnly
Cary Clarka560c472017-11-27 10:44:06 -05001272
1273#Method ##
1274
1275# ------------------------------------------------------------------------------
1276
1277#Method sk_sp<SkShader> makeShader(SkShader::TileMode tileMode1, SkShader::TileMode tileMode2,
1278 const SkMatrix* localMatrix = nullptr) const
Cary Clark61313f32018-10-08 14:57:48 -04001279#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05001280#Line # creates Shader, Paint element that can tile Image ##
Cary Clarka560c472017-11-27 10:44:06 -05001281
Cary Clark61dfc3a2018-01-03 08:37:53 -05001282Creates Shader from Image. Shader dimensions are taken from Image. Shader uses
1283SkShader::TileMode rules to fill drawn area outside Image. localMatrix permits
1284transforming Image before Canvas_Matrix is applied.
Cary Clarka560c472017-11-27 10:44:06 -05001285
Cary Clark5538c132018-06-14 12:28:14 -04001286#Param tileMode1 tiling on x-axis, one of: SkShader::kClamp_TileMode,
1287 SkShader::kRepeat_TileMode, SkShader::kMirror_TileMode
Cary Clark61dfc3a2018-01-03 08:37:53 -05001288##
Cary Clark5538c132018-06-14 12:28:14 -04001289#Param tileMode2 tiling on y-axis, one of: SkShader::kClamp_TileMode,
1290 SkShader::kRepeat_TileMode, SkShader::kMirror_TileMode
Cary Clark61dfc3a2018-01-03 08:37:53 -05001291##
1292#Param localMatrix Image transformation, or nullptr ##
1293
1294#Return Shader containing Image ##
Cary Clarka560c472017-11-27 10:44:06 -05001295
1296#Example
Cary Clark61dfc3a2018-01-03 08:37:53 -05001297#Image 4
1298SkMatrix matrix;
1299matrix.setRotate(45);
1300SkPaint paint;
1301paint.setShader(image->makeShader(SkShader::kRepeat_TileMode, SkShader::kMirror_TileMode,
1302 &matrix));
1303canvas->drawPaint(paint);
Cary Clarka560c472017-11-27 10:44:06 -05001304##
1305
Cary Clark61dfc3a2018-01-03 08:37:53 -05001306#SeeAlso scalePixels
Cary Clarka560c472017-11-27 10:44:06 -05001307
1308#Method ##
1309
1310# ------------------------------------------------------------------------------
1311
1312#Method sk_sp<SkShader> makeShader(const SkMatrix* localMatrix = nullptr) const
1313
Cary Clark61dfc3a2018-01-03 08:37:53 -05001314Creates Shader from Image. Shader dimensions are taken from Image. Shader uses
1315SkShader::kClamp_TileMode to fill drawn area outside Image. localMatrix permits
1316transforming Image before Canvas_Matrix is applied.
Cary Clarka560c472017-11-27 10:44:06 -05001317
Cary Clark61dfc3a2018-01-03 08:37:53 -05001318#Param localMatrix Image transformation, or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -05001319
Cary Clark61dfc3a2018-01-03 08:37:53 -05001320#Return Shader containing Image ##
Cary Clarka560c472017-11-27 10:44:06 -05001321
1322#Example
Cary Clark61dfc3a2018-01-03 08:37:53 -05001323#Image 5
1324SkMatrix matrix;
1325matrix.setRotate(45);
1326matrix.postTranslate(125, 30);
1327SkPaint paint;
1328paint.setShader(image->makeShader(&matrix));
1329canvas->drawPaint(paint);
Cary Clarka560c472017-11-27 10:44:06 -05001330##
1331
Cary Clarkf5404bb2018-01-05 12:10:09 -05001332#SeeAlso scalePixels
Cary Clarka560c472017-11-27 10:44:06 -05001333
1334#Method ##
1335
1336# ------------------------------------------------------------------------------
Cary Clark78de7512018-02-07 07:27:09 -05001337#Subtopic Pixels
Cary Clark78de7512018-02-07 07:27:09 -05001338#Line # read and write pixel values ##
1339##
Cary Clarka560c472017-11-27 10:44:06 -05001340
1341#Method bool peekPixels(SkPixmap* pixmap) const
Cary Clark78de7512018-02-07 07:27:09 -05001342#In Pixels
Cary Clark4855f782018-02-06 09:41:53 -05001343#Line # returns Pixmap if possible ##
Cary Clarkf5404bb2018-01-05 12:10:09 -05001344Copies Image pixel address, row bytes, and Image_Info to pixmap, if address
1345is available, and returns true. If pixel address is not available, return
1346false and leave pixmap unchanged.
Cary Clarka560c472017-11-27 10:44:06 -05001347
Cary Clarkf5404bb2018-01-05 12:10:09 -05001348#Param pixmap storage for pixel state if pixels are readable; otherwise, ignored ##
Cary Clarka560c472017-11-27 10:44:06 -05001349
Cary Clarkf5404bb2018-01-05 12:10:09 -05001350#Return true if Image has direct access to pixels ##
Cary Clarka560c472017-11-27 10:44:06 -05001351
1352#Example
Cary Clarkf5404bb2018-01-05 12:10:09 -05001353 SkBitmap bitmap;
1354 bitmap.allocPixels(SkImageInfo::MakeN32Premul(12, 11));
1355 SkCanvas offscreen(bitmap);
1356 offscreen.clear(SK_ColorWHITE);
1357 SkPaint paint;
1358 offscreen.drawString("%", 1, 10, paint);
1359 sk_sp<SkImage> image = SkImage::MakeFromBitmap(bitmap);
1360 SkPixmap pixmap;
1361 if (image->peekPixels(&pixmap)) {
1362 const SkPMColor* pixels = pixmap.addr32();
1363 SkPMColor pmWhite = pixels[0];
1364 for (int y = 0; y < image->height(); ++y) {
1365 for (int x = 0; x < image->width(); ++x) {
1366 SkDebugf("%c", *pixels++ == pmWhite ? '-' : 'x');
1367 }
1368 SkDebugf("\n");
1369 }
1370 }
1371#StdOut
1372------------
1373--xx----x---
1374-x--x--x----
1375-x--x--x----
1376-x--x-x-----
1377--xx-xx-xx--
1378-----x-x--x-
1379----x--x--x-
1380----x--x--x-
1381---x----xx--
1382------------
1383##
Cary Clarka560c472017-11-27 10:44:06 -05001384##
1385
Cary Clarkf5404bb2018-01-05 12:10:09 -05001386#SeeAlso readPixels
Cary Clarka560c472017-11-27 10:44:06 -05001387
1388#Method ##
1389
1390# ------------------------------------------------------------------------------
1391
1392#Method GrTexture* getTexture() const
Cary Clark682c58d2018-05-16 07:07:07 -04001393#Deprecated
Cary Clarka560c472017-11-27 10:44:06 -05001394#Method ##
1395
1396# ------------------------------------------------------------------------------
1397
1398#Method bool isTextureBacked() const
Cary Clark78de7512018-02-07 07:27:09 -05001399#In Property
Cary Clark4855f782018-02-06 09:41:53 -05001400#Line # returns if Image was created from GPU_Texture ##
Cary Clarkf5404bb2018-01-05 12:10:09 -05001401Returns true the contents of Image was created on or uploaded to GPU memory,
1402and is available as a GPU_Texture.
Cary Clarka560c472017-11-27 10:44:06 -05001403
Cary Clarkf5404bb2018-01-05 12:10:09 -05001404#Return true if Image is a GPU_Texture ##
Cary Clarka560c472017-11-27 10:44:06 -05001405
1406#Example
Cary Clarkf5404bb2018-01-05 12:10:09 -05001407#Image 5
1408#Platform gpu
1409auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {
1410 if (nullptr == image) {
1411 return;
1412 }
1413 SkPaint paint;
1414 paint.setAntiAlias(true);
1415 paint.setTextAlign(SkPaint::kCenter_Align);
1416 canvas->drawImage(image, 0, 0);
1417 canvas->drawString(label, image->width() / 2, image->height() / 4, paint);
1418 canvas->drawString(image->isTextureBacked() ? "is GPU texture" : "not GPU texture",
1419 image->width() / 2, image->height() * 3 / 4, paint);
1420};
1421sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
1422sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04001423 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
1424 kOpaque_SkAlphaType, nullptr));
Cary Clarkf5404bb2018-01-05 12:10:09 -05001425drawImage(image, "image");
1426canvas->translate(image->width(), 0);
1427drawImage(bitmapImage, "source");
1428canvas->translate(-image->width(), image->height());
1429drawImage(textureImage, "backEndTexture");
Cary Clarka560c472017-11-27 10:44:06 -05001430##
1431
Cary Clarkf5404bb2018-01-05 12:10:09 -05001432#SeeAlso MakeFromTexture isValid
Cary Clarka560c472017-11-27 10:44:06 -05001433
1434#Method ##
1435
1436# ------------------------------------------------------------------------------
1437
1438#Method bool isValid(GrContext* context) const
Cary Clark4855f782018-02-06 09:41:53 -05001439#In Property
1440#Line # returns if Image can draw to Raster_Surface or GPU_Context ##
Cary Clarkf5404bb2018-01-05 12:10:09 -05001441Returns true if Image can be drawn on either Raster_Surface or GPU_Surface.
1442If context is nullptr, tests if Image draws on Raster_Surface;
1443otherwise, tests if Image draws on GPU_Surface associated with context.
Cary Clarka560c472017-11-27 10:44:06 -05001444
Cary Clarkf5404bb2018-01-05 12:10:09 -05001445Image backed by GPU_Texture may become invalid if associated GrContext is
1446invalid. Lazy_Image may be invalid and may not draw to Raster_Surface or
1447GPU_Surface or both.
Cary Clarka560c472017-11-27 10:44:06 -05001448
Cary Clark61ca7c52018-01-02 11:34:14 -05001449#Param context GPU_Context ##
Cary Clarka560c472017-11-27 10:44:06 -05001450
Cary Clarkf5404bb2018-01-05 12:10:09 -05001451#Return true if Image can be drawn ##
Cary Clarka560c472017-11-27 10:44:06 -05001452
1453#Example
Cary Clarkf5404bb2018-01-05 12:10:09 -05001454#Image 5
1455#Platform gpu
1456auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {
1457 if (nullptr == image) {
1458 return;
1459 }
1460 SkPaint paint;
1461 paint.setAntiAlias(true);
1462 paint.setTextAlign(SkPaint::kCenter_Align);
1463 canvas->drawImage(image, 0, 0);
1464 canvas->drawString(label, image->width() / 2, image->height() / 4, paint);
1465 if (canvas->getGrContext()) {
1466 canvas->drawString(image->isValid(canvas->getGrContext()) ? "is valid on GPU" :
1467 "not valid on GPU", image->width() / 2, image->height() * 5 / 8, paint);
1468 }
1469 canvas->drawString(image->isValid(nullptr) ? "is valid on CPU" :
1470 "not valid on CPU", image->width() / 2, image->height() * 7 / 8, paint);
1471};
1472sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
1473sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04001474 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
1475 kOpaque_SkAlphaType, nullptr));
Cary Clarkf5404bb2018-01-05 12:10:09 -05001476drawImage(image, "image");
1477canvas->translate(image->width(), 0);
1478drawImage(bitmapImage, "source");
1479canvas->translate(-image->width(), image->height());
1480drawImage(textureImage, "backEndTexture");
Cary Clarka560c472017-11-27 10:44:06 -05001481##
1482
Cary Clarkf5404bb2018-01-05 12:10:09 -05001483#SeeAlso isTextureBacked isLazyGenerated
Cary Clarka560c472017-11-27 10:44:06 -05001484
1485#Method ##
1486
1487# ------------------------------------------------------------------------------
1488
Robert Phillipsc5509952018-04-04 15:54:55 -04001489#Method GrBackendTexture getBackendTexture(bool flushPendingGrContextIO,
1490 GrSurfaceOrigin* origin = nullptr) const
1491#In Property
1492#Line # returns GPU reference to Image as texture ##
1493
Cary Clark682c58d2018-05-16 07:07:07 -04001494Retrieves the back-end texture. If Image has no back-end texture, an invalid
Cary Clarkba75aee2018-04-05 08:18:41 -04001495object is returned. Call GrBackendTexture::isValid to determine if the result
1496is valid.
1497
1498If flushPendingGrContextIO is true, completes deferred I/O operations.
Robert Phillipsc5509952018-04-04 15:54:55 -04001499
1500If origin in not nullptr, copies location of content drawn into Image.
1501
1502#Param flushPendingGrContextIO flag to flush outstanding requests ##
1503#Param origin storage for one of: kTopLeft_GrSurfaceOrigin,
1504 kBottomLeft_GrSurfaceOrigin; or nullptr
1505##
1506
Cary Clarkba75aee2018-04-05 08:18:41 -04001507#Return back-end API texture handle; invalid on failure ##
Robert Phillipsc5509952018-04-04 15:54:55 -04001508
Cary Clarkba75aee2018-04-05 08:18:41 -04001509#Example
1510#Image 3
1511#Platform gpu
Brian Osman584b5012018-04-13 15:48:26 -04001512 GrContext* grContext = canvas->getGrContext();
1513 if (!grContext) {
1514 canvas->drawString("GPU only!", 20, 40, SkPaint());
1515 return;
1516 }
1517 sk_sp<SkImage> imageFromBackend = SkImage::MakeFromAdoptedTexture(grContext, backEndTexture,
1518 kBottomLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType, kOpaque_SkAlphaType);
1519 GrBackendTexture textureFromImage = imageFromBackend->getBackendTexture(false);
1520 if (!textureFromImage.isValid()) {
1521 return;
1522 }
1523 sk_sp<SkImage> imageFromTexture = SkImage::MakeFromAdoptedTexture(grContext, textureFromImage,
1524 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType, kOpaque_SkAlphaType);
1525 canvas->drawImage(imageFromTexture, 0, 0);
Cary Clarkba75aee2018-04-05 08:18:41 -04001526 canvas->drawImage(imageFromBackend, 128, 128);
Robert Phillipsc5509952018-04-04 15:54:55 -04001527##
1528
1529#SeeAlso MakeFromTexture isTextureBacked
1530
1531#Method ##
1532
1533# ------------------------------------------------------------------------------
1534
Cary Clarka560c472017-11-27 10:44:06 -05001535#Enum CachingHint
Cary Clark682c58d2018-05-16 07:07:07 -04001536#Line # options for readPixels and scalePixels ##
Cary Clarka560c472017-11-27 10:44:06 -05001537#Code
Cary Clarka90ea222018-10-16 10:30:28 -04001538#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001539##
1540
Cary Clarkac47b882018-01-11 10:35:44 -05001541CachingHint selects whether Skia may internally cache Bitmaps generated by
1542decoding Image, or by copying Image from GPU to CPU. The default behavior
Cary Clark682c58d2018-05-16 07:07:07 -04001543allows caching Bitmaps.
Cary Clarkac47b882018-01-11 10:35:44 -05001544
1545Choose kDisallow_CachingHint if Image pixels are to be used only once, or
1546if Image pixels reside in a cache outside of Skia, or to reduce memory pressure.
1547
1548Choosing kAllow_CachingHint does not ensure that pixels will be cached.
1549Image pixels may not be cached if memory requirements are too large or
1550pixels are not accessible.
Cary Clarka560c472017-11-27 10:44:06 -05001551
1552#Const kAllow_CachingHint 0
Cary Clark682c58d2018-05-16 07:07:07 -04001553#Line # allows internally caching decoded and copied pixels ##
Cary Clarka560c472017-11-27 10:44:06 -05001554##
1555#Const kDisallow_CachingHint 1
Cary Clark682c58d2018-05-16 07:07:07 -04001556#Line # disallows internally caching decoded and copied pixels ##
Cary Clarka560c472017-11-27 10:44:06 -05001557##
1558
Cary Clarkac47b882018-01-11 10:35:44 -05001559#NoExample
Cary Clarka560c472017-11-27 10:44:06 -05001560##
1561
Cary Clarkac47b882018-01-11 10:35:44 -05001562#SeeAlso readPixels scalePixels
Cary Clarka560c472017-11-27 10:44:06 -05001563
1564#Enum ##
1565
1566# ------------------------------------------------------------------------------
1567
1568#Method bool readPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRowBytes,
1569 int srcX, int srcY, CachingHint cachingHint = kAllow_CachingHint) const
Cary Clark78de7512018-02-07 07:27:09 -05001570#In Pixels
Cary Clark4855f782018-02-06 09:41:53 -05001571#Line # copies and converts pixels ##
Cary Clarka560c472017-11-27 10:44:06 -05001572
Cary Clarkac47b882018-01-11 10:35:44 -05001573Copies Rect of pixels from Image to dstPixels. Copy starts at offset (srcX, srcY),
Cary Clark682c58d2018-05-16 07:07:07 -04001574and does not exceed Image (width(), height()).
Cary Clarkac47b882018-01-11 10:35:44 -05001575
1576dstInfo specifies width, height, Color_Type, Alpha_Type, and Color_Space of
1577destination. dstRowBytes specifics the gap from one destination row to the next.
1578Returns true if pixels are copied. Returns false if:
1579#List
1580# dstInfo.addr() equals nullptr ##
1581# dstRowBytes is less than dstInfo.minRowBytes ##
1582# Pixel_Ref is nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -05001583##
1584
Cary Clarkac47b882018-01-11 10:35:44 -05001585Pixels are copied only if pixel conversion is possible. If Image Color_Type is
1586kGray_8_SkColorType, or kAlpha_8_SkColorType; dstInfo.colorType must match.
1587If Image Color_Type is kGray_8_SkColorType, dstInfo.colorSpace must match.
1588If Image Alpha_Type is kOpaque_SkAlphaType, dstInfo.alphaType must
1589match. If Image Color_Space is nullptr, dstInfo.colorSpace must match. Returns
1590false if pixel conversion is not possible.
Cary Clarka560c472017-11-27 10:44:06 -05001591
Cary Clarkac47b882018-01-11 10:35:44 -05001592srcX and srcY may be negative to copy only top or left of source. Returns
Cary Clark682c58d2018-05-16 07:07:07 -04001593false if width() or height() is zero or negative.
Cary Clark2be81cf2018-09-13 12:04:30 -04001594Returns false if #Formula # abs(srcX) >= Image width() ##, or if #Formula # abs(srcY) >= Image height() ##.
Cary Clarka560c472017-11-27 10:44:06 -05001595
Cary Clarkac47b882018-01-11 10:35:44 -05001596If cachingHint is kAllow_CachingHint, pixels may be retained locally.
1597If cachingHint is kDisallow_CachingHint, pixels are not added to the local cache.
1598
1599#Param dstInfo destination width, height, Color_Type, Alpha_Type, Color_Space ##
1600#Param dstPixels destination pixel storage ##
1601#Param dstRowBytes destination row length ##
1602#Param srcX column index whose absolute value is less than width() ##
1603#Param srcY row index whose absolute value is less than height() ##
1604#Param cachingHint one of: kAllow_CachingHint, kDisallow_CachingHint ##
1605
1606#Return true if pixels are copied to dstPixels ##
Cary Clarka560c472017-11-27 10:44:06 -05001607
1608#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001609#Image 3
1610 canvas->scale(.5f, .5f);
1611 const int width = 32;
1612 const int height = 32;
1613 std::vector<int32_t> dstPixels;
1614 dstPixels.resize(height * width * 4);
1615 SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);
1616 for (int y = 0; y < 512; y += height ) {
1617 for (int x = 0; x < 512; x += width ) {
1618 if (image->readPixels(info, &dstPixels.front(), width * 4, x, y)) {
1619 SkPixmap dstPixmap(info, &dstPixels.front(), width * 4);
1620 SkBitmap bitmap;
1621 bitmap.installPixels(dstPixmap);
1622 canvas->drawBitmap(bitmap, 0, 0);
1623 }
1624 canvas->translate(48, 0);
1625 }
1626 canvas->translate(-16 * 48, 48);
1627 }
Cary Clarka560c472017-11-27 10:44:06 -05001628##
1629
Cary Clarkac47b882018-01-11 10:35:44 -05001630#SeeAlso scalePixels SkBitmap::readPixels SkPixmap::readPixels SkCanvas::readPixels SkSurface::readPixels
Cary Clarka560c472017-11-27 10:44:06 -05001631
1632#Method ##
1633
1634# ------------------------------------------------------------------------------
1635
1636#Method bool readPixels(const SkPixmap& dst, int srcX, int srcY,
1637 CachingHint cachingHint = kAllow_CachingHint) const
1638
Cary Clarkac47b882018-01-11 10:35:44 -05001639Copies a Rect of pixels from Image to dst. Copy starts at (srcX, srcY), and
Cary Clark682c58d2018-05-16 07:07:07 -04001640does not exceed Image (width(), height()).
Cary Clarka560c472017-11-27 10:44:06 -05001641
Cary Clarkac47b882018-01-11 10:35:44 -05001642dst specifies width, height, Color_Type, Alpha_Type, Color_Space, pixel storage,
1643and row bytes of destination. dst.rowBytes specifics the gap from one destination
1644row to the next. Returns true if pixels are copied. Returns false if:
1645#List
1646# dst pixel storage equals nullptr ##
1647# dst.rowBytes is less than SkImageInfo::minRowBytes ##
1648# Pixel_Ref is nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -05001649##
1650
Cary Clarkac47b882018-01-11 10:35:44 -05001651Pixels are copied only if pixel conversion is possible. If Image Color_Type is
1652kGray_8_SkColorType, or kAlpha_8_SkColorType; dst.colorType must match.
1653If Image Color_Type is kGray_8_SkColorType, dst.colorSpace must match.
1654If Image Alpha_Type is kOpaque_SkAlphaType, dst.alphaType must
1655match. If Image Color_Space is nullptr, dst.colorSpace must match. Returns
1656false if pixel conversion is not possible.
Cary Clark682c58d2018-05-16 07:07:07 -04001657
Cary Clarkac47b882018-01-11 10:35:44 -05001658srcX and srcY may be negative to copy only top or left of source. Returns
Cary Clark682c58d2018-05-16 07:07:07 -04001659false if width() or height() is zero or negative.
Cary Clark2be81cf2018-09-13 12:04:30 -04001660Returns false if #Formula # abs(srcX) >= Image width() ##, or if #Formula # abs(srcY) >= Image height() ##.
Cary Clarkac47b882018-01-11 10:35:44 -05001661
1662If cachingHint is kAllow_CachingHint, pixels may be retained locally.
1663If cachingHint is kDisallow_CachingHint, pixels are not added to the local cache.
1664
1665#Param dst destination Pixmap: Image_Info, pixels, row bytes ##
1666#Param srcX column index whose absolute value is less than width() ##
1667#Param srcY row index whose absolute value is less than height() ##
1668#Param cachingHint one of: kAllow_CachingHint, kDisallow_CachingHint ##
1669
1670#Return true if pixels are copied to dst ##
1671
1672#Example
1673#Image 3
1674 std::vector<int32_t> srcPixels;
1675 int rowBytes = image->width() * 4;
1676 int quarterWidth = image->width() / 4;
1677 int quarterHeight = image->height() / 4;
1678 srcPixels.resize(image->height() * rowBytes);
1679 for (int y = 0; y < 4; ++y) {
1680 for (int x = 0; x < 4; ++x) {
1681 SkPixmap pixmap(SkImageInfo::MakeN32Premul(quarterWidth, quarterHeight),
1682 &srcPixels.front() + x * image->height() * quarterWidth +
1683 y * quarterWidth, rowBytes);
1684 image->readPixels(pixmap, x * quarterWidth, y * quarterHeight);
1685 }
1686 }
1687 canvas->scale(.5f, .5f);
1688 SkBitmap bitmap;
1689 bitmap.installPixels(SkImageInfo::MakeN32Premul(image->width(), image->height()),
1690 &srcPixels.front(), rowBytes);
1691 canvas->drawBitmap(bitmap, 0, 0);
1692##
1693
1694#SeeAlso scalePixels SkBitmap::readPixels SkPixmap::readPixels SkCanvas::readPixels SkSurface::readPixels
Cary Clarka560c472017-11-27 10:44:06 -05001695
1696#Method ##
1697
1698# ------------------------------------------------------------------------------
1699
1700#Method bool scalePixels(const SkPixmap& dst, SkFilterQuality filterQuality,
1701 CachingHint cachingHint = kAllow_CachingHint) const
Cary Clark78de7512018-02-07 07:27:09 -05001702#In Pixels
Cary Clark4855f782018-02-06 09:41:53 -05001703#Line # scales and converts one Image to another ##
Cary Clarka560c472017-11-27 10:44:06 -05001704
Cary Clarkac47b882018-01-11 10:35:44 -05001705Copies Image to dst, scaling pixels to fit dst.width() and dst.height(), and
1706converting pixels to match dst.colorType and dst.alphaType. Returns true if
1707pixels are copied. Returns false if dst.addr() is nullptr, or dst.rowBytes is
1708less than dst SkImageInfo::minRowBytes.
Cary Clarka560c472017-11-27 10:44:06 -05001709
Cary Clarkac47b882018-01-11 10:35:44 -05001710Pixels are copied only if pixel conversion is possible. If Image Color_Type is
1711kGray_8_SkColorType, or kAlpha_8_SkColorType; dst.colorType must match.
1712If Image Color_Type is kGray_8_SkColorType, dst.colorSpace must match.
1713If Image Alpha_Type is kOpaque_SkAlphaType, dst.alphaType must
1714match. If Image Color_Space is nullptr, dst.colorSpace must match. Returns
1715false if pixel conversion is not possible.
Cary Clarka560c472017-11-27 10:44:06 -05001716
Cary Clarkac47b882018-01-11 10:35:44 -05001717Scales the image, with filterQuality, to match dst.width() and dst.height().
1718filterQuality kNone_SkFilterQuality is fastest, typically implemented with
1719Filter_Quality_Nearest_Neighbor. kLow_SkFilterQuality is typically implemented with
1720Filter_Quality_Bilerp. kMedium_SkFilterQuality is typically implemented with
1721Filter_Quality_Bilerp, and Filter_Quality_MipMap when size is reduced.
1722kHigh_SkFilterQuality is slowest, typically implemented with Filter_Quality_BiCubic.
1723
1724If cachingHint is kAllow_CachingHint, pixels may be retained locally.
1725If cachingHint is kDisallow_CachingHint, pixels are not added to the local cache.
1726
1727#Param dst destination Pixmap: Image_Info, pixels, row bytes ##
1728#Param filterQuality one of: kNone_SkFilterQuality, kLow_SkFilterQuality,
1729 kMedium_SkFilterQuality, kHigh_SkFilterQuality
1730##
1731#Param cachingHint one of: kAllow_CachingHint, kDisallow_CachingHint ##
1732
1733#Return true if pixels are scaled to fit dst ##
Cary Clarka560c472017-11-27 10:44:06 -05001734
1735#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001736#Image 3
1737#Height 128
1738 std::vector<int32_t> srcPixels;
1739 int quarterWidth = image->width() / 16;
1740 int rowBytes = quarterWidth * 4;
1741 int quarterHeight = image->height() / 16;
1742 srcPixels.resize(quarterHeight * rowBytes);
1743 SkPixmap pixmap(SkImageInfo::MakeN32Premul(quarterWidth, quarterHeight),
1744 &srcPixels.front(), rowBytes);
1745 canvas->scale(4, 4);
1746 SkFilterQuality qualities[] = { kNone_SkFilterQuality, kLow_SkFilterQuality,
1747 kMedium_SkFilterQuality, kHigh_SkFilterQuality };
1748 for (unsigned index = 0; index < SK_ARRAY_COUNT(qualities); ++index) {
1749 image->scalePixels(pixmap, qualities[index]);
1750 sk_sp<SkImage> filtered = SkImage::MakeFromRaster(pixmap, nullptr, nullptr);
1751 canvas->drawImage(filtered, 16 * index, 0);
1752 }
Cary Clarka560c472017-11-27 10:44:06 -05001753##
1754
Cary Clarkac47b882018-01-11 10:35:44 -05001755#SeeAlso SkCanvas::drawImage readPixels SkPixmap::scalePixels
Cary Clarka560c472017-11-27 10:44:06 -05001756
1757#Method ##
1758
1759# ------------------------------------------------------------------------------
1760
1761#Method sk_sp<SkData> encodeToData(SkEncodedImageFormat encodedImageFormat, int quality) const
Cary Clark78de7512018-02-07 07:27:09 -05001762#In Utility
Cary Clark4855f782018-02-06 09:41:53 -05001763#Line # returns encoded Image as SkData ##
Cary Clark682c58d2018-05-16 07:07:07 -04001764Encodes Image pixels, returning result as SkData.
Cary Clark2f466242017-12-11 16:03:17 -05001765
Cary Clarkac47b882018-01-11 10:35:44 -05001766Returns nullptr if encoding fails, or if encodedImageFormat is not supported.
Cary Clarka560c472017-11-27 10:44:06 -05001767
Cary Clarkac47b882018-01-11 10:35:44 -05001768Image encoding in a format requires both building with one or more of:
1769SK_HAS_JPEG_LIBRARY, SK_HAS_PNG_LIBRARY, SK_HAS_WEBP_LIBRARY; and platform support
1770for the encoded format.
1771
1772If SK_BUILD_FOR_MAC or SK_BUILD_FOR_IOS is defined, encodedImageFormat can
1773additionally be one of: SkEncodedImageFormat::kICO, SkEncodedImageFormat::kBMP,
1774SkEncodedImageFormat::kGIF.
1775
1776quality is a platform and format specific metric trading off size and encoding
1777error. When used, quality equaling 100 encodes with the least error. quality may
1778be ignored by the encoder.
1779
1780#Param encodedImageFormat one of: SkEncodedImageFormat::kJPEG, SkEncodedImageFormat::kPNG,
1781 SkEncodedImageFormat::kWEBP
1782 ##
1783#Param quality encoder specific metric with 100 equaling best ##
Cary Clarka560c472017-11-27 10:44:06 -05001784
Cary Clark2f466242017-12-11 16:03:17 -05001785#Return encoded Image, or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -05001786
1787#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001788#Image 3
1789 canvas->scale(4, 4);
1790 SkIRect subset = {0, 0, 16, 64};
1791 int x = 0;
1792 for (int quality : { 0, 10, 50, 100 } ) {
1793 sk_sp<SkData> data(image->encodeToData(SkEncodedImageFormat::kJPEG, quality));
1794 sk_sp<SkImage> filtered = SkImage::MakeFromEncoded(data, &subset);
1795 canvas->drawImage(filtered, x, 0);
1796 x += 16;
1797 }
Cary Clarka560c472017-11-27 10:44:06 -05001798##
1799
Cary Clarkac47b882018-01-11 10:35:44 -05001800#SeeAlso refEncodedData MakeFromEncoded
Cary Clarka560c472017-11-27 10:44:06 -05001801
1802#Method ##
1803
1804# ------------------------------------------------------------------------------
1805
Cary Clark61ca7c52018-01-02 11:34:14 -05001806#Method sk_sp<SkData> encodeToData() const
Cary Clarka560c472017-11-27 10:44:06 -05001807
Cary Clarkac47b882018-01-11 10:35:44 -05001808Encodes Image pixels, returning result as SkData. Returns existing encoded data
1809if present; otherwise, Image is encoded with SkEncodedImageFormat::kPNG. Skia
1810must be built with SK_HAS_PNG_LIBRARY to encode Image.
Cary Clarka560c472017-11-27 10:44:06 -05001811
Cary Clark682c58d2018-05-16 07:07:07 -04001812Returns nullptr if existing encoded data is missing or invalid, and
Cary Clarka560c472017-11-27 10:44:06 -05001813encoding fails.
1814
Cary Clarkac47b882018-01-11 10:35:44 -05001815#Return encoded Image, or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -05001816
1817#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001818#Image 3
1819 canvas->scale(4, 4);
1820 SkIRect subset = {136, 32, 200, 96};
1821 sk_sp<SkData> data(image->encodeToData());
1822 sk_sp<SkImage> eye = SkImage::MakeFromEncoded(data, &subset);
1823 canvas->drawImage(eye, 0, 0);
Cary Clarka560c472017-11-27 10:44:06 -05001824##
1825
Cary Clarkac47b882018-01-11 10:35:44 -05001826#SeeAlso refEncodedData MakeFromEncoded
Cary Clarka560c472017-11-27 10:44:06 -05001827
1828#Method ##
1829
1830# ------------------------------------------------------------------------------
1831
1832#Method sk_sp<SkData> refEncodedData() const
Cary Clark78de7512018-02-07 07:27:09 -05001833#In Utility
Cary Clark4855f782018-02-06 09:41:53 -05001834#Line # returns Image encoded in SkData if present ##
Cary Clarkac47b882018-01-11 10:35:44 -05001835Returns encoded Image pixels as SkData, if Image was created from supported
1836encoded stream format. Platform support for formats vary and may require building
1837with one or more of: SK_HAS_JPEG_LIBRARY, SK_HAS_PNG_LIBRARY, SK_HAS_WEBP_LIBRARY.
Cary Clarka560c472017-11-27 10:44:06 -05001838
Cary Clarkac47b882018-01-11 10:35:44 -05001839Returns nullptr if Image contents are not encoded.
Cary Clarka560c472017-11-27 10:44:06 -05001840
Cary Clarkac47b882018-01-11 10:35:44 -05001841#Return encoded Image, or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -05001842
1843#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001844#Image 3
1845#Platform gpu
1846 struct {
1847 const char* name;
1848 sk_sp<SkImage> image;
1849 } tests[] = { { "image", image }, { "bitmap", SkImage::MakeFromBitmap(source) },
1850 { "texture", SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04001851 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
1852 kOpaque_SkAlphaType, nullptr) } };
Cary Clarkac47b882018-01-11 10:35:44 -05001853 SkString string;
1854 SkPaint paint;
1855 for (const auto& test : tests ) {
1856 if (!test.image) {
1857 string.printf("no %s", test.name);
1858 } else {
1859 string.printf("%s" "encoded %s", test.image->refEncodedData() ? "" : "no ", test.name);
1860 }
1861 canvas->drawString(string, 10, 20, paint);
1862 canvas->translate(0, 20);
1863 }
Cary Clarka560c472017-11-27 10:44:06 -05001864##
1865
Cary Clarkac47b882018-01-11 10:35:44 -05001866#SeeAlso encodeToData MakeFromEncoded
Cary Clarka560c472017-11-27 10:44:06 -05001867
1868#Method ##
1869
1870# ------------------------------------------------------------------------------
Cary Clark4855f782018-02-06 09:41:53 -05001871#Subtopic Utility
Cary Clark4855f782018-02-06 09:41:53 -05001872#Line # rarely called management functions ##
1873##
Cary Clarka560c472017-11-27 10:44:06 -05001874
Cary Clarka560c472017-11-27 10:44:06 -05001875#Method sk_sp<SkImage> makeSubset(const SkIRect& subset) const
Cary Clark61313f32018-10-08 14:57:48 -04001876#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05001877#Line # creates Image containing part of original ##
Cary Clarkac47b882018-01-11 10:35:44 -05001878Returns subset of Image. subset must be fully contained by Image dimensions().
1879The implementation may share pixels, or may copy them.
Cary Clarka560c472017-11-27 10:44:06 -05001880
Cary Clarkac47b882018-01-11 10:35:44 -05001881Returns nullptr if subset is empty, or subset is not contained by bounds, or
1882pixels in Image could not be read or copied.
Cary Clarka560c472017-11-27 10:44:06 -05001883
Cary Clarkac47b882018-01-11 10:35:44 -05001884#Param subset bounds of returned Image ##
1885
1886#Return partial or full Image, or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -05001887
1888#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001889#Image 3
1890 canvas->scale(.5f, .5f);
Cary Clarkc30382f2018-07-24 08:09:27 -04001891 const int width = 64;
1892 const int height = 64;
Cary Clarkac47b882018-01-11 10:35:44 -05001893 for (int y = 0; y < 512; y += height ) {
1894 for (int x = 0; x < 512; x += width ) {
1895 sk_sp<SkImage> subset(image->makeSubset({x, y, x + width, y + height}));
1896 canvas->drawImage(subset, x * 3 / 2, y * 3 / 2);
1897 }
1898 }
Cary Clarka560c472017-11-27 10:44:06 -05001899##
1900
Cary Clarkac47b882018-01-11 10:35:44 -05001901#SeeAlso MakeFromEncoded
Cary Clarka560c472017-11-27 10:44:06 -05001902
1903#Method ##
1904
1905# ------------------------------------------------------------------------------
1906
Greg Daniel5f4b09d2018-06-12 16:39:59 -04001907#Method sk_sp<SkImage> makeTextureImage(GrContext* context, SkColorSpace* dstColorSpace,
1908 GrMipMapped mipMapped = GrMipMapped::kNo) const
Cary Clark61313f32018-10-08 14:57:48 -04001909#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05001910#Line # creates Image matching Color_Space if possible ##
Cary Clarkac47b882018-01-11 10:35:44 -05001911Returns Image backed by GPU_Texture associated with context. Returned Image is
Cary Clark5538c132018-06-14 12:28:14 -04001912compatible with Surface created with dstColorSpace. The returned Image respects
1913mipMapped setting; if mipMapped equals GrMipMapped::kYes, the backing texture
1914allocates Mip_Map levels. Returns original Image if context
1915and dstColorSpace match and mipMapped is compatible with backing GPU_Texture.
Cary Clarkac47b882018-01-11 10:35:44 -05001916
1917Returns nullptr if context is nullptr, or if Image was created with another
1918GrContext.
Cary Clarka560c472017-11-27 10:44:06 -05001919
Cary Clark61ca7c52018-01-02 11:34:14 -05001920#Param context GPU_Context ##
Cary Clarkac47b882018-01-11 10:35:44 -05001921#Param dstColorSpace range of colors of matching Surface on GPU ##
Cary Clark5538c132018-06-14 12:28:14 -04001922#Param mipMapped whether created Image texture must allocate Mip_Map levels ##
Cary Clarka560c472017-11-27 10:44:06 -05001923
Cary Clarkac47b882018-01-11 10:35:44 -05001924#Return created Image, or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -05001925
1926#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001927#Platform gpu
1928#Image 5
1929 auto drawImage = [=](sk_sp<SkImage> image, GrContext* context, const char* label) -> void {
1930 if (nullptr == image || nullptr == context) {
1931 return;
1932 }
1933 SkPaint paint;
1934 paint.setAntiAlias(true);
1935 paint.setTextAlign(SkPaint::kCenter_Align);
1936 sk_sp<SkImage> texture(image->makeTextureImage(context, nullptr));
1937 canvas->drawImage(texture, 0, 0);
1938 canvas->drawString(label, texture->width() / 2, texture->height() / 4, paint);
1939 };
1940 sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
1941 GrContext* context = canvas->getGrContext();
1942 sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(context, backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04001943 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
1944 kOpaque_SkAlphaType, nullptr));
Cary Clarkac47b882018-01-11 10:35:44 -05001945 drawImage(image, context, "image");
1946 canvas->translate(image->width(), 0);
1947 drawImage(bitmapImage, context, "source");
1948 canvas->translate(-image->width(), image->height());
1949 drawImage(textureImage, context, "backEndTexture");
Cary Clarka560c472017-11-27 10:44:06 -05001950##
1951
Cary Clarkac47b882018-01-11 10:35:44 -05001952#SeeAlso MakeFromTexture
Cary Clarka560c472017-11-27 10:44:06 -05001953
1954#Method ##
1955
1956# ------------------------------------------------------------------------------
1957
1958#Method sk_sp<SkImage> makeNonTextureImage() const
Cary Clark61313f32018-10-08 14:57:48 -04001959#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05001960#Line # creates Image without dependency on GPU_Texture ##
Cary Clarkac47b882018-01-11 10:35:44 -05001961Returns Raster_Image or Lazy_Image. Copies Image backed by GPU_Texture into
Cary Clark4855f782018-02-06 09:41:53 -05001962CPU memory if needed. Returns original Image if decoded in Raster_Bitmap,
Cary Clarkac47b882018-01-11 10:35:44 -05001963or if encoded in a stream.
Cary Clark61ca7c52018-01-02 11:34:14 -05001964
Cary Clarkac47b882018-01-11 10:35:44 -05001965Returns nullptr if backed by GPU_Texture and copy fails.
1966
1967#Return Raster_Image, Lazy_Image, or nullptr ##
Cary Clark61ca7c52018-01-02 11:34:14 -05001968
1969#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001970#Image 5
1971#Platform gpu
1972 auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {
1973 if (nullptr == image) {
1974 return;
1975 }
1976 SkPaint paint;
1977 paint.setAntiAlias(true);
1978 paint.setTextAlign(SkPaint::kCenter_Align);
1979 sk_sp<SkImage> nonTexture(image->makeNonTextureImage());
1980 canvas->drawImage(nonTexture, 0, 0);
1981 canvas->drawString(label, nonTexture->width() / 2, nonTexture->height() / 4, paint);
1982 };
1983 sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
1984 sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04001985 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
1986 kOpaque_SkAlphaType, nullptr));
Cary Clarkac47b882018-01-11 10:35:44 -05001987 drawImage(image, "image");
1988 canvas->translate(image->width(), 0);
1989 drawImage(bitmapImage, "source");
1990 canvas->translate(-image->width(), image->height());
1991 drawImage(textureImage, "backEndTexture");
Cary Clark61ca7c52018-01-02 11:34:14 -05001992##
1993
Cary Clark56356312018-02-08 14:45:18 -05001994#SeeAlso makeTextureImage makeRasterImage MakeBackendTextureFromSkImage
Cary Clark61ca7c52018-01-02 11:34:14 -05001995
1996#Method ##
1997
1998# ------------------------------------------------------------------------------
1999
2000#Method sk_sp<SkImage> makeRasterImage() const
Cary Clark61313f32018-10-08 14:57:48 -04002001#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05002002#Line # creates Image compatible with Raster_Surface if possible ##
Cary Clarkac47b882018-01-11 10:35:44 -05002003Returns Raster_Image. Copies Image backed by GPU_Texture into CPU memory,
Cary Clark4855f782018-02-06 09:41:53 -05002004or decodes Image from Lazy_Image. Returns original Image if decoded in
Cary Clarkac47b882018-01-11 10:35:44 -05002005Raster_Bitmap.
Cary Clarka560c472017-11-27 10:44:06 -05002006
Cary Clarkac47b882018-01-11 10:35:44 -05002007Returns nullptr if copy, decode, or pixel read fails.
Cary Clarka560c472017-11-27 10:44:06 -05002008
Cary Clarkac47b882018-01-11 10:35:44 -05002009#Return Raster_Image, or nullptr ##
2010
Cary Clark4855f782018-02-06 09:41:53 -05002011#Bug 7479
Cary Clarka560c472017-11-27 10:44:06 -05002012#Example
Cary Clarkac47b882018-01-11 10:35:44 -05002013#Image 5
2014#Platform gpu
2015 auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {
2016 if (nullptr == image) {
2017 return;
2018 }
2019 SkPaint paint;
2020 paint.setAntiAlias(true);
2021 paint.setTextAlign(SkPaint::kCenter_Align);
2022 sk_sp<SkImage> raster(image->makeRasterImage());
2023 canvas->drawImage(raster, 0, 0);
2024 canvas->drawString(label, raster->width() / 2, raster->height() / 4, paint);
2025 };
2026 sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
2027 sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04002028 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
2029 kOpaque_SkAlphaType, nullptr));
Cary Clarkac47b882018-01-11 10:35:44 -05002030 drawImage(image, "image");
2031 canvas->translate(image->width(), 0);
2032 drawImage(bitmapImage, "source");
2033 canvas->translate(-image->width(), image->height());
2034 drawImage(textureImage, "backEndTexture");
Cary Clarka560c472017-11-27 10:44:06 -05002035##
2036
Cary Clarkac47b882018-01-11 10:35:44 -05002037#SeeAlso isTextureBacked isLazyGenerated MakeFromRaster
Cary Clarka560c472017-11-27 10:44:06 -05002038
2039#Method ##
2040
2041# ------------------------------------------------------------------------------
2042
2043#Method sk_sp<SkImage> makeWithFilter(const SkImageFilter* filter, const SkIRect& subset,
2044 const SkIRect& clipBounds, SkIRect* outSubset,
2045 SkIPoint* offset) const
Cary Clark61313f32018-10-08 14:57:48 -04002046#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05002047#Line # creates filtered, clipped Image ##
Cary Clarka560c472017-11-27 10:44:06 -05002048
Cary Clarkac47b882018-01-11 10:35:44 -05002049Creates filtered Image. filter processes original Image, potentially changing
2050color, position, and size. subset is the bounds of original Image processed
2051by filter. clipBounds is the expected bounds of the filtered Image. outSubset
2052is required storage for the actual bounds of the filtered Image. offset is
2053required storage for translation of returned Image.
Cary Clarka560c472017-11-27 10:44:06 -05002054
Cary Clarkac47b882018-01-11 10:35:44 -05002055Returns nullptr if Image could not be created. If nullptr is returned, outSubset
2056and offset are undefined.
2057
Cary Clark56356312018-02-08 14:45:18 -05002058Useful for animation of SkImageFilter that varies size from frame to frame.
2059Returned Image is created larger than required by filter so that GPU_Texture
2060can be reused with different sized effects. outSubset describes the valid bounds
2061of GPU_Texture returned. offset translates the returned Image to keep subsequent
2062animation frames aligned with respect to each other.
Cary Clarkac47b882018-01-11 10:35:44 -05002063
2064#Param filter how Image is sampled when transformed ##
Cary Clark56356312018-02-08 14:45:18 -05002065#Param subset bounds of Image processed by filter ##
2066#Param clipBounds expected bounds of filtered Image ##
2067#Param outSubset storage for returned Image bounds ##
2068#Param offset storage for returned Image translation ##
Cary Clarka560c472017-11-27 10:44:06 -05002069
Cary Clarkac47b882018-01-11 10:35:44 -05002070#Return filtered Image, or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -05002071
Cary Clark5717e822018-09-21 11:36:41 -04002072# Duration 5 breaks fiddlecli
Cary Clarka560c472017-11-27 10:44:06 -05002073#Example
Cary Clarkac47b882018-01-11 10:35:44 -05002074#Description
2075In each frame of the animation, filtered Image is drawn in a different location.
2076By translating canvas by returned offset, Image appears stationary.
2077##
2078#Image 5
2079#Platform gpu
Cary Clark5717e822018-09-21 11:36:41 -04002080#Duration 1
Cary Clarkac47b882018-01-11 10:35:44 -05002081 sk_sp<SkImageFilter> shadowFilter = SkDropShadowImageFilter::Make(
2082 -10.0f * frame, 5.0f * frame, 3.0f, 3.0f, SK_ColorBLUE,
2083 SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode,
2084 nullptr);
2085 sk_sp<SkImageFilter> offsetFilter = SkOffsetImageFilter::Make(40, 40, shadowFilter, nullptr);
2086 SkIRect subset = image->bounds();
2087 SkIRect clipBounds = image->bounds();
2088 clipBounds.outset(60, 60);
2089 SkIRect outSubset;
2090 SkIPoint offset;
2091 sk_sp<SkImage> filtered(image->makeWithFilter(offsetFilter.get(), subset, clipBounds,
2092 &outSubset, &offset));
2093 SkPaint paint;
2094 paint.setAntiAlias(true);
2095 paint.setStyle(SkPaint::kStroke_Style);
2096 canvas->drawLine(0, 0, offset.fX, offset.fY, paint);
2097 canvas->translate(offset.fX, offset.fY);
2098 canvas->drawImage(filtered, 0, 0);
Cary Clark681287e2018-03-16 11:34:15 -04002099 canvas->drawRect(SkRect::Make(outSubset), paint);
Cary Clarka560c472017-11-27 10:44:06 -05002100##
2101
Cary Clark56356312018-02-08 14:45:18 -05002102#SeeAlso makeShader SkPaint::setImageFilter
Cary Clarka560c472017-11-27 10:44:06 -05002103
2104#Method ##
2105
2106# ------------------------------------------------------------------------------
2107
Cary Clarka560c472017-11-27 10:44:06 -05002108#Typedef std::function<void(GrBackendTexture)> BackendTextureReleaseProc
Cary Clark682c58d2018-05-16 07:07:07 -04002109#Line # parameter type for MakeBackendTextureFromSkImage ##
Cary Clarkffb3d682018-05-17 12:17:28 -04002110
2111#Code
Cary Clarka90ea222018-10-16 10:30:28 -04002112#Populate
Cary Clarkffb3d682018-05-17 12:17:28 -04002113##
2114
Cary Clark0d225392018-06-07 09:59:07 -04002115Defines a callback function, taking one parameter of type GrBackendTexture with
2116no return value. Function is called when back-end texture is to be released.
Cary Clarka560c472017-11-27 10:44:06 -05002117##
2118
2119# ------------------------------------------------------------------------------
2120
2121#Method static bool MakeBackendTextureFromSkImage(GrContext* context,
2122 sk_sp<SkImage> image,
2123 GrBackendTexture* backendTexture,
2124 BackendTextureReleaseProc* backendTextureReleaseProc)
Cary Clark61313f32018-10-08 14:57:48 -04002125#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05002126#Line # creates GPU_Texture from Image ##
Cary Clarka560c472017-11-27 10:44:06 -05002127
Cary Clark56356312018-02-08 14:45:18 -05002128Creates a GrBackendTexture from the provided SkImage. Returns true and
2129stores result in backendTexture and backendTextureReleaseProc if
2130texture is created; otherwise, returns false and leaves
2131backendTexture and backendTextureReleaseProc unmodified.
Cary Clarka560c472017-11-27 10:44:06 -05002132
Cary Clark56356312018-02-08 14:45:18 -05002133Call backendTextureReleaseProc after deleting backendTexture.
2134backendTextureReleaseProc cleans up auxiliary data related to returned
2135backendTexture. The caller must delete returned backendTexture after use.
Cary Clarka560c472017-11-27 10:44:06 -05002136
Cary Clark56356312018-02-08 14:45:18 -05002137If Image is both texture backed and singly referenced, image is returned in
2138backendTexture without conversion or making a copy. Image is singly referenced
2139if its was transferred solely using std::move().
2140
2141If Image is not texture backed, returns texture with Image contents.
Cary Clarka560c472017-11-27 10:44:06 -05002142
Cary Clark61ca7c52018-01-02 11:34:14 -05002143#Param context GPU_Context ##
Cary Clark56356312018-02-08 14:45:18 -05002144#Param image Image used for texture ##
Cary Clark682c58d2018-05-16 07:07:07 -04002145#Param backendTexture storage for back-end texture ##
Cary Clark56356312018-02-08 14:45:18 -05002146#Param backendTextureReleaseProc storage for clean up function ##
Cary Clarka560c472017-11-27 10:44:06 -05002147
Cary Clark682c58d2018-05-16 07:07:07 -04002148#Return true if back-end texture was created ##
Cary Clarka560c472017-11-27 10:44:06 -05002149
2150#Example
Cary Clark56356312018-02-08 14:45:18 -05002151#Platform gpu
2152#Height 64
2153#Function
Brian Salomon67f85842018-02-09 08:50:22 -05002154static sk_sp<SkImage> create_gpu_image(GrContext* grContext) {
2155 const SkImageInfo info = SkImageInfo::MakeN32(20, 20, kOpaque_SkAlphaType);
2156 auto surface(SkSurface::MakeRenderTarget(grContext, SkBudgeted::kNo, info));
2157 SkCanvas* canvas = surface->getCanvas();
2158 canvas->clear(SK_ColorWHITE);
2159 SkPaint paint;
2160 paint.setColor(SK_ColorBLACK);
2161 canvas->drawRect(SkRect::MakeXYWH(5, 5, 10, 10), paint);
2162 return surface->makeImageSnapshot();
2163}
2164##
2165
Cary Clark682c58d2018-05-16 07:07:07 -04002166void draw(SkCanvas* canvas) {
Brian Salomon67f85842018-02-09 08:50:22 -05002167 GrContext* grContext = canvas->getGrContext();
2168 if (!grContext) {
2169 return;
2170 }
2171 sk_sp<SkImage> backEndImage = create_gpu_image(grContext);
2172 canvas->drawImage(backEndImage, 0, 0);
2173 GrBackendTexture texture;
2174 SkImage::BackendTextureReleaseProc proc;
2175 if (!SkImage::MakeBackendTextureFromSkImage(grContext, std::move(backEndImage),
2176 &texture, &proc)) {
2177 return;
2178 }
2179 sk_sp<SkImage> i2 = SkImage::MakeFromTexture(grContext, texture, kTopLeft_GrSurfaceOrigin,
2180 kN32_SkColorType, kOpaque_SkAlphaType, nullptr);
2181 canvas->drawImage(i2, 30, 30);
Cary Clark56356312018-02-08 14:45:18 -05002182}
Cary Clarka560c472017-11-27 10:44:06 -05002183##
2184
Cary Clark56356312018-02-08 14:45:18 -05002185#SeeAlso MakeFromTexture makeTextureImage
Cary Clarka560c472017-11-27 10:44:06 -05002186
2187#Method ##
2188
2189# ------------------------------------------------------------------------------
2190
2191#Enum LegacyBitmapMode
Cary Clark56356312018-02-08 14:45:18 -05002192#Deprecated soon
Cary Clarka560c472017-11-27 10:44:06 -05002193#Code
Cary Clarka90ea222018-10-16 10:30:28 -04002194#Populate
Cary Clarka560c472017-11-27 10:44:06 -05002195##
2196
Cary Clarka560c472017-11-27 10:44:06 -05002197#Const kRO_LegacyBitmapMode 0
Cary Clark682c58d2018-05-16 07:07:07 -04002198#Line # returned bitmap is read-only and immutable ##
Cary Clarka560c472017-11-27 10:44:06 -05002199##
Cary Clarka560c472017-11-27 10:44:06 -05002200
2201#Enum ##
2202
2203# ------------------------------------------------------------------------------
2204
Cary Clark56356312018-02-08 14:45:18 -05002205#Method bool asLegacyBitmap(SkBitmap* bitmap, LegacyBitmapMode legacyBitmapMode = kRO_LegacyBitmapMode) const
Cary Clark61313f32018-10-08 14:57:48 -04002206#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05002207#Line # returns as Raster_Bitmap ##
Cary Clarkac47b882018-01-11 10:35:44 -05002208Creates raster Bitmap with same pixels as Image. If legacyBitmapMode is
2209kRO_LegacyBitmapMode, returned bitmap is read-only and immutable.
2210Returns true if Bitmap is stored in bitmap. Returns false and resets bitmap if
2211Bitmap write did not succeed.
Cary Clarka560c472017-11-27 10:44:06 -05002212
Cary Clark3cd22cc2017-12-01 11:49:58 -05002213#Param bitmap storage for legacy Bitmap ##
Cary Clark56356312018-02-08 14:45:18 -05002214#Param legacyBitmapMode to be deprecated ##
Cary Clarka560c472017-11-27 10:44:06 -05002215
Cary Clark3cd22cc2017-12-01 11:49:58 -05002216#Return true if Bitmap was created ##
Cary Clarka560c472017-11-27 10:44:06 -05002217
Cary Clarkae957c42018-06-07 17:07:17 -04002218#Example
Cary Clark56356312018-02-08 14:45:18 -05002219#Image 4
2220#Platform gpu
Brian Salomon67f85842018-02-09 08:50:22 -05002221 SkBitmap bitImage;
2222 if (image->asLegacyBitmap(&bitImage, SkImage::kRO_LegacyBitmapMode)) {
2223 canvas->drawBitmap(bitImage, 0, 0);
2224 }
2225 GrContext* grContext = canvas->getGrContext();
2226 if (!grContext) {
2227 return;
2228 }
2229 sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(grContext, backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04002230 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
2231 kOpaque_SkAlphaType, nullptr));
Brian Salomon67f85842018-02-09 08:50:22 -05002232 canvas->drawImage(textureImage, 45, 45);
2233 if (textureImage->asLegacyBitmap(&bitImage, SkImage::kRO_LegacyBitmapMode)) {
2234 canvas->drawBitmap(bitImage, 90, 90);
2235 }
Cary Clarka560c472017-11-27 10:44:06 -05002236##
2237
Cary Clark56356312018-02-08 14:45:18 -05002238#SeeAlso MakeRasterData makeRasterImage makeNonTextureImage
Cary Clarka560c472017-11-27 10:44:06 -05002239
2240#Method ##
2241
2242# ------------------------------------------------------------------------------
2243
2244#Method bool isLazyGenerated() const
Cary Clark4855f782018-02-06 09:41:53 -05002245#In Property
2246#Line # returns if Image is created as needed ##
Cary Clarka560c472017-11-27 10:44:06 -05002247Returns true if Image is backed by an image-generator or other service that creates
2248and caches its pixels or texture on-demand.
2249
Cary Clark2f466242017-12-11 16:03:17 -05002250#Return true if Image is created as needed ##
Cary Clarka560c472017-11-27 10:44:06 -05002251
2252#Example
Cary Clark2f466242017-12-11 16:03:17 -05002253#Height 80
2254#Function
2255class TestImageGenerator : public SkImageGenerator {
2256public:
2257 TestImageGenerator() : SkImageGenerator(SkImageInfo::MakeN32Premul(10, 10)) {}
2258 ~TestImageGenerator() override {}
2259protected:
2260 bool onGetPixels(const SkImageInfo& info, void* pixelPtr, size_t rowBytes,
2261 const Options& options) override {
2262 SkPMColor* pixels = static_cast<SkPMColor*>(pixelPtr);
2263 for (int y = 0; y < info.height(); ++y) {
2264 for (int x = 0; x < info.width(); ++x) {
2265 pixels[y * info.width() + x] = 0xff223344 + y * 0x000C0811;
2266 }
2267 }
2268 return true;
2269 }
2270};
2271##
2272void draw(SkCanvas* canvas) {
2273 auto gen = std::unique_ptr<TestImageGenerator>(new TestImageGenerator());
2274 sk_sp<SkImage> image(SkImage::MakeFromGenerator(std::move(gen)));
2275 SkString lazy(image->isLazyGenerated() ? "is lazy" : "not lazy");
2276 canvas->scale(8, 8);
2277 canvas->drawImage(image, 0, 0, nullptr);
2278 SkPaint paint;
2279 paint.setTextSize(4);
2280 canvas->drawString(lazy, 2, 5, paint);
2281}
Cary Clarka560c472017-11-27 10:44:06 -05002282##
2283
Cary Clarkf5404bb2018-01-05 12:10:09 -05002284#Example
2285#Image 5
2286#Platform gpu
2287void draw(SkCanvas* canvas) {
2288 auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {
2289 if (nullptr == image) {
2290 return;
2291 }
2292 SkPaint paint;
2293 paint.setAntiAlias(true);
2294 paint.setTextAlign(SkPaint::kCenter_Align);
2295 canvas->drawImage(image, 0, 0);
2296 canvas->drawString(label, image->width() / 2, image->height() / 4, paint);
2297 canvas->drawString(
2298 image->isLazyGenerated() ? "is lazily generated" : "not lazily generated",
2299 image->width() / 2, image->height() * 3 / 4, paint);
2300 };
2301 sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
2302 sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04002303 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
2304 kOpaque_SkAlphaType, nullptr));
Cary Clarkf5404bb2018-01-05 12:10:09 -05002305 drawImage(image, "image");
2306 canvas->translate(image->width(), 0);
2307 drawImage(bitmapImage, "source");
2308 canvas->translate(-image->width(), image->height());
2309 drawImage(textureImage, "backEndTexture");
2310}
2311##
2312
Cary Clarkac47b882018-01-11 10:35:44 -05002313#SeeAlso isTextureBacked MakeNonTextureImage
Cary Clarka560c472017-11-27 10:44:06 -05002314
2315#Method ##
2316
2317# ------------------------------------------------------------------------------
2318
Cary Clarke80cd442018-07-17 13:19:56 -04002319#Method sk_sp<SkImage> makeColorSpace(sk_sp<SkColorSpace> target) const
Cary Clark61313f32018-10-08 14:57:48 -04002320#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05002321#Line # creates Image matching Color_Space if possible ##
Cary Clarka560c472017-11-27 10:44:06 -05002322
Cary Clarkac47b882018-01-11 10:35:44 -05002323Creates Image in target Color_Space.
2324Returns nullptr if Image could not be created.
Cary Clarka560c472017-11-27 10:44:06 -05002325
Cary Clarkac47b882018-01-11 10:35:44 -05002326Returns original Image if it is in target Color_Space.
2327Otherwise, converts pixels from Image Color_Space to target Color_Space.
2328If Image colorSpace returns nullptr, Image Color_Space is assumed to be sRGB.
2329
Cary Clarkac47b882018-01-11 10:35:44 -05002330#Param target Color_Space describing color range of returned Image ##
Cary Clarka560c472017-11-27 10:44:06 -05002331
Cary Clarkac47b882018-01-11 10:35:44 -05002332#Return created Image in target Color_Space ##
2333
2334#Example
2335#Image 5
2336#Set sRGB
2337 sk_sp<SkColorSpace> normalColorSpace = SkColorSpace::MakeRGB(
2338 SkColorSpace::kSRGB_RenderTargetGamma, SkColorSpace::kSRGB_Gamut);
2339 sk_sp<SkColorSpace> wackyColorSpace = normalColorSpace->makeColorSpin();
2340 for (auto colorSpace : { normalColorSpace, wackyColorSpace } ) {
Cary Clarkc3c1c312018-07-18 09:25:15 -04002341 sk_sp<SkImage> colorSpaced = image->makeColorSpace(colorSpace);
2342 canvas->drawImage(colorSpaced, 0, 0);
2343 canvas->translate(128, 0);
Cary Clarkac47b882018-01-11 10:35:44 -05002344 }
2345##
2346
2347#SeeAlso MakeFromPixture MakeFromTexture
Cary Clarka560c472017-11-27 10:44:06 -05002348
2349#Method ##
2350
2351#Class SkImage ##
2352
2353#Topic Image ##