blob: 5d38e9148093912fc48ab99e5c23813754be2b72 [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 Clark09d80c02018-10-31 12:14:03 -040053#Populate
Cary Clarka560c472017-11-27 10:44:06 -050054
55#Example
Cary Clark2f466242017-12-11 16:03:17 -050056#Height 50
57#Description
58Draw a five by five bitmap, and draw a copy in an Image. Editing the pixmap
59alters the bitmap draw, but does not alter the Image draw since the Image
60contains a copy of the pixels.
61##
62 uint8_t storage[][5] = {{ 0xCA, 0xDA, 0xCA, 0xC9, 0xA3 },
63 { 0xAC, 0xA8, 0x89, 0xA7, 0x87 },
64 { 0x9B, 0xB5, 0xE5, 0x95, 0x46 },
65 { 0x90, 0x81, 0xC5, 0x71, 0x33 },
66 { 0x75, 0x55, 0x44, 0x40, 0x30 }};
67 SkImageInfo imageInfo = SkImageInfo::Make(5, 5, kGray_8_SkColorType, kOpaque_SkAlphaType);
68 SkPixmap pixmap(imageInfo, storage[0], sizeof(storage) / 5);
69 SkBitmap bitmap;
70 bitmap.installPixels(pixmap);
71 sk_sp<SkImage> image = SkImage::MakeRasterCopy(pixmap);
72 *pixmap.writable_addr8(2, 2) = 0x00;
73 canvas->scale(10, 10);
74 canvas->drawBitmap(bitmap, 0, 0);
75 canvas->drawImage(image, 10, 0);
Cary Clarka560c472017-11-27 10:44:06 -050076##
77
Cary Clark3cd22cc2017-12-01 11:49:58 -050078#SeeAlso MakeRasterData MakeFromGenerator
Cary Clarka560c472017-11-27 10:44:06 -050079
80#Method ##
81
82# ------------------------------------------------------------------------------
83
Cary Clarkcc45cc72018-05-15 16:06:12 -040084#Method static sk_sp<SkImage> MakeRasterData(const SkImageInfo& info, sk_sp<SkData> pixels, size_t rowBytes)
Cary Clark61313f32018-10-08 14:57:48 -040085#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -050086#Line # creates Image from Image_Info and shared pixels ##
Cary Clark09d80c02018-10-31 12:14:03 -040087#Populate
Cary Clarka560c472017-11-27 10:44:06 -050088
89#Example
Cary Clark0c5f5462017-12-15 11:21:51 -050090#Image 3
91 size_t rowBytes = image->width() * SkColorTypeBytesPerPixel(kRGBA_8888_SkColorType);
92 sk_sp<SkData> data = SkData::MakeUninitialized(rowBytes * image->height());
Cary Clark682c58d2018-05-16 07:07:07 -040093 SkImageInfo dstInfo = SkImageInfo::MakeN32(image->width(), image->height(),
Cary Clark0c5f5462017-12-15 11:21:51 -050094 kPremul_SkAlphaType);
95 image->readPixels(dstInfo, data->writable_data(), rowBytes, 0, 0, SkImage::kAllow_CachingHint);
96 sk_sp<SkImage> raw = SkImage::MakeRasterData(dstInfo.makeColorType(kRGBA_8888_SkColorType),
97 data, rowBytes);
98 canvas->drawImage(image, 0, 0);
99 canvas->drawImage(raw.get(), 128, 0);
Cary Clarka560c472017-11-27 10:44:06 -0500100##
101
Cary Clark3cd22cc2017-12-01 11:49:58 -0500102#SeeAlso MakeRasterCopy MakeFromGenerator
Cary Clarka560c472017-11-27 10:44:06 -0500103
104#Method ##
105
106# ------------------------------------------------------------------------------
107
Cary Clark3cd22cc2017-12-01 11:49:58 -0500108#Typedef void* ReleaseContext
Cary Clark682c58d2018-05-16 07:07:07 -0400109#Line # parameter type for MakeFromRaster ##
Cary Clarkffb3d682018-05-17 12:17:28 -0400110
111#Code
Cary Clarka90ea222018-10-16 10:30:28 -0400112#Populate
Cary Clarkffb3d682018-05-17 12:17:28 -0400113##
114
Cary Clark3cd22cc2017-12-01 11:49:58 -0500115Caller data passed to RasterReleaseProc; may be nullptr.
116
117#SeeAlso MakeFromRaster RasterReleaseProc
118
119##
120
Cary Clarka560c472017-11-27 10:44:06 -0500121#Typedef void (*RasterReleaseProc)(const void* pixels, ReleaseContext)
Cary Clark682c58d2018-05-16 07:07:07 -0400122#Line # parameter type for MakeFromRaster ##
Cary Clarkffb3d682018-05-17 12:17:28 -0400123
124#Code
Cary Clarka90ea222018-10-16 10:30:28 -0400125#Populate
Cary Clarkffb3d682018-05-17 12:17:28 -0400126##
127
Cary Clark3cd22cc2017-12-01 11:49:58 -0500128Function called when Image no longer shares pixels. ReleaseContext is
Cary Clark682c58d2018-05-16 07:07:07 -0400129provided by caller when Image is created, and may be nullptr.
Cary Clark3cd22cc2017-12-01 11:49:58 -0500130
131#SeeAlso ReleaseContext MakeFromRaster
132
Cary Clarka560c472017-11-27 10:44:06 -0500133##
134
135#Method static sk_sp<SkImage> MakeFromRaster(const SkPixmap& pixmap,
136 RasterReleaseProc rasterReleaseProc,
137 ReleaseContext releaseContext)
Cary Clark61313f32018-10-08 14:57:48 -0400138#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -0500139#Line # creates Image from Pixmap, with release ##
Cary Clark09d80c02018-10-31 12:14:03 -0400140#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500141
142#Example
Cary Clark0c5f5462017-12-15 11:21:51 -0500143#Function
144static void releaseProc(const void* pixels, SkImage::ReleaseContext context) {
145 int* countPtr = static_cast<int*>(context);
146 *countPtr += 1;
147}
148##
149
150void draw(SkCanvas* canvas) {
151 SkColor color = 0;
152 SkPixmap pixmap(SkImageInfo::MakeN32(1, 1, kPremul_SkAlphaType), &color, 4);
153 int releaseCount = 0;
154 sk_sp<SkImage> image(SkImage::MakeFromRaster(pixmap, releaseProc, &releaseCount));
155 SkDebugf("before reset: %d\n", releaseCount);
156 image.reset();
157 SkDebugf("after reset: %d\n", releaseCount);
158}
159#StdOut
160before reset: 0
161after reset: 1
162##
Cary Clarka560c472017-11-27 10:44:06 -0500163##
164
Cary Clark3cd22cc2017-12-01 11:49:58 -0500165#SeeAlso MakeRasterCopy MakeRasterData MakeFromGenerator RasterReleaseProc ReleaseContext
Cary Clarka560c472017-11-27 10:44:06 -0500166
167#Method ##
168
169# ------------------------------------------------------------------------------
170
171#Method static sk_sp<SkImage> MakeFromBitmap(const SkBitmap& bitmap)
Cary Clark61313f32018-10-08 14:57:48 -0400172#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -0500173#Line # creates Image from Bitmap, sharing or copying pixels ##
Cary Clark09d80c02018-10-31 12:14:03 -0400174#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500175
176#Example
Cary Clark0c5f5462017-12-15 11:21:51 -0500177#Description
178The first Bitmap is shared; writing to the pixel memory changes the first
179Image.
180The second Bitmap is marked immutable, and is copied; writing to the pixel
181memory does not alter the second Image.
182##
183#Height 50
184 uint8_t storage[][5] = {{ 0xCA, 0xDA, 0xCA, 0xC9, 0xA3 },
185 { 0xAC, 0xA8, 0x89, 0xA7, 0x87 },
186 { 0x9B, 0xB5, 0xE5, 0x95, 0x46 },
187 { 0x90, 0x81, 0xC5, 0x71, 0x33 },
188 { 0x75, 0x55, 0x44, 0x40, 0x30 }};
189 SkImageInfo imageInfo = SkImageInfo::Make(5, 5, kGray_8_SkColorType, kOpaque_SkAlphaType);
190 SkPixmap pixmap(imageInfo, storage[0], sizeof(storage) / 5);
191 SkBitmap bitmap;
192 bitmap.installPixels(pixmap);
193 sk_sp<SkImage> image1 = SkImage::MakeFromBitmap(bitmap);
194 bitmap.setImmutable();
195 sk_sp<SkImage> image2 = SkImage::MakeFromBitmap(bitmap);
196 *pixmap.writable_addr8(2, 2) = 0x00;
197 canvas->scale(10, 10);
198 canvas->drawImage(image1, 0, 0);
199 canvas->drawImage(image2, 10, 0);
Cary Clarka560c472017-11-27 10:44:06 -0500200##
201
Cary Clark3cd22cc2017-12-01 11:49:58 -0500202#SeeAlso MakeFromRaster MakeRasterCopy MakeFromGenerator MakeRasterData
Cary Clarka560c472017-11-27 10:44:06 -0500203
204#Method ##
205
206# ------------------------------------------------------------------------------
207
208#Method static sk_sp<SkImage> MakeFromGenerator(std::unique_ptr<SkImageGenerator> imageGenerator,
209 const SkIRect* subset = nullptr)
Cary Clark61313f32018-10-08 14:57:48 -0400210#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -0500211#Line # creates Image from a stream of data ##
Cary Clark09d80c02018-10-31 12:14:03 -0400212#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500213
214#Example
Cary Clarkac47b882018-01-11 10:35:44 -0500215#Height 128
Cary Clark0c5f5462017-12-15 11:21:51 -0500216#Description
217The generator returning Picture cannot be shared; std::move transfers ownership to generated Image.
218##
219 SkPictureRecorder recorder;
220 recorder.beginRecording(100, 100)->drawColor(SK_ColorRED);
221 auto picture = recorder.finishRecordingAsPicture();
222 auto gen = SkImageGenerator::MakeFromPicture({100, 100}, picture, nullptr, nullptr,
223 SkImage::BitDepth::kU8, SkColorSpace::MakeSRGB());
224 sk_sp<SkImage> image = SkImage::MakeFromGenerator(std::move(gen));
225 canvas->drawImage(image, 0, 0);
Cary Clarka560c472017-11-27 10:44:06 -0500226##
227
Cary Clark3cd22cc2017-12-01 11:49:58 -0500228#SeeAlso MakeFromEncoded
Cary Clarka560c472017-11-27 10:44:06 -0500229
230#Method ##
231
232# ------------------------------------------------------------------------------
233
234#Method static sk_sp<SkImage> MakeFromEncoded(sk_sp<SkData> encoded, const SkIRect* subset = nullptr)
Cary Clark61313f32018-10-08 14:57:48 -0400235#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -0500236#Line # creates Image from encoded data ##
Cary Clark09d80c02018-10-31 12:14:03 -0400237#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500238
Cary Clark61ca7c52018-01-02 11:34:14 -0500239#Example
240#Image 3
241int x = 0;
242for (int quality : { 100, 50, 10, 1} ) {
243 sk_sp<SkData> encodedData = image->encodeToData(SkEncodedImageFormat::kJPEG, quality);
244 sk_sp<SkImage> image = SkImage::MakeFromEncoded(encodedData);
245 canvas->drawImage(image, x, 0);
246 x += 64;
247}
Cary Clarka560c472017-11-27 10:44:06 -0500248##
249
Cary Clark3cd22cc2017-12-01 11:49:58 -0500250#SeeAlso MakeFromGenerator
Cary Clarka560c472017-11-27 10:44:06 -0500251
252#Method ##
253
254# ------------------------------------------------------------------------------
255
Jim Van Verth5acf39b2019-01-18 13:34:08 -0500256#Method static sk_sp<SkImage> MakeFromCompressed(GrContext* context, sk_sp<SkData> data, int width, int height, CompressionType type)
257#In Constructors
258#Line # creates a GPU-backed Image from compressed data ##
259#Populate
260
261#NoExample
262##
263
264#SeeAlso MakeFromTexture CompressionType
265
266#Method ##
267
268# ------------------------------------------------------------------------------
269
Cary Clarka560c472017-11-27 10:44:06 -0500270#Typedef void (*TextureReleaseProc)(ReleaseContext releaseContext)
Cary Clark682c58d2018-05-16 07:07:07 -0400271#Line # parameter type for MakeFromTexture ##
Cary Clarkffb3d682018-05-17 12:17:28 -0400272
273#Code
Cary Clarka90ea222018-10-16 10:30:28 -0400274#Populate
Cary Clarkffb3d682018-05-17 12:17:28 -0400275##
276
Cary Clark682c58d2018-05-16 07:07:07 -0400277User function called when supplied texture may be deleted.
278#SeeAlso MakeFromTexture
Cary Clarka560c472017-11-27 10:44:06 -0500279##
280
281#Method static sk_sp<SkImage> MakeFromTexture(GrContext* context,
282 const GrBackendTexture& backendTexture,
283 GrSurfaceOrigin origin,
Cary Clark61ca7c52018-01-02 11:34:14 -0500284 SkColorType colorType,
285 SkAlphaType alphaType,
286 sk_sp<SkColorSpace> colorSpace)
Cary Clark61313f32018-10-08 14:57:48 -0400287#In Constructors
Cary Clarkf895a422018-02-27 09:54:21 -0500288#Line # creates Image from GPU_Texture ##
Cary Clark09d80c02018-10-31 12:14:03 -0400289#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500290
291#Example
Cary Clark0c5f5462017-12-15 11:21:51 -0500292#Image 3
293#Platform gpu
294#Height 128
295#Description
296A back-end texture has been created and uploaded to the GPU outside of this example.
297##
298GrContext* context = canvas->getGrContext();
299if (!context) {
300 return;
301}
302canvas->scale(.25f, .25f);
303int x = 0;
304for (auto origin : { kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin } ) {
Cary Clarkac47b882018-01-11 10:35:44 -0500305 sk_sp<SkImage> image = SkImage::MakeFromTexture(context, backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -0400306 origin, kRGBA_8888_SkColorType, kOpaque_SkAlphaType, nullptr);
Cary Clark0c5f5462017-12-15 11:21:51 -0500307 canvas->drawImage(image, x, 0);
308x += 512;
309}
Cary Clarka560c472017-11-27 10:44:06 -0500310##
311
Cary Clark3cd22cc2017-12-01 11:49:58 -0500312#SeeAlso MakeFromAdoptedTexture SkSurface::MakeFromBackendTexture
Cary Clarka560c472017-11-27 10:44:06 -0500313
314#Method ##
315
316# ------------------------------------------------------------------------------
317
318#Method static sk_sp<SkImage> MakeFromTexture(GrContext* context,
319 const GrBackendTexture& backendTexture,
320 GrSurfaceOrigin origin,
Cary Clark61ca7c52018-01-02 11:34:14 -0500321 SkColorType colorType,
Cary Clarka560c472017-11-27 10:44:06 -0500322 SkAlphaType alphaType,
323 sk_sp<SkColorSpace> colorSpace,
324 TextureReleaseProc textureReleaseProc,
325 ReleaseContext releaseContext)
Cary Clark09d80c02018-10-31 12:14:03 -0400326#Populate
Cary Clark0c5f5462017-12-15 11:21:51 -0500327
Cary Clarka560c472017-11-27 10:44:06 -0500328#Example
Cary Clark14f49f02018-12-13 09:10:49 -0500329#Description
330textureReleaseProc may be called at some later point in time. In this example,
331textureReleaseProc has no effect on the drawing.
332##
Cary Clarkac47b882018-01-11 10:35:44 -0500333#Platform gpu
334#Image 4
Cary Clark0c5f5462017-12-15 11:21:51 -0500335GrContext* context = canvas->getGrContext();
336if (!context) {
337 return;
338}
Cary Clarkac47b882018-01-11 10:35:44 -0500339auto debugster = [](SkImage::ReleaseContext releaseContext) -> void {
Cary Clark14f49f02018-12-13 09:10:49 -0500340 *((int *) releaseContext) += 128;
Cary Clark0c5f5462017-12-15 11:21:51 -0500341};
Cary Clark14f49f02018-12-13 09:10:49 -0500342int x = 0, y = 0;
Cary Clark0c5f5462017-12-15 11:21:51 -0500343for (auto origin : { kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin } ) {
Cary Clarkac47b882018-01-11 10:35:44 -0500344 sk_sp<SkImage> image = SkImage::MakeFromTexture(context, backEndTexture,
Cary Clark61ca7c52018-01-02 11:34:14 -0500345 origin, kRGBA_8888_SkColorType, kOpaque_SkAlphaType, nullptr, debugster, &x);
Cary Clark14f49f02018-12-13 09:10:49 -0500346 canvas->drawImage(image, x, y);
347 y += 128;
Cary Clark0c5f5462017-12-15 11:21:51 -0500348}
Cary Clarka560c472017-11-27 10:44:06 -0500349##
350
Cary Clark3cd22cc2017-12-01 11:49:58 -0500351#SeeAlso MakeFromAdoptedTexture SkSurface::MakeFromBackendTexture
Cary Clarka560c472017-11-27 10:44:06 -0500352
353#Method ##
354
355# ------------------------------------------------------------------------------
356
357#Method static sk_sp<SkImage> MakeCrossContextFromEncoded(GrContext* context, sk_sp<SkData> data,
358 bool buildMips,
Brian Osman584b5012018-04-13 15:48:26 -0400359 SkColorSpace* dstColorSpace,
360 bool limitToMaxTextureSize = false)
Cary Clark61313f32018-10-08 14:57:48 -0400361#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -0500362#Line # creates Image from encoded data, and uploads to GPU ##
Cary Clark09d80c02018-10-31 12:14:03 -0400363#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500364
365#Example
Cary Clark61ca7c52018-01-02 11:34:14 -0500366#Image 4
Cary Clarkac47b882018-01-11 10:35:44 -0500367#Height 64
Cary Clark61ca7c52018-01-02 11:34:14 -0500368GrContext* context = canvas->getGrContext();
369sk_sp<SkData> encodedData = image->encodeToData(SkEncodedImageFormat::kJPEG, 100);
370sk_sp<SkImage> image = SkImage::MakeCrossContextFromEncoded(context,
371 encodedData, false, nullptr);
372canvas->drawImage(image, 0, 0);
Cary Clarka560c472017-11-27 10:44:06 -0500373##
374
Cary Clark3cd22cc2017-12-01 11:49:58 -0500375#SeeAlso MakeCrossContextFromPixmap
376
377#Method ##
378
379# ------------------------------------------------------------------------------
380
381#Method static sk_sp<SkImage> MakeCrossContextFromPixmap(GrContext* context, const SkPixmap& pixmap,
382 bool buildMips,
Brian Osman584b5012018-04-13 15:48:26 -0400383 SkColorSpace* dstColorSpace,
384 bool limitToMaxTextureSize = false)
Cary Clark61313f32018-10-08 14:57:48 -0400385#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -0500386#Line # creates Image from Pixmap, and uploads to GPU ##
Cary Clark09d80c02018-10-31 12:14:03 -0400387#Populate
Cary Clark3cd22cc2017-12-01 11:49:58 -0500388
389#Example
Cary Clark61ca7c52018-01-02 11:34:14 -0500390#Image 4
Cary Clarkac47b882018-01-11 10:35:44 -0500391#Height 64
Cary Clark61ca7c52018-01-02 11:34:14 -0500392GrContext* context = canvas->getGrContext();
393SkPixmap pixmap;
394if (source.peekPixels(&pixmap)) {
395 sk_sp<SkImage> image = SkImage::MakeCrossContextFromPixmap(context, pixmap,
396 false, nullptr);
397 canvas->drawImage(image, 0, 0);
398}
Cary Clark3cd22cc2017-12-01 11:49:58 -0500399##
400
401#SeeAlso MakeCrossContextFromEncoded
Cary Clarka560c472017-11-27 10:44:06 -0500402
403#Method ##
404
405# ------------------------------------------------------------------------------
406
407#Method static sk_sp<SkImage> MakeFromAdoptedTexture(GrContext* context,
408 const GrBackendTexture& backendTexture,
409 GrSurfaceOrigin surfaceOrigin,
Cary Clark61ca7c52018-01-02 11:34:14 -0500410 SkColorType colorType,
411 SkAlphaType alphaType = kPremul_SkAlphaType,
412 sk_sp<SkColorSpace> colorSpace = nullptr)
Cary Clark61313f32018-10-08 14:57:48 -0400413#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -0500414#Line # creates Image from GPU_Texture, managed internally ##
Cary Clark09d80c02018-10-31 12:14:03 -0400415#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500416
417#Example
Cary Clarkac47b882018-01-11 10:35:44 -0500418#Image 5
419#Platform gpu
Cary Clark61ca7c52018-01-02 11:34:14 -0500420 if (!canvas->getGrContext()) {
421 return;
422 }
423 canvas->scale(.5f, .5f);
424 canvas->clear(0x7f3f5f7f);
425 int x = 0, y = 0;
426 for (auto origin : { kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin } ) {
427 for (auto alpha : { kOpaque_SkAlphaType, kPremul_SkAlphaType, kUnpremul_SkAlphaType } ) {
428 sk_sp<SkImage> image = SkImage::MakeFromAdoptedTexture(canvas->getGrContext(),
Cary Clark682c58d2018-05-16 07:07:07 -0400429 backEndTexture, origin,
Cary Clark61ca7c52018-01-02 11:34:14 -0500430 kRGBA_8888_SkColorType, alpha);
431 canvas->drawImage(image, x, y);
432 x += 160;
433 }
434 x -= 160 * 3;
435 y += 256;
436 }
Cary Clarka560c472017-11-27 10:44:06 -0500437##
438
Cary Clark61ca7c52018-01-02 11:34:14 -0500439#SeeAlso MakeFromTexture MakeFromYUVTexturesCopy
Cary Clarka560c472017-11-27 10:44:06 -0500440
441#Method ##
442
443# ------------------------------------------------------------------------------
444
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400445#Method static sk_sp<SkImage> MakeFromYUVATexturesCopy(GrContext* context,
446 SkYUVColorSpace yuvColorSpace,
447 const GrBackendTexture yuvaTextures[],
448 const SkYUVAIndex yuvaIndices[4],
449 SkISize imageSize,
450 GrSurfaceOrigin imageOrigin,
451 sk_sp<SkColorSpace> imageColorSpace = nullptr)
452#In Constructor
453#Line # creates Image from YUV_ColorSpace data ##
Cary Clark09d80c02018-10-31 12:14:03 -0400454#Populate
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400455
456#NoExample
457##
458
Cary Clark1801b942018-10-30 21:10:03 -0400459#SeeAlso MakeFromYUVATexturesCopyWithExternalBackend MakeFromYUVATextures
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400460
461#Method ##
462
Cary Clark1801b942018-10-30 21:10:03 -0400463#Method static sk_sp<SkImage> MakeFromYUVATextures(GrContext* context,
464 SkYUVColorSpace yuvColorSpace,
465 const GrBackendTexture yuvaTextures[],
466 const SkYUVAIndex yuvaIndices[4],
467 SkISize imageSize,
468 GrSurfaceOrigin imageOrigin,
469 sk_sp<SkColorSpace> imageColorSpace = nullptr);
470
471#In Constructor
472#Line # creates Image from YUV_ColorSpace data ##
Cary Clark09d80c02018-10-31 12:14:03 -0400473#Populate
Cary Clark1801b942018-10-30 21:10:03 -0400474
475#NoExample
476##
477
478#SeeAlso MakeFromYUVATexturesCopy MakeFromYUVATexturesCopyWithExternalBackend
479
480#Method ##
481
Jim Van Verthc8429ad2018-11-20 11:12:37 -0500482#Method static sk_sp<SkImage> MakeFromYUVAPixmaps(
483 GrContext* context,
484 SkYUVColorSpace yuvColorSpace,
485 const SkPixmap yuvaPixmaps[],
486 const SkYUVAIndex yuvaIndices[4],
487 SkISize imageSize,
488 GrSurfaceOrigin imageOrigin,
489 bool buildMips,
490 bool limitToMaxTextureSize = false,
491 sk_sp<SkColorSpace> imageColorSpace = nullptr);
492
493#In Constructor
494#Line # creates Image from YUV_ColorSpace data ##
495#Populate
496
497#NoExample
498##
499
500#SeeAlso MakeFromYUVATextures
501
502#Method ##
Cary Clark1801b942018-10-30 21:10:03 -0400503
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400504# ------------------------------------------------------------------------------
505
506#Method static sk_sp<SkImage> MakeFromYUVATexturesCopyWithExternalBackend(
507 GrContext* context,
508 SkYUVColorSpace yuvColorSpace,
509 const GrBackendTexture yuvaTextures[],
510 const SkYUVAIndex yuvaIndices[4],
511 SkISize imageSize,
512 GrSurfaceOrigin imageOrigin,
513 const GrBackendTexture& backendTexture,
514 sk_sp<SkColorSpace> imageColorSpace = nullptr)
515#In Constructor
516#Line # creates Image from planar YUV_ColorSpace, stored in texture ##
Cary Clark09d80c02018-10-31 12:14:03 -0400517#Populate
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400518
519#NoExample
520##
521
Cary Clark1801b942018-10-30 21:10:03 -0400522#SeeAlso MakeFromYUVATexturesCopy MakeFromYUVATextures
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400523
524#Method ##
525
Cary Clarka560c472017-11-27 10:44:06 -0500526#Method static sk_sp<SkImage> MakeFromYUVTexturesCopy(GrContext* context, SkYUVColorSpace yuvColorSpace,
Brian Salomon6a426c12018-03-15 12:16:02 -0400527 const GrBackendTexture yuvTextures[3],
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400528 GrSurfaceOrigin imageOrigin,
529 sk_sp<SkColorSpace> imageColorSpace = nullptr)
Cary Clark61313f32018-10-08 14:57:48 -0400530#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -0500531#Line # creates Image from YUV_ColorSpace data in three planes ##
Cary Clark09d80c02018-10-31 12:14:03 -0400532#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500533
Cary Clark61ca7c52018-01-02 11:34:14 -0500534#NoExample
535##
536
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400537#SeeAlso MakeFromYUVTexturesCopyWithExternalBackend MakeFromNV12TexturesCopy MakeFromYUVATexturesCopy
Cary Clarkcdc371a2018-09-18 07:31:37 -0400538
539#Method ##
540
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400541# ------------------------------------------------------------------------------
542
Cary Clarkcdc371a2018-09-18 07:31:37 -0400543#Method static sk_sp<SkImage> MakeFromYUVTexturesCopyWithExternalBackend(
544 GrContext* context, SkYUVColorSpace yuvColorSpace,
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400545 const GrBackendTexture yuvTextures[3], GrSurfaceOrigin imageOrigin,
546 const GrBackendTexture& backendTexture, sk_sp<SkColorSpace> imageColorSpace = nullptr);
Cary Clark61313f32018-10-08 14:57:48 -0400547#In Constructors
Cary Clarkcdc371a2018-09-18 07:31:37 -0400548#Line # creates Image from planar YUV_ColorSpace, stored in texture ##
Cary Clark09d80c02018-10-31 12:14:03 -0400549#Populate
Cary Clarkcdc371a2018-09-18 07:31:37 -0400550
551#NoExample
552##
553
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400554#SeeAlso MakeFromYUVTexturesCopy MakeFromNV12TexturesCopy MakeFromYUVATexturesCopyWithExternalBackend
Cary Clark61ca7c52018-01-02 11:34:14 -0500555
556#Method ##
557
558# ------------------------------------------------------------------------------
559
Cary Clarka560c472017-11-27 10:44:06 -0500560#Method static sk_sp<SkImage> MakeFromNV12TexturesCopy(GrContext* context,
561 SkYUVColorSpace yuvColorSpace,
Brian Salomon6a426c12018-03-15 12:16:02 -0400562 const GrBackendTexture nv12Textures[2],
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400563 GrSurfaceOrigin imageOrigin,
564 sk_sp<SkColorSpace> imageColorSpace = nullptr)
Cary Clark61313f32018-10-08 14:57:48 -0400565#In Constructors
Brian Salomon6a426c12018-03-15 12:16:02 -0400566#Line # creates Image from YUV_ColorSpace data in three planes ##
Cary Clark09d80c02018-10-31 12:14:03 -0400567#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500568
Cary Clark61ca7c52018-01-02 11:34:14 -0500569#NoExample
570##
571
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400572#SeeAlso MakeFromNV12TexturesCopyWithExternalBackend MakeFromYUVTexturesCopy MakeFromYUVATexturesCopy
Cary Clarkcdc371a2018-09-18 07:31:37 -0400573
574#Method ##
575
576#Method static sk_sp<SkImage> MakeFromNV12TexturesCopyWithExternalBackend(
577 GrContext* context,
578 SkYUVColorSpace yuvColorSpace,
579 const GrBackendTexture nv12Textures[2],
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400580 GrSurfaceOrigin imageOrigin,
581 const GrBackendTexture& backendTexture,
582 sk_sp<SkColorSpace> imageColorSpace = nullptr);
Cary Clark61313f32018-10-08 14:57:48 -0400583#In Constructors
Cary Clarkcdc371a2018-09-18 07:31:37 -0400584#Line # creates Image from planar YUV_ColorSpace, stored in texture ##
Cary Clark09d80c02018-10-31 12:14:03 -0400585#Populate
Cary Clarkcdc371a2018-09-18 07:31:37 -0400586
587#NoExample
588##
589
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400590#SeeAlso MakeFromNV12TexturesCopy MakeFromYUVTexturesCopy MakeFromYUVATexturesCopyWithExternalBackend
Cary Clarka560c472017-11-27 10:44:06 -0500591
592#Method ##
593
594# ------------------------------------------------------------------------------
595
Cary Clark4855f782018-02-06 09:41:53 -0500596# currently uncalled by any test or client ##
Cary Clark61ca7c52018-01-02 11:34:14 -0500597#Bug 7424
Cary Clark61ca7c52018-01-02 11:34:14 -0500598
Cary Clark56356312018-02-08 14:45:18 -0500599#EnumClass BitDepth
Cary Clark682c58d2018-05-16 07:07:07 -0400600#Line # options for MakeFromPicture ##
Cary Clarka560c472017-11-27 10:44:06 -0500601#Code
Cary Clarka90ea222018-10-16 10:30:28 -0400602#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500603##
604
605#Const kU8 0
Cary Clark682c58d2018-05-16 07:07:07 -0400606#Line # uses 8-bit unsigned int per Color component ##
Cary Clarkffb3d682018-05-17 12:17:28 -0400607Use 8 bits per ARGB component using unsigned integer format.
Cary Clarka560c472017-11-27 10:44:06 -0500608##
609#Const kF16 1
Cary Clark682c58d2018-05-16 07:07:07 -0400610#Line # uses 16-bit float per Color component ##
Cary Clarkffb3d682018-05-17 12:17:28 -0400611Use 16 bits per ARGB component using half-precision floating point format.
Cary Clarka560c472017-11-27 10:44:06 -0500612##
613
Cary Clark61ca7c52018-01-02 11:34:14 -0500614#NoExample
Cary Clarka560c472017-11-27 10:44:06 -0500615##
616
Cary Clark61ca7c52018-01-02 11:34:14 -0500617#SeeAlso MakeFromPicture
Cary Clarka560c472017-11-27 10:44:06 -0500618
Cary Clark56356312018-02-08 14:45:18 -0500619#EnumClass ##
Cary Clarka560c472017-11-27 10:44:06 -0500620
621# ------------------------------------------------------------------------------
622
623#Method static sk_sp<SkImage> MakeFromPicture(sk_sp<SkPicture> picture, const SkISize& dimensions,
624 const SkMatrix* matrix, const SkPaint* paint,
625 BitDepth bitDepth,
626 sk_sp<SkColorSpace> colorSpace)
Cary Clark61313f32018-10-08 14:57:48 -0400627#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -0500628#Line # creates Image from Picture ##
Cary Clark09d80c02018-10-31 12:14:03 -0400629#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500630
631#Example
Cary Clark61ca7c52018-01-02 11:34:14 -0500632 SkPaint paint;
633 SkPictureRecorder recorder;
634 SkCanvas* recordingCanvas = recorder.beginRecording(50, 50);
635 for (auto color : { SK_ColorRED, SK_ColorBLUE, 0xff007f00 } ) {
636 paint.setColor(color);
637 recordingCanvas->drawRect({10, 10, 30, 40}, paint);
638 recordingCanvas->translate(10, 10);
639 recordingCanvas->scale(1.2f, 1.4f);
640 }
641 sk_sp<SkPicture> playback = recorder.finishRecordingAsPicture();
642 int x = 0, y = 0;
643 for (auto alpha : { 70, 140, 210 } ) {
644 paint.setAlpha(alpha);
645 auto srgbColorSpace = SkColorSpace::MakeSRGB();
646 sk_sp<SkImage> image = SkImage::MakeFromPicture(playback, {50, 50}, nullptr, &paint,
647 SkImage::BitDepth::kU8, srgbColorSpace);
648 canvas->drawImage(image, x, y);
649 x += 70; y += 70;
650 }
Cary Clarka560c472017-11-27 10:44:06 -0500651##
652
Cary Clark61ca7c52018-01-02 11:34:14 -0500653#SeeAlso SkCanvas::drawPicture
Cary Clarka560c472017-11-27 10:44:06 -0500654
655#Method ##
656
657# ------------------------------------------------------------------------------
658
Cary Clark9548ea92018-09-13 15:26:33 -0400659#Method static sk_sp<SkImage> MakeFromAHardwareBuffer(
660 AHardwareBuffer* hardwareBuffer,
661 SkAlphaType alphaType = kPremul_SkAlphaType,
662 sk_sp<SkColorSpace> colorSpace = nullptr,
663 GrSurfaceOrigin surfaceOrigin = kTopLeft_GrSurfaceOrigin)
Cary Clark61313f32018-10-08 14:57:48 -0400664#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -0500665#Line # creates Image from Android hardware buffer ##
Cary Clark09d80c02018-10-31 12:14:03 -0400666#Populate
Cary Clark61ca7c52018-01-02 11:34:14 -0500667
668#NoExample
Cary Clarka560c472017-11-27 10:44:06 -0500669##
670
Cary Clark61ca7c52018-01-02 11:34:14 -0500671#SeeAlso MakeFromRaster
Cary Clarka560c472017-11-27 10:44:06 -0500672
673#Method ##
674
675# ------------------------------------------------------------------------------
Cary Clark4855f782018-02-06 09:41:53 -0500676#Subtopic Property
Cary Clark4855f782018-02-06 09:41:53 -0500677#Line # values and attributes ##
678##
Cary Clarka560c472017-11-27 10:44:06 -0500679
680#Method int width() const
Cary Clark4855f782018-02-06 09:41:53 -0500681#In Property
682#Line # returns pixel column count ##
Cary Clark09d80c02018-10-31 12:14:03 -0400683#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500684
685#Example
Cary Clark61ca7c52018-01-02 11:34:14 -0500686#Image 4
Cary Clarkac47b882018-01-11 10:35:44 -0500687#Height 96
Cary Clark61ca7c52018-01-02 11:34:14 -0500688 canvas->translate(10, 10);
689 canvas->drawImage(image, 0, 0);
690 canvas->translate(0, image->height());
691 SkPaint paint;
Cary Clark61ca7c52018-01-02 11:34:14 -0500692 canvas->drawLine(0, 10, image->width(), 10, paint);
Cary Clark14768f62018-10-29 20:33:51 -0400693 canvas->drawString("width", image->width() / 2 - 15, 25, paint);
Cary Clarka560c472017-11-27 10:44:06 -0500694##
695
Cary Clark61ca7c52018-01-02 11:34:14 -0500696#SeeAlso dimensions() height()
Cary Clarka560c472017-11-27 10:44:06 -0500697
698#Method ##
699
700# ------------------------------------------------------------------------------
701
702#Method int height() const
Cary Clark4855f782018-02-06 09:41:53 -0500703#In Property
704#Line # returns pixel row count ##
Cary Clark09d80c02018-10-31 12:14:03 -0400705#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500706
707#Example
Cary Clark61ca7c52018-01-02 11:34:14 -0500708#Image 4
Cary Clarkac47b882018-01-11 10:35:44 -0500709#Height 96
Cary Clark61ca7c52018-01-02 11:34:14 -0500710 canvas->translate(10, 10);
711 canvas->drawImage(image, 0, 0);
712 canvas->translate(image->width(), 0);
713 SkPaint paint;
Cary Clark61ca7c52018-01-02 11:34:14 -0500714 canvas->drawLine(10, 0, 10, image->height(), paint);
Cary Clark92694be2018-10-25 08:15:36 -0400715 canvas->drawString("height", 34, image->height() / 2, paint);
Cary Clarkac47b882018-01-11 10:35:44 -0500716##
Cary Clarka560c472017-11-27 10:44:06 -0500717
Cary Clark61ca7c52018-01-02 11:34:14 -0500718#SeeAlso dimensions() width()
Cary Clarka560c472017-11-27 10:44:06 -0500719
720#Method ##
721
722# ------------------------------------------------------------------------------
723
724#Method SkISize dimensions() const
Cary Clark4855f782018-02-06 09:41:53 -0500725#In Property
726#Line # returns width() and height() ##
Cary Clark09d80c02018-10-31 12:14:03 -0400727#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500728
729#Example
Cary Clark61ca7c52018-01-02 11:34:14 -0500730#Image 4
731 SkISize dimensions = image->dimensions();
732 SkIRect bounds = image->bounds();
733 SkIRect dimensionsAsBounds = SkIRect::MakeSize(dimensions);
734 SkDebugf("dimensionsAsBounds %c= bounds\n", dimensionsAsBounds == bounds ? '=' : '!');
Cary Clark681287e2018-03-16 11:34:15 -0400735#StdOut
736dimensionsAsBounds == bounds
737##
Cary Clarka560c472017-11-27 10:44:06 -0500738##
739
Cary Clark61ca7c52018-01-02 11:34:14 -0500740#SeeAlso height() width() bounds()
Cary Clarka560c472017-11-27 10:44:06 -0500741
742#Method ##
743
744# ------------------------------------------------------------------------------
745
746#Method SkIRect bounds() const
Cary Clark4855f782018-02-06 09:41:53 -0500747#In Property
748#Line # returns width() and height() as Rectangle ##
Cary Clark09d80c02018-10-31 12:14:03 -0400749#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500750
751#Example
Cary Clark61ca7c52018-01-02 11:34:14 -0500752#Height 128
753#Image 4
Cary Clark61ca7c52018-01-02 11:34:14 -0500754 SkIRect bounds = image->bounds();
Cary Clarkac47b882018-01-11 10:35:44 -0500755 for (int x : { 0, bounds.width() } ) {
756 for (int y : { 0, bounds.height() } ) {
Cary Clark61ca7c52018-01-02 11:34:14 -0500757 canvas->drawImage(image, x, y);
758 }
759 }
Cary Clarka560c472017-11-27 10:44:06 -0500760##
761
Cary Clark682c58d2018-05-16 07:07:07 -0400762#SeeAlso dimensions()
Cary Clarka560c472017-11-27 10:44:06 -0500763
764#Method ##
765
766# ------------------------------------------------------------------------------
767
768#Method uint32_t uniqueID() const
Cary Clark4855f782018-02-06 09:41:53 -0500769#In Property
Cary Clark682c58d2018-05-16 07:07:07 -0400770#Line # returns identifier for Image ##
Cary Clark09d80c02018-10-31 12:14:03 -0400771#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500772
773#Example
Cary Clark61ca7c52018-01-02 11:34:14 -0500774#Image 5
775#Height 156
776 sk_sp<SkImage> subset = image->makeSubset({10, 20, 90, 100});
777 canvas->drawImage(image, 0, 0);
778 canvas->drawImage(subset, 128, 0);
779 SkPaint paint;
780 SkString s;
781 s.printf("original id: %d", image->uniqueID());
782 canvas->drawString(s, 20, image->height() + 20, paint);
783 s.printf("subset id: %d", subset->uniqueID());
784 canvas->drawString(s, 148, subset->height() + 20, paint);
Cary Clarka560c472017-11-27 10:44:06 -0500785##
786
Cary Clark61ca7c52018-01-02 11:34:14 -0500787#SeeAlso isLazyGenerated
Cary Clarka560c472017-11-27 10:44:06 -0500788
789#Method ##
790
791# ------------------------------------------------------------------------------
792
793#Method SkAlphaType alphaType() const
Cary Clark4855f782018-02-06 09:41:53 -0500794#In Property
795#Line # returns Alpha_Type ##
Cary Clark681287e2018-03-16 11:34:15 -0400796Returns Alpha_Type, one of: #list_of_alpha_types#.
Cary Clark61ca7c52018-01-02 11:34:14 -0500797
798Alpha_Type returned was a parameter to an Image constructor,
799or was parsed from encoded data.
800
801#Return Alpha_Type in Image ##
Cary Clarka560c472017-11-27 10:44:06 -0500802
803#Example
Cary Clark61ca7c52018-01-02 11:34:14 -0500804#Image 4
Cary Clarkac47b882018-01-11 10:35:44 -0500805#Height 96
Cary Clark61ca7c52018-01-02 11:34:14 -0500806 const char* alphaTypeStr[] = { "Unknown", "Opaque", "Premul", "Unpremul" };
807 SkAlphaType alphaType = image->alphaType();
Cary Clarkac47b882018-01-11 10:35:44 -0500808 canvas->drawImage(image, 16, 0);
Cary Clarkffb3d682018-05-17 12:17:28 -0400809 canvas->drawString(alphaTypeStr[(int) alphaType], 20, image->height() + 20, SkPaint());
Cary Clarka560c472017-11-27 10:44:06 -0500810##
811
Cary Clark61ca7c52018-01-02 11:34:14 -0500812#SeeAlso SkImageInfo::alphaType
Cary Clarka560c472017-11-27 10:44:06 -0500813
814#Method ##
815
816# ------------------------------------------------------------------------------
817
Greg Daniel56008aa2018-03-14 15:33:42 -0400818#Method SkColorType colorType() const
819#In Property
820#Line # returns Color_Type ##
Cary Clark09d80c02018-10-31 12:14:03 -0400821#Populate
Greg Daniel56008aa2018-03-14 15:33:42 -0400822
823#Example
Cary Clarkffb3d682018-05-17 12:17:28 -0400824#Image 4
825#Height 96
826 const char* colors[] = { "Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x",
827 "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16" };
828 SkColorType colorType = image->colorType();
829 canvas->drawImage(image, 16, 0);
830 canvas->drawString(colors[(int) colorType], 20, image->height() + 20, SkPaint());
Greg Daniel56008aa2018-03-14 15:33:42 -0400831##
832
833#SeeAlso SkImageInfo::colorType
834
835#Method ##
836
837# ------------------------------------------------------------------------------
838
Cary Clarka560c472017-11-27 10:44:06 -0500839#Method SkColorSpace* colorSpace() const
Cary Clark4855f782018-02-06 09:41:53 -0500840#In Property
841#Line # returns Color_Space ##
Cary Clark09d80c02018-10-31 12:14:03 -0400842#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500843
844#Example
Cary Clark61dfc3a2018-01-03 08:37:53 -0500845#Image 3
846#Set sRGB
847 SkPixmap pixmap;
848 source.peekPixels(&pixmap);
849 canvas->scale(.25f, .25f);
850 int y = 0;
Brian Osman410b3022019-01-28 15:42:55 -0500851 for (auto gamma : { SkNamedTransferFn::kLinear,
852 SkNamedTransferFn::kSRGB } ) {
Cary Clark61dfc3a2018-01-03 08:37:53 -0500853 int x = 0;
Brian Osman410b3022019-01-28 15:42:55 -0500854 sk_sp<SkColorSpace> colorSpace = SkColorSpace::MakeRGB(gamma, SkNamedGamut::kSRGB);
Cary Clark61dfc3a2018-01-03 08:37:53 -0500855 for (int index = 0; index < 2; ++index) {
856 pixmap.setColorSpace(colorSpace);
857 sk_sp<SkImage> image = SkImage::MakeRasterCopy(pixmap);
858 canvas->drawImage(image, x, y);
859 colorSpace = image->colorSpace()->makeColorSpin();
860 x += 512;
861 }
862 y += 512;
863 }
Cary Clarka560c472017-11-27 10:44:06 -0500864##
865
Cary Clark61dfc3a2018-01-03 08:37:53 -0500866#SeeAlso refColorSpace makeColorSpace
Cary Clarka560c472017-11-27 10:44:06 -0500867
868#Method ##
869
870# ------------------------------------------------------------------------------
871
872#Method sk_sp<SkColorSpace> refColorSpace() const
Cary Clark4855f782018-02-06 09:41:53 -0500873#In Property
874#Line # returns Image_Info Color_Space ##
Cary Clark09d80c02018-10-31 12:14:03 -0400875#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500876
877#Example
Cary Clark61dfc3a2018-01-03 08:37:53 -0500878#Image 3
879#Set sRGB
880 SkPixmap pixmap;
881 source.peekPixels(&pixmap);
882 canvas->scale(.25f, .25f);
883 int y = 0;
Brian Osman410b3022019-01-28 15:42:55 -0500884 for (auto gamma : { SkNamedTransferFn::kLinear,
885 SkNamedTransferFn::kSRGB } ) {
Cary Clark61dfc3a2018-01-03 08:37:53 -0500886 int x = 0;
Brian Osman410b3022019-01-28 15:42:55 -0500887 sk_sp<SkColorSpace> colorSpace = SkColorSpace::MakeRGB(gamma, SkNamedGamut::kSRGB);
Cary Clark61dfc3a2018-01-03 08:37:53 -0500888 for (int index = 0; index < 2; ++index) {
889 pixmap.setColorSpace(colorSpace);
890 sk_sp<SkImage> image = SkImage::MakeRasterCopy(pixmap);
891 canvas->drawImage(image, x, y);
892 colorSpace = image->refColorSpace()->makeColorSpin();
893 x += 512;
894 }
895 y += 512;
896 }
Cary Clarka560c472017-11-27 10:44:06 -0500897##
898
Cary Clark61dfc3a2018-01-03 08:37:53 -0500899#SeeAlso colorSpace makeColorSpace
Cary Clarka560c472017-11-27 10:44:06 -0500900
901#Method ##
902
903# ------------------------------------------------------------------------------
904
905#Method bool isAlphaOnly() const
Cary Clark4855f782018-02-06 09:41:53 -0500906#In Property
907#Line # returns if pixels represent a transparency mask ##
Cary Clark09d80c02018-10-31 12:14:03 -0400908#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500909
910#Example
Cary Clark61dfc3a2018-01-03 08:37:53 -0500911 uint8_t pmColors = 0;
912 sk_sp<SkImage> image = SkImage::MakeRasterCopy({SkImageInfo::MakeA8(1, 1), &pmColors, 1});
913 SkDebugf("alphaOnly = %s\n", image->isAlphaOnly() ? "true" : "false");
914#StdOut
915alphaOnly = true
916##
Cary Clarka560c472017-11-27 10:44:06 -0500917##
918
Cary Clark61dfc3a2018-01-03 08:37:53 -0500919#SeeAlso alphaType isOpaque
Cary Clarka560c472017-11-27 10:44:06 -0500920
921#Method ##
922
923# ------------------------------------------------------------------------------
924
925#Method bool isOpaque() const
Cary Clark4855f782018-02-06 09:41:53 -0500926#In Property
927#Line # returns if Alpha_Type is kOpaque_SkAlphaType ##
Cary Clark09d80c02018-10-31 12:14:03 -0400928#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500929
930#Example
Cary Clark61dfc3a2018-01-03 08:37:53 -0500931 auto check_isopaque = [](const SkImageInfo& imageInfo) -> void {
932 auto surface(SkSurface::MakeRaster(imageInfo));
933 auto image(surface->makeImageSnapshot());
934 SkDebugf("isOpaque = %s\n", image->isOpaque() ? "true" : "false");
935 };
936
937 check_isopaque(SkImageInfo::MakeN32Premul(5, 5));
938 check_isopaque(SkImageInfo::MakeN32(5, 5, kOpaque_SkAlphaType));
939#StdOut
940isOpaque = false
941isOpaque = true
942##
Cary Clarka560c472017-11-27 10:44:06 -0500943##
944
Cary Clark61dfc3a2018-01-03 08:37:53 -0500945#SeeAlso alphaType isAlphaOnly
Cary Clarka560c472017-11-27 10:44:06 -0500946
947#Method ##
948
949# ------------------------------------------------------------------------------
950
951#Method sk_sp<SkShader> makeShader(SkShader::TileMode tileMode1, SkShader::TileMode tileMode2,
952 const SkMatrix* localMatrix = nullptr) const
Cary Clark61313f32018-10-08 14:57:48 -0400953#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -0500954#Line # creates Shader, Paint element that can tile Image ##
Cary Clark09d80c02018-10-31 12:14:03 -0400955#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500956
957#Example
Cary Clark61dfc3a2018-01-03 08:37:53 -0500958#Image 4
959SkMatrix matrix;
960matrix.setRotate(45);
961SkPaint paint;
962paint.setShader(image->makeShader(SkShader::kRepeat_TileMode, SkShader::kMirror_TileMode,
963 &matrix));
964canvas->drawPaint(paint);
Cary Clarka560c472017-11-27 10:44:06 -0500965##
966
Cary Clark61dfc3a2018-01-03 08:37:53 -0500967#SeeAlso scalePixels
Cary Clarka560c472017-11-27 10:44:06 -0500968
969#Method ##
970
971# ------------------------------------------------------------------------------
972
973#Method sk_sp<SkShader> makeShader(const SkMatrix* localMatrix = nullptr) const
Cary Clark09d80c02018-10-31 12:14:03 -0400974#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500975
976#Example
Cary Clark61dfc3a2018-01-03 08:37:53 -0500977#Image 5
978SkMatrix matrix;
979matrix.setRotate(45);
980matrix.postTranslate(125, 30);
981SkPaint paint;
982paint.setShader(image->makeShader(&matrix));
983canvas->drawPaint(paint);
Cary Clarka560c472017-11-27 10:44:06 -0500984##
985
Cary Clarkf5404bb2018-01-05 12:10:09 -0500986#SeeAlso scalePixels
Cary Clarka560c472017-11-27 10:44:06 -0500987
988#Method ##
989
990# ------------------------------------------------------------------------------
Cary Clark78de7512018-02-07 07:27:09 -0500991#Subtopic Pixels
Cary Clark78de7512018-02-07 07:27:09 -0500992#Line # read and write pixel values ##
993##
Cary Clarka560c472017-11-27 10:44:06 -0500994
995#Method bool peekPixels(SkPixmap* pixmap) const
Cary Clark78de7512018-02-07 07:27:09 -0500996#In Pixels
Cary Clark4855f782018-02-06 09:41:53 -0500997#Line # returns Pixmap if possible ##
Cary Clark09d80c02018-10-31 12:14:03 -0400998#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500999
1000#Example
Cary Clarkf5404bb2018-01-05 12:10:09 -05001001 SkBitmap bitmap;
1002 bitmap.allocPixels(SkImageInfo::MakeN32Premul(12, 11));
1003 SkCanvas offscreen(bitmap);
1004 offscreen.clear(SK_ColorWHITE);
1005 SkPaint paint;
1006 offscreen.drawString("%", 1, 10, paint);
1007 sk_sp<SkImage> image = SkImage::MakeFromBitmap(bitmap);
1008 SkPixmap pixmap;
1009 if (image->peekPixels(&pixmap)) {
1010 const SkPMColor* pixels = pixmap.addr32();
1011 SkPMColor pmWhite = pixels[0];
1012 for (int y = 0; y < image->height(); ++y) {
1013 for (int x = 0; x < image->width(); ++x) {
1014 SkDebugf("%c", *pixels++ == pmWhite ? '-' : 'x');
1015 }
1016 SkDebugf("\n");
1017 }
1018 }
1019#StdOut
1020------------
1021--xx----x---
1022-x--x--x----
1023-x--x--x----
1024-x--x-x-----
1025--xx-xx-xx--
1026-----x-x--x-
1027----x--x--x-
1028----x--x--x-
1029---x----xx--
1030------------
1031##
Cary Clarka560c472017-11-27 10:44:06 -05001032##
1033
Cary Clarkf5404bb2018-01-05 12:10:09 -05001034#SeeAlso readPixels
Cary Clarka560c472017-11-27 10:44:06 -05001035
1036#Method ##
1037
1038# ------------------------------------------------------------------------------
1039
Cary Clarka560c472017-11-27 10:44:06 -05001040#Method bool isTextureBacked() const
Cary Clark78de7512018-02-07 07:27:09 -05001041#In Property
Cary Clark4855f782018-02-06 09:41:53 -05001042#Line # returns if Image was created from GPU_Texture ##
Cary Clark09d80c02018-10-31 12:14:03 -04001043#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001044
1045#Example
Cary Clarkf5404bb2018-01-05 12:10:09 -05001046#Image 5
1047#Platform gpu
1048auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {
1049 if (nullptr == image) {
1050 return;
1051 }
1052 SkPaint paint;
1053 paint.setAntiAlias(true);
Cary Clarkf5404bb2018-01-05 12:10:09 -05001054 canvas->drawImage(image, 0, 0);
Cary Clark14768f62018-10-29 20:33:51 -04001055 canvas->drawString(label, 30, image->height() / 4, paint);
Cary Clarkf5404bb2018-01-05 12:10:09 -05001056 canvas->drawString(image->isTextureBacked() ? "is GPU texture" : "not GPU texture",
Cary Clark14768f62018-10-29 20:33:51 -04001057 20, image->height() * 3 / 4, paint);
Cary Clarkf5404bb2018-01-05 12:10:09 -05001058};
1059sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
1060sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04001061 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
1062 kOpaque_SkAlphaType, nullptr));
Cary Clarkf5404bb2018-01-05 12:10:09 -05001063drawImage(image, "image");
1064canvas->translate(image->width(), 0);
1065drawImage(bitmapImage, "source");
1066canvas->translate(-image->width(), image->height());
1067drawImage(textureImage, "backEndTexture");
Cary Clarka560c472017-11-27 10:44:06 -05001068##
1069
Cary Clarkf5404bb2018-01-05 12:10:09 -05001070#SeeAlso MakeFromTexture isValid
Cary Clarka560c472017-11-27 10:44:06 -05001071
1072#Method ##
1073
1074# ------------------------------------------------------------------------------
1075
1076#Method bool isValid(GrContext* context) const
Cary Clark4855f782018-02-06 09:41:53 -05001077#In Property
1078#Line # returns if Image can draw to Raster_Surface or GPU_Context ##
Cary Clark09d80c02018-10-31 12:14:03 -04001079#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001080
1081#Example
Cary Clarkf5404bb2018-01-05 12:10:09 -05001082#Image 5
1083#Platform gpu
1084auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {
1085 if (nullptr == image) {
1086 return;
1087 }
1088 SkPaint paint;
1089 paint.setAntiAlias(true);
Cary Clarkf5404bb2018-01-05 12:10:09 -05001090 canvas->drawImage(image, 0, 0);
1091 canvas->drawString(label, image->width() / 2, image->height() / 4, paint);
1092 if (canvas->getGrContext()) {
1093 canvas->drawString(image->isValid(canvas->getGrContext()) ? "is valid on GPU" :
Cary Clark14768f62018-10-29 20:33:51 -04001094 "not valid on GPU", 20, image->height() * 5 / 8, paint);
Cary Clarkf5404bb2018-01-05 12:10:09 -05001095 }
1096 canvas->drawString(image->isValid(nullptr) ? "is valid on CPU" :
Cary Clark14768f62018-10-29 20:33:51 -04001097 "not valid on CPU", 20, image->height() * 7 / 8, paint);
Cary Clarkf5404bb2018-01-05 12:10:09 -05001098};
1099sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
1100sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04001101 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
1102 kOpaque_SkAlphaType, nullptr));
Cary Clarkf5404bb2018-01-05 12:10:09 -05001103drawImage(image, "image");
1104canvas->translate(image->width(), 0);
1105drawImage(bitmapImage, "source");
1106canvas->translate(-image->width(), image->height());
1107drawImage(textureImage, "backEndTexture");
Cary Clarka560c472017-11-27 10:44:06 -05001108##
1109
Cary Clarkf5404bb2018-01-05 12:10:09 -05001110#SeeAlso isTextureBacked isLazyGenerated
Cary Clarka560c472017-11-27 10:44:06 -05001111
1112#Method ##
1113
1114# ------------------------------------------------------------------------------
1115
Robert Phillipsc5509952018-04-04 15:54:55 -04001116#Method GrBackendTexture getBackendTexture(bool flushPendingGrContextIO,
1117 GrSurfaceOrigin* origin = nullptr) const
1118#In Property
1119#Line # returns GPU reference to Image as texture ##
Cary Clark09d80c02018-10-31 12:14:03 -04001120#Populate
Robert Phillipsc5509952018-04-04 15:54:55 -04001121
Cary Clarkba75aee2018-04-05 08:18:41 -04001122#Example
1123#Image 3
1124#Platform gpu
Brian Osman584b5012018-04-13 15:48:26 -04001125 GrContext* grContext = canvas->getGrContext();
1126 if (!grContext) {
1127 canvas->drawString("GPU only!", 20, 40, SkPaint());
1128 return;
1129 }
1130 sk_sp<SkImage> imageFromBackend = SkImage::MakeFromAdoptedTexture(grContext, backEndTexture,
1131 kBottomLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType, kOpaque_SkAlphaType);
1132 GrBackendTexture textureFromImage = imageFromBackend->getBackendTexture(false);
1133 if (!textureFromImage.isValid()) {
1134 return;
1135 }
1136 sk_sp<SkImage> imageFromTexture = SkImage::MakeFromAdoptedTexture(grContext, textureFromImage,
1137 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType, kOpaque_SkAlphaType);
1138 canvas->drawImage(imageFromTexture, 0, 0);
Cary Clarkba75aee2018-04-05 08:18:41 -04001139 canvas->drawImage(imageFromBackend, 128, 128);
Robert Phillipsc5509952018-04-04 15:54:55 -04001140##
1141
1142#SeeAlso MakeFromTexture isTextureBacked
1143
1144#Method ##
1145
1146# ------------------------------------------------------------------------------
1147
Cary Clarka560c472017-11-27 10:44:06 -05001148#Enum CachingHint
Cary Clark682c58d2018-05-16 07:07:07 -04001149#Line # options for readPixels and scalePixels ##
Cary Clarka560c472017-11-27 10:44:06 -05001150#Code
Cary Clarka90ea222018-10-16 10:30:28 -04001151#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001152##
1153
Cary Clarkac47b882018-01-11 10:35:44 -05001154CachingHint selects whether Skia may internally cache Bitmaps generated by
1155decoding Image, or by copying Image from GPU to CPU. The default behavior
Cary Clark682c58d2018-05-16 07:07:07 -04001156allows caching Bitmaps.
Cary Clarkac47b882018-01-11 10:35:44 -05001157
1158Choose kDisallow_CachingHint if Image pixels are to be used only once, or
1159if Image pixels reside in a cache outside of Skia, or to reduce memory pressure.
1160
1161Choosing kAllow_CachingHint does not ensure that pixels will be cached.
1162Image pixels may not be cached if memory requirements are too large or
1163pixels are not accessible.
Cary Clarka560c472017-11-27 10:44:06 -05001164
1165#Const kAllow_CachingHint 0
Cary Clark682c58d2018-05-16 07:07:07 -04001166#Line # allows internally caching decoded and copied pixels ##
Cary Clarka560c472017-11-27 10:44:06 -05001167##
1168#Const kDisallow_CachingHint 1
Cary Clark682c58d2018-05-16 07:07:07 -04001169#Line # disallows internally caching decoded and copied pixels ##
Cary Clarka560c472017-11-27 10:44:06 -05001170##
1171
Cary Clarkac47b882018-01-11 10:35:44 -05001172#NoExample
Cary Clarka560c472017-11-27 10:44:06 -05001173##
1174
Cary Clarkac47b882018-01-11 10:35:44 -05001175#SeeAlso readPixels scalePixels
Cary Clarka560c472017-11-27 10:44:06 -05001176
1177#Enum ##
1178
1179# ------------------------------------------------------------------------------
1180
1181#Method bool readPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRowBytes,
1182 int srcX, int srcY, CachingHint cachingHint = kAllow_CachingHint) const
Cary Clark78de7512018-02-07 07:27:09 -05001183#In Pixels
Cary Clark4855f782018-02-06 09:41:53 -05001184#Line # copies and converts pixels ##
Cary Clarka560c472017-11-27 10:44:06 -05001185
Cary Clarkac47b882018-01-11 10:35:44 -05001186Copies Rect of pixels from Image to dstPixels. Copy starts at offset (srcX, srcY),
Cary Clark682c58d2018-05-16 07:07:07 -04001187and does not exceed Image (width(), height()).
Cary Clarkac47b882018-01-11 10:35:44 -05001188
1189dstInfo specifies width, height, Color_Type, Alpha_Type, and Color_Space of
1190destination. dstRowBytes specifics the gap from one destination row to the next.
1191Returns true if pixels are copied. Returns false if:
1192#List
Cary Clark77b3f3a2018-11-07 14:59:03 -05001193# dstInfo has no address ##
1194# dstRowBytes is less than dstInfo.minRowBytes() ##
Cary Clarkac47b882018-01-11 10:35:44 -05001195# Pixel_Ref is nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -05001196##
1197
Cary Clarkac47b882018-01-11 10:35:44 -05001198Pixels are copied only if pixel conversion is possible. If Image Color_Type is
Cary Clark77b3f3a2018-11-07 14:59:03 -05001199kGray_8_SkColorType, or kAlpha_8_SkColorType; dstInfo.colorType() must match.
1200If Image Color_Type is kGray_8_SkColorType, dstInfo.colorSpace() must match.
1201If Image Alpha_Type is kOpaque_SkAlphaType, dstInfo.alphaType() must
1202match. If Image Color_Space is nullptr, dstInfo.colorSpace() must match. Returns
Cary Clarkac47b882018-01-11 10:35:44 -05001203false if pixel conversion is not possible.
Cary Clarka560c472017-11-27 10:44:06 -05001204
Cary Clarkac47b882018-01-11 10:35:44 -05001205srcX and srcY may be negative to copy only top or left of source. Returns
Cary Clark682c58d2018-05-16 07:07:07 -04001206false if width() or height() is zero or negative.
Cary Clark2be81cf2018-09-13 12:04:30 -04001207Returns false if #Formula # abs(srcX) >= Image width() ##, or if #Formula # abs(srcY) >= Image height() ##.
Cary Clarka560c472017-11-27 10:44:06 -05001208
Cary Clarkac47b882018-01-11 10:35:44 -05001209If cachingHint is kAllow_CachingHint, pixels may be retained locally.
1210If cachingHint is kDisallow_CachingHint, pixels are not added to the local cache.
1211
1212#Param dstInfo destination width, height, Color_Type, Alpha_Type, Color_Space ##
1213#Param dstPixels destination pixel storage ##
1214#Param dstRowBytes destination row length ##
1215#Param srcX column index whose absolute value is less than width() ##
1216#Param srcY row index whose absolute value is less than height() ##
1217#Param cachingHint one of: kAllow_CachingHint, kDisallow_CachingHint ##
1218
1219#Return true if pixels are copied to dstPixels ##
Cary Clarka560c472017-11-27 10:44:06 -05001220
1221#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001222#Image 3
1223 canvas->scale(.5f, .5f);
1224 const int width = 32;
1225 const int height = 32;
1226 std::vector<int32_t> dstPixels;
1227 dstPixels.resize(height * width * 4);
1228 SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);
1229 for (int y = 0; y < 512; y += height ) {
1230 for (int x = 0; x < 512; x += width ) {
1231 if (image->readPixels(info, &dstPixels.front(), width * 4, x, y)) {
1232 SkPixmap dstPixmap(info, &dstPixels.front(), width * 4);
1233 SkBitmap bitmap;
1234 bitmap.installPixels(dstPixmap);
1235 canvas->drawBitmap(bitmap, 0, 0);
1236 }
1237 canvas->translate(48, 0);
1238 }
1239 canvas->translate(-16 * 48, 48);
1240 }
Cary Clarka560c472017-11-27 10:44:06 -05001241##
1242
Cary Clarkac47b882018-01-11 10:35:44 -05001243#SeeAlso scalePixels SkBitmap::readPixels SkPixmap::readPixels SkCanvas::readPixels SkSurface::readPixels
Cary Clarka560c472017-11-27 10:44:06 -05001244
1245#Method ##
1246
1247# ------------------------------------------------------------------------------
1248
1249#Method bool readPixels(const SkPixmap& dst, int srcX, int srcY,
1250 CachingHint cachingHint = kAllow_CachingHint) const
1251
Cary Clarkac47b882018-01-11 10:35:44 -05001252Copies a Rect of pixels from Image to dst. Copy starts at (srcX, srcY), and
Cary Clark682c58d2018-05-16 07:07:07 -04001253does not exceed Image (width(), height()).
Cary Clarka560c472017-11-27 10:44:06 -05001254
Cary Clarkac47b882018-01-11 10:35:44 -05001255dst specifies width, height, Color_Type, Alpha_Type, Color_Space, pixel storage,
Cary Clark77b3f3a2018-11-07 14:59:03 -05001256and row bytes of destination. dst.rowBytes() specifics the gap from one destination
Cary Clarkac47b882018-01-11 10:35:44 -05001257row to the next. Returns true if pixels are copied. Returns false if:
1258#List
1259# dst pixel storage equals nullptr ##
Cary Clark77b3f3a2018-11-07 14:59:03 -05001260# dst.rowBytes() is less than SkImageInfo::minRowBytes ##
Cary Clarkac47b882018-01-11 10:35:44 -05001261# Pixel_Ref is nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -05001262##
1263
Cary Clarkac47b882018-01-11 10:35:44 -05001264Pixels are copied only if pixel conversion is possible. If Image Color_Type is
Cary Clark77b3f3a2018-11-07 14:59:03 -05001265kGray_8_SkColorType, or kAlpha_8_SkColorType; dst.colorType() must match.
1266If Image Color_Type is kGray_8_SkColorType, dst.colorSpace() must match.
1267If Image Alpha_Type is kOpaque_SkAlphaType, dst.alphaType() must
1268match. If Image Color_Space is nullptr, dst.colorSpace() must match. Returns
Cary Clarkac47b882018-01-11 10:35:44 -05001269false if pixel conversion is not possible.
Cary Clark682c58d2018-05-16 07:07:07 -04001270
Cary Clarkac47b882018-01-11 10:35:44 -05001271srcX and srcY may be negative to copy only top or left of source. Returns
Cary Clark682c58d2018-05-16 07:07:07 -04001272false if width() or height() is zero or negative.
Cary Clark2be81cf2018-09-13 12:04:30 -04001273Returns false if #Formula # abs(srcX) >= Image width() ##, or if #Formula # abs(srcY) >= Image height() ##.
Cary Clarkac47b882018-01-11 10:35:44 -05001274
1275If cachingHint is kAllow_CachingHint, pixels may be retained locally.
1276If cachingHint is kDisallow_CachingHint, pixels are not added to the local cache.
1277
1278#Param dst destination Pixmap: Image_Info, pixels, row bytes ##
1279#Param srcX column index whose absolute value is less than width() ##
1280#Param srcY row index whose absolute value is less than height() ##
1281#Param cachingHint one of: kAllow_CachingHint, kDisallow_CachingHint ##
1282
1283#Return true if pixels are copied to dst ##
1284
1285#Example
1286#Image 3
1287 std::vector<int32_t> srcPixels;
1288 int rowBytes = image->width() * 4;
1289 int quarterWidth = image->width() / 4;
1290 int quarterHeight = image->height() / 4;
1291 srcPixels.resize(image->height() * rowBytes);
1292 for (int y = 0; y < 4; ++y) {
1293 for (int x = 0; x < 4; ++x) {
1294 SkPixmap pixmap(SkImageInfo::MakeN32Premul(quarterWidth, quarterHeight),
1295 &srcPixels.front() + x * image->height() * quarterWidth +
1296 y * quarterWidth, rowBytes);
1297 image->readPixels(pixmap, x * quarterWidth, y * quarterHeight);
1298 }
1299 }
1300 canvas->scale(.5f, .5f);
1301 SkBitmap bitmap;
1302 bitmap.installPixels(SkImageInfo::MakeN32Premul(image->width(), image->height()),
1303 &srcPixels.front(), rowBytes);
1304 canvas->drawBitmap(bitmap, 0, 0);
1305##
1306
1307#SeeAlso scalePixels SkBitmap::readPixels SkPixmap::readPixels SkCanvas::readPixels SkSurface::readPixels
Cary Clarka560c472017-11-27 10:44:06 -05001308
1309#Method ##
1310
1311# ------------------------------------------------------------------------------
1312
1313#Method bool scalePixels(const SkPixmap& dst, SkFilterQuality filterQuality,
1314 CachingHint cachingHint = kAllow_CachingHint) const
Cary Clark78de7512018-02-07 07:27:09 -05001315#In Pixels
Cary Clark4855f782018-02-06 09:41:53 -05001316#Line # scales and converts one Image to another ##
Cary Clark09d80c02018-10-31 12:14:03 -04001317#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001318
1319#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001320#Image 3
1321#Height 128
1322 std::vector<int32_t> srcPixels;
1323 int quarterWidth = image->width() / 16;
1324 int rowBytes = quarterWidth * 4;
1325 int quarterHeight = image->height() / 16;
1326 srcPixels.resize(quarterHeight * rowBytes);
1327 SkPixmap pixmap(SkImageInfo::MakeN32Premul(quarterWidth, quarterHeight),
1328 &srcPixels.front(), rowBytes);
1329 canvas->scale(4, 4);
1330 SkFilterQuality qualities[] = { kNone_SkFilterQuality, kLow_SkFilterQuality,
1331 kMedium_SkFilterQuality, kHigh_SkFilterQuality };
1332 for (unsigned index = 0; index < SK_ARRAY_COUNT(qualities); ++index) {
1333 image->scalePixels(pixmap, qualities[index]);
1334 sk_sp<SkImage> filtered = SkImage::MakeFromRaster(pixmap, nullptr, nullptr);
1335 canvas->drawImage(filtered, 16 * index, 0);
1336 }
Cary Clarka560c472017-11-27 10:44:06 -05001337##
1338
Cary Clarkac47b882018-01-11 10:35:44 -05001339#SeeAlso SkCanvas::drawImage readPixels SkPixmap::scalePixels
Cary Clarka560c472017-11-27 10:44:06 -05001340
1341#Method ##
1342
1343# ------------------------------------------------------------------------------
1344
1345#Method sk_sp<SkData> encodeToData(SkEncodedImageFormat encodedImageFormat, int quality) const
Cary Clark78de7512018-02-07 07:27:09 -05001346#In Utility
Cary Clark4855f782018-02-06 09:41:53 -05001347#Line # returns encoded Image as SkData ##
Cary Clark09d80c02018-10-31 12:14:03 -04001348#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001349
1350#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001351#Image 3
1352 canvas->scale(4, 4);
1353 SkIRect subset = {0, 0, 16, 64};
1354 int x = 0;
1355 for (int quality : { 0, 10, 50, 100 } ) {
1356 sk_sp<SkData> data(image->encodeToData(SkEncodedImageFormat::kJPEG, quality));
1357 sk_sp<SkImage> filtered = SkImage::MakeFromEncoded(data, &subset);
1358 canvas->drawImage(filtered, x, 0);
1359 x += 16;
1360 }
Cary Clarka560c472017-11-27 10:44:06 -05001361##
1362
Cary Clarkac47b882018-01-11 10:35:44 -05001363#SeeAlso refEncodedData MakeFromEncoded
Cary Clarka560c472017-11-27 10:44:06 -05001364
1365#Method ##
1366
1367# ------------------------------------------------------------------------------
1368
Cary Clark61ca7c52018-01-02 11:34:14 -05001369#Method sk_sp<SkData> encodeToData() const
Cary Clark09d80c02018-10-31 12:14:03 -04001370#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001371
1372#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001373#Image 3
1374 canvas->scale(4, 4);
1375 SkIRect subset = {136, 32, 200, 96};
1376 sk_sp<SkData> data(image->encodeToData());
1377 sk_sp<SkImage> eye = SkImage::MakeFromEncoded(data, &subset);
1378 canvas->drawImage(eye, 0, 0);
Cary Clarka560c472017-11-27 10:44:06 -05001379##
1380
Cary Clarkac47b882018-01-11 10:35:44 -05001381#SeeAlso refEncodedData MakeFromEncoded
Cary Clarka560c472017-11-27 10:44:06 -05001382
1383#Method ##
1384
1385# ------------------------------------------------------------------------------
1386
1387#Method sk_sp<SkData> refEncodedData() const
Cary Clark78de7512018-02-07 07:27:09 -05001388#In Utility
Cary Clark4855f782018-02-06 09:41:53 -05001389#Line # returns Image encoded in SkData if present ##
Cary Clark09d80c02018-10-31 12:14:03 -04001390#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001391
1392#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001393#Image 3
1394#Platform gpu
1395 struct {
1396 const char* name;
1397 sk_sp<SkImage> image;
1398 } tests[] = { { "image", image }, { "bitmap", SkImage::MakeFromBitmap(source) },
1399 { "texture", SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04001400 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
1401 kOpaque_SkAlphaType, nullptr) } };
Cary Clarkac47b882018-01-11 10:35:44 -05001402 SkString string;
1403 SkPaint paint;
1404 for (const auto& test : tests ) {
1405 if (!test.image) {
1406 string.printf("no %s", test.name);
1407 } else {
1408 string.printf("%s" "encoded %s", test.image->refEncodedData() ? "" : "no ", test.name);
1409 }
1410 canvas->drawString(string, 10, 20, paint);
1411 canvas->translate(0, 20);
1412 }
Cary Clarka560c472017-11-27 10:44:06 -05001413##
1414
Cary Clarkac47b882018-01-11 10:35:44 -05001415#SeeAlso encodeToData MakeFromEncoded
Cary Clarka560c472017-11-27 10:44:06 -05001416
1417#Method ##
1418
1419# ------------------------------------------------------------------------------
Cary Clark4855f782018-02-06 09:41:53 -05001420#Subtopic Utility
Cary Clark4855f782018-02-06 09:41:53 -05001421#Line # rarely called management functions ##
1422##
Cary Clarka560c472017-11-27 10:44:06 -05001423
Cary Clarka560c472017-11-27 10:44:06 -05001424#Method sk_sp<SkImage> makeSubset(const SkIRect& subset) const
Cary Clark61313f32018-10-08 14:57:48 -04001425#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05001426#Line # creates Image containing part of original ##
Cary Clark09d80c02018-10-31 12:14:03 -04001427#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001428
1429#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001430#Image 3
1431 canvas->scale(.5f, .5f);
Cary Clarkc30382f2018-07-24 08:09:27 -04001432 const int width = 64;
1433 const int height = 64;
Cary Clarkac47b882018-01-11 10:35:44 -05001434 for (int y = 0; y < 512; y += height ) {
1435 for (int x = 0; x < 512; x += width ) {
1436 sk_sp<SkImage> subset(image->makeSubset({x, y, x + width, y + height}));
1437 canvas->drawImage(subset, x * 3 / 2, y * 3 / 2);
1438 }
1439 }
Cary Clarka560c472017-11-27 10:44:06 -05001440##
1441
Cary Clarkac47b882018-01-11 10:35:44 -05001442#SeeAlso MakeFromEncoded
Cary Clarka560c472017-11-27 10:44:06 -05001443
1444#Method ##
1445
1446# ------------------------------------------------------------------------------
1447
Greg Daniel5f4b09d2018-06-12 16:39:59 -04001448#Method sk_sp<SkImage> makeTextureImage(GrContext* context, SkColorSpace* dstColorSpace,
1449 GrMipMapped mipMapped = GrMipMapped::kNo) const
Cary Clark61313f32018-10-08 14:57:48 -04001450#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05001451#Line # creates Image matching Color_Space if possible ##
Cary Clark09d80c02018-10-31 12:14:03 -04001452#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001453
1454#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001455#Platform gpu
1456#Image 5
1457 auto drawImage = [=](sk_sp<SkImage> image, GrContext* context, const char* label) -> void {
1458 if (nullptr == image || nullptr == context) {
1459 return;
1460 }
1461 SkPaint paint;
1462 paint.setAntiAlias(true);
Cary Clarkac47b882018-01-11 10:35:44 -05001463 sk_sp<SkImage> texture(image->makeTextureImage(context, nullptr));
1464 canvas->drawImage(texture, 0, 0);
Cary Clark14768f62018-10-29 20:33:51 -04001465 canvas->drawString(label, 20, texture->height() / 4, paint);
Cary Clarkac47b882018-01-11 10:35:44 -05001466 };
1467 sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
1468 GrContext* context = canvas->getGrContext();
1469 sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(context, backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04001470 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
1471 kOpaque_SkAlphaType, nullptr));
Cary Clarkac47b882018-01-11 10:35:44 -05001472 drawImage(image, context, "image");
1473 canvas->translate(image->width(), 0);
1474 drawImage(bitmapImage, context, "source");
1475 canvas->translate(-image->width(), image->height());
1476 drawImage(textureImage, context, "backEndTexture");
Cary Clarka560c472017-11-27 10:44:06 -05001477##
1478
Cary Clarkac47b882018-01-11 10:35:44 -05001479#SeeAlso MakeFromTexture
Cary Clarka560c472017-11-27 10:44:06 -05001480
1481#Method ##
1482
1483# ------------------------------------------------------------------------------
1484
1485#Method sk_sp<SkImage> makeNonTextureImage() const
Cary Clark61313f32018-10-08 14:57:48 -04001486#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05001487#Line # creates Image without dependency on GPU_Texture ##
Cary Clark09d80c02018-10-31 12:14:03 -04001488#Populate
Cary Clark61ca7c52018-01-02 11:34:14 -05001489
1490#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001491#Image 5
1492#Platform gpu
1493 auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {
1494 if (nullptr == image) {
1495 return;
1496 }
1497 SkPaint paint;
1498 paint.setAntiAlias(true);
Cary Clarkac47b882018-01-11 10:35:44 -05001499 sk_sp<SkImage> nonTexture(image->makeNonTextureImage());
1500 canvas->drawImage(nonTexture, 0, 0);
Cary Clark14768f62018-10-29 20:33:51 -04001501 canvas->drawString(label, 20, nonTexture->height() / 4, paint);
Cary Clarkac47b882018-01-11 10:35:44 -05001502 };
1503 sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
1504 sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04001505 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
1506 kOpaque_SkAlphaType, nullptr));
Cary Clarkac47b882018-01-11 10:35:44 -05001507 drawImage(image, "image");
1508 canvas->translate(image->width(), 0);
1509 drawImage(bitmapImage, "source");
1510 canvas->translate(-image->width(), image->height());
1511 drawImage(textureImage, "backEndTexture");
Cary Clark61ca7c52018-01-02 11:34:14 -05001512##
1513
Cary Clark56356312018-02-08 14:45:18 -05001514#SeeAlso makeTextureImage makeRasterImage MakeBackendTextureFromSkImage
Cary Clark61ca7c52018-01-02 11:34:14 -05001515
1516#Method ##
1517
1518# ------------------------------------------------------------------------------
1519
1520#Method sk_sp<SkImage> makeRasterImage() const
Cary Clark61313f32018-10-08 14:57:48 -04001521#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05001522#Line # creates Image compatible with Raster_Surface if possible ##
Cary Clark09d80c02018-10-31 12:14:03 -04001523#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001524
Cary Clarka560c472017-11-27 10:44:06 -05001525#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001526#Image 5
1527#Platform gpu
1528 auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {
1529 if (nullptr == image) {
1530 return;
1531 }
1532 SkPaint paint;
1533 paint.setAntiAlias(true);
Cary Clarkac47b882018-01-11 10:35:44 -05001534 sk_sp<SkImage> raster(image->makeRasterImage());
1535 canvas->drawImage(raster, 0, 0);
Cary Clark14768f62018-10-29 20:33:51 -04001536 canvas->drawString(label, 20, raster->height() / 4, paint);
Cary Clarkac47b882018-01-11 10:35:44 -05001537 };
1538 sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
1539 sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04001540 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
1541 kOpaque_SkAlphaType, nullptr));
Cary Clarkac47b882018-01-11 10:35:44 -05001542 drawImage(image, "image");
1543 canvas->translate(image->width(), 0);
1544 drawImage(bitmapImage, "source");
1545 canvas->translate(-image->width(), image->height());
1546 drawImage(textureImage, "backEndTexture");
Cary Clarka560c472017-11-27 10:44:06 -05001547##
1548
Cary Clarkac47b882018-01-11 10:35:44 -05001549#SeeAlso isTextureBacked isLazyGenerated MakeFromRaster
Cary Clarka560c472017-11-27 10:44:06 -05001550
1551#Method ##
1552
1553# ------------------------------------------------------------------------------
1554
Robert Phillipsc334df72019-01-11 14:50:16 -05001555#Method sk_sp<SkImage> makeWithFilter(GrContext* context,
1556 const SkImageFilter* filter, const SkIRect& subset,
Cary Clarka560c472017-11-27 10:44:06 -05001557 const SkIRect& clipBounds, SkIRect* outSubset,
1558 SkIPoint* offset) const
Cary Clark61313f32018-10-08 14:57:48 -04001559#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05001560#Line # creates filtered, clipped Image ##
Cary Clark09d80c02018-10-31 12:14:03 -04001561#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001562
Cary Clarka560c472017-11-27 10:44:06 -05001563#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001564#Description
1565In each frame of the animation, filtered Image is drawn in a different location.
1566By translating canvas by returned offset, Image appears stationary.
1567##
1568#Image 5
1569#Platform gpu
Cary Clark5717e822018-09-21 11:36:41 -04001570#Duration 1
Cary Clarkac47b882018-01-11 10:35:44 -05001571 sk_sp<SkImageFilter> shadowFilter = SkDropShadowImageFilter::Make(
1572 -10.0f * frame, 5.0f * frame, 3.0f, 3.0f, SK_ColorBLUE,
1573 SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode,
1574 nullptr);
1575 sk_sp<SkImageFilter> offsetFilter = SkOffsetImageFilter::Make(40, 40, shadowFilter, nullptr);
1576 SkIRect subset = image->bounds();
1577 SkIRect clipBounds = image->bounds();
1578 clipBounds.outset(60, 60);
1579 SkIRect outSubset;
1580 SkIPoint offset;
Robert Phillipsc334df72019-01-11 14:50:16 -05001581 sk_sp<SkImage> filtered(image->makeWithFilter(canvas->getGrContext(),
1582 offsetFilter.get(), subset, clipBounds,
Cary Clarkac47b882018-01-11 10:35:44 -05001583 &outSubset, &offset));
1584 SkPaint paint;
1585 paint.setAntiAlias(true);
1586 paint.setStyle(SkPaint::kStroke_Style);
1587 canvas->drawLine(0, 0, offset.fX, offset.fY, paint);
1588 canvas->translate(offset.fX, offset.fY);
1589 canvas->drawImage(filtered, 0, 0);
Cary Clark681287e2018-03-16 11:34:15 -04001590 canvas->drawRect(SkRect::Make(outSubset), paint);
Cary Clarka560c472017-11-27 10:44:06 -05001591##
1592
Cary Clark56356312018-02-08 14:45:18 -05001593#SeeAlso makeShader SkPaint::setImageFilter
Cary Clarka560c472017-11-27 10:44:06 -05001594
1595#Method ##
1596
1597# ------------------------------------------------------------------------------
1598
Robert Phillipsc334df72019-01-11 14:50:16 -05001599#Method sk_sp<SkImage> makeWithFilter(const SkImageFilter* filter, const SkIRect& subset,
1600 const SkIRect& clipBounds, SkIRect* outSubset,
1601 SkIPoint* offset) const
1602#In Constructors
1603#Line # creates filtered, clipped Image ##
1604#Populate
1605#NoExample
1606##
1607#SeeAlso makeShader SkPaint::setImageFilter
1608#Method ##
1609
1610# ------------------------------------------------------------------------------
1611
Cary Clarka560c472017-11-27 10:44:06 -05001612#Typedef std::function<void(GrBackendTexture)> BackendTextureReleaseProc
Cary Clark682c58d2018-05-16 07:07:07 -04001613#Line # parameter type for MakeBackendTextureFromSkImage ##
Cary Clarkffb3d682018-05-17 12:17:28 -04001614
1615#Code
Cary Clarka90ea222018-10-16 10:30:28 -04001616#Populate
Cary Clarkffb3d682018-05-17 12:17:28 -04001617##
1618
Cary Clark0d225392018-06-07 09:59:07 -04001619Defines a callback function, taking one parameter of type GrBackendTexture with
1620no return value. Function is called when back-end texture is to be released.
Cary Clarka560c472017-11-27 10:44:06 -05001621##
1622
1623# ------------------------------------------------------------------------------
1624
1625#Method static bool MakeBackendTextureFromSkImage(GrContext* context,
1626 sk_sp<SkImage> image,
1627 GrBackendTexture* backendTexture,
1628 BackendTextureReleaseProc* backendTextureReleaseProc)
Cary Clark61313f32018-10-08 14:57:48 -04001629#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05001630#Line # creates GPU_Texture from Image ##
Cary Clark09d80c02018-10-31 12:14:03 -04001631#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001632
1633#Example
Cary Clark56356312018-02-08 14:45:18 -05001634#Platform gpu
1635#Height 64
1636#Function
Brian Salomon67f85842018-02-09 08:50:22 -05001637static sk_sp<SkImage> create_gpu_image(GrContext* grContext) {
1638 const SkImageInfo info = SkImageInfo::MakeN32(20, 20, kOpaque_SkAlphaType);
1639 auto surface(SkSurface::MakeRenderTarget(grContext, SkBudgeted::kNo, info));
1640 SkCanvas* canvas = surface->getCanvas();
1641 canvas->clear(SK_ColorWHITE);
1642 SkPaint paint;
1643 paint.setColor(SK_ColorBLACK);
1644 canvas->drawRect(SkRect::MakeXYWH(5, 5, 10, 10), paint);
1645 return surface->makeImageSnapshot();
1646}
1647##
1648
Cary Clark682c58d2018-05-16 07:07:07 -04001649void draw(SkCanvas* canvas) {
Brian Salomon67f85842018-02-09 08:50:22 -05001650 GrContext* grContext = canvas->getGrContext();
1651 if (!grContext) {
1652 return;
1653 }
1654 sk_sp<SkImage> backEndImage = create_gpu_image(grContext);
1655 canvas->drawImage(backEndImage, 0, 0);
1656 GrBackendTexture texture;
1657 SkImage::BackendTextureReleaseProc proc;
1658 if (!SkImage::MakeBackendTextureFromSkImage(grContext, std::move(backEndImage),
1659 &texture, &proc)) {
1660 return;
1661 }
1662 sk_sp<SkImage> i2 = SkImage::MakeFromTexture(grContext, texture, kTopLeft_GrSurfaceOrigin,
1663 kN32_SkColorType, kOpaque_SkAlphaType, nullptr);
1664 canvas->drawImage(i2, 30, 30);
Cary Clark56356312018-02-08 14:45:18 -05001665}
Cary Clarka560c472017-11-27 10:44:06 -05001666##
1667
Cary Clark56356312018-02-08 14:45:18 -05001668#SeeAlso MakeFromTexture makeTextureImage
Cary Clarka560c472017-11-27 10:44:06 -05001669
1670#Method ##
1671
1672# ------------------------------------------------------------------------------
1673
Cary Clarka560c472017-11-27 10:44:06 -05001674#Method bool isLazyGenerated() const
Cary Clark4855f782018-02-06 09:41:53 -05001675#In Property
1676#Line # returns if Image is created as needed ##
Cary Clark09d80c02018-10-31 12:14:03 -04001677#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001678
1679#Example
Cary Clark2f466242017-12-11 16:03:17 -05001680#Height 80
1681#Function
1682class TestImageGenerator : public SkImageGenerator {
1683public:
1684 TestImageGenerator() : SkImageGenerator(SkImageInfo::MakeN32Premul(10, 10)) {}
1685 ~TestImageGenerator() override {}
1686protected:
1687 bool onGetPixels(const SkImageInfo& info, void* pixelPtr, size_t rowBytes,
1688 const Options& options) override {
1689 SkPMColor* pixels = static_cast<SkPMColor*>(pixelPtr);
1690 for (int y = 0; y < info.height(); ++y) {
1691 for (int x = 0; x < info.width(); ++x) {
1692 pixels[y * info.width() + x] = 0xff223344 + y * 0x000C0811;
1693 }
1694 }
1695 return true;
1696 }
1697};
1698##
1699void draw(SkCanvas* canvas) {
1700 auto gen = std::unique_ptr<TestImageGenerator>(new TestImageGenerator());
1701 sk_sp<SkImage> image(SkImage::MakeFromGenerator(std::move(gen)));
1702 SkString lazy(image->isLazyGenerated() ? "is lazy" : "not lazy");
1703 canvas->scale(8, 8);
1704 canvas->drawImage(image, 0, 0, nullptr);
1705 SkPaint paint;
Mike Reed729bb192019-02-13 16:56:13 -05001706 SkFont font(nullptr, 4);
1707 canvas->drawString(lazy, 2, 5, font, paint);
Cary Clark2f466242017-12-11 16:03:17 -05001708}
Cary Clarka560c472017-11-27 10:44:06 -05001709##
1710
Cary Clarkf5404bb2018-01-05 12:10:09 -05001711#Example
1712#Image 5
1713#Platform gpu
1714void draw(SkCanvas* canvas) {
1715 auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {
1716 if (nullptr == image) {
1717 return;
1718 }
1719 SkPaint paint;
1720 paint.setAntiAlias(true);
Cary Clarkf5404bb2018-01-05 12:10:09 -05001721 canvas->drawImage(image, 0, 0);
Cary Clark14768f62018-10-29 20:33:51 -04001722 canvas->drawString(label, 30, image->height() / 4, paint);
Cary Clarkf5404bb2018-01-05 12:10:09 -05001723 canvas->drawString(
1724 image->isLazyGenerated() ? "is lazily generated" : "not lazily generated",
Cary Clark14768f62018-10-29 20:33:51 -04001725 20, image->height() * 3 / 4, paint);
Cary Clarkf5404bb2018-01-05 12:10:09 -05001726 };
1727 sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
1728 sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04001729 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
1730 kOpaque_SkAlphaType, nullptr));
Cary Clarkf5404bb2018-01-05 12:10:09 -05001731 drawImage(image, "image");
1732 canvas->translate(image->width(), 0);
1733 drawImage(bitmapImage, "source");
1734 canvas->translate(-image->width(), image->height());
1735 drawImage(textureImage, "backEndTexture");
1736}
1737##
1738
Cary Clark77b3f3a2018-11-07 14:59:03 -05001739#SeeAlso isTextureBacked makeNonTextureImage
Cary Clarka560c472017-11-27 10:44:06 -05001740
1741#Method ##
1742
1743# ------------------------------------------------------------------------------
1744
Cary Clarke80cd442018-07-17 13:19:56 -04001745#Method sk_sp<SkImage> makeColorSpace(sk_sp<SkColorSpace> target) const
Cary Clark61313f32018-10-08 14:57:48 -04001746#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05001747#Line # creates Image matching Color_Space if possible ##
Cary Clark09d80c02018-10-31 12:14:03 -04001748#Populate
Cary Clarkac47b882018-01-11 10:35:44 -05001749
1750#Example
1751#Image 5
1752#Set sRGB
1753 sk_sp<SkColorSpace> normalColorSpace = SkColorSpace::MakeRGB(
Brian Osman410b3022019-01-28 15:42:55 -05001754 SkNamedTransferFn::kSRGB, SkNamedGamut::kSRGB);
Cary Clarkac47b882018-01-11 10:35:44 -05001755 sk_sp<SkColorSpace> wackyColorSpace = normalColorSpace->makeColorSpin();
1756 for (auto colorSpace : { normalColorSpace, wackyColorSpace } ) {
Cary Clarkc3c1c312018-07-18 09:25:15 -04001757 sk_sp<SkImage> colorSpaced = image->makeColorSpace(colorSpace);
1758 canvas->drawImage(colorSpaced, 0, 0);
1759 canvas->translate(128, 0);
Cary Clarkac47b882018-01-11 10:35:44 -05001760 }
1761##
1762
Cary Clark77b3f3a2018-11-07 14:59:03 -05001763#SeeAlso MakeFromPicture MakeFromTexture
Cary Clarka560c472017-11-27 10:44:06 -05001764
1765#Method ##
1766
1767#Class SkImage ##
1768
1769#Topic Image ##