blob: 7c7ed8e3e575316525dd1960411c41cf09e91083 [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#Enum CompressionType
257#Line # option for MakeFromCompressed ##
258#Code
259#Populate
260##
261
262Used to inform MakeFromCompressed which compression method was used on the
263input data.
264
265#Const kETC1_CompressionType 0
266#Line # compressed data uses ETC1 compression ##
267##
268
269#NoExample
270##
271
272#SeeAlso MakeFromCompressed
273
274#Enum ##
275
276#Method static sk_sp<SkImage> MakeFromCompressed(GrContext* context, sk_sp<SkData> data, int width, int height, CompressionType type)
277#In Constructors
278#Line # creates a GPU-backed Image from compressed data ##
279#Populate
280
281#NoExample
282##
283
284#SeeAlso MakeFromTexture CompressionType
285
286#Method ##
287
288# ------------------------------------------------------------------------------
289
Cary Clarka560c472017-11-27 10:44:06 -0500290#Typedef void (*TextureReleaseProc)(ReleaseContext releaseContext)
Cary Clark682c58d2018-05-16 07:07:07 -0400291#Line # parameter type for MakeFromTexture ##
Cary Clarkffb3d682018-05-17 12:17:28 -0400292
293#Code
Cary Clarka90ea222018-10-16 10:30:28 -0400294#Populate
Cary Clarkffb3d682018-05-17 12:17:28 -0400295##
296
Cary Clark682c58d2018-05-16 07:07:07 -0400297User function called when supplied texture may be deleted.
298#SeeAlso MakeFromTexture
Cary Clarka560c472017-11-27 10:44:06 -0500299##
300
301#Method static sk_sp<SkImage> MakeFromTexture(GrContext* context,
302 const GrBackendTexture& backendTexture,
303 GrSurfaceOrigin origin,
Cary Clark61ca7c52018-01-02 11:34:14 -0500304 SkColorType colorType,
305 SkAlphaType alphaType,
306 sk_sp<SkColorSpace> colorSpace)
Cary Clark61313f32018-10-08 14:57:48 -0400307#In Constructors
Cary Clarkf895a422018-02-27 09:54:21 -0500308#Line # creates Image from GPU_Texture ##
Cary Clark09d80c02018-10-31 12:14:03 -0400309#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500310
311#Example
Cary Clark0c5f5462017-12-15 11:21:51 -0500312#Image 3
313#Platform gpu
314#Height 128
315#Description
316A back-end texture has been created and uploaded to the GPU outside of this example.
317##
318GrContext* context = canvas->getGrContext();
319if (!context) {
320 return;
321}
322canvas->scale(.25f, .25f);
323int x = 0;
324for (auto origin : { kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin } ) {
Cary Clarkac47b882018-01-11 10:35:44 -0500325 sk_sp<SkImage> image = SkImage::MakeFromTexture(context, backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -0400326 origin, kRGBA_8888_SkColorType, kOpaque_SkAlphaType, nullptr);
Cary Clark0c5f5462017-12-15 11:21:51 -0500327 canvas->drawImage(image, x, 0);
328x += 512;
329}
Cary Clarka560c472017-11-27 10:44:06 -0500330##
331
Cary Clark3cd22cc2017-12-01 11:49:58 -0500332#SeeAlso MakeFromAdoptedTexture SkSurface::MakeFromBackendTexture
Cary Clarka560c472017-11-27 10:44:06 -0500333
334#Method ##
335
336# ------------------------------------------------------------------------------
337
338#Method static sk_sp<SkImage> MakeFromTexture(GrContext* context,
339 const GrBackendTexture& backendTexture,
340 GrSurfaceOrigin origin,
Cary Clark61ca7c52018-01-02 11:34:14 -0500341 SkColorType colorType,
Cary Clarka560c472017-11-27 10:44:06 -0500342 SkAlphaType alphaType,
343 sk_sp<SkColorSpace> colorSpace,
344 TextureReleaseProc textureReleaseProc,
345 ReleaseContext releaseContext)
Cary Clark09d80c02018-10-31 12:14:03 -0400346#Populate
Cary Clark0c5f5462017-12-15 11:21:51 -0500347
Cary Clarka560c472017-11-27 10:44:06 -0500348#Example
Cary Clark14f49f02018-12-13 09:10:49 -0500349#Description
350textureReleaseProc may be called at some later point in time. In this example,
351textureReleaseProc has no effect on the drawing.
352##
Cary Clarkac47b882018-01-11 10:35:44 -0500353#Platform gpu
354#Image 4
Cary Clark0c5f5462017-12-15 11:21:51 -0500355GrContext* context = canvas->getGrContext();
356if (!context) {
357 return;
358}
Cary Clarkac47b882018-01-11 10:35:44 -0500359auto debugster = [](SkImage::ReleaseContext releaseContext) -> void {
Cary Clark14f49f02018-12-13 09:10:49 -0500360 *((int *) releaseContext) += 128;
Cary Clark0c5f5462017-12-15 11:21:51 -0500361};
Cary Clark14f49f02018-12-13 09:10:49 -0500362int x = 0, y = 0;
Cary Clark0c5f5462017-12-15 11:21:51 -0500363for (auto origin : { kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin } ) {
Cary Clarkac47b882018-01-11 10:35:44 -0500364 sk_sp<SkImage> image = SkImage::MakeFromTexture(context, backEndTexture,
Cary Clark61ca7c52018-01-02 11:34:14 -0500365 origin, kRGBA_8888_SkColorType, kOpaque_SkAlphaType, nullptr, debugster, &x);
Cary Clark14f49f02018-12-13 09:10:49 -0500366 canvas->drawImage(image, x, y);
367 y += 128;
Cary Clark0c5f5462017-12-15 11:21:51 -0500368}
Cary Clarka560c472017-11-27 10:44:06 -0500369##
370
Cary Clark3cd22cc2017-12-01 11:49:58 -0500371#SeeAlso MakeFromAdoptedTexture SkSurface::MakeFromBackendTexture
Cary Clarka560c472017-11-27 10:44:06 -0500372
373#Method ##
374
375# ------------------------------------------------------------------------------
376
377#Method static sk_sp<SkImage> MakeCrossContextFromEncoded(GrContext* context, sk_sp<SkData> data,
378 bool buildMips,
Brian Osman584b5012018-04-13 15:48:26 -0400379 SkColorSpace* dstColorSpace,
380 bool limitToMaxTextureSize = false)
Cary Clark61313f32018-10-08 14:57:48 -0400381#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -0500382#Line # creates Image from encoded data, and uploads to GPU ##
Cary Clark09d80c02018-10-31 12:14:03 -0400383#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500384
385#Example
Cary Clark61ca7c52018-01-02 11:34:14 -0500386#Image 4
Cary Clarkac47b882018-01-11 10:35:44 -0500387#Height 64
Cary Clark61ca7c52018-01-02 11:34:14 -0500388GrContext* context = canvas->getGrContext();
389sk_sp<SkData> encodedData = image->encodeToData(SkEncodedImageFormat::kJPEG, 100);
390sk_sp<SkImage> image = SkImage::MakeCrossContextFromEncoded(context,
391 encodedData, false, nullptr);
392canvas->drawImage(image, 0, 0);
Cary Clarka560c472017-11-27 10:44:06 -0500393##
394
Cary Clark3cd22cc2017-12-01 11:49:58 -0500395#SeeAlso MakeCrossContextFromPixmap
396
397#Method ##
398
399# ------------------------------------------------------------------------------
400
401#Method static sk_sp<SkImage> MakeCrossContextFromPixmap(GrContext* context, const SkPixmap& pixmap,
402 bool buildMips,
Brian Osman584b5012018-04-13 15:48:26 -0400403 SkColorSpace* dstColorSpace,
404 bool limitToMaxTextureSize = false)
Cary Clark61313f32018-10-08 14:57:48 -0400405#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -0500406#Line # creates Image from Pixmap, and uploads to GPU ##
Cary Clark09d80c02018-10-31 12:14:03 -0400407#Populate
Cary Clark3cd22cc2017-12-01 11:49:58 -0500408
409#Example
Cary Clark61ca7c52018-01-02 11:34:14 -0500410#Image 4
Cary Clarkac47b882018-01-11 10:35:44 -0500411#Height 64
Cary Clark61ca7c52018-01-02 11:34:14 -0500412GrContext* context = canvas->getGrContext();
413SkPixmap pixmap;
414if (source.peekPixels(&pixmap)) {
415 sk_sp<SkImage> image = SkImage::MakeCrossContextFromPixmap(context, pixmap,
416 false, nullptr);
417 canvas->drawImage(image, 0, 0);
418}
Cary Clark3cd22cc2017-12-01 11:49:58 -0500419##
420
421#SeeAlso MakeCrossContextFromEncoded
Cary Clarka560c472017-11-27 10:44:06 -0500422
423#Method ##
424
425# ------------------------------------------------------------------------------
426
427#Method static sk_sp<SkImage> MakeFromAdoptedTexture(GrContext* context,
428 const GrBackendTexture& backendTexture,
429 GrSurfaceOrigin surfaceOrigin,
Cary Clark61ca7c52018-01-02 11:34:14 -0500430 SkColorType colorType,
431 SkAlphaType alphaType = kPremul_SkAlphaType,
432 sk_sp<SkColorSpace> colorSpace = nullptr)
Cary Clark61313f32018-10-08 14:57:48 -0400433#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -0500434#Line # creates Image from GPU_Texture, managed internally ##
Cary Clark09d80c02018-10-31 12:14:03 -0400435#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500436
437#Example
Cary Clarkac47b882018-01-11 10:35:44 -0500438#Image 5
439#Platform gpu
Cary Clark61ca7c52018-01-02 11:34:14 -0500440 if (!canvas->getGrContext()) {
441 return;
442 }
443 canvas->scale(.5f, .5f);
444 canvas->clear(0x7f3f5f7f);
445 int x = 0, y = 0;
446 for (auto origin : { kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin } ) {
447 for (auto alpha : { kOpaque_SkAlphaType, kPremul_SkAlphaType, kUnpremul_SkAlphaType } ) {
448 sk_sp<SkImage> image = SkImage::MakeFromAdoptedTexture(canvas->getGrContext(),
Cary Clark682c58d2018-05-16 07:07:07 -0400449 backEndTexture, origin,
Cary Clark61ca7c52018-01-02 11:34:14 -0500450 kRGBA_8888_SkColorType, alpha);
451 canvas->drawImage(image, x, y);
452 x += 160;
453 }
454 x -= 160 * 3;
455 y += 256;
456 }
Cary Clarka560c472017-11-27 10:44:06 -0500457##
458
Cary Clark61ca7c52018-01-02 11:34:14 -0500459#SeeAlso MakeFromTexture MakeFromYUVTexturesCopy
Cary Clarka560c472017-11-27 10:44:06 -0500460
461#Method ##
462
463# ------------------------------------------------------------------------------
464
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400465#Method static sk_sp<SkImage> MakeFromYUVATexturesCopy(GrContext* context,
466 SkYUVColorSpace yuvColorSpace,
467 const GrBackendTexture yuvaTextures[],
468 const SkYUVAIndex yuvaIndices[4],
469 SkISize imageSize,
470 GrSurfaceOrigin imageOrigin,
471 sk_sp<SkColorSpace> imageColorSpace = nullptr)
472#In Constructor
473#Line # creates Image from YUV_ColorSpace data ##
Cary Clark09d80c02018-10-31 12:14:03 -0400474#Populate
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400475
476#NoExample
477##
478
Cary Clark1801b942018-10-30 21:10:03 -0400479#SeeAlso MakeFromYUVATexturesCopyWithExternalBackend MakeFromYUVATextures
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400480
481#Method ##
482
Cary Clark1801b942018-10-30 21:10:03 -0400483#Method static sk_sp<SkImage> MakeFromYUVATextures(GrContext* context,
484 SkYUVColorSpace yuvColorSpace,
485 const GrBackendTexture yuvaTextures[],
486 const SkYUVAIndex yuvaIndices[4],
487 SkISize imageSize,
488 GrSurfaceOrigin imageOrigin,
489 sk_sp<SkColorSpace> imageColorSpace = nullptr);
490
491#In Constructor
492#Line # creates Image from YUV_ColorSpace data ##
Cary Clark09d80c02018-10-31 12:14:03 -0400493#Populate
Cary Clark1801b942018-10-30 21:10:03 -0400494
495#NoExample
496##
497
498#SeeAlso MakeFromYUVATexturesCopy MakeFromYUVATexturesCopyWithExternalBackend
499
500#Method ##
501
Jim Van Verthc8429ad2018-11-20 11:12:37 -0500502#Method static sk_sp<SkImage> MakeFromYUVAPixmaps(
503 GrContext* context,
504 SkYUVColorSpace yuvColorSpace,
505 const SkPixmap yuvaPixmaps[],
506 const SkYUVAIndex yuvaIndices[4],
507 SkISize imageSize,
508 GrSurfaceOrigin imageOrigin,
509 bool buildMips,
510 bool limitToMaxTextureSize = false,
511 sk_sp<SkColorSpace> imageColorSpace = nullptr);
512
513#In Constructor
514#Line # creates Image from YUV_ColorSpace data ##
515#Populate
516
517#NoExample
518##
519
520#SeeAlso MakeFromYUVATextures
521
522#Method ##
Cary Clark1801b942018-10-30 21:10:03 -0400523
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400524# ------------------------------------------------------------------------------
525
526#Method static sk_sp<SkImage> MakeFromYUVATexturesCopyWithExternalBackend(
527 GrContext* context,
528 SkYUVColorSpace yuvColorSpace,
529 const GrBackendTexture yuvaTextures[],
530 const SkYUVAIndex yuvaIndices[4],
531 SkISize imageSize,
532 GrSurfaceOrigin imageOrigin,
533 const GrBackendTexture& backendTexture,
534 sk_sp<SkColorSpace> imageColorSpace = nullptr)
535#In Constructor
536#Line # creates Image from planar YUV_ColorSpace, stored in texture ##
Cary Clark09d80c02018-10-31 12:14:03 -0400537#Populate
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400538
539#NoExample
540##
541
Cary Clark1801b942018-10-30 21:10:03 -0400542#SeeAlso MakeFromYUVATexturesCopy MakeFromYUVATextures
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400543
544#Method ##
545
Cary Clarka560c472017-11-27 10:44:06 -0500546#Method static sk_sp<SkImage> MakeFromYUVTexturesCopy(GrContext* context, SkYUVColorSpace yuvColorSpace,
Brian Salomon6a426c12018-03-15 12:16:02 -0400547 const GrBackendTexture yuvTextures[3],
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400548 GrSurfaceOrigin imageOrigin,
549 sk_sp<SkColorSpace> imageColorSpace = nullptr)
Cary Clark61313f32018-10-08 14:57:48 -0400550#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -0500551#Line # creates Image from YUV_ColorSpace data in three planes ##
Cary Clark09d80c02018-10-31 12:14:03 -0400552#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500553
Cary Clark61ca7c52018-01-02 11:34:14 -0500554#NoExample
555##
556
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400557#SeeAlso MakeFromYUVTexturesCopyWithExternalBackend MakeFromNV12TexturesCopy MakeFromYUVATexturesCopy
Cary Clarkcdc371a2018-09-18 07:31:37 -0400558
559#Method ##
560
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400561# ------------------------------------------------------------------------------
562
Cary Clarkcdc371a2018-09-18 07:31:37 -0400563#Method static sk_sp<SkImage> MakeFromYUVTexturesCopyWithExternalBackend(
564 GrContext* context, SkYUVColorSpace yuvColorSpace,
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400565 const GrBackendTexture yuvTextures[3], GrSurfaceOrigin imageOrigin,
566 const GrBackendTexture& backendTexture, sk_sp<SkColorSpace> imageColorSpace = nullptr);
Cary Clark61313f32018-10-08 14:57:48 -0400567#In Constructors
Cary Clarkcdc371a2018-09-18 07:31:37 -0400568#Line # creates Image from planar YUV_ColorSpace, stored in texture ##
Cary Clark09d80c02018-10-31 12:14:03 -0400569#Populate
Cary Clarkcdc371a2018-09-18 07:31:37 -0400570
571#NoExample
572##
573
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400574#SeeAlso MakeFromYUVTexturesCopy MakeFromNV12TexturesCopy MakeFromYUVATexturesCopyWithExternalBackend
Cary Clark61ca7c52018-01-02 11:34:14 -0500575
576#Method ##
577
578# ------------------------------------------------------------------------------
579
Cary Clarka560c472017-11-27 10:44:06 -0500580#Method static sk_sp<SkImage> MakeFromNV12TexturesCopy(GrContext* context,
581 SkYUVColorSpace yuvColorSpace,
Brian Salomon6a426c12018-03-15 12:16:02 -0400582 const GrBackendTexture nv12Textures[2],
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400583 GrSurfaceOrigin imageOrigin,
584 sk_sp<SkColorSpace> imageColorSpace = nullptr)
Cary Clark61313f32018-10-08 14:57:48 -0400585#In Constructors
Brian Salomon6a426c12018-03-15 12:16:02 -0400586#Line # creates Image from YUV_ColorSpace data in three planes ##
Cary Clark09d80c02018-10-31 12:14:03 -0400587#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500588
Cary Clark61ca7c52018-01-02 11:34:14 -0500589#NoExample
590##
591
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400592#SeeAlso MakeFromNV12TexturesCopyWithExternalBackend MakeFromYUVTexturesCopy MakeFromYUVATexturesCopy
Cary Clarkcdc371a2018-09-18 07:31:37 -0400593
594#Method ##
595
596#Method static sk_sp<SkImage> MakeFromNV12TexturesCopyWithExternalBackend(
597 GrContext* context,
598 SkYUVColorSpace yuvColorSpace,
599 const GrBackendTexture nv12Textures[2],
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400600 GrSurfaceOrigin imageOrigin,
601 const GrBackendTexture& backendTexture,
602 sk_sp<SkColorSpace> imageColorSpace = nullptr);
Cary Clark61313f32018-10-08 14:57:48 -0400603#In Constructors
Cary Clarkcdc371a2018-09-18 07:31:37 -0400604#Line # creates Image from planar YUV_ColorSpace, stored in texture ##
Cary Clark09d80c02018-10-31 12:14:03 -0400605#Populate
Cary Clarkcdc371a2018-09-18 07:31:37 -0400606
607#NoExample
608##
609
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400610#SeeAlso MakeFromNV12TexturesCopy MakeFromYUVTexturesCopy MakeFromYUVATexturesCopyWithExternalBackend
Cary Clarka560c472017-11-27 10:44:06 -0500611
612#Method ##
613
614# ------------------------------------------------------------------------------
615
Cary Clark4855f782018-02-06 09:41:53 -0500616# currently uncalled by any test or client ##
Cary Clark61ca7c52018-01-02 11:34:14 -0500617#Bug 7424
Cary Clark61ca7c52018-01-02 11:34:14 -0500618
Cary Clark56356312018-02-08 14:45:18 -0500619#EnumClass BitDepth
Cary Clark682c58d2018-05-16 07:07:07 -0400620#Line # options for MakeFromPicture ##
Cary Clarka560c472017-11-27 10:44:06 -0500621#Code
Cary Clarka90ea222018-10-16 10:30:28 -0400622#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500623##
624
625#Const kU8 0
Cary Clark682c58d2018-05-16 07:07:07 -0400626#Line # uses 8-bit unsigned int per Color component ##
Cary Clarkffb3d682018-05-17 12:17:28 -0400627Use 8 bits per ARGB component using unsigned integer format.
Cary Clarka560c472017-11-27 10:44:06 -0500628##
629#Const kF16 1
Cary Clark682c58d2018-05-16 07:07:07 -0400630#Line # uses 16-bit float per Color component ##
Cary Clarkffb3d682018-05-17 12:17:28 -0400631Use 16 bits per ARGB component using half-precision floating point format.
Cary Clarka560c472017-11-27 10:44:06 -0500632##
633
Cary Clark61ca7c52018-01-02 11:34:14 -0500634#NoExample
Cary Clarka560c472017-11-27 10:44:06 -0500635##
636
Cary Clark61ca7c52018-01-02 11:34:14 -0500637#SeeAlso MakeFromPicture
Cary Clarka560c472017-11-27 10:44:06 -0500638
Cary Clark56356312018-02-08 14:45:18 -0500639#EnumClass ##
Cary Clarka560c472017-11-27 10:44:06 -0500640
641# ------------------------------------------------------------------------------
642
643#Method static sk_sp<SkImage> MakeFromPicture(sk_sp<SkPicture> picture, const SkISize& dimensions,
644 const SkMatrix* matrix, const SkPaint* paint,
645 BitDepth bitDepth,
646 sk_sp<SkColorSpace> colorSpace)
Cary Clark61313f32018-10-08 14:57:48 -0400647#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -0500648#Line # creates Image from Picture ##
Cary Clark09d80c02018-10-31 12:14:03 -0400649#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500650
651#Example
Cary Clark61ca7c52018-01-02 11:34:14 -0500652 SkPaint paint;
653 SkPictureRecorder recorder;
654 SkCanvas* recordingCanvas = recorder.beginRecording(50, 50);
655 for (auto color : { SK_ColorRED, SK_ColorBLUE, 0xff007f00 } ) {
656 paint.setColor(color);
657 recordingCanvas->drawRect({10, 10, 30, 40}, paint);
658 recordingCanvas->translate(10, 10);
659 recordingCanvas->scale(1.2f, 1.4f);
660 }
661 sk_sp<SkPicture> playback = recorder.finishRecordingAsPicture();
662 int x = 0, y = 0;
663 for (auto alpha : { 70, 140, 210 } ) {
664 paint.setAlpha(alpha);
665 auto srgbColorSpace = SkColorSpace::MakeSRGB();
666 sk_sp<SkImage> image = SkImage::MakeFromPicture(playback, {50, 50}, nullptr, &paint,
667 SkImage::BitDepth::kU8, srgbColorSpace);
668 canvas->drawImage(image, x, y);
669 x += 70; y += 70;
670 }
Cary Clarka560c472017-11-27 10:44:06 -0500671##
672
Cary Clark61ca7c52018-01-02 11:34:14 -0500673#SeeAlso SkCanvas::drawPicture
Cary Clarka560c472017-11-27 10:44:06 -0500674
675#Method ##
676
677# ------------------------------------------------------------------------------
678
Cary Clark9548ea92018-09-13 15:26:33 -0400679#Method static sk_sp<SkImage> MakeFromAHardwareBuffer(
680 AHardwareBuffer* hardwareBuffer,
681 SkAlphaType alphaType = kPremul_SkAlphaType,
682 sk_sp<SkColorSpace> colorSpace = nullptr,
683 GrSurfaceOrigin surfaceOrigin = kTopLeft_GrSurfaceOrigin)
Cary Clark61313f32018-10-08 14:57:48 -0400684#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -0500685#Line # creates Image from Android hardware buffer ##
Cary Clark09d80c02018-10-31 12:14:03 -0400686#Populate
Cary Clark61ca7c52018-01-02 11:34:14 -0500687
688#NoExample
Cary Clarka560c472017-11-27 10:44:06 -0500689##
690
Cary Clark61ca7c52018-01-02 11:34:14 -0500691#SeeAlso MakeFromRaster
Cary Clarka560c472017-11-27 10:44:06 -0500692
693#Method ##
694
695# ------------------------------------------------------------------------------
Cary Clark4855f782018-02-06 09:41:53 -0500696#Subtopic Property
Cary Clark4855f782018-02-06 09:41:53 -0500697#Line # values and attributes ##
698##
Cary Clarka560c472017-11-27 10:44:06 -0500699
700#Method int width() const
Cary Clark4855f782018-02-06 09:41:53 -0500701#In Property
702#Line # returns pixel column count ##
Cary Clark09d80c02018-10-31 12:14:03 -0400703#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500704
705#Example
Cary Clark61ca7c52018-01-02 11:34:14 -0500706#Image 4
Cary Clarkac47b882018-01-11 10:35:44 -0500707#Height 96
Cary Clark61ca7c52018-01-02 11:34:14 -0500708 canvas->translate(10, 10);
709 canvas->drawImage(image, 0, 0);
710 canvas->translate(0, image->height());
711 SkPaint paint;
Cary Clark61ca7c52018-01-02 11:34:14 -0500712 canvas->drawLine(0, 10, image->width(), 10, paint);
Cary Clark14768f62018-10-29 20:33:51 -0400713 canvas->drawString("width", image->width() / 2 - 15, 25, paint);
Cary Clarka560c472017-11-27 10:44:06 -0500714##
715
Cary Clark61ca7c52018-01-02 11:34:14 -0500716#SeeAlso dimensions() height()
Cary Clarka560c472017-11-27 10:44:06 -0500717
718#Method ##
719
720# ------------------------------------------------------------------------------
721
722#Method int height() const
Cary Clark4855f782018-02-06 09:41:53 -0500723#In Property
724#Line # returns pixel row count ##
Cary Clark09d80c02018-10-31 12:14:03 -0400725#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500726
727#Example
Cary Clark61ca7c52018-01-02 11:34:14 -0500728#Image 4
Cary Clarkac47b882018-01-11 10:35:44 -0500729#Height 96
Cary Clark61ca7c52018-01-02 11:34:14 -0500730 canvas->translate(10, 10);
731 canvas->drawImage(image, 0, 0);
732 canvas->translate(image->width(), 0);
733 SkPaint paint;
Cary Clark61ca7c52018-01-02 11:34:14 -0500734 canvas->drawLine(10, 0, 10, image->height(), paint);
Cary Clark92694be2018-10-25 08:15:36 -0400735 canvas->drawString("height", 34, image->height() / 2, paint);
Cary Clarkac47b882018-01-11 10:35:44 -0500736##
Cary Clarka560c472017-11-27 10:44:06 -0500737
Cary Clark61ca7c52018-01-02 11:34:14 -0500738#SeeAlso dimensions() width()
Cary Clarka560c472017-11-27 10:44:06 -0500739
740#Method ##
741
742# ------------------------------------------------------------------------------
743
744#Method SkISize dimensions() const
Cary Clark4855f782018-02-06 09:41:53 -0500745#In Property
746#Line # returns width() and height() ##
Cary Clark09d80c02018-10-31 12:14:03 -0400747#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500748
749#Example
Cary Clark61ca7c52018-01-02 11:34:14 -0500750#Image 4
751 SkISize dimensions = image->dimensions();
752 SkIRect bounds = image->bounds();
753 SkIRect dimensionsAsBounds = SkIRect::MakeSize(dimensions);
754 SkDebugf("dimensionsAsBounds %c= bounds\n", dimensionsAsBounds == bounds ? '=' : '!');
Cary Clark681287e2018-03-16 11:34:15 -0400755#StdOut
756dimensionsAsBounds == bounds
757##
Cary Clarka560c472017-11-27 10:44:06 -0500758##
759
Cary Clark61ca7c52018-01-02 11:34:14 -0500760#SeeAlso height() width() bounds()
Cary Clarka560c472017-11-27 10:44:06 -0500761
762#Method ##
763
764# ------------------------------------------------------------------------------
765
766#Method SkIRect bounds() const
Cary Clark4855f782018-02-06 09:41:53 -0500767#In Property
768#Line # returns width() and height() as Rectangle ##
Cary Clark09d80c02018-10-31 12:14:03 -0400769#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500770
771#Example
Cary Clark61ca7c52018-01-02 11:34:14 -0500772#Height 128
773#Image 4
Cary Clark61ca7c52018-01-02 11:34:14 -0500774 SkIRect bounds = image->bounds();
Cary Clarkac47b882018-01-11 10:35:44 -0500775 for (int x : { 0, bounds.width() } ) {
776 for (int y : { 0, bounds.height() } ) {
Cary Clark61ca7c52018-01-02 11:34:14 -0500777 canvas->drawImage(image, x, y);
778 }
779 }
Cary Clarka560c472017-11-27 10:44:06 -0500780##
781
Cary Clark682c58d2018-05-16 07:07:07 -0400782#SeeAlso dimensions()
Cary Clarka560c472017-11-27 10:44:06 -0500783
784#Method ##
785
786# ------------------------------------------------------------------------------
787
788#Method uint32_t uniqueID() const
Cary Clark4855f782018-02-06 09:41:53 -0500789#In Property
Cary Clark682c58d2018-05-16 07:07:07 -0400790#Line # returns identifier for Image ##
Cary Clark09d80c02018-10-31 12:14:03 -0400791#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500792
793#Example
Cary Clark61ca7c52018-01-02 11:34:14 -0500794#Image 5
795#Height 156
796 sk_sp<SkImage> subset = image->makeSubset({10, 20, 90, 100});
797 canvas->drawImage(image, 0, 0);
798 canvas->drawImage(subset, 128, 0);
799 SkPaint paint;
800 SkString s;
801 s.printf("original id: %d", image->uniqueID());
802 canvas->drawString(s, 20, image->height() + 20, paint);
803 s.printf("subset id: %d", subset->uniqueID());
804 canvas->drawString(s, 148, subset->height() + 20, paint);
Cary Clarka560c472017-11-27 10:44:06 -0500805##
806
Cary Clark61ca7c52018-01-02 11:34:14 -0500807#SeeAlso isLazyGenerated
Cary Clarka560c472017-11-27 10:44:06 -0500808
809#Method ##
810
811# ------------------------------------------------------------------------------
812
813#Method SkAlphaType alphaType() const
Cary Clark4855f782018-02-06 09:41:53 -0500814#In Property
815#Line # returns Alpha_Type ##
Cary Clark681287e2018-03-16 11:34:15 -0400816Returns Alpha_Type, one of: #list_of_alpha_types#.
Cary Clark61ca7c52018-01-02 11:34:14 -0500817
818Alpha_Type returned was a parameter to an Image constructor,
819or was parsed from encoded data.
820
821#Return Alpha_Type in Image ##
Cary Clarka560c472017-11-27 10:44:06 -0500822
823#Example
Cary Clark61ca7c52018-01-02 11:34:14 -0500824#Image 4
Cary Clarkac47b882018-01-11 10:35:44 -0500825#Height 96
Cary Clark61ca7c52018-01-02 11:34:14 -0500826 const char* alphaTypeStr[] = { "Unknown", "Opaque", "Premul", "Unpremul" };
827 SkAlphaType alphaType = image->alphaType();
Cary Clarkac47b882018-01-11 10:35:44 -0500828 canvas->drawImage(image, 16, 0);
Cary Clarkffb3d682018-05-17 12:17:28 -0400829 canvas->drawString(alphaTypeStr[(int) alphaType], 20, image->height() + 20, SkPaint());
Cary Clarka560c472017-11-27 10:44:06 -0500830##
831
Cary Clark61ca7c52018-01-02 11:34:14 -0500832#SeeAlso SkImageInfo::alphaType
Cary Clarka560c472017-11-27 10:44:06 -0500833
834#Method ##
835
836# ------------------------------------------------------------------------------
837
Greg Daniel56008aa2018-03-14 15:33:42 -0400838#Method SkColorType colorType() const
839#In Property
840#Line # returns Color_Type ##
Cary Clark09d80c02018-10-31 12:14:03 -0400841#Populate
Greg Daniel56008aa2018-03-14 15:33:42 -0400842
843#Example
Cary Clarkffb3d682018-05-17 12:17:28 -0400844#Image 4
845#Height 96
846 const char* colors[] = { "Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x",
847 "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16" };
848 SkColorType colorType = image->colorType();
849 canvas->drawImage(image, 16, 0);
850 canvas->drawString(colors[(int) colorType], 20, image->height() + 20, SkPaint());
Greg Daniel56008aa2018-03-14 15:33:42 -0400851##
852
853#SeeAlso SkImageInfo::colorType
854
855#Method ##
856
857# ------------------------------------------------------------------------------
858
Cary Clarka560c472017-11-27 10:44:06 -0500859#Method SkColorSpace* colorSpace() const
Cary Clark4855f782018-02-06 09:41:53 -0500860#In Property
861#Line # returns Color_Space ##
Cary Clark09d80c02018-10-31 12:14:03 -0400862#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500863
864#Example
Cary Clark61dfc3a2018-01-03 08:37:53 -0500865#Image 3
866#Set sRGB
867 SkPixmap pixmap;
868 source.peekPixels(&pixmap);
869 canvas->scale(.25f, .25f);
870 int y = 0;
Brian Osman410b3022019-01-28 15:42:55 -0500871 for (auto gamma : { SkNamedTransferFn::kLinear,
872 SkNamedTransferFn::kSRGB } ) {
Cary Clark61dfc3a2018-01-03 08:37:53 -0500873 int x = 0;
Brian Osman410b3022019-01-28 15:42:55 -0500874 sk_sp<SkColorSpace> colorSpace = SkColorSpace::MakeRGB(gamma, SkNamedGamut::kSRGB);
Cary Clark61dfc3a2018-01-03 08:37:53 -0500875 for (int index = 0; index < 2; ++index) {
876 pixmap.setColorSpace(colorSpace);
877 sk_sp<SkImage> image = SkImage::MakeRasterCopy(pixmap);
878 canvas->drawImage(image, x, y);
879 colorSpace = image->colorSpace()->makeColorSpin();
880 x += 512;
881 }
882 y += 512;
883 }
Cary Clarka560c472017-11-27 10:44:06 -0500884##
885
Cary Clark61dfc3a2018-01-03 08:37:53 -0500886#SeeAlso refColorSpace makeColorSpace
Cary Clarka560c472017-11-27 10:44:06 -0500887
888#Method ##
889
890# ------------------------------------------------------------------------------
891
892#Method sk_sp<SkColorSpace> refColorSpace() const
Cary Clark4855f782018-02-06 09:41:53 -0500893#In Property
894#Line # returns Image_Info Color_Space ##
Cary Clark09d80c02018-10-31 12:14:03 -0400895#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500896
897#Example
Cary Clark61dfc3a2018-01-03 08:37:53 -0500898#Image 3
899#Set sRGB
900 SkPixmap pixmap;
901 source.peekPixels(&pixmap);
902 canvas->scale(.25f, .25f);
903 int y = 0;
Brian Osman410b3022019-01-28 15:42:55 -0500904 for (auto gamma : { SkNamedTransferFn::kLinear,
905 SkNamedTransferFn::kSRGB } ) {
Cary Clark61dfc3a2018-01-03 08:37:53 -0500906 int x = 0;
Brian Osman410b3022019-01-28 15:42:55 -0500907 sk_sp<SkColorSpace> colorSpace = SkColorSpace::MakeRGB(gamma, SkNamedGamut::kSRGB);
Cary Clark61dfc3a2018-01-03 08:37:53 -0500908 for (int index = 0; index < 2; ++index) {
909 pixmap.setColorSpace(colorSpace);
910 sk_sp<SkImage> image = SkImage::MakeRasterCopy(pixmap);
911 canvas->drawImage(image, x, y);
912 colorSpace = image->refColorSpace()->makeColorSpin();
913 x += 512;
914 }
915 y += 512;
916 }
Cary Clarka560c472017-11-27 10:44:06 -0500917##
918
Cary Clark61dfc3a2018-01-03 08:37:53 -0500919#SeeAlso colorSpace makeColorSpace
Cary Clarka560c472017-11-27 10:44:06 -0500920
921#Method ##
922
923# ------------------------------------------------------------------------------
924
925#Method bool isAlphaOnly() const
Cary Clark4855f782018-02-06 09:41:53 -0500926#In Property
927#Line # returns if pixels represent a transparency mask ##
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 uint8_t pmColors = 0;
932 sk_sp<SkImage> image = SkImage::MakeRasterCopy({SkImageInfo::MakeA8(1, 1), &pmColors, 1});
933 SkDebugf("alphaOnly = %s\n", image->isAlphaOnly() ? "true" : "false");
934#StdOut
935alphaOnly = true
936##
Cary Clarka560c472017-11-27 10:44:06 -0500937##
938
Cary Clark61dfc3a2018-01-03 08:37:53 -0500939#SeeAlso alphaType isOpaque
Cary Clarka560c472017-11-27 10:44:06 -0500940
941#Method ##
942
943# ------------------------------------------------------------------------------
944
945#Method bool isOpaque() const
Cary Clark4855f782018-02-06 09:41:53 -0500946#In Property
947#Line # returns if Alpha_Type is kOpaque_SkAlphaType ##
Cary Clark09d80c02018-10-31 12:14:03 -0400948#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500949
950#Example
Cary Clark61dfc3a2018-01-03 08:37:53 -0500951 auto check_isopaque = [](const SkImageInfo& imageInfo) -> void {
952 auto surface(SkSurface::MakeRaster(imageInfo));
953 auto image(surface->makeImageSnapshot());
954 SkDebugf("isOpaque = %s\n", image->isOpaque() ? "true" : "false");
955 };
956
957 check_isopaque(SkImageInfo::MakeN32Premul(5, 5));
958 check_isopaque(SkImageInfo::MakeN32(5, 5, kOpaque_SkAlphaType));
959#StdOut
960isOpaque = false
961isOpaque = true
962##
Cary Clarka560c472017-11-27 10:44:06 -0500963##
964
Cary Clark61dfc3a2018-01-03 08:37:53 -0500965#SeeAlso alphaType isAlphaOnly
Cary Clarka560c472017-11-27 10:44:06 -0500966
967#Method ##
968
969# ------------------------------------------------------------------------------
970
971#Method sk_sp<SkShader> makeShader(SkShader::TileMode tileMode1, SkShader::TileMode tileMode2,
972 const SkMatrix* localMatrix = nullptr) const
Cary Clark61313f32018-10-08 14:57:48 -0400973#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -0500974#Line # creates Shader, Paint element that can tile Image ##
Cary Clark09d80c02018-10-31 12:14:03 -0400975#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500976
977#Example
Cary Clark61dfc3a2018-01-03 08:37:53 -0500978#Image 4
979SkMatrix matrix;
980matrix.setRotate(45);
981SkPaint paint;
982paint.setShader(image->makeShader(SkShader::kRepeat_TileMode, SkShader::kMirror_TileMode,
983 &matrix));
984canvas->drawPaint(paint);
Cary Clarka560c472017-11-27 10:44:06 -0500985##
986
Cary Clark61dfc3a2018-01-03 08:37:53 -0500987#SeeAlso scalePixels
Cary Clarka560c472017-11-27 10:44:06 -0500988
989#Method ##
990
991# ------------------------------------------------------------------------------
992
993#Method sk_sp<SkShader> makeShader(const SkMatrix* localMatrix = nullptr) const
Cary Clark09d80c02018-10-31 12:14:03 -0400994#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500995
996#Example
Cary Clark61dfc3a2018-01-03 08:37:53 -0500997#Image 5
998SkMatrix matrix;
999matrix.setRotate(45);
1000matrix.postTranslate(125, 30);
1001SkPaint paint;
1002paint.setShader(image->makeShader(&matrix));
1003canvas->drawPaint(paint);
Cary Clarka560c472017-11-27 10:44:06 -05001004##
1005
Cary Clarkf5404bb2018-01-05 12:10:09 -05001006#SeeAlso scalePixels
Cary Clarka560c472017-11-27 10:44:06 -05001007
1008#Method ##
1009
1010# ------------------------------------------------------------------------------
Cary Clark78de7512018-02-07 07:27:09 -05001011#Subtopic Pixels
Cary Clark78de7512018-02-07 07:27:09 -05001012#Line # read and write pixel values ##
1013##
Cary Clarka560c472017-11-27 10:44:06 -05001014
1015#Method bool peekPixels(SkPixmap* pixmap) const
Cary Clark78de7512018-02-07 07:27:09 -05001016#In Pixels
Cary Clark4855f782018-02-06 09:41:53 -05001017#Line # returns Pixmap if possible ##
Cary Clark09d80c02018-10-31 12:14:03 -04001018#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001019
1020#Example
Cary Clarkf5404bb2018-01-05 12:10:09 -05001021 SkBitmap bitmap;
1022 bitmap.allocPixels(SkImageInfo::MakeN32Premul(12, 11));
1023 SkCanvas offscreen(bitmap);
1024 offscreen.clear(SK_ColorWHITE);
1025 SkPaint paint;
1026 offscreen.drawString("%", 1, 10, paint);
1027 sk_sp<SkImage> image = SkImage::MakeFromBitmap(bitmap);
1028 SkPixmap pixmap;
1029 if (image->peekPixels(&pixmap)) {
1030 const SkPMColor* pixels = pixmap.addr32();
1031 SkPMColor pmWhite = pixels[0];
1032 for (int y = 0; y < image->height(); ++y) {
1033 for (int x = 0; x < image->width(); ++x) {
1034 SkDebugf("%c", *pixels++ == pmWhite ? '-' : 'x');
1035 }
1036 SkDebugf("\n");
1037 }
1038 }
1039#StdOut
1040------------
1041--xx----x---
1042-x--x--x----
1043-x--x--x----
1044-x--x-x-----
1045--xx-xx-xx--
1046-----x-x--x-
1047----x--x--x-
1048----x--x--x-
1049---x----xx--
1050------------
1051##
Cary Clarka560c472017-11-27 10:44:06 -05001052##
1053
Cary Clarkf5404bb2018-01-05 12:10:09 -05001054#SeeAlso readPixels
Cary Clarka560c472017-11-27 10:44:06 -05001055
1056#Method ##
1057
1058# ------------------------------------------------------------------------------
1059
Cary Clarka560c472017-11-27 10:44:06 -05001060#Method bool isTextureBacked() const
Cary Clark78de7512018-02-07 07:27:09 -05001061#In Property
Cary Clark4855f782018-02-06 09:41:53 -05001062#Line # returns if Image was created from GPU_Texture ##
Cary Clark09d80c02018-10-31 12:14:03 -04001063#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001064
1065#Example
Cary Clarkf5404bb2018-01-05 12:10:09 -05001066#Image 5
1067#Platform gpu
1068auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {
1069 if (nullptr == image) {
1070 return;
1071 }
1072 SkPaint paint;
1073 paint.setAntiAlias(true);
Cary Clarkf5404bb2018-01-05 12:10:09 -05001074 canvas->drawImage(image, 0, 0);
Cary Clark14768f62018-10-29 20:33:51 -04001075 canvas->drawString(label, 30, image->height() / 4, paint);
Cary Clarkf5404bb2018-01-05 12:10:09 -05001076 canvas->drawString(image->isTextureBacked() ? "is GPU texture" : "not GPU texture",
Cary Clark14768f62018-10-29 20:33:51 -04001077 20, image->height() * 3 / 4, paint);
Cary Clarkf5404bb2018-01-05 12:10:09 -05001078};
1079sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
1080sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04001081 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
1082 kOpaque_SkAlphaType, nullptr));
Cary Clarkf5404bb2018-01-05 12:10:09 -05001083drawImage(image, "image");
1084canvas->translate(image->width(), 0);
1085drawImage(bitmapImage, "source");
1086canvas->translate(-image->width(), image->height());
1087drawImage(textureImage, "backEndTexture");
Cary Clarka560c472017-11-27 10:44:06 -05001088##
1089
Cary Clarkf5404bb2018-01-05 12:10:09 -05001090#SeeAlso MakeFromTexture isValid
Cary Clarka560c472017-11-27 10:44:06 -05001091
1092#Method ##
1093
1094# ------------------------------------------------------------------------------
1095
1096#Method bool isValid(GrContext* context) const
Cary Clark4855f782018-02-06 09:41:53 -05001097#In Property
1098#Line # returns if Image can draw to Raster_Surface or GPU_Context ##
Cary Clark09d80c02018-10-31 12:14:03 -04001099#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001100
1101#Example
Cary Clarkf5404bb2018-01-05 12:10:09 -05001102#Image 5
1103#Platform gpu
1104auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {
1105 if (nullptr == image) {
1106 return;
1107 }
1108 SkPaint paint;
1109 paint.setAntiAlias(true);
Cary Clarkf5404bb2018-01-05 12:10:09 -05001110 canvas->drawImage(image, 0, 0);
1111 canvas->drawString(label, image->width() / 2, image->height() / 4, paint);
1112 if (canvas->getGrContext()) {
1113 canvas->drawString(image->isValid(canvas->getGrContext()) ? "is valid on GPU" :
Cary Clark14768f62018-10-29 20:33:51 -04001114 "not valid on GPU", 20, image->height() * 5 / 8, paint);
Cary Clarkf5404bb2018-01-05 12:10:09 -05001115 }
1116 canvas->drawString(image->isValid(nullptr) ? "is valid on CPU" :
Cary Clark14768f62018-10-29 20:33:51 -04001117 "not valid on CPU", 20, image->height() * 7 / 8, paint);
Cary Clarkf5404bb2018-01-05 12:10:09 -05001118};
1119sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
1120sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04001121 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
1122 kOpaque_SkAlphaType, nullptr));
Cary Clarkf5404bb2018-01-05 12:10:09 -05001123drawImage(image, "image");
1124canvas->translate(image->width(), 0);
1125drawImage(bitmapImage, "source");
1126canvas->translate(-image->width(), image->height());
1127drawImage(textureImage, "backEndTexture");
Cary Clarka560c472017-11-27 10:44:06 -05001128##
1129
Cary Clarkf5404bb2018-01-05 12:10:09 -05001130#SeeAlso isTextureBacked isLazyGenerated
Cary Clarka560c472017-11-27 10:44:06 -05001131
1132#Method ##
1133
1134# ------------------------------------------------------------------------------
1135
Robert Phillipsc5509952018-04-04 15:54:55 -04001136#Method GrBackendTexture getBackendTexture(bool flushPendingGrContextIO,
1137 GrSurfaceOrigin* origin = nullptr) const
1138#In Property
1139#Line # returns GPU reference to Image as texture ##
Cary Clark09d80c02018-10-31 12:14:03 -04001140#Populate
Robert Phillipsc5509952018-04-04 15:54:55 -04001141
Cary Clarkba75aee2018-04-05 08:18:41 -04001142#Example
1143#Image 3
1144#Platform gpu
Brian Osman584b5012018-04-13 15:48:26 -04001145 GrContext* grContext = canvas->getGrContext();
1146 if (!grContext) {
1147 canvas->drawString("GPU only!", 20, 40, SkPaint());
1148 return;
1149 }
1150 sk_sp<SkImage> imageFromBackend = SkImage::MakeFromAdoptedTexture(grContext, backEndTexture,
1151 kBottomLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType, kOpaque_SkAlphaType);
1152 GrBackendTexture textureFromImage = imageFromBackend->getBackendTexture(false);
1153 if (!textureFromImage.isValid()) {
1154 return;
1155 }
1156 sk_sp<SkImage> imageFromTexture = SkImage::MakeFromAdoptedTexture(grContext, textureFromImage,
1157 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType, kOpaque_SkAlphaType);
1158 canvas->drawImage(imageFromTexture, 0, 0);
Cary Clarkba75aee2018-04-05 08:18:41 -04001159 canvas->drawImage(imageFromBackend, 128, 128);
Robert Phillipsc5509952018-04-04 15:54:55 -04001160##
1161
1162#SeeAlso MakeFromTexture isTextureBacked
1163
1164#Method ##
1165
1166# ------------------------------------------------------------------------------
1167
Cary Clarka560c472017-11-27 10:44:06 -05001168#Enum CachingHint
Cary Clark682c58d2018-05-16 07:07:07 -04001169#Line # options for readPixels and scalePixels ##
Cary Clarka560c472017-11-27 10:44:06 -05001170#Code
Cary Clarka90ea222018-10-16 10:30:28 -04001171#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001172##
1173
Cary Clarkac47b882018-01-11 10:35:44 -05001174CachingHint selects whether Skia may internally cache Bitmaps generated by
1175decoding Image, or by copying Image from GPU to CPU. The default behavior
Cary Clark682c58d2018-05-16 07:07:07 -04001176allows caching Bitmaps.
Cary Clarkac47b882018-01-11 10:35:44 -05001177
1178Choose kDisallow_CachingHint if Image pixels are to be used only once, or
1179if Image pixels reside in a cache outside of Skia, or to reduce memory pressure.
1180
1181Choosing kAllow_CachingHint does not ensure that pixels will be cached.
1182Image pixels may not be cached if memory requirements are too large or
1183pixels are not accessible.
Cary Clarka560c472017-11-27 10:44:06 -05001184
1185#Const kAllow_CachingHint 0
Cary Clark682c58d2018-05-16 07:07:07 -04001186#Line # allows internally caching decoded and copied pixels ##
Cary Clarka560c472017-11-27 10:44:06 -05001187##
1188#Const kDisallow_CachingHint 1
Cary Clark682c58d2018-05-16 07:07:07 -04001189#Line # disallows internally caching decoded and copied pixels ##
Cary Clarka560c472017-11-27 10:44:06 -05001190##
1191
Cary Clarkac47b882018-01-11 10:35:44 -05001192#NoExample
Cary Clarka560c472017-11-27 10:44:06 -05001193##
1194
Cary Clarkac47b882018-01-11 10:35:44 -05001195#SeeAlso readPixels scalePixels
Cary Clarka560c472017-11-27 10:44:06 -05001196
1197#Enum ##
1198
1199# ------------------------------------------------------------------------------
1200
1201#Method bool readPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRowBytes,
1202 int srcX, int srcY, CachingHint cachingHint = kAllow_CachingHint) const
Cary Clark78de7512018-02-07 07:27:09 -05001203#In Pixels
Cary Clark4855f782018-02-06 09:41:53 -05001204#Line # copies and converts pixels ##
Cary Clarka560c472017-11-27 10:44:06 -05001205
Cary Clarkac47b882018-01-11 10:35:44 -05001206Copies Rect of pixels from Image to dstPixels. Copy starts at offset (srcX, srcY),
Cary Clark682c58d2018-05-16 07:07:07 -04001207and does not exceed Image (width(), height()).
Cary Clarkac47b882018-01-11 10:35:44 -05001208
1209dstInfo specifies width, height, Color_Type, Alpha_Type, and Color_Space of
1210destination. dstRowBytes specifics the gap from one destination row to the next.
1211Returns true if pixels are copied. Returns false if:
1212#List
Cary Clark77b3f3a2018-11-07 14:59:03 -05001213# dstInfo has no address ##
1214# dstRowBytes is less than dstInfo.minRowBytes() ##
Cary Clarkac47b882018-01-11 10:35:44 -05001215# Pixel_Ref is nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -05001216##
1217
Cary Clarkac47b882018-01-11 10:35:44 -05001218Pixels are copied only if pixel conversion is possible. If Image Color_Type is
Cary Clark77b3f3a2018-11-07 14:59:03 -05001219kGray_8_SkColorType, or kAlpha_8_SkColorType; dstInfo.colorType() must match.
1220If Image Color_Type is kGray_8_SkColorType, dstInfo.colorSpace() must match.
1221If Image Alpha_Type is kOpaque_SkAlphaType, dstInfo.alphaType() must
1222match. If Image Color_Space is nullptr, dstInfo.colorSpace() must match. Returns
Cary Clarkac47b882018-01-11 10:35:44 -05001223false if pixel conversion is not possible.
Cary Clarka560c472017-11-27 10:44:06 -05001224
Cary Clarkac47b882018-01-11 10:35:44 -05001225srcX and srcY may be negative to copy only top or left of source. Returns
Cary Clark682c58d2018-05-16 07:07:07 -04001226false if width() or height() is zero or negative.
Cary Clark2be81cf2018-09-13 12:04:30 -04001227Returns false if #Formula # abs(srcX) >= Image width() ##, or if #Formula # abs(srcY) >= Image height() ##.
Cary Clarka560c472017-11-27 10:44:06 -05001228
Cary Clarkac47b882018-01-11 10:35:44 -05001229If cachingHint is kAllow_CachingHint, pixels may be retained locally.
1230If cachingHint is kDisallow_CachingHint, pixels are not added to the local cache.
1231
1232#Param dstInfo destination width, height, Color_Type, Alpha_Type, Color_Space ##
1233#Param dstPixels destination pixel storage ##
1234#Param dstRowBytes destination row length ##
1235#Param srcX column index whose absolute value is less than width() ##
1236#Param srcY row index whose absolute value is less than height() ##
1237#Param cachingHint one of: kAllow_CachingHint, kDisallow_CachingHint ##
1238
1239#Return true if pixels are copied to dstPixels ##
Cary Clarka560c472017-11-27 10:44:06 -05001240
1241#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001242#Image 3
1243 canvas->scale(.5f, .5f);
1244 const int width = 32;
1245 const int height = 32;
1246 std::vector<int32_t> dstPixels;
1247 dstPixels.resize(height * width * 4);
1248 SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);
1249 for (int y = 0; y < 512; y += height ) {
1250 for (int x = 0; x < 512; x += width ) {
1251 if (image->readPixels(info, &dstPixels.front(), width * 4, x, y)) {
1252 SkPixmap dstPixmap(info, &dstPixels.front(), width * 4);
1253 SkBitmap bitmap;
1254 bitmap.installPixels(dstPixmap);
1255 canvas->drawBitmap(bitmap, 0, 0);
1256 }
1257 canvas->translate(48, 0);
1258 }
1259 canvas->translate(-16 * 48, 48);
1260 }
Cary Clarka560c472017-11-27 10:44:06 -05001261##
1262
Cary Clarkac47b882018-01-11 10:35:44 -05001263#SeeAlso scalePixels SkBitmap::readPixels SkPixmap::readPixels SkCanvas::readPixels SkSurface::readPixels
Cary Clarka560c472017-11-27 10:44:06 -05001264
1265#Method ##
1266
1267# ------------------------------------------------------------------------------
1268
1269#Method bool readPixels(const SkPixmap& dst, int srcX, int srcY,
1270 CachingHint cachingHint = kAllow_CachingHint) const
1271
Cary Clarkac47b882018-01-11 10:35:44 -05001272Copies a Rect of pixels from Image to dst. Copy starts at (srcX, srcY), and
Cary Clark682c58d2018-05-16 07:07:07 -04001273does not exceed Image (width(), height()).
Cary Clarka560c472017-11-27 10:44:06 -05001274
Cary Clarkac47b882018-01-11 10:35:44 -05001275dst specifies width, height, Color_Type, Alpha_Type, Color_Space, pixel storage,
Cary Clark77b3f3a2018-11-07 14:59:03 -05001276and row bytes of destination. dst.rowBytes() specifics the gap from one destination
Cary Clarkac47b882018-01-11 10:35:44 -05001277row to the next. Returns true if pixels are copied. Returns false if:
1278#List
1279# dst pixel storage equals nullptr ##
Cary Clark77b3f3a2018-11-07 14:59:03 -05001280# dst.rowBytes() is less than SkImageInfo::minRowBytes ##
Cary Clarkac47b882018-01-11 10:35:44 -05001281# Pixel_Ref is nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -05001282##
1283
Cary Clarkac47b882018-01-11 10:35:44 -05001284Pixels are copied only if pixel conversion is possible. If Image Color_Type is
Cary Clark77b3f3a2018-11-07 14:59:03 -05001285kGray_8_SkColorType, or kAlpha_8_SkColorType; dst.colorType() must match.
1286If Image Color_Type is kGray_8_SkColorType, dst.colorSpace() must match.
1287If Image Alpha_Type is kOpaque_SkAlphaType, dst.alphaType() must
1288match. If Image Color_Space is nullptr, dst.colorSpace() must match. Returns
Cary Clarkac47b882018-01-11 10:35:44 -05001289false if pixel conversion is not possible.
Cary Clark682c58d2018-05-16 07:07:07 -04001290
Cary Clarkac47b882018-01-11 10:35:44 -05001291srcX and srcY may be negative to copy only top or left of source. Returns
Cary Clark682c58d2018-05-16 07:07:07 -04001292false if width() or height() is zero or negative.
Cary Clark2be81cf2018-09-13 12:04:30 -04001293Returns false if #Formula # abs(srcX) >= Image width() ##, or if #Formula # abs(srcY) >= Image height() ##.
Cary Clarkac47b882018-01-11 10:35:44 -05001294
1295If cachingHint is kAllow_CachingHint, pixels may be retained locally.
1296If cachingHint is kDisallow_CachingHint, pixels are not added to the local cache.
1297
1298#Param dst destination Pixmap: Image_Info, pixels, row bytes ##
1299#Param srcX column index whose absolute value is less than width() ##
1300#Param srcY row index whose absolute value is less than height() ##
1301#Param cachingHint one of: kAllow_CachingHint, kDisallow_CachingHint ##
1302
1303#Return true if pixels are copied to dst ##
1304
1305#Example
1306#Image 3
1307 std::vector<int32_t> srcPixels;
1308 int rowBytes = image->width() * 4;
1309 int quarterWidth = image->width() / 4;
1310 int quarterHeight = image->height() / 4;
1311 srcPixels.resize(image->height() * rowBytes);
1312 for (int y = 0; y < 4; ++y) {
1313 for (int x = 0; x < 4; ++x) {
1314 SkPixmap pixmap(SkImageInfo::MakeN32Premul(quarterWidth, quarterHeight),
1315 &srcPixels.front() + x * image->height() * quarterWidth +
1316 y * quarterWidth, rowBytes);
1317 image->readPixels(pixmap, x * quarterWidth, y * quarterHeight);
1318 }
1319 }
1320 canvas->scale(.5f, .5f);
1321 SkBitmap bitmap;
1322 bitmap.installPixels(SkImageInfo::MakeN32Premul(image->width(), image->height()),
1323 &srcPixels.front(), rowBytes);
1324 canvas->drawBitmap(bitmap, 0, 0);
1325##
1326
1327#SeeAlso scalePixels SkBitmap::readPixels SkPixmap::readPixels SkCanvas::readPixels SkSurface::readPixels
Cary Clarka560c472017-11-27 10:44:06 -05001328
1329#Method ##
1330
1331# ------------------------------------------------------------------------------
1332
1333#Method bool scalePixels(const SkPixmap& dst, SkFilterQuality filterQuality,
1334 CachingHint cachingHint = kAllow_CachingHint) const
Cary Clark78de7512018-02-07 07:27:09 -05001335#In Pixels
Cary Clark4855f782018-02-06 09:41:53 -05001336#Line # scales and converts one Image to another ##
Cary Clark09d80c02018-10-31 12:14:03 -04001337#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001338
1339#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001340#Image 3
1341#Height 128
1342 std::vector<int32_t> srcPixels;
1343 int quarterWidth = image->width() / 16;
1344 int rowBytes = quarterWidth * 4;
1345 int quarterHeight = image->height() / 16;
1346 srcPixels.resize(quarterHeight * rowBytes);
1347 SkPixmap pixmap(SkImageInfo::MakeN32Premul(quarterWidth, quarterHeight),
1348 &srcPixels.front(), rowBytes);
1349 canvas->scale(4, 4);
1350 SkFilterQuality qualities[] = { kNone_SkFilterQuality, kLow_SkFilterQuality,
1351 kMedium_SkFilterQuality, kHigh_SkFilterQuality };
1352 for (unsigned index = 0; index < SK_ARRAY_COUNT(qualities); ++index) {
1353 image->scalePixels(pixmap, qualities[index]);
1354 sk_sp<SkImage> filtered = SkImage::MakeFromRaster(pixmap, nullptr, nullptr);
1355 canvas->drawImage(filtered, 16 * index, 0);
1356 }
Cary Clarka560c472017-11-27 10:44:06 -05001357##
1358
Cary Clarkac47b882018-01-11 10:35:44 -05001359#SeeAlso SkCanvas::drawImage readPixels SkPixmap::scalePixels
Cary Clarka560c472017-11-27 10:44:06 -05001360
1361#Method ##
1362
1363# ------------------------------------------------------------------------------
1364
1365#Method sk_sp<SkData> encodeToData(SkEncodedImageFormat encodedImageFormat, int quality) const
Cary Clark78de7512018-02-07 07:27:09 -05001366#In Utility
Cary Clark4855f782018-02-06 09:41:53 -05001367#Line # returns encoded Image as SkData ##
Cary Clark09d80c02018-10-31 12:14:03 -04001368#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001369
1370#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001371#Image 3
1372 canvas->scale(4, 4);
1373 SkIRect subset = {0, 0, 16, 64};
1374 int x = 0;
1375 for (int quality : { 0, 10, 50, 100 } ) {
1376 sk_sp<SkData> data(image->encodeToData(SkEncodedImageFormat::kJPEG, quality));
1377 sk_sp<SkImage> filtered = SkImage::MakeFromEncoded(data, &subset);
1378 canvas->drawImage(filtered, x, 0);
1379 x += 16;
1380 }
Cary Clarka560c472017-11-27 10:44:06 -05001381##
1382
Cary Clarkac47b882018-01-11 10:35:44 -05001383#SeeAlso refEncodedData MakeFromEncoded
Cary Clarka560c472017-11-27 10:44:06 -05001384
1385#Method ##
1386
1387# ------------------------------------------------------------------------------
1388
Cary Clark61ca7c52018-01-02 11:34:14 -05001389#Method sk_sp<SkData> encodeToData() const
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 canvas->scale(4, 4);
1395 SkIRect subset = {136, 32, 200, 96};
1396 sk_sp<SkData> data(image->encodeToData());
1397 sk_sp<SkImage> eye = SkImage::MakeFromEncoded(data, &subset);
1398 canvas->drawImage(eye, 0, 0);
Cary Clarka560c472017-11-27 10:44:06 -05001399##
1400
Cary Clarkac47b882018-01-11 10:35:44 -05001401#SeeAlso refEncodedData MakeFromEncoded
Cary Clarka560c472017-11-27 10:44:06 -05001402
1403#Method ##
1404
1405# ------------------------------------------------------------------------------
1406
1407#Method sk_sp<SkData> refEncodedData() const
Cary Clark78de7512018-02-07 07:27:09 -05001408#In Utility
Cary Clark4855f782018-02-06 09:41:53 -05001409#Line # returns Image encoded in SkData if present ##
Cary Clark09d80c02018-10-31 12:14:03 -04001410#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001411
1412#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001413#Image 3
1414#Platform gpu
1415 struct {
1416 const char* name;
1417 sk_sp<SkImage> image;
1418 } tests[] = { { "image", image }, { "bitmap", SkImage::MakeFromBitmap(source) },
1419 { "texture", SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04001420 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
1421 kOpaque_SkAlphaType, nullptr) } };
Cary Clarkac47b882018-01-11 10:35:44 -05001422 SkString string;
1423 SkPaint paint;
1424 for (const auto& test : tests ) {
1425 if (!test.image) {
1426 string.printf("no %s", test.name);
1427 } else {
1428 string.printf("%s" "encoded %s", test.image->refEncodedData() ? "" : "no ", test.name);
1429 }
1430 canvas->drawString(string, 10, 20, paint);
1431 canvas->translate(0, 20);
1432 }
Cary Clarka560c472017-11-27 10:44:06 -05001433##
1434
Cary Clarkac47b882018-01-11 10:35:44 -05001435#SeeAlso encodeToData MakeFromEncoded
Cary Clarka560c472017-11-27 10:44:06 -05001436
1437#Method ##
1438
1439# ------------------------------------------------------------------------------
Cary Clark4855f782018-02-06 09:41:53 -05001440#Subtopic Utility
Cary Clark4855f782018-02-06 09:41:53 -05001441#Line # rarely called management functions ##
1442##
Cary Clarka560c472017-11-27 10:44:06 -05001443
Cary Clarka560c472017-11-27 10:44:06 -05001444#Method sk_sp<SkImage> makeSubset(const SkIRect& subset) const
Cary Clark61313f32018-10-08 14:57:48 -04001445#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05001446#Line # creates Image containing part of original ##
Cary Clark09d80c02018-10-31 12:14:03 -04001447#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001448
1449#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001450#Image 3
1451 canvas->scale(.5f, .5f);
Cary Clarkc30382f2018-07-24 08:09:27 -04001452 const int width = 64;
1453 const int height = 64;
Cary Clarkac47b882018-01-11 10:35:44 -05001454 for (int y = 0; y < 512; y += height ) {
1455 for (int x = 0; x < 512; x += width ) {
1456 sk_sp<SkImage> subset(image->makeSubset({x, y, x + width, y + height}));
1457 canvas->drawImage(subset, x * 3 / 2, y * 3 / 2);
1458 }
1459 }
Cary Clarka560c472017-11-27 10:44:06 -05001460##
1461
Cary Clarkac47b882018-01-11 10:35:44 -05001462#SeeAlso MakeFromEncoded
Cary Clarka560c472017-11-27 10:44:06 -05001463
1464#Method ##
1465
1466# ------------------------------------------------------------------------------
1467
Greg Daniel5f4b09d2018-06-12 16:39:59 -04001468#Method sk_sp<SkImage> makeTextureImage(GrContext* context, SkColorSpace* dstColorSpace,
1469 GrMipMapped mipMapped = GrMipMapped::kNo) const
Cary Clark61313f32018-10-08 14:57:48 -04001470#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05001471#Line # creates Image matching Color_Space if possible ##
Cary Clark09d80c02018-10-31 12:14:03 -04001472#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001473
1474#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001475#Platform gpu
1476#Image 5
1477 auto drawImage = [=](sk_sp<SkImage> image, GrContext* context, const char* label) -> void {
1478 if (nullptr == image || nullptr == context) {
1479 return;
1480 }
1481 SkPaint paint;
1482 paint.setAntiAlias(true);
Cary Clarkac47b882018-01-11 10:35:44 -05001483 sk_sp<SkImage> texture(image->makeTextureImage(context, nullptr));
1484 canvas->drawImage(texture, 0, 0);
Cary Clark14768f62018-10-29 20:33:51 -04001485 canvas->drawString(label, 20, texture->height() / 4, paint);
Cary Clarkac47b882018-01-11 10:35:44 -05001486 };
1487 sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
1488 GrContext* context = canvas->getGrContext();
1489 sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(context, backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04001490 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
1491 kOpaque_SkAlphaType, nullptr));
Cary Clarkac47b882018-01-11 10:35:44 -05001492 drawImage(image, context, "image");
1493 canvas->translate(image->width(), 0);
1494 drawImage(bitmapImage, context, "source");
1495 canvas->translate(-image->width(), image->height());
1496 drawImage(textureImage, context, "backEndTexture");
Cary Clarka560c472017-11-27 10:44:06 -05001497##
1498
Cary Clarkac47b882018-01-11 10:35:44 -05001499#SeeAlso MakeFromTexture
Cary Clarka560c472017-11-27 10:44:06 -05001500
1501#Method ##
1502
1503# ------------------------------------------------------------------------------
1504
1505#Method sk_sp<SkImage> makeNonTextureImage() const
Cary Clark61313f32018-10-08 14:57:48 -04001506#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05001507#Line # creates Image without dependency on GPU_Texture ##
Cary Clark09d80c02018-10-31 12:14:03 -04001508#Populate
Cary Clark61ca7c52018-01-02 11:34:14 -05001509
1510#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001511#Image 5
1512#Platform gpu
1513 auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {
1514 if (nullptr == image) {
1515 return;
1516 }
1517 SkPaint paint;
1518 paint.setAntiAlias(true);
Cary Clarkac47b882018-01-11 10:35:44 -05001519 sk_sp<SkImage> nonTexture(image->makeNonTextureImage());
1520 canvas->drawImage(nonTexture, 0, 0);
Cary Clark14768f62018-10-29 20:33:51 -04001521 canvas->drawString(label, 20, nonTexture->height() / 4, paint);
Cary Clarkac47b882018-01-11 10:35:44 -05001522 };
1523 sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
1524 sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04001525 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
1526 kOpaque_SkAlphaType, nullptr));
Cary Clarkac47b882018-01-11 10:35:44 -05001527 drawImage(image, "image");
1528 canvas->translate(image->width(), 0);
1529 drawImage(bitmapImage, "source");
1530 canvas->translate(-image->width(), image->height());
1531 drawImage(textureImage, "backEndTexture");
Cary Clark61ca7c52018-01-02 11:34:14 -05001532##
1533
Cary Clark56356312018-02-08 14:45:18 -05001534#SeeAlso makeTextureImage makeRasterImage MakeBackendTextureFromSkImage
Cary Clark61ca7c52018-01-02 11:34:14 -05001535
1536#Method ##
1537
1538# ------------------------------------------------------------------------------
1539
1540#Method sk_sp<SkImage> makeRasterImage() const
Cary Clark61313f32018-10-08 14:57:48 -04001541#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05001542#Line # creates Image compatible with Raster_Surface if possible ##
Cary Clark09d80c02018-10-31 12:14:03 -04001543#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001544
Cary Clarka560c472017-11-27 10:44:06 -05001545#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001546#Image 5
1547#Platform gpu
1548 auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {
1549 if (nullptr == image) {
1550 return;
1551 }
1552 SkPaint paint;
1553 paint.setAntiAlias(true);
Cary Clarkac47b882018-01-11 10:35:44 -05001554 sk_sp<SkImage> raster(image->makeRasterImage());
1555 canvas->drawImage(raster, 0, 0);
Cary Clark14768f62018-10-29 20:33:51 -04001556 canvas->drawString(label, 20, raster->height() / 4, paint);
Cary Clarkac47b882018-01-11 10:35:44 -05001557 };
1558 sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
1559 sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04001560 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
1561 kOpaque_SkAlphaType, nullptr));
Cary Clarkac47b882018-01-11 10:35:44 -05001562 drawImage(image, "image");
1563 canvas->translate(image->width(), 0);
1564 drawImage(bitmapImage, "source");
1565 canvas->translate(-image->width(), image->height());
1566 drawImage(textureImage, "backEndTexture");
Cary Clarka560c472017-11-27 10:44:06 -05001567##
1568
Cary Clarkac47b882018-01-11 10:35:44 -05001569#SeeAlso isTextureBacked isLazyGenerated MakeFromRaster
Cary Clarka560c472017-11-27 10:44:06 -05001570
1571#Method ##
1572
1573# ------------------------------------------------------------------------------
1574
Robert Phillipsc334df72019-01-11 14:50:16 -05001575#Method sk_sp<SkImage> makeWithFilter(GrContext* context,
1576 const SkImageFilter* filter, const SkIRect& subset,
Cary Clarka560c472017-11-27 10:44:06 -05001577 const SkIRect& clipBounds, SkIRect* outSubset,
1578 SkIPoint* offset) const
Cary Clark61313f32018-10-08 14:57:48 -04001579#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05001580#Line # creates filtered, clipped Image ##
Cary Clark09d80c02018-10-31 12:14:03 -04001581#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001582
Cary Clarka560c472017-11-27 10:44:06 -05001583#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001584#Description
1585In each frame of the animation, filtered Image is drawn in a different location.
1586By translating canvas by returned offset, Image appears stationary.
1587##
1588#Image 5
1589#Platform gpu
Cary Clark5717e822018-09-21 11:36:41 -04001590#Duration 1
Cary Clarkac47b882018-01-11 10:35:44 -05001591 sk_sp<SkImageFilter> shadowFilter = SkDropShadowImageFilter::Make(
1592 -10.0f * frame, 5.0f * frame, 3.0f, 3.0f, SK_ColorBLUE,
1593 SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode,
1594 nullptr);
1595 sk_sp<SkImageFilter> offsetFilter = SkOffsetImageFilter::Make(40, 40, shadowFilter, nullptr);
1596 SkIRect subset = image->bounds();
1597 SkIRect clipBounds = image->bounds();
1598 clipBounds.outset(60, 60);
1599 SkIRect outSubset;
1600 SkIPoint offset;
Robert Phillipsc334df72019-01-11 14:50:16 -05001601 sk_sp<SkImage> filtered(image->makeWithFilter(canvas->getGrContext(),
1602 offsetFilter.get(), subset, clipBounds,
Cary Clarkac47b882018-01-11 10:35:44 -05001603 &outSubset, &offset));
1604 SkPaint paint;
1605 paint.setAntiAlias(true);
1606 paint.setStyle(SkPaint::kStroke_Style);
1607 canvas->drawLine(0, 0, offset.fX, offset.fY, paint);
1608 canvas->translate(offset.fX, offset.fY);
1609 canvas->drawImage(filtered, 0, 0);
Cary Clark681287e2018-03-16 11:34:15 -04001610 canvas->drawRect(SkRect::Make(outSubset), paint);
Cary Clarka560c472017-11-27 10:44:06 -05001611##
1612
Cary Clark56356312018-02-08 14:45:18 -05001613#SeeAlso makeShader SkPaint::setImageFilter
Cary Clarka560c472017-11-27 10:44:06 -05001614
1615#Method ##
1616
1617# ------------------------------------------------------------------------------
1618
Robert Phillipsc334df72019-01-11 14:50:16 -05001619#Method sk_sp<SkImage> makeWithFilter(const SkImageFilter* filter, const SkIRect& subset,
1620 const SkIRect& clipBounds, SkIRect* outSubset,
1621 SkIPoint* offset) const
1622#In Constructors
1623#Line # creates filtered, clipped Image ##
1624#Populate
1625#NoExample
1626##
1627#SeeAlso makeShader SkPaint::setImageFilter
1628#Method ##
1629
1630# ------------------------------------------------------------------------------
1631
Cary Clarka560c472017-11-27 10:44:06 -05001632#Typedef std::function<void(GrBackendTexture)> BackendTextureReleaseProc
Cary Clark682c58d2018-05-16 07:07:07 -04001633#Line # parameter type for MakeBackendTextureFromSkImage ##
Cary Clarkffb3d682018-05-17 12:17:28 -04001634
1635#Code
Cary Clarka90ea222018-10-16 10:30:28 -04001636#Populate
Cary Clarkffb3d682018-05-17 12:17:28 -04001637##
1638
Cary Clark0d225392018-06-07 09:59:07 -04001639Defines a callback function, taking one parameter of type GrBackendTexture with
1640no return value. Function is called when back-end texture is to be released.
Cary Clarka560c472017-11-27 10:44:06 -05001641##
1642
1643# ------------------------------------------------------------------------------
1644
1645#Method static bool MakeBackendTextureFromSkImage(GrContext* context,
1646 sk_sp<SkImage> image,
1647 GrBackendTexture* backendTexture,
1648 BackendTextureReleaseProc* backendTextureReleaseProc)
Cary Clark61313f32018-10-08 14:57:48 -04001649#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05001650#Line # creates GPU_Texture from Image ##
Cary Clark09d80c02018-10-31 12:14:03 -04001651#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001652
1653#Example
Cary Clark56356312018-02-08 14:45:18 -05001654#Platform gpu
1655#Height 64
1656#Function
Brian Salomon67f85842018-02-09 08:50:22 -05001657static sk_sp<SkImage> create_gpu_image(GrContext* grContext) {
1658 const SkImageInfo info = SkImageInfo::MakeN32(20, 20, kOpaque_SkAlphaType);
1659 auto surface(SkSurface::MakeRenderTarget(grContext, SkBudgeted::kNo, info));
1660 SkCanvas* canvas = surface->getCanvas();
1661 canvas->clear(SK_ColorWHITE);
1662 SkPaint paint;
1663 paint.setColor(SK_ColorBLACK);
1664 canvas->drawRect(SkRect::MakeXYWH(5, 5, 10, 10), paint);
1665 return surface->makeImageSnapshot();
1666}
1667##
1668
Cary Clark682c58d2018-05-16 07:07:07 -04001669void draw(SkCanvas* canvas) {
Brian Salomon67f85842018-02-09 08:50:22 -05001670 GrContext* grContext = canvas->getGrContext();
1671 if (!grContext) {
1672 return;
1673 }
1674 sk_sp<SkImage> backEndImage = create_gpu_image(grContext);
1675 canvas->drawImage(backEndImage, 0, 0);
1676 GrBackendTexture texture;
1677 SkImage::BackendTextureReleaseProc proc;
1678 if (!SkImage::MakeBackendTextureFromSkImage(grContext, std::move(backEndImage),
1679 &texture, &proc)) {
1680 return;
1681 }
1682 sk_sp<SkImage> i2 = SkImage::MakeFromTexture(grContext, texture, kTopLeft_GrSurfaceOrigin,
1683 kN32_SkColorType, kOpaque_SkAlphaType, nullptr);
1684 canvas->drawImage(i2, 30, 30);
Cary Clark56356312018-02-08 14:45:18 -05001685}
Cary Clarka560c472017-11-27 10:44:06 -05001686##
1687
Cary Clark56356312018-02-08 14:45:18 -05001688#SeeAlso MakeFromTexture makeTextureImage
Cary Clarka560c472017-11-27 10:44:06 -05001689
1690#Method ##
1691
1692# ------------------------------------------------------------------------------
1693
Cary Clarka560c472017-11-27 10:44:06 -05001694#Method bool isLazyGenerated() const
Cary Clark4855f782018-02-06 09:41:53 -05001695#In Property
1696#Line # returns if Image is created as needed ##
Cary Clark09d80c02018-10-31 12:14:03 -04001697#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001698
1699#Example
Cary Clark2f466242017-12-11 16:03:17 -05001700#Height 80
1701#Function
1702class TestImageGenerator : public SkImageGenerator {
1703public:
1704 TestImageGenerator() : SkImageGenerator(SkImageInfo::MakeN32Premul(10, 10)) {}
1705 ~TestImageGenerator() override {}
1706protected:
1707 bool onGetPixels(const SkImageInfo& info, void* pixelPtr, size_t rowBytes,
1708 const Options& options) override {
1709 SkPMColor* pixels = static_cast<SkPMColor*>(pixelPtr);
1710 for (int y = 0; y < info.height(); ++y) {
1711 for (int x = 0; x < info.width(); ++x) {
1712 pixels[y * info.width() + x] = 0xff223344 + y * 0x000C0811;
1713 }
1714 }
1715 return true;
1716 }
1717};
1718##
1719void draw(SkCanvas* canvas) {
1720 auto gen = std::unique_ptr<TestImageGenerator>(new TestImageGenerator());
1721 sk_sp<SkImage> image(SkImage::MakeFromGenerator(std::move(gen)));
1722 SkString lazy(image->isLazyGenerated() ? "is lazy" : "not lazy");
1723 canvas->scale(8, 8);
1724 canvas->drawImage(image, 0, 0, nullptr);
1725 SkPaint paint;
1726 paint.setTextSize(4);
1727 canvas->drawString(lazy, 2, 5, paint);
1728}
Cary Clarka560c472017-11-27 10:44:06 -05001729##
1730
Cary Clarkf5404bb2018-01-05 12:10:09 -05001731#Example
1732#Image 5
1733#Platform gpu
1734void draw(SkCanvas* canvas) {
1735 auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {
1736 if (nullptr == image) {
1737 return;
1738 }
1739 SkPaint paint;
1740 paint.setAntiAlias(true);
Cary Clarkf5404bb2018-01-05 12:10:09 -05001741 canvas->drawImage(image, 0, 0);
Cary Clark14768f62018-10-29 20:33:51 -04001742 canvas->drawString(label, 30, image->height() / 4, paint);
Cary Clarkf5404bb2018-01-05 12:10:09 -05001743 canvas->drawString(
1744 image->isLazyGenerated() ? "is lazily generated" : "not lazily generated",
Cary Clark14768f62018-10-29 20:33:51 -04001745 20, image->height() * 3 / 4, paint);
Cary Clarkf5404bb2018-01-05 12:10:09 -05001746 };
1747 sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
1748 sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04001749 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
1750 kOpaque_SkAlphaType, nullptr));
Cary Clarkf5404bb2018-01-05 12:10:09 -05001751 drawImage(image, "image");
1752 canvas->translate(image->width(), 0);
1753 drawImage(bitmapImage, "source");
1754 canvas->translate(-image->width(), image->height());
1755 drawImage(textureImage, "backEndTexture");
1756}
1757##
1758
Cary Clark77b3f3a2018-11-07 14:59:03 -05001759#SeeAlso isTextureBacked makeNonTextureImage
Cary Clarka560c472017-11-27 10:44:06 -05001760
1761#Method ##
1762
1763# ------------------------------------------------------------------------------
1764
Cary Clarke80cd442018-07-17 13:19:56 -04001765#Method sk_sp<SkImage> makeColorSpace(sk_sp<SkColorSpace> target) const
Cary Clark61313f32018-10-08 14:57:48 -04001766#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05001767#Line # creates Image matching Color_Space if possible ##
Cary Clark09d80c02018-10-31 12:14:03 -04001768#Populate
Cary Clarkac47b882018-01-11 10:35:44 -05001769
1770#Example
1771#Image 5
1772#Set sRGB
1773 sk_sp<SkColorSpace> normalColorSpace = SkColorSpace::MakeRGB(
Brian Osman410b3022019-01-28 15:42:55 -05001774 SkNamedTransferFn::kSRGB, SkNamedGamut::kSRGB);
Cary Clarkac47b882018-01-11 10:35:44 -05001775 sk_sp<SkColorSpace> wackyColorSpace = normalColorSpace->makeColorSpin();
1776 for (auto colorSpace : { normalColorSpace, wackyColorSpace } ) {
Cary Clarkc3c1c312018-07-18 09:25:15 -04001777 sk_sp<SkImage> colorSpaced = image->makeColorSpace(colorSpace);
1778 canvas->drawImage(colorSpaced, 0, 0);
1779 canvas->translate(128, 0);
Cary Clarkac47b882018-01-11 10:35:44 -05001780 }
1781##
1782
Cary Clark77b3f3a2018-11-07 14:59:03 -05001783#SeeAlso MakeFromPicture MakeFromTexture
Cary Clarka560c472017-11-27 10:44:06 -05001784
1785#Method ##
1786
1787#Class SkImage ##
1788
1789#Topic Image ##