blob: 2a8f35d2517fdecb24af57b9e928ea8ce81c9008 [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
137typedef void* ReleaseContext;
138##
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
150typedef void (*RasterReleaseProc)(const void* pixels, ReleaseContext);
151##
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
343typedef void (*TextureReleaseProc)(ReleaseContext releaseContext);
344##
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 Clark61ca7c52018-01-02 11:34:14 -0500858 enum class BitDepth {
Cary Clarka560c472017-11-27 10:44:06 -0500859 kU8,
860 kF16,
861 };
862##
863
864#Const kU8 0
Cary Clark682c58d2018-05-16 07:07:07 -0400865#Line # uses 8-bit unsigned int per Color component ##
Cary Clarkffb3d682018-05-17 12:17:28 -0400866Use 8 bits per ARGB component using unsigned integer format.
Cary Clarka560c472017-11-27 10:44:06 -0500867##
868#Const kF16 1
Cary Clark682c58d2018-05-16 07:07:07 -0400869#Line # uses 16-bit float per Color component ##
Cary Clarkffb3d682018-05-17 12:17:28 -0400870Use 16 bits per ARGB component using half-precision floating point format.
Cary Clarka560c472017-11-27 10:44:06 -0500871##
872
Cary Clark61ca7c52018-01-02 11:34:14 -0500873#NoExample
Cary Clarka560c472017-11-27 10:44:06 -0500874##
875
Cary Clark61ca7c52018-01-02 11:34:14 -0500876#SeeAlso MakeFromPicture
Cary Clarka560c472017-11-27 10:44:06 -0500877
Cary Clark56356312018-02-08 14:45:18 -0500878#EnumClass ##
Cary Clarka560c472017-11-27 10:44:06 -0500879
880# ------------------------------------------------------------------------------
881
882#Method static sk_sp<SkImage> MakeFromPicture(sk_sp<SkPicture> picture, const SkISize& dimensions,
883 const SkMatrix* matrix, const SkPaint* paint,
884 BitDepth bitDepth,
885 sk_sp<SkColorSpace> colorSpace)
Cary Clark61313f32018-10-08 14:57:48 -0400886#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -0500887#Line # creates Image from Picture ##
Cary Clarka560c472017-11-27 10:44:06 -0500888
Cary Clark61ca7c52018-01-02 11:34:14 -0500889Creates Image from picture. Returned Image width and height are set by dimensions.
890Image draws picture with matrix and paint, set to bitDepth and colorSpace.
Cary Clarka560c472017-11-27 10:44:06 -0500891
Cary Clark61ca7c52018-01-02 11:34:14 -0500892If matrix is nullptr, draws with identity Matrix. If paint is nullptr, draws
Cary Clark682c58d2018-05-16 07:07:07 -0400893with default Paint. colorSpace may be nullptr.
Cary Clarka560c472017-11-27 10:44:06 -0500894
Cary Clark61ca7c52018-01-02 11:34:14 -0500895#Param picture stream of drawing commands ##
896#Param dimensions width and height ##
897#Param matrix Matrix to rotate, scale, translate, and so on; may be nullptr ##
898#Param paint Paint to apply transparency, filtering, and so on; may be nullptr ##
Cary Clark682c58d2018-05-16 07:07:07 -0400899#Param bitDepth 8-bit integer or 16-bit float: per component ##
Cary Clark61ca7c52018-01-02 11:34:14 -0500900#Param colorSpace range of colors; may be nullptr ##
901
902#Return created Image, or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -0500903
904#Example
Cary Clark61ca7c52018-01-02 11:34:14 -0500905 SkPaint paint;
906 SkPictureRecorder recorder;
907 SkCanvas* recordingCanvas = recorder.beginRecording(50, 50);
908 for (auto color : { SK_ColorRED, SK_ColorBLUE, 0xff007f00 } ) {
909 paint.setColor(color);
910 recordingCanvas->drawRect({10, 10, 30, 40}, paint);
911 recordingCanvas->translate(10, 10);
912 recordingCanvas->scale(1.2f, 1.4f);
913 }
914 sk_sp<SkPicture> playback = recorder.finishRecordingAsPicture();
915 int x = 0, y = 0;
916 for (auto alpha : { 70, 140, 210 } ) {
917 paint.setAlpha(alpha);
918 auto srgbColorSpace = SkColorSpace::MakeSRGB();
919 sk_sp<SkImage> image = SkImage::MakeFromPicture(playback, {50, 50}, nullptr, &paint,
920 SkImage::BitDepth::kU8, srgbColorSpace);
921 canvas->drawImage(image, x, y);
922 x += 70; y += 70;
923 }
Cary Clarka560c472017-11-27 10:44:06 -0500924##
925
Cary Clark61ca7c52018-01-02 11:34:14 -0500926#SeeAlso SkCanvas::drawPicture
Cary Clarka560c472017-11-27 10:44:06 -0500927
928#Method ##
929
930# ------------------------------------------------------------------------------
931
Cary Clark9548ea92018-09-13 15:26:33 -0400932#Method static sk_sp<SkImage> MakeFromAHardwareBuffer(
933 AHardwareBuffer* hardwareBuffer,
934 SkAlphaType alphaType = kPremul_SkAlphaType,
935 sk_sp<SkColorSpace> colorSpace = nullptr,
936 GrSurfaceOrigin surfaceOrigin = kTopLeft_GrSurfaceOrigin)
Cary Clark61313f32018-10-08 14:57:48 -0400937#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -0500938#Line # creates Image from Android hardware buffer ##
Cary Clarka560c472017-11-27 10:44:06 -0500939
Cary Clark4855f782018-02-06 09:41:53 -0500940#Bug 7447
Cary Clarka560c472017-11-27 10:44:06 -0500941
Cary Clark61ca7c52018-01-02 11:34:14 -0500942Creates Image from Android hardware buffer.
943Returned Image takes a reference on the buffer.
Cary Clarka560c472017-11-27 10:44:06 -0500944
Cary Clark61ca7c52018-01-02 11:34:14 -0500945Only available on Android, when __ANDROID_API__ is defined to be 26 or greater.
Cary Clarka560c472017-11-27 10:44:06 -0500946
Cary Clark61ca7c52018-01-02 11:34:14 -0500947#Param hardwareBuffer AHardwareBuffer Android hardware buffer ##
Cary Clark681287e2018-03-16 11:34:15 -0400948#Param alphaType one of: #list_of_alpha_types#
Cary Clark61ca7c52018-01-02 11:34:14 -0500949##
950#Param colorSpace range of colors; may be nullptr ##
Cary Clark9548ea92018-09-13 15:26:33 -0400951#Param surfaceOrigin one of: kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin ##
Cary Clarka560c472017-11-27 10:44:06 -0500952
Cary Clark61ca7c52018-01-02 11:34:14 -0500953#Return created Image, or nullptr ##
954
955#NoExample
Cary Clarka560c472017-11-27 10:44:06 -0500956##
957
Cary Clark61ca7c52018-01-02 11:34:14 -0500958#SeeAlso MakeFromRaster
Cary Clarka560c472017-11-27 10:44:06 -0500959
960#Method ##
961
962# ------------------------------------------------------------------------------
Cary Clark4855f782018-02-06 09:41:53 -0500963#Subtopic Property
Cary Clark4855f782018-02-06 09:41:53 -0500964#Line # values and attributes ##
965##
Cary Clarka560c472017-11-27 10:44:06 -0500966
967#Method int width() const
Cary Clark4855f782018-02-06 09:41:53 -0500968#In Property
969#Line # returns pixel column count ##
Cary Clark61ca7c52018-01-02 11:34:14 -0500970Returns pixel count in each row.
971
972#Return pixel width in Image ##
Cary Clarka560c472017-11-27 10:44:06 -0500973
974#Example
Cary Clark61ca7c52018-01-02 11:34:14 -0500975#Image 4
Cary Clarkac47b882018-01-11 10:35:44 -0500976#Height 96
Cary Clark61ca7c52018-01-02 11:34:14 -0500977 canvas->translate(10, 10);
978 canvas->drawImage(image, 0, 0);
979 canvas->translate(0, image->height());
980 SkPaint paint;
981 paint.setTextAlign(SkPaint::kCenter_Align);
982 canvas->drawLine(0, 10, image->width(), 10, paint);
983 canvas->drawString("width", image->width() / 2, 25, paint);
Cary Clarka560c472017-11-27 10:44:06 -0500984##
985
Cary Clark61ca7c52018-01-02 11:34:14 -0500986#SeeAlso dimensions() height()
Cary Clarka560c472017-11-27 10:44:06 -0500987
988#Method ##
989
990# ------------------------------------------------------------------------------
991
992#Method int height() const
Cary Clark4855f782018-02-06 09:41:53 -0500993#In Property
994#Line # returns pixel row count ##
Cary Clark2f466242017-12-11 16:03:17 -0500995Returns pixel row count.
996
Cary Clark61ca7c52018-01-02 11:34:14 -0500997#Return pixel height in Image ##
Cary Clarka560c472017-11-27 10:44:06 -0500998
999#Example
Cary Clark61ca7c52018-01-02 11:34:14 -05001000#Image 4
Cary Clarkac47b882018-01-11 10:35:44 -05001001#Height 96
Cary Clark61ca7c52018-01-02 11:34:14 -05001002 canvas->translate(10, 10);
1003 canvas->drawImage(image, 0, 0);
1004 canvas->translate(image->width(), 0);
1005 SkPaint paint;
1006 paint.setTextAlign(SkPaint::kCenter_Align);
1007 paint.setVerticalText(true);
1008 canvas->drawLine(10, 0, 10, image->height(), paint);
Cary Clarkac47b882018-01-11 10:35:44 -05001009 canvas->drawString("height", 25, image->height() / 2, paint);
1010##
Cary Clarka560c472017-11-27 10:44:06 -05001011
Cary Clark61ca7c52018-01-02 11:34:14 -05001012#SeeAlso dimensions() width()
Cary Clarka560c472017-11-27 10:44:06 -05001013
1014#Method ##
1015
1016# ------------------------------------------------------------------------------
1017
1018#Method SkISize dimensions() const
Cary Clark4855f782018-02-06 09:41:53 -05001019#In Property
1020#Line # returns width() and height() ##
Cary Clark681287e2018-03-16 11:34:15 -04001021
Cary Clark2f466242017-12-11 16:03:17 -05001022Returns ISize { width(), height() }.
1023
1024#Return integral size of width() and height() ##
Cary Clarka560c472017-11-27 10:44:06 -05001025
1026#Example
Cary Clark61ca7c52018-01-02 11:34:14 -05001027#Image 4
1028 SkISize dimensions = image->dimensions();
1029 SkIRect bounds = image->bounds();
1030 SkIRect dimensionsAsBounds = SkIRect::MakeSize(dimensions);
1031 SkDebugf("dimensionsAsBounds %c= bounds\n", dimensionsAsBounds == bounds ? '=' : '!');
Cary Clark681287e2018-03-16 11:34:15 -04001032#StdOut
1033dimensionsAsBounds == bounds
1034##
Cary Clarka560c472017-11-27 10:44:06 -05001035##
1036
Cary Clark61ca7c52018-01-02 11:34:14 -05001037#SeeAlso height() width() bounds()
Cary Clarka560c472017-11-27 10:44:06 -05001038
1039#Method ##
1040
1041# ------------------------------------------------------------------------------
1042
1043#Method SkIRect bounds() const
Cary Clark4855f782018-02-06 09:41:53 -05001044#In Property
1045#Line # returns width() and height() as Rectangle ##
Cary Clark2f466242017-12-11 16:03:17 -05001046Returns IRect { 0, 0, width(), height() }.
1047
1048#Return integral rectangle from origin to width() and height() ##
Cary Clarka560c472017-11-27 10:44:06 -05001049
1050#Example
Cary Clark61ca7c52018-01-02 11:34:14 -05001051#Height 128
1052#Image 4
Cary Clark61ca7c52018-01-02 11:34:14 -05001053 SkIRect bounds = image->bounds();
Cary Clarkac47b882018-01-11 10:35:44 -05001054 for (int x : { 0, bounds.width() } ) {
1055 for (int y : { 0, bounds.height() } ) {
Cary Clark61ca7c52018-01-02 11:34:14 -05001056 canvas->drawImage(image, x, y);
1057 }
1058 }
Cary Clarka560c472017-11-27 10:44:06 -05001059##
1060
Cary Clark682c58d2018-05-16 07:07:07 -04001061#SeeAlso dimensions()
Cary Clarka560c472017-11-27 10:44:06 -05001062
1063#Method ##
1064
1065# ------------------------------------------------------------------------------
1066
1067#Method uint32_t uniqueID() const
Cary Clark4855f782018-02-06 09:41:53 -05001068#In Property
Cary Clark682c58d2018-05-16 07:07:07 -04001069#Line # returns identifier for Image ##
Cary Clark61ca7c52018-01-02 11:34:14 -05001070Returns value unique to image. Image contents cannot change after Image is
1071created. Any operation to create a new Image will receive generate a new
1072unique number.
1073
1074#Return unique identifier ##
Cary Clarka560c472017-11-27 10:44:06 -05001075
1076#Example
Cary Clark61ca7c52018-01-02 11:34:14 -05001077#Image 5
1078#Height 156
1079 sk_sp<SkImage> subset = image->makeSubset({10, 20, 90, 100});
1080 canvas->drawImage(image, 0, 0);
1081 canvas->drawImage(subset, 128, 0);
1082 SkPaint paint;
1083 SkString s;
1084 s.printf("original id: %d", image->uniqueID());
1085 canvas->drawString(s, 20, image->height() + 20, paint);
1086 s.printf("subset id: %d", subset->uniqueID());
1087 canvas->drawString(s, 148, subset->height() + 20, paint);
Cary Clarka560c472017-11-27 10:44:06 -05001088##
1089
Cary Clark61ca7c52018-01-02 11:34:14 -05001090#SeeAlso isLazyGenerated
Cary Clarka560c472017-11-27 10:44:06 -05001091
1092#Method ##
1093
1094# ------------------------------------------------------------------------------
1095
1096#Method SkAlphaType alphaType() const
Cary Clark4855f782018-02-06 09:41:53 -05001097#In Property
1098#Line # returns Alpha_Type ##
Cary Clark681287e2018-03-16 11:34:15 -04001099Returns Alpha_Type, one of: #list_of_alpha_types#.
Cary Clark61ca7c52018-01-02 11:34:14 -05001100
1101Alpha_Type returned was a parameter to an Image constructor,
1102or was parsed from encoded data.
1103
1104#Return Alpha_Type in Image ##
Cary Clarka560c472017-11-27 10:44:06 -05001105
1106#Example
Cary Clark61ca7c52018-01-02 11:34:14 -05001107#Image 4
Cary Clarkac47b882018-01-11 10:35:44 -05001108#Height 96
Cary Clark61ca7c52018-01-02 11:34:14 -05001109 const char* alphaTypeStr[] = { "Unknown", "Opaque", "Premul", "Unpremul" };
1110 SkAlphaType alphaType = image->alphaType();
Cary Clarkac47b882018-01-11 10:35:44 -05001111 canvas->drawImage(image, 16, 0);
Cary Clarkffb3d682018-05-17 12:17:28 -04001112 canvas->drawString(alphaTypeStr[(int) alphaType], 20, image->height() + 20, SkPaint());
Cary Clarka560c472017-11-27 10:44:06 -05001113##
1114
Cary Clark61ca7c52018-01-02 11:34:14 -05001115#SeeAlso SkImageInfo::alphaType
Cary Clarka560c472017-11-27 10:44:06 -05001116
1117#Method ##
1118
1119# ------------------------------------------------------------------------------
1120
Greg Daniel56008aa2018-03-14 15:33:42 -04001121#Method SkColorType colorType() const
1122#In Property
1123#Line # returns Color_Type ##
1124
1125Returns Color_Type if known; otherwise, returns kUnknown_SkColorType.
1126
1127#Return Color_Type of Image ##
1128
1129#Example
Cary Clarkffb3d682018-05-17 12:17:28 -04001130#Image 4
1131#Height 96
1132 const char* colors[] = { "Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x",
1133 "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16" };
1134 SkColorType colorType = image->colorType();
1135 canvas->drawImage(image, 16, 0);
1136 canvas->drawString(colors[(int) colorType], 20, image->height() + 20, SkPaint());
Greg Daniel56008aa2018-03-14 15:33:42 -04001137##
1138
1139#SeeAlso SkImageInfo::colorType
1140
1141#Method ##
1142
1143# ------------------------------------------------------------------------------
1144
Cary Clarka560c472017-11-27 10:44:06 -05001145#Method SkColorSpace* colorSpace() const
Cary Clark4855f782018-02-06 09:41:53 -05001146#In Property
1147#Line # returns Color_Space ##
Cary Clark2f466242017-12-11 16:03:17 -05001148Returns Color_Space, the range of colors, associated with Image. The
1149reference count of Color_Space is unchanged. The returned Color_Space is
1150immutable.
Cary Clarka560c472017-11-27 10:44:06 -05001151
Cary Clark61dfc3a2018-01-03 08:37:53 -05001152Color_Space returned was passed to an Image constructor,
1153or was parsed from encoded data. Color_Space returned may be ignored when Image
1154is drawn, depending on the capabilities of the Surface receiving the drawing.
Cary Clark2f466242017-12-11 16:03:17 -05001155
1156#Return Color_Space in Image, or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -05001157
1158#Example
Cary Clark61dfc3a2018-01-03 08:37:53 -05001159#Image 3
1160#Set sRGB
1161 SkPixmap pixmap;
1162 source.peekPixels(&pixmap);
1163 canvas->scale(.25f, .25f);
1164 int y = 0;
1165 for (auto gamma : { SkColorSpace::kLinear_RenderTargetGamma,
1166 SkColorSpace::kSRGB_RenderTargetGamma } ) {
1167 int x = 0;
1168 sk_sp<SkColorSpace> colorSpace = SkColorSpace::MakeRGB(gamma, SkColorSpace::kSRGB_Gamut);
1169 for (int index = 0; index < 2; ++index) {
1170 pixmap.setColorSpace(colorSpace);
1171 sk_sp<SkImage> image = SkImage::MakeRasterCopy(pixmap);
1172 canvas->drawImage(image, x, y);
1173 colorSpace = image->colorSpace()->makeColorSpin();
1174 x += 512;
1175 }
1176 y += 512;
1177 }
Cary Clarka560c472017-11-27 10:44:06 -05001178##
1179
Cary Clark61dfc3a2018-01-03 08:37:53 -05001180#SeeAlso refColorSpace makeColorSpace
Cary Clarka560c472017-11-27 10:44:06 -05001181
1182#Method ##
1183
1184# ------------------------------------------------------------------------------
1185
1186#Method sk_sp<SkColorSpace> refColorSpace() const
Cary Clark4855f782018-02-06 09:41:53 -05001187#In Property
1188#Line # returns Image_Info Color_Space ##
Cary Clark61dfc3a2018-01-03 08:37:53 -05001189Returns a smart pointer to Color_Space, the range of colors, associated with
1190Image. The smart pointer tracks the number of objects sharing this
1191SkColorSpace reference so the memory is released when the owners destruct.
1192
1193The returned SkColorSpace is immutable.
1194
1195Color_Space returned was passed to an Image constructor,
1196or was parsed from encoded data. Color_Space returned may be ignored when Image
1197is drawn, depending on the capabilities of the Surface receiving the drawing.
1198
1199#Return Color_Space in Image, or nullptr, wrapped in a smart pointer ##
Cary Clarka560c472017-11-27 10:44:06 -05001200
1201#Example
Cary Clark61dfc3a2018-01-03 08:37:53 -05001202#Image 3
1203#Set sRGB
1204 SkPixmap pixmap;
1205 source.peekPixels(&pixmap);
1206 canvas->scale(.25f, .25f);
1207 int y = 0;
1208 for (auto gamma : { SkColorSpace::kLinear_RenderTargetGamma,
1209 SkColorSpace::kSRGB_RenderTargetGamma } ) {
1210 int x = 0;
1211 sk_sp<SkColorSpace> colorSpace = SkColorSpace::MakeRGB(gamma, SkColorSpace::kSRGB_Gamut);
1212 for (int index = 0; index < 2; ++index) {
1213 pixmap.setColorSpace(colorSpace);
1214 sk_sp<SkImage> image = SkImage::MakeRasterCopy(pixmap);
1215 canvas->drawImage(image, x, y);
1216 colorSpace = image->refColorSpace()->makeColorSpin();
1217 x += 512;
1218 }
1219 y += 512;
1220 }
Cary Clarka560c472017-11-27 10:44:06 -05001221##
1222
Cary Clark61dfc3a2018-01-03 08:37:53 -05001223#SeeAlso colorSpace makeColorSpace
Cary Clarka560c472017-11-27 10:44:06 -05001224
1225#Method ##
1226
1227# ------------------------------------------------------------------------------
1228
1229#Method bool isAlphaOnly() const
Cary Clark4855f782018-02-06 09:41:53 -05001230#In Property
1231#Line # returns if pixels represent a transparency mask ##
Cary Clark2f466242017-12-11 16:03:17 -05001232Returns true if Image pixels represent transparency only. If true, each pixel
1233is packed in 8 bits as defined by kAlpha_8_SkColorType.
Cary Clarka560c472017-11-27 10:44:06 -05001234
Cary Clark2f466242017-12-11 16:03:17 -05001235#Return true if pixels represent a transparency mask ##
Cary Clarka560c472017-11-27 10:44:06 -05001236
1237#Example
Cary Clark61dfc3a2018-01-03 08:37:53 -05001238 uint8_t pmColors = 0;
1239 sk_sp<SkImage> image = SkImage::MakeRasterCopy({SkImageInfo::MakeA8(1, 1), &pmColors, 1});
1240 SkDebugf("alphaOnly = %s\n", image->isAlphaOnly() ? "true" : "false");
1241#StdOut
1242alphaOnly = true
1243##
Cary Clarka560c472017-11-27 10:44:06 -05001244##
1245
Cary Clark61dfc3a2018-01-03 08:37:53 -05001246#SeeAlso alphaType isOpaque
Cary Clarka560c472017-11-27 10:44:06 -05001247
1248#Method ##
1249
1250# ------------------------------------------------------------------------------
1251
1252#Method bool isOpaque() const
Cary Clark4855f782018-02-06 09:41:53 -05001253#In Property
1254#Line # returns if Alpha_Type is kOpaque_SkAlphaType ##
Cary Clark61dfc3a2018-01-03 08:37:53 -05001255Returns true if pixels ignore their Alpha value and are treated as fully opaque.
Cary Clark2f466242017-12-11 16:03:17 -05001256
1257#Return true if Alpha_Type is kOpaque_SkAlphaType ##
Cary Clarka560c472017-11-27 10:44:06 -05001258
1259#Example
Cary Clark61dfc3a2018-01-03 08:37:53 -05001260 auto check_isopaque = [](const SkImageInfo& imageInfo) -> void {
1261 auto surface(SkSurface::MakeRaster(imageInfo));
1262 auto image(surface->makeImageSnapshot());
1263 SkDebugf("isOpaque = %s\n", image->isOpaque() ? "true" : "false");
1264 };
1265
1266 check_isopaque(SkImageInfo::MakeN32Premul(5, 5));
1267 check_isopaque(SkImageInfo::MakeN32(5, 5, kOpaque_SkAlphaType));
1268#StdOut
1269isOpaque = false
1270isOpaque = true
1271##
Cary Clarka560c472017-11-27 10:44:06 -05001272##
1273
Cary Clark61dfc3a2018-01-03 08:37:53 -05001274#SeeAlso alphaType isAlphaOnly
Cary Clarka560c472017-11-27 10:44:06 -05001275
1276#Method ##
1277
1278# ------------------------------------------------------------------------------
1279
1280#Method sk_sp<SkShader> makeShader(SkShader::TileMode tileMode1, SkShader::TileMode tileMode2,
1281 const SkMatrix* localMatrix = nullptr) const
Cary Clark61313f32018-10-08 14:57:48 -04001282#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05001283#Line # creates Shader, Paint element that can tile Image ##
Cary Clarka560c472017-11-27 10:44:06 -05001284
Cary Clark61dfc3a2018-01-03 08:37:53 -05001285Creates Shader from Image. Shader dimensions are taken from Image. Shader uses
1286SkShader::TileMode rules to fill drawn area outside Image. localMatrix permits
1287transforming Image before Canvas_Matrix is applied.
Cary Clarka560c472017-11-27 10:44:06 -05001288
Cary Clark5538c132018-06-14 12:28:14 -04001289#Param tileMode1 tiling on x-axis, one of: SkShader::kClamp_TileMode,
1290 SkShader::kRepeat_TileMode, SkShader::kMirror_TileMode
Cary Clark61dfc3a2018-01-03 08:37:53 -05001291##
Cary Clark5538c132018-06-14 12:28:14 -04001292#Param tileMode2 tiling on y-axis, one of: SkShader::kClamp_TileMode,
1293 SkShader::kRepeat_TileMode, SkShader::kMirror_TileMode
Cary Clark61dfc3a2018-01-03 08:37:53 -05001294##
1295#Param localMatrix Image transformation, or nullptr ##
1296
1297#Return Shader containing Image ##
Cary Clarka560c472017-11-27 10:44:06 -05001298
1299#Example
Cary Clark61dfc3a2018-01-03 08:37:53 -05001300#Image 4
1301SkMatrix matrix;
1302matrix.setRotate(45);
1303SkPaint paint;
1304paint.setShader(image->makeShader(SkShader::kRepeat_TileMode, SkShader::kMirror_TileMode,
1305 &matrix));
1306canvas->drawPaint(paint);
Cary Clarka560c472017-11-27 10:44:06 -05001307##
1308
Cary Clark61dfc3a2018-01-03 08:37:53 -05001309#SeeAlso scalePixels
Cary Clarka560c472017-11-27 10:44:06 -05001310
1311#Method ##
1312
1313# ------------------------------------------------------------------------------
1314
1315#Method sk_sp<SkShader> makeShader(const SkMatrix* localMatrix = nullptr) const
1316
Cary Clark61dfc3a2018-01-03 08:37:53 -05001317Creates Shader from Image. Shader dimensions are taken from Image. Shader uses
1318SkShader::kClamp_TileMode to fill drawn area outside Image. localMatrix permits
1319transforming Image before Canvas_Matrix is applied.
Cary Clarka560c472017-11-27 10:44:06 -05001320
Cary Clark61dfc3a2018-01-03 08:37:53 -05001321#Param localMatrix Image transformation, or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -05001322
Cary Clark61dfc3a2018-01-03 08:37:53 -05001323#Return Shader containing Image ##
Cary Clarka560c472017-11-27 10:44:06 -05001324
1325#Example
Cary Clark61dfc3a2018-01-03 08:37:53 -05001326#Image 5
1327SkMatrix matrix;
1328matrix.setRotate(45);
1329matrix.postTranslate(125, 30);
1330SkPaint paint;
1331paint.setShader(image->makeShader(&matrix));
1332canvas->drawPaint(paint);
Cary Clarka560c472017-11-27 10:44:06 -05001333##
1334
Cary Clarkf5404bb2018-01-05 12:10:09 -05001335#SeeAlso scalePixels
Cary Clarka560c472017-11-27 10:44:06 -05001336
1337#Method ##
1338
1339# ------------------------------------------------------------------------------
Cary Clark78de7512018-02-07 07:27:09 -05001340#Subtopic Pixels
Cary Clark78de7512018-02-07 07:27:09 -05001341#Line # read and write pixel values ##
1342##
Cary Clarka560c472017-11-27 10:44:06 -05001343
1344#Method bool peekPixels(SkPixmap* pixmap) const
Cary Clark78de7512018-02-07 07:27:09 -05001345#In Pixels
Cary Clark4855f782018-02-06 09:41:53 -05001346#Line # returns Pixmap if possible ##
Cary Clarkf5404bb2018-01-05 12:10:09 -05001347Copies Image pixel address, row bytes, and Image_Info to pixmap, if address
1348is available, and returns true. If pixel address is not available, return
1349false and leave pixmap unchanged.
Cary Clarka560c472017-11-27 10:44:06 -05001350
Cary Clarkf5404bb2018-01-05 12:10:09 -05001351#Param pixmap storage for pixel state if pixels are readable; otherwise, ignored ##
Cary Clarka560c472017-11-27 10:44:06 -05001352
Cary Clarkf5404bb2018-01-05 12:10:09 -05001353#Return true if Image has direct access to pixels ##
Cary Clarka560c472017-11-27 10:44:06 -05001354
1355#Example
Cary Clarkf5404bb2018-01-05 12:10:09 -05001356 SkBitmap bitmap;
1357 bitmap.allocPixels(SkImageInfo::MakeN32Premul(12, 11));
1358 SkCanvas offscreen(bitmap);
1359 offscreen.clear(SK_ColorWHITE);
1360 SkPaint paint;
1361 offscreen.drawString("%", 1, 10, paint);
1362 sk_sp<SkImage> image = SkImage::MakeFromBitmap(bitmap);
1363 SkPixmap pixmap;
1364 if (image->peekPixels(&pixmap)) {
1365 const SkPMColor* pixels = pixmap.addr32();
1366 SkPMColor pmWhite = pixels[0];
1367 for (int y = 0; y < image->height(); ++y) {
1368 for (int x = 0; x < image->width(); ++x) {
1369 SkDebugf("%c", *pixels++ == pmWhite ? '-' : 'x');
1370 }
1371 SkDebugf("\n");
1372 }
1373 }
1374#StdOut
1375------------
1376--xx----x---
1377-x--x--x----
1378-x--x--x----
1379-x--x-x-----
1380--xx-xx-xx--
1381-----x-x--x-
1382----x--x--x-
1383----x--x--x-
1384---x----xx--
1385------------
1386##
Cary Clarka560c472017-11-27 10:44:06 -05001387##
1388
Cary Clarkf5404bb2018-01-05 12:10:09 -05001389#SeeAlso readPixels
Cary Clarka560c472017-11-27 10:44:06 -05001390
1391#Method ##
1392
1393# ------------------------------------------------------------------------------
1394
1395#Method GrTexture* getTexture() const
Cary Clark682c58d2018-05-16 07:07:07 -04001396#Deprecated
Cary Clarka560c472017-11-27 10:44:06 -05001397#Method ##
1398
1399# ------------------------------------------------------------------------------
1400
1401#Method bool isTextureBacked() const
Cary Clark78de7512018-02-07 07:27:09 -05001402#In Property
Cary Clark4855f782018-02-06 09:41:53 -05001403#Line # returns if Image was created from GPU_Texture ##
Cary Clarkf5404bb2018-01-05 12:10:09 -05001404Returns true the contents of Image was created on or uploaded to GPU memory,
1405and is available as a GPU_Texture.
Cary Clarka560c472017-11-27 10:44:06 -05001406
Cary Clarkf5404bb2018-01-05 12:10:09 -05001407#Return true if Image is a GPU_Texture ##
Cary Clarka560c472017-11-27 10:44:06 -05001408
1409#Example
Cary Clarkf5404bb2018-01-05 12:10:09 -05001410#Image 5
1411#Platform gpu
1412auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {
1413 if (nullptr == image) {
1414 return;
1415 }
1416 SkPaint paint;
1417 paint.setAntiAlias(true);
1418 paint.setTextAlign(SkPaint::kCenter_Align);
1419 canvas->drawImage(image, 0, 0);
1420 canvas->drawString(label, image->width() / 2, image->height() / 4, paint);
1421 canvas->drawString(image->isTextureBacked() ? "is GPU texture" : "not GPU texture",
1422 image->width() / 2, image->height() * 3 / 4, paint);
1423};
1424sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
1425sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04001426 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
1427 kOpaque_SkAlphaType, nullptr));
Cary Clarkf5404bb2018-01-05 12:10:09 -05001428drawImage(image, "image");
1429canvas->translate(image->width(), 0);
1430drawImage(bitmapImage, "source");
1431canvas->translate(-image->width(), image->height());
1432drawImage(textureImage, "backEndTexture");
Cary Clarka560c472017-11-27 10:44:06 -05001433##
1434
Cary Clarkf5404bb2018-01-05 12:10:09 -05001435#SeeAlso MakeFromTexture isValid
Cary Clarka560c472017-11-27 10:44:06 -05001436
1437#Method ##
1438
1439# ------------------------------------------------------------------------------
1440
1441#Method bool isValid(GrContext* context) const
Cary Clark4855f782018-02-06 09:41:53 -05001442#In Property
1443#Line # returns if Image can draw to Raster_Surface or GPU_Context ##
Cary Clarkf5404bb2018-01-05 12:10:09 -05001444Returns true if Image can be drawn on either Raster_Surface or GPU_Surface.
1445If context is nullptr, tests if Image draws on Raster_Surface;
1446otherwise, tests if Image draws on GPU_Surface associated with context.
Cary Clarka560c472017-11-27 10:44:06 -05001447
Cary Clarkf5404bb2018-01-05 12:10:09 -05001448Image backed by GPU_Texture may become invalid if associated GrContext is
1449invalid. Lazy_Image may be invalid and may not draw to Raster_Surface or
1450GPU_Surface or both.
Cary Clarka560c472017-11-27 10:44:06 -05001451
Cary Clark61ca7c52018-01-02 11:34:14 -05001452#Param context GPU_Context ##
Cary Clarka560c472017-11-27 10:44:06 -05001453
Cary Clarkf5404bb2018-01-05 12:10:09 -05001454#Return true if Image can be drawn ##
Cary Clarka560c472017-11-27 10:44:06 -05001455
1456#Example
Cary Clarkf5404bb2018-01-05 12:10:09 -05001457#Image 5
1458#Platform gpu
1459auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {
1460 if (nullptr == image) {
1461 return;
1462 }
1463 SkPaint paint;
1464 paint.setAntiAlias(true);
1465 paint.setTextAlign(SkPaint::kCenter_Align);
1466 canvas->drawImage(image, 0, 0);
1467 canvas->drawString(label, image->width() / 2, image->height() / 4, paint);
1468 if (canvas->getGrContext()) {
1469 canvas->drawString(image->isValid(canvas->getGrContext()) ? "is valid on GPU" :
1470 "not valid on GPU", image->width() / 2, image->height() * 5 / 8, paint);
1471 }
1472 canvas->drawString(image->isValid(nullptr) ? "is valid on CPU" :
1473 "not valid on CPU", image->width() / 2, image->height() * 7 / 8, paint);
1474};
1475sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
1476sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04001477 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
1478 kOpaque_SkAlphaType, nullptr));
Cary Clarkf5404bb2018-01-05 12:10:09 -05001479drawImage(image, "image");
1480canvas->translate(image->width(), 0);
1481drawImage(bitmapImage, "source");
1482canvas->translate(-image->width(), image->height());
1483drawImage(textureImage, "backEndTexture");
Cary Clarka560c472017-11-27 10:44:06 -05001484##
1485
Cary Clarkf5404bb2018-01-05 12:10:09 -05001486#SeeAlso isTextureBacked isLazyGenerated
Cary Clarka560c472017-11-27 10:44:06 -05001487
1488#Method ##
1489
1490# ------------------------------------------------------------------------------
1491
Robert Phillipsc5509952018-04-04 15:54:55 -04001492#Method GrBackendTexture getBackendTexture(bool flushPendingGrContextIO,
1493 GrSurfaceOrigin* origin = nullptr) const
1494#In Property
1495#Line # returns GPU reference to Image as texture ##
1496
Cary Clark682c58d2018-05-16 07:07:07 -04001497Retrieves the back-end texture. If Image has no back-end texture, an invalid
Cary Clarkba75aee2018-04-05 08:18:41 -04001498object is returned. Call GrBackendTexture::isValid to determine if the result
1499is valid.
1500
1501If flushPendingGrContextIO is true, completes deferred I/O operations.
Robert Phillipsc5509952018-04-04 15:54:55 -04001502
1503If origin in not nullptr, copies location of content drawn into Image.
1504
1505#Param flushPendingGrContextIO flag to flush outstanding requests ##
1506#Param origin storage for one of: kTopLeft_GrSurfaceOrigin,
1507 kBottomLeft_GrSurfaceOrigin; or nullptr
1508##
1509
Cary Clarkba75aee2018-04-05 08:18:41 -04001510#Return back-end API texture handle; invalid on failure ##
Robert Phillipsc5509952018-04-04 15:54:55 -04001511
Cary Clarkba75aee2018-04-05 08:18:41 -04001512#Example
1513#Image 3
1514#Platform gpu
Brian Osman584b5012018-04-13 15:48:26 -04001515 GrContext* grContext = canvas->getGrContext();
1516 if (!grContext) {
1517 canvas->drawString("GPU only!", 20, 40, SkPaint());
1518 return;
1519 }
1520 sk_sp<SkImage> imageFromBackend = SkImage::MakeFromAdoptedTexture(grContext, backEndTexture,
1521 kBottomLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType, kOpaque_SkAlphaType);
1522 GrBackendTexture textureFromImage = imageFromBackend->getBackendTexture(false);
1523 if (!textureFromImage.isValid()) {
1524 return;
1525 }
1526 sk_sp<SkImage> imageFromTexture = SkImage::MakeFromAdoptedTexture(grContext, textureFromImage,
1527 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType, kOpaque_SkAlphaType);
1528 canvas->drawImage(imageFromTexture, 0, 0);
Cary Clarkba75aee2018-04-05 08:18:41 -04001529 canvas->drawImage(imageFromBackend, 128, 128);
Robert Phillipsc5509952018-04-04 15:54:55 -04001530##
1531
1532#SeeAlso MakeFromTexture isTextureBacked
1533
1534#Method ##
1535
1536# ------------------------------------------------------------------------------
1537
Cary Clarka560c472017-11-27 10:44:06 -05001538#Enum CachingHint
Cary Clark682c58d2018-05-16 07:07:07 -04001539#Line # options for readPixels and scalePixels ##
Cary Clarka560c472017-11-27 10:44:06 -05001540#Code
1541 enum CachingHint {
1542 kAllow_CachingHint,
1543 kDisallow_CachingHint,
1544 };
1545##
1546
Cary Clarkac47b882018-01-11 10:35:44 -05001547CachingHint selects whether Skia may internally cache Bitmaps generated by
1548decoding Image, or by copying Image from GPU to CPU. The default behavior
Cary Clark682c58d2018-05-16 07:07:07 -04001549allows caching Bitmaps.
Cary Clarkac47b882018-01-11 10:35:44 -05001550
1551Choose kDisallow_CachingHint if Image pixels are to be used only once, or
1552if Image pixels reside in a cache outside of Skia, or to reduce memory pressure.
1553
1554Choosing kAllow_CachingHint does not ensure that pixels will be cached.
1555Image pixels may not be cached if memory requirements are too large or
1556pixels are not accessible.
Cary Clarka560c472017-11-27 10:44:06 -05001557
1558#Const kAllow_CachingHint 0
Cary Clark682c58d2018-05-16 07:07:07 -04001559#Line # allows internally caching decoded and copied pixels ##
Cary Clarka560c472017-11-27 10:44:06 -05001560##
1561#Const kDisallow_CachingHint 1
Cary Clark682c58d2018-05-16 07:07:07 -04001562#Line # disallows internally caching decoded and copied pixels ##
Cary Clarka560c472017-11-27 10:44:06 -05001563##
1564
Cary Clarkac47b882018-01-11 10:35:44 -05001565#NoExample
Cary Clarka560c472017-11-27 10:44:06 -05001566##
1567
Cary Clarkac47b882018-01-11 10:35:44 -05001568#SeeAlso readPixels scalePixels
Cary Clarka560c472017-11-27 10:44:06 -05001569
1570#Enum ##
1571
1572# ------------------------------------------------------------------------------
1573
1574#Method bool readPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRowBytes,
1575 int srcX, int srcY, CachingHint cachingHint = kAllow_CachingHint) const
Cary Clark78de7512018-02-07 07:27:09 -05001576#In Pixels
Cary Clark4855f782018-02-06 09:41:53 -05001577#Line # copies and converts pixels ##
Cary Clarka560c472017-11-27 10:44:06 -05001578
Cary Clarkac47b882018-01-11 10:35:44 -05001579Copies Rect of pixels from Image to dstPixels. Copy starts at offset (srcX, srcY),
Cary Clark682c58d2018-05-16 07:07:07 -04001580and does not exceed Image (width(), height()).
Cary Clarkac47b882018-01-11 10:35:44 -05001581
1582dstInfo specifies width, height, Color_Type, Alpha_Type, and Color_Space of
1583destination. dstRowBytes specifics the gap from one destination row to the next.
1584Returns true if pixels are copied. Returns false if:
1585#List
1586# dstInfo.addr() equals nullptr ##
1587# dstRowBytes is less than dstInfo.minRowBytes ##
1588# Pixel_Ref is nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -05001589##
1590
Cary Clarkac47b882018-01-11 10:35:44 -05001591Pixels are copied only if pixel conversion is possible. If Image Color_Type is
1592kGray_8_SkColorType, or kAlpha_8_SkColorType; dstInfo.colorType must match.
1593If Image Color_Type is kGray_8_SkColorType, dstInfo.colorSpace must match.
1594If Image Alpha_Type is kOpaque_SkAlphaType, dstInfo.alphaType must
1595match. If Image Color_Space is nullptr, dstInfo.colorSpace must match. Returns
1596false if pixel conversion is not possible.
Cary Clarka560c472017-11-27 10:44:06 -05001597
Cary Clarkac47b882018-01-11 10:35:44 -05001598srcX and srcY may be negative to copy only top or left of source. Returns
Cary Clark682c58d2018-05-16 07:07:07 -04001599false if width() or height() is zero or negative.
Cary Clark2be81cf2018-09-13 12:04:30 -04001600Returns false if #Formula # abs(srcX) >= Image width() ##, or if #Formula # abs(srcY) >= Image height() ##.
Cary Clarka560c472017-11-27 10:44:06 -05001601
Cary Clarkac47b882018-01-11 10:35:44 -05001602If cachingHint is kAllow_CachingHint, pixels may be retained locally.
1603If cachingHint is kDisallow_CachingHint, pixels are not added to the local cache.
1604
1605#Param dstInfo destination width, height, Color_Type, Alpha_Type, Color_Space ##
1606#Param dstPixels destination pixel storage ##
1607#Param dstRowBytes destination row length ##
1608#Param srcX column index whose absolute value is less than width() ##
1609#Param srcY row index whose absolute value is less than height() ##
1610#Param cachingHint one of: kAllow_CachingHint, kDisallow_CachingHint ##
1611
1612#Return true if pixels are copied to dstPixels ##
Cary Clarka560c472017-11-27 10:44:06 -05001613
1614#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001615#Image 3
1616 canvas->scale(.5f, .5f);
1617 const int width = 32;
1618 const int height = 32;
1619 std::vector<int32_t> dstPixels;
1620 dstPixels.resize(height * width * 4);
1621 SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);
1622 for (int y = 0; y < 512; y += height ) {
1623 for (int x = 0; x < 512; x += width ) {
1624 if (image->readPixels(info, &dstPixels.front(), width * 4, x, y)) {
1625 SkPixmap dstPixmap(info, &dstPixels.front(), width * 4);
1626 SkBitmap bitmap;
1627 bitmap.installPixels(dstPixmap);
1628 canvas->drawBitmap(bitmap, 0, 0);
1629 }
1630 canvas->translate(48, 0);
1631 }
1632 canvas->translate(-16 * 48, 48);
1633 }
Cary Clarka560c472017-11-27 10:44:06 -05001634##
1635
Cary Clarkac47b882018-01-11 10:35:44 -05001636#SeeAlso scalePixels SkBitmap::readPixels SkPixmap::readPixels SkCanvas::readPixels SkSurface::readPixels
Cary Clarka560c472017-11-27 10:44:06 -05001637
1638#Method ##
1639
1640# ------------------------------------------------------------------------------
1641
1642#Method bool readPixels(const SkPixmap& dst, int srcX, int srcY,
1643 CachingHint cachingHint = kAllow_CachingHint) const
1644
Cary Clarkac47b882018-01-11 10:35:44 -05001645Copies a Rect of pixels from Image to dst. Copy starts at (srcX, srcY), and
Cary Clark682c58d2018-05-16 07:07:07 -04001646does not exceed Image (width(), height()).
Cary Clarka560c472017-11-27 10:44:06 -05001647
Cary Clarkac47b882018-01-11 10:35:44 -05001648dst specifies width, height, Color_Type, Alpha_Type, Color_Space, pixel storage,
1649and row bytes of destination. dst.rowBytes specifics the gap from one destination
1650row to the next. Returns true if pixels are copied. Returns false if:
1651#List
1652# dst pixel storage equals nullptr ##
1653# dst.rowBytes is less than SkImageInfo::minRowBytes ##
1654# Pixel_Ref is nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -05001655##
1656
Cary Clarkac47b882018-01-11 10:35:44 -05001657Pixels are copied only if pixel conversion is possible. If Image Color_Type is
1658kGray_8_SkColorType, or kAlpha_8_SkColorType; dst.colorType must match.
1659If Image Color_Type is kGray_8_SkColorType, dst.colorSpace must match.
1660If Image Alpha_Type is kOpaque_SkAlphaType, dst.alphaType must
1661match. If Image Color_Space is nullptr, dst.colorSpace must match. Returns
1662false if pixel conversion is not possible.
Cary Clark682c58d2018-05-16 07:07:07 -04001663
Cary Clarkac47b882018-01-11 10:35:44 -05001664srcX and srcY may be negative to copy only top or left of source. Returns
Cary Clark682c58d2018-05-16 07:07:07 -04001665false if width() or height() is zero or negative.
Cary Clark2be81cf2018-09-13 12:04:30 -04001666Returns false if #Formula # abs(srcX) >= Image width() ##, or if #Formula # abs(srcY) >= Image height() ##.
Cary Clarkac47b882018-01-11 10:35:44 -05001667
1668If cachingHint is kAllow_CachingHint, pixels may be retained locally.
1669If cachingHint is kDisallow_CachingHint, pixels are not added to the local cache.
1670
1671#Param dst destination Pixmap: Image_Info, pixels, row bytes ##
1672#Param srcX column index whose absolute value is less than width() ##
1673#Param srcY row index whose absolute value is less than height() ##
1674#Param cachingHint one of: kAllow_CachingHint, kDisallow_CachingHint ##
1675
1676#Return true if pixels are copied to dst ##
1677
1678#Example
1679#Image 3
1680 std::vector<int32_t> srcPixels;
1681 int rowBytes = image->width() * 4;
1682 int quarterWidth = image->width() / 4;
1683 int quarterHeight = image->height() / 4;
1684 srcPixels.resize(image->height() * rowBytes);
1685 for (int y = 0; y < 4; ++y) {
1686 for (int x = 0; x < 4; ++x) {
1687 SkPixmap pixmap(SkImageInfo::MakeN32Premul(quarterWidth, quarterHeight),
1688 &srcPixels.front() + x * image->height() * quarterWidth +
1689 y * quarterWidth, rowBytes);
1690 image->readPixels(pixmap, x * quarterWidth, y * quarterHeight);
1691 }
1692 }
1693 canvas->scale(.5f, .5f);
1694 SkBitmap bitmap;
1695 bitmap.installPixels(SkImageInfo::MakeN32Premul(image->width(), image->height()),
1696 &srcPixels.front(), rowBytes);
1697 canvas->drawBitmap(bitmap, 0, 0);
1698##
1699
1700#SeeAlso scalePixels SkBitmap::readPixels SkPixmap::readPixels SkCanvas::readPixels SkSurface::readPixels
Cary Clarka560c472017-11-27 10:44:06 -05001701
1702#Method ##
1703
1704# ------------------------------------------------------------------------------
1705
1706#Method bool scalePixels(const SkPixmap& dst, SkFilterQuality filterQuality,
1707 CachingHint cachingHint = kAllow_CachingHint) const
Cary Clark78de7512018-02-07 07:27:09 -05001708#In Pixels
Cary Clark4855f782018-02-06 09:41:53 -05001709#Line # scales and converts one Image to another ##
Cary Clarka560c472017-11-27 10:44:06 -05001710
Cary Clarkac47b882018-01-11 10:35:44 -05001711Copies Image to dst, scaling pixels to fit dst.width() and dst.height(), and
1712converting pixels to match dst.colorType and dst.alphaType. Returns true if
1713pixels are copied. Returns false if dst.addr() is nullptr, or dst.rowBytes is
1714less than dst SkImageInfo::minRowBytes.
Cary Clarka560c472017-11-27 10:44:06 -05001715
Cary Clarkac47b882018-01-11 10:35:44 -05001716Pixels are copied only if pixel conversion is possible. If Image Color_Type is
1717kGray_8_SkColorType, or kAlpha_8_SkColorType; dst.colorType must match.
1718If Image Color_Type is kGray_8_SkColorType, dst.colorSpace must match.
1719If Image Alpha_Type is kOpaque_SkAlphaType, dst.alphaType must
1720match. If Image Color_Space is nullptr, dst.colorSpace must match. Returns
1721false if pixel conversion is not possible.
Cary Clarka560c472017-11-27 10:44:06 -05001722
Cary Clarkac47b882018-01-11 10:35:44 -05001723Scales the image, with filterQuality, to match dst.width() and dst.height().
1724filterQuality kNone_SkFilterQuality is fastest, typically implemented with
1725Filter_Quality_Nearest_Neighbor. kLow_SkFilterQuality is typically implemented with
1726Filter_Quality_Bilerp. kMedium_SkFilterQuality is typically implemented with
1727Filter_Quality_Bilerp, and Filter_Quality_MipMap when size is reduced.
1728kHigh_SkFilterQuality is slowest, typically implemented with Filter_Quality_BiCubic.
1729
1730If cachingHint is kAllow_CachingHint, pixels may be retained locally.
1731If cachingHint is kDisallow_CachingHint, pixels are not added to the local cache.
1732
1733#Param dst destination Pixmap: Image_Info, pixels, row bytes ##
1734#Param filterQuality one of: kNone_SkFilterQuality, kLow_SkFilterQuality,
1735 kMedium_SkFilterQuality, kHigh_SkFilterQuality
1736##
1737#Param cachingHint one of: kAllow_CachingHint, kDisallow_CachingHint ##
1738
1739#Return true if pixels are scaled to fit dst ##
Cary Clarka560c472017-11-27 10:44:06 -05001740
1741#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001742#Image 3
1743#Height 128
1744 std::vector<int32_t> srcPixels;
1745 int quarterWidth = image->width() / 16;
1746 int rowBytes = quarterWidth * 4;
1747 int quarterHeight = image->height() / 16;
1748 srcPixels.resize(quarterHeight * rowBytes);
1749 SkPixmap pixmap(SkImageInfo::MakeN32Premul(quarterWidth, quarterHeight),
1750 &srcPixels.front(), rowBytes);
1751 canvas->scale(4, 4);
1752 SkFilterQuality qualities[] = { kNone_SkFilterQuality, kLow_SkFilterQuality,
1753 kMedium_SkFilterQuality, kHigh_SkFilterQuality };
1754 for (unsigned index = 0; index < SK_ARRAY_COUNT(qualities); ++index) {
1755 image->scalePixels(pixmap, qualities[index]);
1756 sk_sp<SkImage> filtered = SkImage::MakeFromRaster(pixmap, nullptr, nullptr);
1757 canvas->drawImage(filtered, 16 * index, 0);
1758 }
Cary Clarka560c472017-11-27 10:44:06 -05001759##
1760
Cary Clarkac47b882018-01-11 10:35:44 -05001761#SeeAlso SkCanvas::drawImage readPixels SkPixmap::scalePixels
Cary Clarka560c472017-11-27 10:44:06 -05001762
1763#Method ##
1764
1765# ------------------------------------------------------------------------------
1766
1767#Method sk_sp<SkData> encodeToData(SkEncodedImageFormat encodedImageFormat, int quality) const
Cary Clark78de7512018-02-07 07:27:09 -05001768#In Utility
Cary Clark4855f782018-02-06 09:41:53 -05001769#Line # returns encoded Image as SkData ##
Cary Clark682c58d2018-05-16 07:07:07 -04001770Encodes Image pixels, returning result as SkData.
Cary Clark2f466242017-12-11 16:03:17 -05001771
Cary Clarkac47b882018-01-11 10:35:44 -05001772Returns nullptr if encoding fails, or if encodedImageFormat is not supported.
Cary Clarka560c472017-11-27 10:44:06 -05001773
Cary Clarkac47b882018-01-11 10:35:44 -05001774Image encoding in a format requires both building with one or more of:
1775SK_HAS_JPEG_LIBRARY, SK_HAS_PNG_LIBRARY, SK_HAS_WEBP_LIBRARY; and platform support
1776for the encoded format.
1777
1778If SK_BUILD_FOR_MAC or SK_BUILD_FOR_IOS is defined, encodedImageFormat can
1779additionally be one of: SkEncodedImageFormat::kICO, SkEncodedImageFormat::kBMP,
1780SkEncodedImageFormat::kGIF.
1781
1782quality is a platform and format specific metric trading off size and encoding
1783error. When used, quality equaling 100 encodes with the least error. quality may
1784be ignored by the encoder.
1785
1786#Param encodedImageFormat one of: SkEncodedImageFormat::kJPEG, SkEncodedImageFormat::kPNG,
1787 SkEncodedImageFormat::kWEBP
1788 ##
1789#Param quality encoder specific metric with 100 equaling best ##
Cary Clarka560c472017-11-27 10:44:06 -05001790
Cary Clark2f466242017-12-11 16:03:17 -05001791#Return encoded Image, or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -05001792
1793#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001794#Image 3
1795 canvas->scale(4, 4);
1796 SkIRect subset = {0, 0, 16, 64};
1797 int x = 0;
1798 for (int quality : { 0, 10, 50, 100 } ) {
1799 sk_sp<SkData> data(image->encodeToData(SkEncodedImageFormat::kJPEG, quality));
1800 sk_sp<SkImage> filtered = SkImage::MakeFromEncoded(data, &subset);
1801 canvas->drawImage(filtered, x, 0);
1802 x += 16;
1803 }
Cary Clarka560c472017-11-27 10:44:06 -05001804##
1805
Cary Clarkac47b882018-01-11 10:35:44 -05001806#SeeAlso refEncodedData MakeFromEncoded
Cary Clarka560c472017-11-27 10:44:06 -05001807
1808#Method ##
1809
1810# ------------------------------------------------------------------------------
1811
Cary Clark61ca7c52018-01-02 11:34:14 -05001812#Method sk_sp<SkData> encodeToData() const
Cary Clarka560c472017-11-27 10:44:06 -05001813
Cary Clarkac47b882018-01-11 10:35:44 -05001814Encodes Image pixels, returning result as SkData. Returns existing encoded data
1815if present; otherwise, Image is encoded with SkEncodedImageFormat::kPNG. Skia
1816must be built with SK_HAS_PNG_LIBRARY to encode Image.
Cary Clarka560c472017-11-27 10:44:06 -05001817
Cary Clark682c58d2018-05-16 07:07:07 -04001818Returns nullptr if existing encoded data is missing or invalid, and
Cary Clarka560c472017-11-27 10:44:06 -05001819encoding fails.
1820
Cary Clarkac47b882018-01-11 10:35:44 -05001821#Return encoded Image, or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -05001822
1823#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001824#Image 3
1825 canvas->scale(4, 4);
1826 SkIRect subset = {136, 32, 200, 96};
1827 sk_sp<SkData> data(image->encodeToData());
1828 sk_sp<SkImage> eye = SkImage::MakeFromEncoded(data, &subset);
1829 canvas->drawImage(eye, 0, 0);
Cary Clarka560c472017-11-27 10:44:06 -05001830##
1831
Cary Clarkac47b882018-01-11 10:35:44 -05001832#SeeAlso refEncodedData MakeFromEncoded
Cary Clarka560c472017-11-27 10:44:06 -05001833
1834#Method ##
1835
1836# ------------------------------------------------------------------------------
1837
1838#Method sk_sp<SkData> refEncodedData() const
Cary Clark78de7512018-02-07 07:27:09 -05001839#In Utility
Cary Clark4855f782018-02-06 09:41:53 -05001840#Line # returns Image encoded in SkData if present ##
Cary Clarkac47b882018-01-11 10:35:44 -05001841Returns encoded Image pixels as SkData, if Image was created from supported
1842encoded stream format. Platform support for formats vary and may require building
1843with one or more of: SK_HAS_JPEG_LIBRARY, SK_HAS_PNG_LIBRARY, SK_HAS_WEBP_LIBRARY.
Cary Clarka560c472017-11-27 10:44:06 -05001844
Cary Clarkac47b882018-01-11 10:35:44 -05001845Returns nullptr if Image contents are not encoded.
Cary Clarka560c472017-11-27 10:44:06 -05001846
Cary Clarkac47b882018-01-11 10:35:44 -05001847#Return encoded Image, or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -05001848
1849#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001850#Image 3
1851#Platform gpu
1852 struct {
1853 const char* name;
1854 sk_sp<SkImage> image;
1855 } tests[] = { { "image", image }, { "bitmap", SkImage::MakeFromBitmap(source) },
1856 { "texture", SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04001857 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
1858 kOpaque_SkAlphaType, nullptr) } };
Cary Clarkac47b882018-01-11 10:35:44 -05001859 SkString string;
1860 SkPaint paint;
1861 for (const auto& test : tests ) {
1862 if (!test.image) {
1863 string.printf("no %s", test.name);
1864 } else {
1865 string.printf("%s" "encoded %s", test.image->refEncodedData() ? "" : "no ", test.name);
1866 }
1867 canvas->drawString(string, 10, 20, paint);
1868 canvas->translate(0, 20);
1869 }
Cary Clarka560c472017-11-27 10:44:06 -05001870##
1871
Cary Clarkac47b882018-01-11 10:35:44 -05001872#SeeAlso encodeToData MakeFromEncoded
Cary Clarka560c472017-11-27 10:44:06 -05001873
1874#Method ##
1875
1876# ------------------------------------------------------------------------------
Cary Clark4855f782018-02-06 09:41:53 -05001877#Subtopic Utility
Cary Clark4855f782018-02-06 09:41:53 -05001878#Line # rarely called management functions ##
1879##
Cary Clarka560c472017-11-27 10:44:06 -05001880
Cary Clarka560c472017-11-27 10:44:06 -05001881#Method sk_sp<SkImage> makeSubset(const SkIRect& subset) const
Cary Clark61313f32018-10-08 14:57:48 -04001882#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05001883#Line # creates Image containing part of original ##
Cary Clarkac47b882018-01-11 10:35:44 -05001884Returns subset of Image. subset must be fully contained by Image dimensions().
1885The implementation may share pixels, or may copy them.
Cary Clarka560c472017-11-27 10:44:06 -05001886
Cary Clarkac47b882018-01-11 10:35:44 -05001887Returns nullptr if subset is empty, or subset is not contained by bounds, or
1888pixels in Image could not be read or copied.
Cary Clarka560c472017-11-27 10:44:06 -05001889
Cary Clarkac47b882018-01-11 10:35:44 -05001890#Param subset bounds of returned Image ##
1891
1892#Return partial or full Image, or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -05001893
1894#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001895#Image 3
1896 canvas->scale(.5f, .5f);
Cary Clarkc30382f2018-07-24 08:09:27 -04001897 const int width = 64;
1898 const int height = 64;
Cary Clarkac47b882018-01-11 10:35:44 -05001899 for (int y = 0; y < 512; y += height ) {
1900 for (int x = 0; x < 512; x += width ) {
1901 sk_sp<SkImage> subset(image->makeSubset({x, y, x + width, y + height}));
1902 canvas->drawImage(subset, x * 3 / 2, y * 3 / 2);
1903 }
1904 }
Cary Clarka560c472017-11-27 10:44:06 -05001905##
1906
Cary Clarkac47b882018-01-11 10:35:44 -05001907#SeeAlso MakeFromEncoded
Cary Clarka560c472017-11-27 10:44:06 -05001908
1909#Method ##
1910
1911# ------------------------------------------------------------------------------
1912
Greg Daniel5f4b09d2018-06-12 16:39:59 -04001913#Method sk_sp<SkImage> makeTextureImage(GrContext* context, SkColorSpace* dstColorSpace,
1914 GrMipMapped mipMapped = GrMipMapped::kNo) const
Cary Clark61313f32018-10-08 14:57:48 -04001915#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05001916#Line # creates Image matching Color_Space if possible ##
Cary Clarkac47b882018-01-11 10:35:44 -05001917Returns Image backed by GPU_Texture associated with context. Returned Image is
Cary Clark5538c132018-06-14 12:28:14 -04001918compatible with Surface created with dstColorSpace. The returned Image respects
1919mipMapped setting; if mipMapped equals GrMipMapped::kYes, the backing texture
1920allocates Mip_Map levels. Returns original Image if context
1921and dstColorSpace match and mipMapped is compatible with backing GPU_Texture.
Cary Clarkac47b882018-01-11 10:35:44 -05001922
1923Returns nullptr if context is nullptr, or if Image was created with another
1924GrContext.
Cary Clarka560c472017-11-27 10:44:06 -05001925
Cary Clark61ca7c52018-01-02 11:34:14 -05001926#Param context GPU_Context ##
Cary Clarkac47b882018-01-11 10:35:44 -05001927#Param dstColorSpace range of colors of matching Surface on GPU ##
Cary Clark5538c132018-06-14 12:28:14 -04001928#Param mipMapped whether created Image texture must allocate Mip_Map levels ##
Cary Clarka560c472017-11-27 10:44:06 -05001929
Cary Clarkac47b882018-01-11 10:35:44 -05001930#Return created Image, or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -05001931
1932#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001933#Platform gpu
1934#Image 5
1935 auto drawImage = [=](sk_sp<SkImage> image, GrContext* context, const char* label) -> void {
1936 if (nullptr == image || nullptr == context) {
1937 return;
1938 }
1939 SkPaint paint;
1940 paint.setAntiAlias(true);
1941 paint.setTextAlign(SkPaint::kCenter_Align);
1942 sk_sp<SkImage> texture(image->makeTextureImage(context, nullptr));
1943 canvas->drawImage(texture, 0, 0);
1944 canvas->drawString(label, texture->width() / 2, texture->height() / 4, paint);
1945 };
1946 sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
1947 GrContext* context = canvas->getGrContext();
1948 sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(context, backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04001949 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
1950 kOpaque_SkAlphaType, nullptr));
Cary Clarkac47b882018-01-11 10:35:44 -05001951 drawImage(image, context, "image");
1952 canvas->translate(image->width(), 0);
1953 drawImage(bitmapImage, context, "source");
1954 canvas->translate(-image->width(), image->height());
1955 drawImage(textureImage, context, "backEndTexture");
Cary Clarka560c472017-11-27 10:44:06 -05001956##
1957
Cary Clarkac47b882018-01-11 10:35:44 -05001958#SeeAlso MakeFromTexture
Cary Clarka560c472017-11-27 10:44:06 -05001959
1960#Method ##
1961
1962# ------------------------------------------------------------------------------
1963
1964#Method sk_sp<SkImage> makeNonTextureImage() const
Cary Clark61313f32018-10-08 14:57:48 -04001965#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05001966#Line # creates Image without dependency on GPU_Texture ##
Cary Clarkac47b882018-01-11 10:35:44 -05001967Returns Raster_Image or Lazy_Image. Copies Image backed by GPU_Texture into
Cary Clark4855f782018-02-06 09:41:53 -05001968CPU memory if needed. Returns original Image if decoded in Raster_Bitmap,
Cary Clarkac47b882018-01-11 10:35:44 -05001969or if encoded in a stream.
Cary Clark61ca7c52018-01-02 11:34:14 -05001970
Cary Clarkac47b882018-01-11 10:35:44 -05001971Returns nullptr if backed by GPU_Texture and copy fails.
1972
1973#Return Raster_Image, Lazy_Image, or nullptr ##
Cary Clark61ca7c52018-01-02 11:34:14 -05001974
1975#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001976#Image 5
1977#Platform gpu
1978 auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {
1979 if (nullptr == image) {
1980 return;
1981 }
1982 SkPaint paint;
1983 paint.setAntiAlias(true);
1984 paint.setTextAlign(SkPaint::kCenter_Align);
1985 sk_sp<SkImage> nonTexture(image->makeNonTextureImage());
1986 canvas->drawImage(nonTexture, 0, 0);
1987 canvas->drawString(label, nonTexture->width() / 2, nonTexture->height() / 4, paint);
1988 };
1989 sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
1990 sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04001991 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
1992 kOpaque_SkAlphaType, nullptr));
Cary Clarkac47b882018-01-11 10:35:44 -05001993 drawImage(image, "image");
1994 canvas->translate(image->width(), 0);
1995 drawImage(bitmapImage, "source");
1996 canvas->translate(-image->width(), image->height());
1997 drawImage(textureImage, "backEndTexture");
Cary Clark61ca7c52018-01-02 11:34:14 -05001998##
1999
Cary Clark56356312018-02-08 14:45:18 -05002000#SeeAlso makeTextureImage makeRasterImage MakeBackendTextureFromSkImage
Cary Clark61ca7c52018-01-02 11:34:14 -05002001
2002#Method ##
2003
2004# ------------------------------------------------------------------------------
2005
2006#Method sk_sp<SkImage> makeRasterImage() const
Cary Clark61313f32018-10-08 14:57:48 -04002007#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05002008#Line # creates Image compatible with Raster_Surface if possible ##
Cary Clarkac47b882018-01-11 10:35:44 -05002009Returns Raster_Image. Copies Image backed by GPU_Texture into CPU memory,
Cary Clark4855f782018-02-06 09:41:53 -05002010or decodes Image from Lazy_Image. Returns original Image if decoded in
Cary Clarkac47b882018-01-11 10:35:44 -05002011Raster_Bitmap.
Cary Clarka560c472017-11-27 10:44:06 -05002012
Cary Clarkac47b882018-01-11 10:35:44 -05002013Returns nullptr if copy, decode, or pixel read fails.
Cary Clarka560c472017-11-27 10:44:06 -05002014
Cary Clarkac47b882018-01-11 10:35:44 -05002015#Return Raster_Image, or nullptr ##
2016
Cary Clark4855f782018-02-06 09:41:53 -05002017#Bug 7479
Cary Clarka560c472017-11-27 10:44:06 -05002018#Example
Cary Clarkac47b882018-01-11 10:35:44 -05002019#Image 5
2020#Platform gpu
2021 auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {
2022 if (nullptr == image) {
2023 return;
2024 }
2025 SkPaint paint;
2026 paint.setAntiAlias(true);
2027 paint.setTextAlign(SkPaint::kCenter_Align);
2028 sk_sp<SkImage> raster(image->makeRasterImage());
2029 canvas->drawImage(raster, 0, 0);
2030 canvas->drawString(label, raster->width() / 2, raster->height() / 4, paint);
2031 };
2032 sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
2033 sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04002034 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
2035 kOpaque_SkAlphaType, nullptr));
Cary Clarkac47b882018-01-11 10:35:44 -05002036 drawImage(image, "image");
2037 canvas->translate(image->width(), 0);
2038 drawImage(bitmapImage, "source");
2039 canvas->translate(-image->width(), image->height());
2040 drawImage(textureImage, "backEndTexture");
Cary Clarka560c472017-11-27 10:44:06 -05002041##
2042
Cary Clarkac47b882018-01-11 10:35:44 -05002043#SeeAlso isTextureBacked isLazyGenerated MakeFromRaster
Cary Clarka560c472017-11-27 10:44:06 -05002044
2045#Method ##
2046
2047# ------------------------------------------------------------------------------
2048
2049#Method sk_sp<SkImage> makeWithFilter(const SkImageFilter* filter, const SkIRect& subset,
2050 const SkIRect& clipBounds, SkIRect* outSubset,
2051 SkIPoint* offset) const
Cary Clark61313f32018-10-08 14:57:48 -04002052#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05002053#Line # creates filtered, clipped Image ##
Cary Clarka560c472017-11-27 10:44:06 -05002054
Cary Clarkac47b882018-01-11 10:35:44 -05002055Creates filtered Image. filter processes original Image, potentially changing
2056color, position, and size. subset is the bounds of original Image processed
2057by filter. clipBounds is the expected bounds of the filtered Image. outSubset
2058is required storage for the actual bounds of the filtered Image. offset is
2059required storage for translation of returned Image.
Cary Clarka560c472017-11-27 10:44:06 -05002060
Cary Clarkac47b882018-01-11 10:35:44 -05002061Returns nullptr if Image could not be created. If nullptr is returned, outSubset
2062and offset are undefined.
2063
Cary Clark56356312018-02-08 14:45:18 -05002064Useful for animation of SkImageFilter that varies size from frame to frame.
2065Returned Image is created larger than required by filter so that GPU_Texture
2066can be reused with different sized effects. outSubset describes the valid bounds
2067of GPU_Texture returned. offset translates the returned Image to keep subsequent
2068animation frames aligned with respect to each other.
Cary Clarkac47b882018-01-11 10:35:44 -05002069
2070#Param filter how Image is sampled when transformed ##
Cary Clark56356312018-02-08 14:45:18 -05002071#Param subset bounds of Image processed by filter ##
2072#Param clipBounds expected bounds of filtered Image ##
2073#Param outSubset storage for returned Image bounds ##
2074#Param offset storage for returned Image translation ##
Cary Clarka560c472017-11-27 10:44:06 -05002075
Cary Clarkac47b882018-01-11 10:35:44 -05002076#Return filtered Image, or nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -05002077
Cary Clark5717e822018-09-21 11:36:41 -04002078# Duration 5 breaks fiddlecli
Cary Clarka560c472017-11-27 10:44:06 -05002079#Example
Cary Clarkac47b882018-01-11 10:35:44 -05002080#Description
2081In each frame of the animation, filtered Image is drawn in a different location.
2082By translating canvas by returned offset, Image appears stationary.
2083##
2084#Image 5
2085#Platform gpu
Cary Clark5717e822018-09-21 11:36:41 -04002086#Duration 1
Cary Clarkac47b882018-01-11 10:35:44 -05002087 sk_sp<SkImageFilter> shadowFilter = SkDropShadowImageFilter::Make(
2088 -10.0f * frame, 5.0f * frame, 3.0f, 3.0f, SK_ColorBLUE,
2089 SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode,
2090 nullptr);
2091 sk_sp<SkImageFilter> offsetFilter = SkOffsetImageFilter::Make(40, 40, shadowFilter, nullptr);
2092 SkIRect subset = image->bounds();
2093 SkIRect clipBounds = image->bounds();
2094 clipBounds.outset(60, 60);
2095 SkIRect outSubset;
2096 SkIPoint offset;
2097 sk_sp<SkImage> filtered(image->makeWithFilter(offsetFilter.get(), subset, clipBounds,
2098 &outSubset, &offset));
2099 SkPaint paint;
2100 paint.setAntiAlias(true);
2101 paint.setStyle(SkPaint::kStroke_Style);
2102 canvas->drawLine(0, 0, offset.fX, offset.fY, paint);
2103 canvas->translate(offset.fX, offset.fY);
2104 canvas->drawImage(filtered, 0, 0);
Cary Clark681287e2018-03-16 11:34:15 -04002105 canvas->drawRect(SkRect::Make(outSubset), paint);
Cary Clarka560c472017-11-27 10:44:06 -05002106##
2107
Cary Clark56356312018-02-08 14:45:18 -05002108#SeeAlso makeShader SkPaint::setImageFilter
Cary Clarka560c472017-11-27 10:44:06 -05002109
2110#Method ##
2111
2112# ------------------------------------------------------------------------------
2113
Cary Clarka560c472017-11-27 10:44:06 -05002114#Typedef std::function<void(GrBackendTexture)> BackendTextureReleaseProc
Cary Clark682c58d2018-05-16 07:07:07 -04002115#Line # parameter type for MakeBackendTextureFromSkImage ##
Cary Clarkffb3d682018-05-17 12:17:28 -04002116
2117#Code
2118typedef std::function<void(GrBackendTexture)> BackendTextureReleaseProc;
2119##
2120
Cary Clark0d225392018-06-07 09:59:07 -04002121Defines a callback function, taking one parameter of type GrBackendTexture with
2122no return value. Function is called when back-end texture is to be released.
Cary Clarka560c472017-11-27 10:44:06 -05002123##
2124
2125# ------------------------------------------------------------------------------
2126
2127#Method static bool MakeBackendTextureFromSkImage(GrContext* context,
2128 sk_sp<SkImage> image,
2129 GrBackendTexture* backendTexture,
2130 BackendTextureReleaseProc* backendTextureReleaseProc)
Cary Clark61313f32018-10-08 14:57:48 -04002131#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05002132#Line # creates GPU_Texture from Image ##
Cary Clarka560c472017-11-27 10:44:06 -05002133
Cary Clark56356312018-02-08 14:45:18 -05002134Creates a GrBackendTexture from the provided SkImage. Returns true and
2135stores result in backendTexture and backendTextureReleaseProc if
2136texture is created; otherwise, returns false and leaves
2137backendTexture and backendTextureReleaseProc unmodified.
Cary Clarka560c472017-11-27 10:44:06 -05002138
Cary Clark56356312018-02-08 14:45:18 -05002139Call backendTextureReleaseProc after deleting backendTexture.
2140backendTextureReleaseProc cleans up auxiliary data related to returned
2141backendTexture. The caller must delete returned backendTexture after use.
Cary Clarka560c472017-11-27 10:44:06 -05002142
Cary Clark56356312018-02-08 14:45:18 -05002143If Image is both texture backed and singly referenced, image is returned in
2144backendTexture without conversion or making a copy. Image is singly referenced
2145if its was transferred solely using std::move().
2146
2147If Image is not texture backed, returns texture with Image contents.
Cary Clarka560c472017-11-27 10:44:06 -05002148
Cary Clark61ca7c52018-01-02 11:34:14 -05002149#Param context GPU_Context ##
Cary Clark56356312018-02-08 14:45:18 -05002150#Param image Image used for texture ##
Cary Clark682c58d2018-05-16 07:07:07 -04002151#Param backendTexture storage for back-end texture ##
Cary Clark56356312018-02-08 14:45:18 -05002152#Param backendTextureReleaseProc storage for clean up function ##
Cary Clarka560c472017-11-27 10:44:06 -05002153
Cary Clark682c58d2018-05-16 07:07:07 -04002154#Return true if back-end texture was created ##
Cary Clarka560c472017-11-27 10:44:06 -05002155
2156#Example
Cary Clark56356312018-02-08 14:45:18 -05002157#Platform gpu
2158#Height 64
2159#Function
Brian Salomon67f85842018-02-09 08:50:22 -05002160static sk_sp<SkImage> create_gpu_image(GrContext* grContext) {
2161 const SkImageInfo info = SkImageInfo::MakeN32(20, 20, kOpaque_SkAlphaType);
2162 auto surface(SkSurface::MakeRenderTarget(grContext, SkBudgeted::kNo, info));
2163 SkCanvas* canvas = surface->getCanvas();
2164 canvas->clear(SK_ColorWHITE);
2165 SkPaint paint;
2166 paint.setColor(SK_ColorBLACK);
2167 canvas->drawRect(SkRect::MakeXYWH(5, 5, 10, 10), paint);
2168 return surface->makeImageSnapshot();
2169}
2170##
2171
Cary Clark682c58d2018-05-16 07:07:07 -04002172void draw(SkCanvas* canvas) {
Brian Salomon67f85842018-02-09 08:50:22 -05002173 GrContext* grContext = canvas->getGrContext();
2174 if (!grContext) {
2175 return;
2176 }
2177 sk_sp<SkImage> backEndImage = create_gpu_image(grContext);
2178 canvas->drawImage(backEndImage, 0, 0);
2179 GrBackendTexture texture;
2180 SkImage::BackendTextureReleaseProc proc;
2181 if (!SkImage::MakeBackendTextureFromSkImage(grContext, std::move(backEndImage),
2182 &texture, &proc)) {
2183 return;
2184 }
2185 sk_sp<SkImage> i2 = SkImage::MakeFromTexture(grContext, texture, kTopLeft_GrSurfaceOrigin,
2186 kN32_SkColorType, kOpaque_SkAlphaType, nullptr);
2187 canvas->drawImage(i2, 30, 30);
Cary Clark56356312018-02-08 14:45:18 -05002188}
Cary Clarka560c472017-11-27 10:44:06 -05002189##
2190
Cary Clark56356312018-02-08 14:45:18 -05002191#SeeAlso MakeFromTexture makeTextureImage
Cary Clarka560c472017-11-27 10:44:06 -05002192
2193#Method ##
2194
2195# ------------------------------------------------------------------------------
2196
2197#Enum LegacyBitmapMode
Cary Clark56356312018-02-08 14:45:18 -05002198#Deprecated soon
Cary Clarka560c472017-11-27 10:44:06 -05002199#Code
2200 enum LegacyBitmapMode {
2201 kRO_LegacyBitmapMode,
Cary Clarka560c472017-11-27 10:44:06 -05002202 };
2203##
2204
Cary Clarka560c472017-11-27 10:44:06 -05002205#Const kRO_LegacyBitmapMode 0
Cary Clark682c58d2018-05-16 07:07:07 -04002206#Line # returned bitmap is read-only and immutable ##
Cary Clarka560c472017-11-27 10:44:06 -05002207##
Cary Clarka560c472017-11-27 10:44:06 -05002208
2209#Enum ##
2210
2211# ------------------------------------------------------------------------------
2212
Cary Clark56356312018-02-08 14:45:18 -05002213#Method bool asLegacyBitmap(SkBitmap* bitmap, LegacyBitmapMode legacyBitmapMode = kRO_LegacyBitmapMode) const
Cary Clark61313f32018-10-08 14:57:48 -04002214#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05002215#Line # returns as Raster_Bitmap ##
Cary Clarkac47b882018-01-11 10:35:44 -05002216Creates raster Bitmap with same pixels as Image. If legacyBitmapMode is
2217kRO_LegacyBitmapMode, returned bitmap is read-only and immutable.
2218Returns true if Bitmap is stored in bitmap. Returns false and resets bitmap if
2219Bitmap write did not succeed.
Cary Clarka560c472017-11-27 10:44:06 -05002220
Cary Clark3cd22cc2017-12-01 11:49:58 -05002221#Param bitmap storage for legacy Bitmap ##
Cary Clark56356312018-02-08 14:45:18 -05002222#Param legacyBitmapMode to be deprecated ##
Cary Clarka560c472017-11-27 10:44:06 -05002223
Cary Clark3cd22cc2017-12-01 11:49:58 -05002224#Return true if Bitmap was created ##
Cary Clarka560c472017-11-27 10:44:06 -05002225
Cary Clarkae957c42018-06-07 17:07:17 -04002226#Example
Cary Clark56356312018-02-08 14:45:18 -05002227#Image 4
2228#Platform gpu
Brian Salomon67f85842018-02-09 08:50:22 -05002229 SkBitmap bitImage;
2230 if (image->asLegacyBitmap(&bitImage, SkImage::kRO_LegacyBitmapMode)) {
2231 canvas->drawBitmap(bitImage, 0, 0);
2232 }
2233 GrContext* grContext = canvas->getGrContext();
2234 if (!grContext) {
2235 return;
2236 }
2237 sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(grContext, backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04002238 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
2239 kOpaque_SkAlphaType, nullptr));
Brian Salomon67f85842018-02-09 08:50:22 -05002240 canvas->drawImage(textureImage, 45, 45);
2241 if (textureImage->asLegacyBitmap(&bitImage, SkImage::kRO_LegacyBitmapMode)) {
2242 canvas->drawBitmap(bitImage, 90, 90);
2243 }
Cary Clarka560c472017-11-27 10:44:06 -05002244##
2245
Cary Clark56356312018-02-08 14:45:18 -05002246#SeeAlso MakeRasterData makeRasterImage makeNonTextureImage
Cary Clarka560c472017-11-27 10:44:06 -05002247
2248#Method ##
2249
2250# ------------------------------------------------------------------------------
2251
2252#Method bool isLazyGenerated() const
Cary Clark4855f782018-02-06 09:41:53 -05002253#In Property
2254#Line # returns if Image is created as needed ##
Cary Clarka560c472017-11-27 10:44:06 -05002255Returns true if Image is backed by an image-generator or other service that creates
2256and caches its pixels or texture on-demand.
2257
Cary Clark2f466242017-12-11 16:03:17 -05002258#Return true if Image is created as needed ##
Cary Clarka560c472017-11-27 10:44:06 -05002259
2260#Example
Cary Clark2f466242017-12-11 16:03:17 -05002261#Height 80
2262#Function
2263class TestImageGenerator : public SkImageGenerator {
2264public:
2265 TestImageGenerator() : SkImageGenerator(SkImageInfo::MakeN32Premul(10, 10)) {}
2266 ~TestImageGenerator() override {}
2267protected:
2268 bool onGetPixels(const SkImageInfo& info, void* pixelPtr, size_t rowBytes,
2269 const Options& options) override {
2270 SkPMColor* pixels = static_cast<SkPMColor*>(pixelPtr);
2271 for (int y = 0; y < info.height(); ++y) {
2272 for (int x = 0; x < info.width(); ++x) {
2273 pixels[y * info.width() + x] = 0xff223344 + y * 0x000C0811;
2274 }
2275 }
2276 return true;
2277 }
2278};
2279##
2280void draw(SkCanvas* canvas) {
2281 auto gen = std::unique_ptr<TestImageGenerator>(new TestImageGenerator());
2282 sk_sp<SkImage> image(SkImage::MakeFromGenerator(std::move(gen)));
2283 SkString lazy(image->isLazyGenerated() ? "is lazy" : "not lazy");
2284 canvas->scale(8, 8);
2285 canvas->drawImage(image, 0, 0, nullptr);
2286 SkPaint paint;
2287 paint.setTextSize(4);
2288 canvas->drawString(lazy, 2, 5, paint);
2289}
Cary Clarka560c472017-11-27 10:44:06 -05002290##
2291
Cary Clarkf5404bb2018-01-05 12:10:09 -05002292#Example
2293#Image 5
2294#Platform gpu
2295void draw(SkCanvas* canvas) {
2296 auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {
2297 if (nullptr == image) {
2298 return;
2299 }
2300 SkPaint paint;
2301 paint.setAntiAlias(true);
2302 paint.setTextAlign(SkPaint::kCenter_Align);
2303 canvas->drawImage(image, 0, 0);
2304 canvas->drawString(label, image->width() / 2, image->height() / 4, paint);
2305 canvas->drawString(
2306 image->isLazyGenerated() ? "is lazily generated" : "not lazily generated",
2307 image->width() / 2, image->height() * 3 / 4, paint);
2308 };
2309 sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
2310 sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04002311 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
2312 kOpaque_SkAlphaType, nullptr));
Cary Clarkf5404bb2018-01-05 12:10:09 -05002313 drawImage(image, "image");
2314 canvas->translate(image->width(), 0);
2315 drawImage(bitmapImage, "source");
2316 canvas->translate(-image->width(), image->height());
2317 drawImage(textureImage, "backEndTexture");
2318}
2319##
2320
Cary Clarkac47b882018-01-11 10:35:44 -05002321#SeeAlso isTextureBacked MakeNonTextureImage
Cary Clarka560c472017-11-27 10:44:06 -05002322
2323#Method ##
2324
2325# ------------------------------------------------------------------------------
2326
Cary Clarke80cd442018-07-17 13:19:56 -04002327#Method sk_sp<SkImage> makeColorSpace(sk_sp<SkColorSpace> target) const
Cary Clark61313f32018-10-08 14:57:48 -04002328#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05002329#Line # creates Image matching Color_Space if possible ##
Cary Clarka560c472017-11-27 10:44:06 -05002330
Cary Clarkac47b882018-01-11 10:35:44 -05002331Creates Image in target Color_Space.
2332Returns nullptr if Image could not be created.
Cary Clarka560c472017-11-27 10:44:06 -05002333
Cary Clarkac47b882018-01-11 10:35:44 -05002334Returns original Image if it is in target Color_Space.
2335Otherwise, converts pixels from Image Color_Space to target Color_Space.
2336If Image colorSpace returns nullptr, Image Color_Space is assumed to be sRGB.
2337
Cary Clarkac47b882018-01-11 10:35:44 -05002338#Param target Color_Space describing color range of returned Image ##
Cary Clarka560c472017-11-27 10:44:06 -05002339
Cary Clarkac47b882018-01-11 10:35:44 -05002340#Return created Image in target Color_Space ##
2341
2342#Example
2343#Image 5
2344#Set sRGB
2345 sk_sp<SkColorSpace> normalColorSpace = SkColorSpace::MakeRGB(
2346 SkColorSpace::kSRGB_RenderTargetGamma, SkColorSpace::kSRGB_Gamut);
2347 sk_sp<SkColorSpace> wackyColorSpace = normalColorSpace->makeColorSpin();
2348 for (auto colorSpace : { normalColorSpace, wackyColorSpace } ) {
Cary Clarkc3c1c312018-07-18 09:25:15 -04002349 sk_sp<SkImage> colorSpaced = image->makeColorSpace(colorSpace);
2350 canvas->drawImage(colorSpaced, 0, 0);
2351 canvas->translate(128, 0);
Cary Clarkac47b882018-01-11 10:35:44 -05002352 }
2353##
2354
2355#SeeAlso MakeFromPixture MakeFromTexture
Cary Clarka560c472017-11-27 10:44:06 -05002356
2357#Method ##
2358
2359#Class SkImage ##
2360
2361#Topic Image ##