blob: 097b7df084e00d2f7d745f0eccda214f7131356b [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
256#Typedef void (*TextureReleaseProc)(ReleaseContext releaseContext)
Cary Clark682c58d2018-05-16 07:07:07 -0400257#Line # parameter type for MakeFromTexture ##
Cary Clarkffb3d682018-05-17 12:17:28 -0400258
259#Code
Cary Clarka90ea222018-10-16 10:30:28 -0400260#Populate
Cary Clarkffb3d682018-05-17 12:17:28 -0400261##
262
Cary Clark682c58d2018-05-16 07:07:07 -0400263User function called when supplied texture may be deleted.
264#SeeAlso MakeFromTexture
Cary Clarka560c472017-11-27 10:44:06 -0500265##
266
267#Method static sk_sp<SkImage> MakeFromTexture(GrContext* context,
268 const GrBackendTexture& backendTexture,
269 GrSurfaceOrigin origin,
Cary Clark61ca7c52018-01-02 11:34:14 -0500270 SkColorType colorType,
271 SkAlphaType alphaType,
272 sk_sp<SkColorSpace> colorSpace)
Cary Clark61313f32018-10-08 14:57:48 -0400273#In Constructors
Cary Clarkf895a422018-02-27 09:54:21 -0500274#Line # creates Image from GPU_Texture ##
Cary Clark09d80c02018-10-31 12:14:03 -0400275#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500276
277#Example
Cary Clark0c5f5462017-12-15 11:21:51 -0500278#Image 3
279#Platform gpu
280#Height 128
281#Description
282A back-end texture has been created and uploaded to the GPU outside of this example.
283##
284GrContext* context = canvas->getGrContext();
285if (!context) {
286 return;
287}
288canvas->scale(.25f, .25f);
289int x = 0;
290for (auto origin : { kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin } ) {
Cary Clarkac47b882018-01-11 10:35:44 -0500291 sk_sp<SkImage> image = SkImage::MakeFromTexture(context, backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -0400292 origin, kRGBA_8888_SkColorType, kOpaque_SkAlphaType, nullptr);
Cary Clark0c5f5462017-12-15 11:21:51 -0500293 canvas->drawImage(image, x, 0);
294x += 512;
295}
Cary Clarka560c472017-11-27 10:44:06 -0500296##
297
Cary Clark3cd22cc2017-12-01 11:49:58 -0500298#SeeAlso MakeFromAdoptedTexture SkSurface::MakeFromBackendTexture
Cary Clarka560c472017-11-27 10:44:06 -0500299
300#Method ##
301
302# ------------------------------------------------------------------------------
303
304#Method static sk_sp<SkImage> MakeFromTexture(GrContext* context,
305 const GrBackendTexture& backendTexture,
306 GrSurfaceOrigin origin,
Cary Clark61ca7c52018-01-02 11:34:14 -0500307 SkColorType colorType,
Cary Clarka560c472017-11-27 10:44:06 -0500308 SkAlphaType alphaType,
309 sk_sp<SkColorSpace> colorSpace,
310 TextureReleaseProc textureReleaseProc,
311 ReleaseContext releaseContext)
Cary Clark09d80c02018-10-31 12:14:03 -0400312#Populate
Cary Clark0c5f5462017-12-15 11:21:51 -0500313
Cary Clarka560c472017-11-27 10:44:06 -0500314#Example
Cary Clark14f49f02018-12-13 09:10:49 -0500315#Description
316textureReleaseProc may be called at some later point in time. In this example,
317textureReleaseProc has no effect on the drawing.
318##
Cary Clarkac47b882018-01-11 10:35:44 -0500319#Platform gpu
320#Image 4
Cary Clark0c5f5462017-12-15 11:21:51 -0500321GrContext* context = canvas->getGrContext();
322if (!context) {
323 return;
324}
Cary Clarkac47b882018-01-11 10:35:44 -0500325auto debugster = [](SkImage::ReleaseContext releaseContext) -> void {
Cary Clark14f49f02018-12-13 09:10:49 -0500326 *((int *) releaseContext) += 128;
Cary Clark0c5f5462017-12-15 11:21:51 -0500327};
Cary Clark14f49f02018-12-13 09:10:49 -0500328int x = 0, y = 0;
Cary Clark0c5f5462017-12-15 11:21:51 -0500329for (auto origin : { kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin } ) {
Cary Clarkac47b882018-01-11 10:35:44 -0500330 sk_sp<SkImage> image = SkImage::MakeFromTexture(context, backEndTexture,
Cary Clark61ca7c52018-01-02 11:34:14 -0500331 origin, kRGBA_8888_SkColorType, kOpaque_SkAlphaType, nullptr, debugster, &x);
Cary Clark14f49f02018-12-13 09:10:49 -0500332 canvas->drawImage(image, x, y);
333 y += 128;
Cary Clark0c5f5462017-12-15 11:21:51 -0500334}
Cary Clarka560c472017-11-27 10:44:06 -0500335##
336
Cary Clark3cd22cc2017-12-01 11:49:58 -0500337#SeeAlso MakeFromAdoptedTexture SkSurface::MakeFromBackendTexture
Cary Clarka560c472017-11-27 10:44:06 -0500338
339#Method ##
340
341# ------------------------------------------------------------------------------
342
343#Method static sk_sp<SkImage> MakeCrossContextFromEncoded(GrContext* context, sk_sp<SkData> data,
344 bool buildMips,
Brian Osman584b5012018-04-13 15:48:26 -0400345 SkColorSpace* dstColorSpace,
346 bool limitToMaxTextureSize = false)
Cary Clark61313f32018-10-08 14:57:48 -0400347#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -0500348#Line # creates Image from encoded data, and uploads to GPU ##
Cary Clark09d80c02018-10-31 12:14:03 -0400349#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500350
351#Example
Cary Clark61ca7c52018-01-02 11:34:14 -0500352#Image 4
Cary Clarkac47b882018-01-11 10:35:44 -0500353#Height 64
Cary Clark61ca7c52018-01-02 11:34:14 -0500354GrContext* context = canvas->getGrContext();
355sk_sp<SkData> encodedData = image->encodeToData(SkEncodedImageFormat::kJPEG, 100);
356sk_sp<SkImage> image = SkImage::MakeCrossContextFromEncoded(context,
357 encodedData, false, nullptr);
358canvas->drawImage(image, 0, 0);
Cary Clarka560c472017-11-27 10:44:06 -0500359##
360
Cary Clark3cd22cc2017-12-01 11:49:58 -0500361#SeeAlso MakeCrossContextFromPixmap
362
363#Method ##
364
365# ------------------------------------------------------------------------------
366
367#Method static sk_sp<SkImage> MakeCrossContextFromPixmap(GrContext* context, const SkPixmap& pixmap,
368 bool buildMips,
Brian Osman584b5012018-04-13 15:48:26 -0400369 SkColorSpace* dstColorSpace,
370 bool limitToMaxTextureSize = false)
Cary Clark61313f32018-10-08 14:57:48 -0400371#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -0500372#Line # creates Image from Pixmap, and uploads to GPU ##
Cary Clark09d80c02018-10-31 12:14:03 -0400373#Populate
Cary Clark3cd22cc2017-12-01 11:49:58 -0500374
375#Example
Cary Clark61ca7c52018-01-02 11:34:14 -0500376#Image 4
Cary Clarkac47b882018-01-11 10:35:44 -0500377#Height 64
Cary Clark61ca7c52018-01-02 11:34:14 -0500378GrContext* context = canvas->getGrContext();
379SkPixmap pixmap;
380if (source.peekPixels(&pixmap)) {
381 sk_sp<SkImage> image = SkImage::MakeCrossContextFromPixmap(context, pixmap,
382 false, nullptr);
383 canvas->drawImage(image, 0, 0);
384}
Cary Clark3cd22cc2017-12-01 11:49:58 -0500385##
386
387#SeeAlso MakeCrossContextFromEncoded
Cary Clarka560c472017-11-27 10:44:06 -0500388
389#Method ##
390
391# ------------------------------------------------------------------------------
392
393#Method static sk_sp<SkImage> MakeFromAdoptedTexture(GrContext* context,
394 const GrBackendTexture& backendTexture,
395 GrSurfaceOrigin surfaceOrigin,
Cary Clark61ca7c52018-01-02 11:34:14 -0500396 SkColorType colorType,
397 SkAlphaType alphaType = kPremul_SkAlphaType,
398 sk_sp<SkColorSpace> colorSpace = nullptr)
Cary Clark61313f32018-10-08 14:57:48 -0400399#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -0500400#Line # creates Image from GPU_Texture, managed internally ##
Cary Clark09d80c02018-10-31 12:14:03 -0400401#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500402
403#Example
Cary Clarkac47b882018-01-11 10:35:44 -0500404#Image 5
405#Platform gpu
Cary Clark61ca7c52018-01-02 11:34:14 -0500406 if (!canvas->getGrContext()) {
407 return;
408 }
409 canvas->scale(.5f, .5f);
410 canvas->clear(0x7f3f5f7f);
411 int x = 0, y = 0;
412 for (auto origin : { kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin } ) {
413 for (auto alpha : { kOpaque_SkAlphaType, kPremul_SkAlphaType, kUnpremul_SkAlphaType } ) {
414 sk_sp<SkImage> image = SkImage::MakeFromAdoptedTexture(canvas->getGrContext(),
Cary Clark682c58d2018-05-16 07:07:07 -0400415 backEndTexture, origin,
Cary Clark61ca7c52018-01-02 11:34:14 -0500416 kRGBA_8888_SkColorType, alpha);
417 canvas->drawImage(image, x, y);
418 x += 160;
419 }
420 x -= 160 * 3;
421 y += 256;
422 }
Cary Clarka560c472017-11-27 10:44:06 -0500423##
424
Cary Clark61ca7c52018-01-02 11:34:14 -0500425#SeeAlso MakeFromTexture MakeFromYUVTexturesCopy
Cary Clarka560c472017-11-27 10:44:06 -0500426
427#Method ##
428
429# ------------------------------------------------------------------------------
430
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400431#Method static sk_sp<SkImage> MakeFromYUVATexturesCopy(GrContext* context,
432 SkYUVColorSpace yuvColorSpace,
433 const GrBackendTexture yuvaTextures[],
434 const SkYUVAIndex yuvaIndices[4],
435 SkISize imageSize,
436 GrSurfaceOrigin imageOrigin,
437 sk_sp<SkColorSpace> imageColorSpace = nullptr)
438#In Constructor
439#Line # creates Image from YUV_ColorSpace data ##
Cary Clark09d80c02018-10-31 12:14:03 -0400440#Populate
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400441
442#NoExample
443##
444
Cary Clark1801b942018-10-30 21:10:03 -0400445#SeeAlso MakeFromYUVATexturesCopyWithExternalBackend MakeFromYUVATextures
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400446
447#Method ##
448
Cary Clark1801b942018-10-30 21:10:03 -0400449#Method static sk_sp<SkImage> MakeFromYUVATextures(GrContext* context,
450 SkYUVColorSpace yuvColorSpace,
451 const GrBackendTexture yuvaTextures[],
452 const SkYUVAIndex yuvaIndices[4],
453 SkISize imageSize,
454 GrSurfaceOrigin imageOrigin,
455 sk_sp<SkColorSpace> imageColorSpace = nullptr);
456
457#In Constructor
458#Line # creates Image from YUV_ColorSpace data ##
Cary Clark09d80c02018-10-31 12:14:03 -0400459#Populate
Cary Clark1801b942018-10-30 21:10:03 -0400460
461#NoExample
462##
463
464#SeeAlso MakeFromYUVATexturesCopy MakeFromYUVATexturesCopyWithExternalBackend
465
466#Method ##
467
Jim Van Verthc8429ad2018-11-20 11:12:37 -0500468#Method static sk_sp<SkImage> MakeFromYUVAPixmaps(
469 GrContext* context,
470 SkYUVColorSpace yuvColorSpace,
471 const SkPixmap yuvaPixmaps[],
472 const SkYUVAIndex yuvaIndices[4],
473 SkISize imageSize,
474 GrSurfaceOrigin imageOrigin,
475 bool buildMips,
476 bool limitToMaxTextureSize = false,
477 sk_sp<SkColorSpace> imageColorSpace = nullptr);
478
479#In Constructor
480#Line # creates Image from YUV_ColorSpace data ##
481#Populate
482
483#NoExample
484##
485
486#SeeAlso MakeFromYUVATextures
487
488#Method ##
Cary Clark1801b942018-10-30 21:10:03 -0400489
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400490# ------------------------------------------------------------------------------
491
492#Method static sk_sp<SkImage> MakeFromYUVATexturesCopyWithExternalBackend(
493 GrContext* context,
494 SkYUVColorSpace yuvColorSpace,
495 const GrBackendTexture yuvaTextures[],
496 const SkYUVAIndex yuvaIndices[4],
497 SkISize imageSize,
498 GrSurfaceOrigin imageOrigin,
499 const GrBackendTexture& backendTexture,
500 sk_sp<SkColorSpace> imageColorSpace = nullptr)
501#In Constructor
502#Line # creates Image from planar YUV_ColorSpace, stored in texture ##
Cary Clark09d80c02018-10-31 12:14:03 -0400503#Populate
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400504
505#NoExample
506##
507
Cary Clark1801b942018-10-30 21:10:03 -0400508#SeeAlso MakeFromYUVATexturesCopy MakeFromYUVATextures
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400509
510#Method ##
511
Cary Clarka560c472017-11-27 10:44:06 -0500512#Method static sk_sp<SkImage> MakeFromYUVTexturesCopy(GrContext* context, SkYUVColorSpace yuvColorSpace,
Brian Salomon6a426c12018-03-15 12:16:02 -0400513 const GrBackendTexture yuvTextures[3],
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400514 GrSurfaceOrigin imageOrigin,
515 sk_sp<SkColorSpace> imageColorSpace = nullptr)
Cary Clark61313f32018-10-08 14:57:48 -0400516#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -0500517#Line # creates Image from YUV_ColorSpace data in three planes ##
Cary Clark09d80c02018-10-31 12:14:03 -0400518#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500519
Cary Clark61ca7c52018-01-02 11:34:14 -0500520#NoExample
521##
522
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400523#SeeAlso MakeFromYUVTexturesCopyWithExternalBackend MakeFromNV12TexturesCopy MakeFromYUVATexturesCopy
Cary Clarkcdc371a2018-09-18 07:31:37 -0400524
525#Method ##
526
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400527# ------------------------------------------------------------------------------
528
Cary Clarkcdc371a2018-09-18 07:31:37 -0400529#Method static sk_sp<SkImage> MakeFromYUVTexturesCopyWithExternalBackend(
530 GrContext* context, SkYUVColorSpace yuvColorSpace,
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400531 const GrBackendTexture yuvTextures[3], GrSurfaceOrigin imageOrigin,
532 const GrBackendTexture& backendTexture, sk_sp<SkColorSpace> imageColorSpace = nullptr);
Cary Clark61313f32018-10-08 14:57:48 -0400533#In Constructors
Cary Clarkcdc371a2018-09-18 07:31:37 -0400534#Line # creates Image from planar YUV_ColorSpace, stored in texture ##
Cary Clark09d80c02018-10-31 12:14:03 -0400535#Populate
Cary Clarkcdc371a2018-09-18 07:31:37 -0400536
537#NoExample
538##
539
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400540#SeeAlso MakeFromYUVTexturesCopy MakeFromNV12TexturesCopy MakeFromYUVATexturesCopyWithExternalBackend
Cary Clark61ca7c52018-01-02 11:34:14 -0500541
542#Method ##
543
544# ------------------------------------------------------------------------------
545
Cary Clarka560c472017-11-27 10:44:06 -0500546#Method static sk_sp<SkImage> MakeFromNV12TexturesCopy(GrContext* context,
547 SkYUVColorSpace yuvColorSpace,
Brian Salomon6a426c12018-03-15 12:16:02 -0400548 const GrBackendTexture nv12Textures[2],
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400549 GrSurfaceOrigin imageOrigin,
550 sk_sp<SkColorSpace> imageColorSpace = nullptr)
Cary Clark61313f32018-10-08 14:57:48 -0400551#In Constructors
Brian Salomon6a426c12018-03-15 12:16:02 -0400552#Line # creates Image from YUV_ColorSpace data in three planes ##
Cary Clark09d80c02018-10-31 12:14:03 -0400553#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500554
Cary Clark61ca7c52018-01-02 11:34:14 -0500555#NoExample
556##
557
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400558#SeeAlso MakeFromNV12TexturesCopyWithExternalBackend MakeFromYUVTexturesCopy MakeFromYUVATexturesCopy
Cary Clarkcdc371a2018-09-18 07:31:37 -0400559
560#Method ##
561
562#Method static sk_sp<SkImage> MakeFromNV12TexturesCopyWithExternalBackend(
563 GrContext* context,
564 SkYUVColorSpace yuvColorSpace,
565 const GrBackendTexture nv12Textures[2],
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400566 GrSurfaceOrigin imageOrigin,
567 const GrBackendTexture& backendTexture,
568 sk_sp<SkColorSpace> imageColorSpace = nullptr);
Cary Clark61313f32018-10-08 14:57:48 -0400569#In Constructors
Cary Clarkcdc371a2018-09-18 07:31:37 -0400570#Line # creates Image from planar YUV_ColorSpace, stored in texture ##
Cary Clark09d80c02018-10-31 12:14:03 -0400571#Populate
Cary Clarkcdc371a2018-09-18 07:31:37 -0400572
573#NoExample
574##
575
Robert Phillipsb6df1c12018-10-05 10:31:34 -0400576#SeeAlso MakeFromNV12TexturesCopy MakeFromYUVTexturesCopy MakeFromYUVATexturesCopyWithExternalBackend
Cary Clarka560c472017-11-27 10:44:06 -0500577
578#Method ##
579
580# ------------------------------------------------------------------------------
581
Cary Clark4855f782018-02-06 09:41:53 -0500582# currently uncalled by any test or client ##
Cary Clark61ca7c52018-01-02 11:34:14 -0500583#Bug 7424
Cary Clark61ca7c52018-01-02 11:34:14 -0500584
Cary Clark56356312018-02-08 14:45:18 -0500585#EnumClass BitDepth
Cary Clark682c58d2018-05-16 07:07:07 -0400586#Line # options for MakeFromPicture ##
Cary Clarka560c472017-11-27 10:44:06 -0500587#Code
Cary Clarka90ea222018-10-16 10:30:28 -0400588#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500589##
590
591#Const kU8 0
Cary Clark682c58d2018-05-16 07:07:07 -0400592#Line # uses 8-bit unsigned int per Color component ##
Cary Clarkffb3d682018-05-17 12:17:28 -0400593Use 8 bits per ARGB component using unsigned integer format.
Cary Clarka560c472017-11-27 10:44:06 -0500594##
595#Const kF16 1
Cary Clark682c58d2018-05-16 07:07:07 -0400596#Line # uses 16-bit float per Color component ##
Cary Clarkffb3d682018-05-17 12:17:28 -0400597Use 16 bits per ARGB component using half-precision floating point format.
Cary Clarka560c472017-11-27 10:44:06 -0500598##
599
Cary Clark61ca7c52018-01-02 11:34:14 -0500600#NoExample
Cary Clarka560c472017-11-27 10:44:06 -0500601##
602
Cary Clark61ca7c52018-01-02 11:34:14 -0500603#SeeAlso MakeFromPicture
Cary Clarka560c472017-11-27 10:44:06 -0500604
Cary Clark56356312018-02-08 14:45:18 -0500605#EnumClass ##
Cary Clarka560c472017-11-27 10:44:06 -0500606
607# ------------------------------------------------------------------------------
608
609#Method static sk_sp<SkImage> MakeFromPicture(sk_sp<SkPicture> picture, const SkISize& dimensions,
610 const SkMatrix* matrix, const SkPaint* paint,
611 BitDepth bitDepth,
612 sk_sp<SkColorSpace> colorSpace)
Cary Clark61313f32018-10-08 14:57:48 -0400613#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -0500614#Line # creates Image from Picture ##
Cary Clark09d80c02018-10-31 12:14:03 -0400615#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500616
617#Example
Cary Clark61ca7c52018-01-02 11:34:14 -0500618 SkPaint paint;
619 SkPictureRecorder recorder;
620 SkCanvas* recordingCanvas = recorder.beginRecording(50, 50);
621 for (auto color : { SK_ColorRED, SK_ColorBLUE, 0xff007f00 } ) {
622 paint.setColor(color);
623 recordingCanvas->drawRect({10, 10, 30, 40}, paint);
624 recordingCanvas->translate(10, 10);
625 recordingCanvas->scale(1.2f, 1.4f);
626 }
627 sk_sp<SkPicture> playback = recorder.finishRecordingAsPicture();
628 int x = 0, y = 0;
629 for (auto alpha : { 70, 140, 210 } ) {
630 paint.setAlpha(alpha);
631 auto srgbColorSpace = SkColorSpace::MakeSRGB();
632 sk_sp<SkImage> image = SkImage::MakeFromPicture(playback, {50, 50}, nullptr, &paint,
633 SkImage::BitDepth::kU8, srgbColorSpace);
634 canvas->drawImage(image, x, y);
635 x += 70; y += 70;
636 }
Cary Clarka560c472017-11-27 10:44:06 -0500637##
638
Cary Clark61ca7c52018-01-02 11:34:14 -0500639#SeeAlso SkCanvas::drawPicture
Cary Clarka560c472017-11-27 10:44:06 -0500640
641#Method ##
642
643# ------------------------------------------------------------------------------
644
Cary Clark9548ea92018-09-13 15:26:33 -0400645#Method static sk_sp<SkImage> MakeFromAHardwareBuffer(
646 AHardwareBuffer* hardwareBuffer,
647 SkAlphaType alphaType = kPremul_SkAlphaType,
648 sk_sp<SkColorSpace> colorSpace = nullptr,
649 GrSurfaceOrigin surfaceOrigin = kTopLeft_GrSurfaceOrigin)
Cary Clark61313f32018-10-08 14:57:48 -0400650#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -0500651#Line # creates Image from Android hardware buffer ##
Cary Clark09d80c02018-10-31 12:14:03 -0400652#Populate
Cary Clark61ca7c52018-01-02 11:34:14 -0500653
654#NoExample
Cary Clarka560c472017-11-27 10:44:06 -0500655##
656
Cary Clark61ca7c52018-01-02 11:34:14 -0500657#SeeAlso MakeFromRaster
Cary Clarka560c472017-11-27 10:44:06 -0500658
659#Method ##
660
661# ------------------------------------------------------------------------------
Cary Clark4855f782018-02-06 09:41:53 -0500662#Subtopic Property
Cary Clark4855f782018-02-06 09:41:53 -0500663#Line # values and attributes ##
664##
Cary Clarka560c472017-11-27 10:44:06 -0500665
666#Method int width() const
Cary Clark4855f782018-02-06 09:41:53 -0500667#In Property
668#Line # returns pixel column count ##
Cary Clark09d80c02018-10-31 12:14:03 -0400669#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500670
671#Example
Cary Clark61ca7c52018-01-02 11:34:14 -0500672#Image 4
Cary Clarkac47b882018-01-11 10:35:44 -0500673#Height 96
Cary Clark61ca7c52018-01-02 11:34:14 -0500674 canvas->translate(10, 10);
675 canvas->drawImage(image, 0, 0);
676 canvas->translate(0, image->height());
677 SkPaint paint;
Cary Clark61ca7c52018-01-02 11:34:14 -0500678 canvas->drawLine(0, 10, image->width(), 10, paint);
Cary Clark14768f62018-10-29 20:33:51 -0400679 canvas->drawString("width", image->width() / 2 - 15, 25, paint);
Cary Clarka560c472017-11-27 10:44:06 -0500680##
681
Cary Clark61ca7c52018-01-02 11:34:14 -0500682#SeeAlso dimensions() height()
Cary Clarka560c472017-11-27 10:44:06 -0500683
684#Method ##
685
686# ------------------------------------------------------------------------------
687
688#Method int height() const
Cary Clark4855f782018-02-06 09:41:53 -0500689#In Property
690#Line # returns pixel row count ##
Cary Clark09d80c02018-10-31 12:14:03 -0400691#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500692
693#Example
Cary Clark61ca7c52018-01-02 11:34:14 -0500694#Image 4
Cary Clarkac47b882018-01-11 10:35:44 -0500695#Height 96
Cary Clark61ca7c52018-01-02 11:34:14 -0500696 canvas->translate(10, 10);
697 canvas->drawImage(image, 0, 0);
698 canvas->translate(image->width(), 0);
699 SkPaint paint;
Cary Clark61ca7c52018-01-02 11:34:14 -0500700 canvas->drawLine(10, 0, 10, image->height(), paint);
Cary Clark92694be2018-10-25 08:15:36 -0400701 canvas->drawString("height", 34, image->height() / 2, paint);
Cary Clarkac47b882018-01-11 10:35:44 -0500702##
Cary Clarka560c472017-11-27 10:44:06 -0500703
Cary Clark61ca7c52018-01-02 11:34:14 -0500704#SeeAlso dimensions() width()
Cary Clarka560c472017-11-27 10:44:06 -0500705
706#Method ##
707
708# ------------------------------------------------------------------------------
709
710#Method SkISize dimensions() const
Cary Clark4855f782018-02-06 09:41:53 -0500711#In Property
712#Line # returns width() and height() ##
Cary Clark09d80c02018-10-31 12:14:03 -0400713#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500714
715#Example
Cary Clark61ca7c52018-01-02 11:34:14 -0500716#Image 4
717 SkISize dimensions = image->dimensions();
718 SkIRect bounds = image->bounds();
719 SkIRect dimensionsAsBounds = SkIRect::MakeSize(dimensions);
720 SkDebugf("dimensionsAsBounds %c= bounds\n", dimensionsAsBounds == bounds ? '=' : '!');
Cary Clark681287e2018-03-16 11:34:15 -0400721#StdOut
722dimensionsAsBounds == bounds
723##
Cary Clarka560c472017-11-27 10:44:06 -0500724##
725
Cary Clark61ca7c52018-01-02 11:34:14 -0500726#SeeAlso height() width() bounds()
Cary Clarka560c472017-11-27 10:44:06 -0500727
728#Method ##
729
730# ------------------------------------------------------------------------------
731
732#Method SkIRect bounds() const
Cary Clark4855f782018-02-06 09:41:53 -0500733#In Property
734#Line # returns width() and height() as Rectangle ##
Cary Clark09d80c02018-10-31 12:14:03 -0400735#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500736
737#Example
Cary Clark61ca7c52018-01-02 11:34:14 -0500738#Height 128
739#Image 4
Cary Clark61ca7c52018-01-02 11:34:14 -0500740 SkIRect bounds = image->bounds();
Cary Clarkac47b882018-01-11 10:35:44 -0500741 for (int x : { 0, bounds.width() } ) {
742 for (int y : { 0, bounds.height() } ) {
Cary Clark61ca7c52018-01-02 11:34:14 -0500743 canvas->drawImage(image, x, y);
744 }
745 }
Cary Clarka560c472017-11-27 10:44:06 -0500746##
747
Cary Clark682c58d2018-05-16 07:07:07 -0400748#SeeAlso dimensions()
Cary Clarka560c472017-11-27 10:44:06 -0500749
750#Method ##
751
752# ------------------------------------------------------------------------------
753
754#Method uint32_t uniqueID() const
Cary Clark4855f782018-02-06 09:41:53 -0500755#In Property
Cary Clark682c58d2018-05-16 07:07:07 -0400756#Line # returns identifier for Image ##
Cary Clark09d80c02018-10-31 12:14:03 -0400757#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500758
759#Example
Cary Clark61ca7c52018-01-02 11:34:14 -0500760#Image 5
761#Height 156
762 sk_sp<SkImage> subset = image->makeSubset({10, 20, 90, 100});
763 canvas->drawImage(image, 0, 0);
764 canvas->drawImage(subset, 128, 0);
765 SkPaint paint;
766 SkString s;
767 s.printf("original id: %d", image->uniqueID());
768 canvas->drawString(s, 20, image->height() + 20, paint);
769 s.printf("subset id: %d", subset->uniqueID());
770 canvas->drawString(s, 148, subset->height() + 20, paint);
Cary Clarka560c472017-11-27 10:44:06 -0500771##
772
Cary Clark61ca7c52018-01-02 11:34:14 -0500773#SeeAlso isLazyGenerated
Cary Clarka560c472017-11-27 10:44:06 -0500774
775#Method ##
776
777# ------------------------------------------------------------------------------
778
779#Method SkAlphaType alphaType() const
Cary Clark4855f782018-02-06 09:41:53 -0500780#In Property
781#Line # returns Alpha_Type ##
Cary Clark681287e2018-03-16 11:34:15 -0400782Returns Alpha_Type, one of: #list_of_alpha_types#.
Cary Clark61ca7c52018-01-02 11:34:14 -0500783
784Alpha_Type returned was a parameter to an Image constructor,
785or was parsed from encoded data.
786
787#Return Alpha_Type in Image ##
Cary Clarka560c472017-11-27 10:44:06 -0500788
789#Example
Cary Clark61ca7c52018-01-02 11:34:14 -0500790#Image 4
Cary Clarkac47b882018-01-11 10:35:44 -0500791#Height 96
Cary Clark61ca7c52018-01-02 11:34:14 -0500792 const char* alphaTypeStr[] = { "Unknown", "Opaque", "Premul", "Unpremul" };
793 SkAlphaType alphaType = image->alphaType();
Cary Clarkac47b882018-01-11 10:35:44 -0500794 canvas->drawImage(image, 16, 0);
Cary Clarkffb3d682018-05-17 12:17:28 -0400795 canvas->drawString(alphaTypeStr[(int) alphaType], 20, image->height() + 20, SkPaint());
Cary Clarka560c472017-11-27 10:44:06 -0500796##
797
Cary Clark61ca7c52018-01-02 11:34:14 -0500798#SeeAlso SkImageInfo::alphaType
Cary Clarka560c472017-11-27 10:44:06 -0500799
800#Method ##
801
802# ------------------------------------------------------------------------------
803
Greg Daniel56008aa2018-03-14 15:33:42 -0400804#Method SkColorType colorType() const
805#In Property
806#Line # returns Color_Type ##
Cary Clark09d80c02018-10-31 12:14:03 -0400807#Populate
Greg Daniel56008aa2018-03-14 15:33:42 -0400808
809#Example
Cary Clarkffb3d682018-05-17 12:17:28 -0400810#Image 4
811#Height 96
812 const char* colors[] = { "Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x",
813 "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16" };
814 SkColorType colorType = image->colorType();
815 canvas->drawImage(image, 16, 0);
816 canvas->drawString(colors[(int) colorType], 20, image->height() + 20, SkPaint());
Greg Daniel56008aa2018-03-14 15:33:42 -0400817##
818
819#SeeAlso SkImageInfo::colorType
820
821#Method ##
822
823# ------------------------------------------------------------------------------
824
Cary Clarka560c472017-11-27 10:44:06 -0500825#Method SkColorSpace* colorSpace() const
Cary Clark4855f782018-02-06 09:41:53 -0500826#In Property
827#Line # returns Color_Space ##
Cary Clark09d80c02018-10-31 12:14:03 -0400828#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500829
830#Example
Cary Clark61dfc3a2018-01-03 08:37:53 -0500831#Image 3
832#Set sRGB
833 SkPixmap pixmap;
834 source.peekPixels(&pixmap);
835 canvas->scale(.25f, .25f);
836 int y = 0;
837 for (auto gamma : { SkColorSpace::kLinear_RenderTargetGamma,
838 SkColorSpace::kSRGB_RenderTargetGamma } ) {
839 int x = 0;
840 sk_sp<SkColorSpace> colorSpace = SkColorSpace::MakeRGB(gamma, SkColorSpace::kSRGB_Gamut);
841 for (int index = 0; index < 2; ++index) {
842 pixmap.setColorSpace(colorSpace);
843 sk_sp<SkImage> image = SkImage::MakeRasterCopy(pixmap);
844 canvas->drawImage(image, x, y);
845 colorSpace = image->colorSpace()->makeColorSpin();
846 x += 512;
847 }
848 y += 512;
849 }
Cary Clarka560c472017-11-27 10:44:06 -0500850##
851
Cary Clark61dfc3a2018-01-03 08:37:53 -0500852#SeeAlso refColorSpace makeColorSpace
Cary Clarka560c472017-11-27 10:44:06 -0500853
854#Method ##
855
856# ------------------------------------------------------------------------------
857
858#Method sk_sp<SkColorSpace> refColorSpace() const
Cary Clark4855f782018-02-06 09:41:53 -0500859#In Property
860#Line # returns Image_Info Color_Space ##
Cary Clark09d80c02018-10-31 12:14:03 -0400861#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500862
863#Example
Cary Clark61dfc3a2018-01-03 08:37:53 -0500864#Image 3
865#Set sRGB
866 SkPixmap pixmap;
867 source.peekPixels(&pixmap);
868 canvas->scale(.25f, .25f);
869 int y = 0;
870 for (auto gamma : { SkColorSpace::kLinear_RenderTargetGamma,
871 SkColorSpace::kSRGB_RenderTargetGamma } ) {
872 int x = 0;
873 sk_sp<SkColorSpace> colorSpace = SkColorSpace::MakeRGB(gamma, SkColorSpace::kSRGB_Gamut);
874 for (int index = 0; index < 2; ++index) {
875 pixmap.setColorSpace(colorSpace);
876 sk_sp<SkImage> image = SkImage::MakeRasterCopy(pixmap);
877 canvas->drawImage(image, x, y);
878 colorSpace = image->refColorSpace()->makeColorSpin();
879 x += 512;
880 }
881 y += 512;
882 }
Cary Clarka560c472017-11-27 10:44:06 -0500883##
884
Cary Clark61dfc3a2018-01-03 08:37:53 -0500885#SeeAlso colorSpace makeColorSpace
Cary Clarka560c472017-11-27 10:44:06 -0500886
887#Method ##
888
889# ------------------------------------------------------------------------------
890
891#Method bool isAlphaOnly() const
Cary Clark4855f782018-02-06 09:41:53 -0500892#In Property
893#Line # returns if pixels represent a transparency mask ##
Cary Clark09d80c02018-10-31 12:14:03 -0400894#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500895
896#Example
Cary Clark61dfc3a2018-01-03 08:37:53 -0500897 uint8_t pmColors = 0;
898 sk_sp<SkImage> image = SkImage::MakeRasterCopy({SkImageInfo::MakeA8(1, 1), &pmColors, 1});
899 SkDebugf("alphaOnly = %s\n", image->isAlphaOnly() ? "true" : "false");
900#StdOut
901alphaOnly = true
902##
Cary Clarka560c472017-11-27 10:44:06 -0500903##
904
Cary Clark61dfc3a2018-01-03 08:37:53 -0500905#SeeAlso alphaType isOpaque
Cary Clarka560c472017-11-27 10:44:06 -0500906
907#Method ##
908
909# ------------------------------------------------------------------------------
910
911#Method bool isOpaque() const
Cary Clark4855f782018-02-06 09:41:53 -0500912#In Property
913#Line # returns if Alpha_Type is kOpaque_SkAlphaType ##
Cary Clark09d80c02018-10-31 12:14:03 -0400914#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500915
916#Example
Cary Clark61dfc3a2018-01-03 08:37:53 -0500917 auto check_isopaque = [](const SkImageInfo& imageInfo) -> void {
918 auto surface(SkSurface::MakeRaster(imageInfo));
919 auto image(surface->makeImageSnapshot());
920 SkDebugf("isOpaque = %s\n", image->isOpaque() ? "true" : "false");
921 };
922
923 check_isopaque(SkImageInfo::MakeN32Premul(5, 5));
924 check_isopaque(SkImageInfo::MakeN32(5, 5, kOpaque_SkAlphaType));
925#StdOut
926isOpaque = false
927isOpaque = true
928##
Cary Clarka560c472017-11-27 10:44:06 -0500929##
930
Cary Clark61dfc3a2018-01-03 08:37:53 -0500931#SeeAlso alphaType isAlphaOnly
Cary Clarka560c472017-11-27 10:44:06 -0500932
933#Method ##
934
935# ------------------------------------------------------------------------------
936
937#Method sk_sp<SkShader> makeShader(SkShader::TileMode tileMode1, SkShader::TileMode tileMode2,
938 const SkMatrix* localMatrix = nullptr) const
Cary Clark61313f32018-10-08 14:57:48 -0400939#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -0500940#Line # creates Shader, Paint element that can tile Image ##
Cary Clark09d80c02018-10-31 12:14:03 -0400941#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500942
943#Example
Cary Clark61dfc3a2018-01-03 08:37:53 -0500944#Image 4
945SkMatrix matrix;
946matrix.setRotate(45);
947SkPaint paint;
948paint.setShader(image->makeShader(SkShader::kRepeat_TileMode, SkShader::kMirror_TileMode,
949 &matrix));
950canvas->drawPaint(paint);
Cary Clarka560c472017-11-27 10:44:06 -0500951##
952
Cary Clark61dfc3a2018-01-03 08:37:53 -0500953#SeeAlso scalePixels
Cary Clarka560c472017-11-27 10:44:06 -0500954
955#Method ##
956
957# ------------------------------------------------------------------------------
958
959#Method sk_sp<SkShader> makeShader(const SkMatrix* localMatrix = nullptr) const
Cary Clark09d80c02018-10-31 12:14:03 -0400960#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500961
962#Example
Cary Clark61dfc3a2018-01-03 08:37:53 -0500963#Image 5
964SkMatrix matrix;
965matrix.setRotate(45);
966matrix.postTranslate(125, 30);
967SkPaint paint;
968paint.setShader(image->makeShader(&matrix));
969canvas->drawPaint(paint);
Cary Clarka560c472017-11-27 10:44:06 -0500970##
971
Cary Clarkf5404bb2018-01-05 12:10:09 -0500972#SeeAlso scalePixels
Cary Clarka560c472017-11-27 10:44:06 -0500973
974#Method ##
975
976# ------------------------------------------------------------------------------
Cary Clark78de7512018-02-07 07:27:09 -0500977#Subtopic Pixels
Cary Clark78de7512018-02-07 07:27:09 -0500978#Line # read and write pixel values ##
979##
Cary Clarka560c472017-11-27 10:44:06 -0500980
981#Method bool peekPixels(SkPixmap* pixmap) const
Cary Clark78de7512018-02-07 07:27:09 -0500982#In Pixels
Cary Clark4855f782018-02-06 09:41:53 -0500983#Line # returns Pixmap if possible ##
Cary Clark09d80c02018-10-31 12:14:03 -0400984#Populate
Cary Clarka560c472017-11-27 10:44:06 -0500985
986#Example
Cary Clarkf5404bb2018-01-05 12:10:09 -0500987 SkBitmap bitmap;
988 bitmap.allocPixels(SkImageInfo::MakeN32Premul(12, 11));
989 SkCanvas offscreen(bitmap);
990 offscreen.clear(SK_ColorWHITE);
991 SkPaint paint;
992 offscreen.drawString("%", 1, 10, paint);
993 sk_sp<SkImage> image = SkImage::MakeFromBitmap(bitmap);
994 SkPixmap pixmap;
995 if (image->peekPixels(&pixmap)) {
996 const SkPMColor* pixels = pixmap.addr32();
997 SkPMColor pmWhite = pixels[0];
998 for (int y = 0; y < image->height(); ++y) {
999 for (int x = 0; x < image->width(); ++x) {
1000 SkDebugf("%c", *pixels++ == pmWhite ? '-' : 'x');
1001 }
1002 SkDebugf("\n");
1003 }
1004 }
1005#StdOut
1006------------
1007--xx----x---
1008-x--x--x----
1009-x--x--x----
1010-x--x-x-----
1011--xx-xx-xx--
1012-----x-x--x-
1013----x--x--x-
1014----x--x--x-
1015---x----xx--
1016------------
1017##
Cary Clarka560c472017-11-27 10:44:06 -05001018##
1019
Cary Clarkf5404bb2018-01-05 12:10:09 -05001020#SeeAlso readPixels
Cary Clarka560c472017-11-27 10:44:06 -05001021
1022#Method ##
1023
1024# ------------------------------------------------------------------------------
1025
Cary Clarka560c472017-11-27 10:44:06 -05001026#Method bool isTextureBacked() const
Cary Clark78de7512018-02-07 07:27:09 -05001027#In Property
Cary Clark4855f782018-02-06 09:41:53 -05001028#Line # returns if Image was created from GPU_Texture ##
Cary Clark09d80c02018-10-31 12:14:03 -04001029#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001030
1031#Example
Cary Clarkf5404bb2018-01-05 12:10:09 -05001032#Image 5
1033#Platform gpu
1034auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {
1035 if (nullptr == image) {
1036 return;
1037 }
1038 SkPaint paint;
1039 paint.setAntiAlias(true);
Cary Clarkf5404bb2018-01-05 12:10:09 -05001040 canvas->drawImage(image, 0, 0);
Cary Clark14768f62018-10-29 20:33:51 -04001041 canvas->drawString(label, 30, image->height() / 4, paint);
Cary Clarkf5404bb2018-01-05 12:10:09 -05001042 canvas->drawString(image->isTextureBacked() ? "is GPU texture" : "not GPU texture",
Cary Clark14768f62018-10-29 20:33:51 -04001043 20, image->height() * 3 / 4, paint);
Cary Clarkf5404bb2018-01-05 12:10:09 -05001044};
1045sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
1046sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04001047 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
1048 kOpaque_SkAlphaType, nullptr));
Cary Clarkf5404bb2018-01-05 12:10:09 -05001049drawImage(image, "image");
1050canvas->translate(image->width(), 0);
1051drawImage(bitmapImage, "source");
1052canvas->translate(-image->width(), image->height());
1053drawImage(textureImage, "backEndTexture");
Cary Clarka560c472017-11-27 10:44:06 -05001054##
1055
Cary Clarkf5404bb2018-01-05 12:10:09 -05001056#SeeAlso MakeFromTexture isValid
Cary Clarka560c472017-11-27 10:44:06 -05001057
1058#Method ##
1059
1060# ------------------------------------------------------------------------------
1061
1062#Method bool isValid(GrContext* context) const
Cary Clark4855f782018-02-06 09:41:53 -05001063#In Property
1064#Line # returns if Image can draw to Raster_Surface or GPU_Context ##
Cary Clark09d80c02018-10-31 12:14:03 -04001065#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001066
1067#Example
Cary Clarkf5404bb2018-01-05 12:10:09 -05001068#Image 5
1069#Platform gpu
1070auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {
1071 if (nullptr == image) {
1072 return;
1073 }
1074 SkPaint paint;
1075 paint.setAntiAlias(true);
Cary Clarkf5404bb2018-01-05 12:10:09 -05001076 canvas->drawImage(image, 0, 0);
1077 canvas->drawString(label, image->width() / 2, image->height() / 4, paint);
1078 if (canvas->getGrContext()) {
1079 canvas->drawString(image->isValid(canvas->getGrContext()) ? "is valid on GPU" :
Cary Clark14768f62018-10-29 20:33:51 -04001080 "not valid on GPU", 20, image->height() * 5 / 8, paint);
Cary Clarkf5404bb2018-01-05 12:10:09 -05001081 }
1082 canvas->drawString(image->isValid(nullptr) ? "is valid on CPU" :
Cary Clark14768f62018-10-29 20:33:51 -04001083 "not valid on CPU", 20, image->height() * 7 / 8, paint);
Cary Clarkf5404bb2018-01-05 12:10:09 -05001084};
1085sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
1086sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04001087 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
1088 kOpaque_SkAlphaType, nullptr));
Cary Clarkf5404bb2018-01-05 12:10:09 -05001089drawImage(image, "image");
1090canvas->translate(image->width(), 0);
1091drawImage(bitmapImage, "source");
1092canvas->translate(-image->width(), image->height());
1093drawImage(textureImage, "backEndTexture");
Cary Clarka560c472017-11-27 10:44:06 -05001094##
1095
Cary Clarkf5404bb2018-01-05 12:10:09 -05001096#SeeAlso isTextureBacked isLazyGenerated
Cary Clarka560c472017-11-27 10:44:06 -05001097
1098#Method ##
1099
1100# ------------------------------------------------------------------------------
1101
Robert Phillipsc5509952018-04-04 15:54:55 -04001102#Method GrBackendTexture getBackendTexture(bool flushPendingGrContextIO,
1103 GrSurfaceOrigin* origin = nullptr) const
1104#In Property
1105#Line # returns GPU reference to Image as texture ##
Cary Clark09d80c02018-10-31 12:14:03 -04001106#Populate
Robert Phillipsc5509952018-04-04 15:54:55 -04001107
Cary Clarkba75aee2018-04-05 08:18:41 -04001108#Example
1109#Image 3
1110#Platform gpu
Brian Osman584b5012018-04-13 15:48:26 -04001111 GrContext* grContext = canvas->getGrContext();
1112 if (!grContext) {
1113 canvas->drawString("GPU only!", 20, 40, SkPaint());
1114 return;
1115 }
1116 sk_sp<SkImage> imageFromBackend = SkImage::MakeFromAdoptedTexture(grContext, backEndTexture,
1117 kBottomLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType, kOpaque_SkAlphaType);
1118 GrBackendTexture textureFromImage = imageFromBackend->getBackendTexture(false);
1119 if (!textureFromImage.isValid()) {
1120 return;
1121 }
1122 sk_sp<SkImage> imageFromTexture = SkImage::MakeFromAdoptedTexture(grContext, textureFromImage,
1123 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType, kOpaque_SkAlphaType);
1124 canvas->drawImage(imageFromTexture, 0, 0);
Cary Clarkba75aee2018-04-05 08:18:41 -04001125 canvas->drawImage(imageFromBackend, 128, 128);
Robert Phillipsc5509952018-04-04 15:54:55 -04001126##
1127
1128#SeeAlso MakeFromTexture isTextureBacked
1129
1130#Method ##
1131
1132# ------------------------------------------------------------------------------
1133
Cary Clarka560c472017-11-27 10:44:06 -05001134#Enum CachingHint
Cary Clark682c58d2018-05-16 07:07:07 -04001135#Line # options for readPixels and scalePixels ##
Cary Clarka560c472017-11-27 10:44:06 -05001136#Code
Cary Clarka90ea222018-10-16 10:30:28 -04001137#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001138##
1139
Cary Clarkac47b882018-01-11 10:35:44 -05001140CachingHint selects whether Skia may internally cache Bitmaps generated by
1141decoding Image, or by copying Image from GPU to CPU. The default behavior
Cary Clark682c58d2018-05-16 07:07:07 -04001142allows caching Bitmaps.
Cary Clarkac47b882018-01-11 10:35:44 -05001143
1144Choose kDisallow_CachingHint if Image pixels are to be used only once, or
1145if Image pixels reside in a cache outside of Skia, or to reduce memory pressure.
1146
1147Choosing kAllow_CachingHint does not ensure that pixels will be cached.
1148Image pixels may not be cached if memory requirements are too large or
1149pixels are not accessible.
Cary Clarka560c472017-11-27 10:44:06 -05001150
1151#Const kAllow_CachingHint 0
Cary Clark682c58d2018-05-16 07:07:07 -04001152#Line # allows internally caching decoded and copied pixels ##
Cary Clarka560c472017-11-27 10:44:06 -05001153##
1154#Const kDisallow_CachingHint 1
Cary Clark682c58d2018-05-16 07:07:07 -04001155#Line # disallows internally caching decoded and copied pixels ##
Cary Clarka560c472017-11-27 10:44:06 -05001156##
1157
Cary Clarkac47b882018-01-11 10:35:44 -05001158#NoExample
Cary Clarka560c472017-11-27 10:44:06 -05001159##
1160
Cary Clarkac47b882018-01-11 10:35:44 -05001161#SeeAlso readPixels scalePixels
Cary Clarka560c472017-11-27 10:44:06 -05001162
1163#Enum ##
1164
1165# ------------------------------------------------------------------------------
1166
1167#Method bool readPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRowBytes,
1168 int srcX, int srcY, CachingHint cachingHint = kAllow_CachingHint) const
Cary Clark78de7512018-02-07 07:27:09 -05001169#In Pixels
Cary Clark4855f782018-02-06 09:41:53 -05001170#Line # copies and converts pixels ##
Cary Clarka560c472017-11-27 10:44:06 -05001171
Cary Clarkac47b882018-01-11 10:35:44 -05001172Copies Rect of pixels from Image to dstPixels. Copy starts at offset (srcX, srcY),
Cary Clark682c58d2018-05-16 07:07:07 -04001173and does not exceed Image (width(), height()).
Cary Clarkac47b882018-01-11 10:35:44 -05001174
1175dstInfo specifies width, height, Color_Type, Alpha_Type, and Color_Space of
1176destination. dstRowBytes specifics the gap from one destination row to the next.
1177Returns true if pixels are copied. Returns false if:
1178#List
Cary Clark77b3f3a2018-11-07 14:59:03 -05001179# dstInfo has no address ##
1180# dstRowBytes is less than dstInfo.minRowBytes() ##
Cary Clarkac47b882018-01-11 10:35:44 -05001181# Pixel_Ref is nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -05001182##
1183
Cary Clarkac47b882018-01-11 10:35:44 -05001184Pixels are copied only if pixel conversion is possible. If Image Color_Type is
Cary Clark77b3f3a2018-11-07 14:59:03 -05001185kGray_8_SkColorType, or kAlpha_8_SkColorType; dstInfo.colorType() must match.
1186If Image Color_Type is kGray_8_SkColorType, dstInfo.colorSpace() must match.
1187If Image Alpha_Type is kOpaque_SkAlphaType, dstInfo.alphaType() must
1188match. If Image Color_Space is nullptr, dstInfo.colorSpace() must match. Returns
Cary Clarkac47b882018-01-11 10:35:44 -05001189false if pixel conversion is not possible.
Cary Clarka560c472017-11-27 10:44:06 -05001190
Cary Clarkac47b882018-01-11 10:35:44 -05001191srcX and srcY may be negative to copy only top or left of source. Returns
Cary Clark682c58d2018-05-16 07:07:07 -04001192false if width() or height() is zero or negative.
Cary Clark2be81cf2018-09-13 12:04:30 -04001193Returns false if #Formula # abs(srcX) >= Image width() ##, or if #Formula # abs(srcY) >= Image height() ##.
Cary Clarka560c472017-11-27 10:44:06 -05001194
Cary Clarkac47b882018-01-11 10:35:44 -05001195If cachingHint is kAllow_CachingHint, pixels may be retained locally.
1196If cachingHint is kDisallow_CachingHint, pixels are not added to the local cache.
1197
1198#Param dstInfo destination width, height, Color_Type, Alpha_Type, Color_Space ##
1199#Param dstPixels destination pixel storage ##
1200#Param dstRowBytes destination row length ##
1201#Param srcX column index whose absolute value is less than width() ##
1202#Param srcY row index whose absolute value is less than height() ##
1203#Param cachingHint one of: kAllow_CachingHint, kDisallow_CachingHint ##
1204
1205#Return true if pixels are copied to dstPixels ##
Cary Clarka560c472017-11-27 10:44:06 -05001206
1207#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001208#Image 3
1209 canvas->scale(.5f, .5f);
1210 const int width = 32;
1211 const int height = 32;
1212 std::vector<int32_t> dstPixels;
1213 dstPixels.resize(height * width * 4);
1214 SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);
1215 for (int y = 0; y < 512; y += height ) {
1216 for (int x = 0; x < 512; x += width ) {
1217 if (image->readPixels(info, &dstPixels.front(), width * 4, x, y)) {
1218 SkPixmap dstPixmap(info, &dstPixels.front(), width * 4);
1219 SkBitmap bitmap;
1220 bitmap.installPixels(dstPixmap);
1221 canvas->drawBitmap(bitmap, 0, 0);
1222 }
1223 canvas->translate(48, 0);
1224 }
1225 canvas->translate(-16 * 48, 48);
1226 }
Cary Clarka560c472017-11-27 10:44:06 -05001227##
1228
Cary Clarkac47b882018-01-11 10:35:44 -05001229#SeeAlso scalePixels SkBitmap::readPixels SkPixmap::readPixels SkCanvas::readPixels SkSurface::readPixels
Cary Clarka560c472017-11-27 10:44:06 -05001230
1231#Method ##
1232
1233# ------------------------------------------------------------------------------
1234
1235#Method bool readPixels(const SkPixmap& dst, int srcX, int srcY,
1236 CachingHint cachingHint = kAllow_CachingHint) const
1237
Cary Clarkac47b882018-01-11 10:35:44 -05001238Copies a Rect of pixels from Image to dst. Copy starts at (srcX, srcY), and
Cary Clark682c58d2018-05-16 07:07:07 -04001239does not exceed Image (width(), height()).
Cary Clarka560c472017-11-27 10:44:06 -05001240
Cary Clarkac47b882018-01-11 10:35:44 -05001241dst specifies width, height, Color_Type, Alpha_Type, Color_Space, pixel storage,
Cary Clark77b3f3a2018-11-07 14:59:03 -05001242and row bytes of destination. dst.rowBytes() specifics the gap from one destination
Cary Clarkac47b882018-01-11 10:35:44 -05001243row to the next. Returns true if pixels are copied. Returns false if:
1244#List
1245# dst pixel storage equals nullptr ##
Cary Clark77b3f3a2018-11-07 14:59:03 -05001246# dst.rowBytes() is less than SkImageInfo::minRowBytes ##
Cary Clarkac47b882018-01-11 10:35:44 -05001247# Pixel_Ref is nullptr ##
Cary Clarka560c472017-11-27 10:44:06 -05001248##
1249
Cary Clarkac47b882018-01-11 10:35:44 -05001250Pixels are copied only if pixel conversion is possible. If Image Color_Type is
Cary Clark77b3f3a2018-11-07 14:59:03 -05001251kGray_8_SkColorType, or kAlpha_8_SkColorType; dst.colorType() must match.
1252If Image Color_Type is kGray_8_SkColorType, dst.colorSpace() must match.
1253If Image Alpha_Type is kOpaque_SkAlphaType, dst.alphaType() must
1254match. If Image Color_Space is nullptr, dst.colorSpace() must match. Returns
Cary Clarkac47b882018-01-11 10:35:44 -05001255false if pixel conversion is not possible.
Cary Clark682c58d2018-05-16 07:07:07 -04001256
Cary Clarkac47b882018-01-11 10:35:44 -05001257srcX and srcY may be negative to copy only top or left of source. Returns
Cary Clark682c58d2018-05-16 07:07:07 -04001258false if width() or height() is zero or negative.
Cary Clark2be81cf2018-09-13 12:04:30 -04001259Returns false if #Formula # abs(srcX) >= Image width() ##, or if #Formula # abs(srcY) >= Image height() ##.
Cary Clarkac47b882018-01-11 10:35:44 -05001260
1261If cachingHint is kAllow_CachingHint, pixels may be retained locally.
1262If cachingHint is kDisallow_CachingHint, pixels are not added to the local cache.
1263
1264#Param dst destination Pixmap: Image_Info, pixels, row bytes ##
1265#Param srcX column index whose absolute value is less than width() ##
1266#Param srcY row index whose absolute value is less than height() ##
1267#Param cachingHint one of: kAllow_CachingHint, kDisallow_CachingHint ##
1268
1269#Return true if pixels are copied to dst ##
1270
1271#Example
1272#Image 3
1273 std::vector<int32_t> srcPixels;
1274 int rowBytes = image->width() * 4;
1275 int quarterWidth = image->width() / 4;
1276 int quarterHeight = image->height() / 4;
1277 srcPixels.resize(image->height() * rowBytes);
1278 for (int y = 0; y < 4; ++y) {
1279 for (int x = 0; x < 4; ++x) {
1280 SkPixmap pixmap(SkImageInfo::MakeN32Premul(quarterWidth, quarterHeight),
1281 &srcPixels.front() + x * image->height() * quarterWidth +
1282 y * quarterWidth, rowBytes);
1283 image->readPixels(pixmap, x * quarterWidth, y * quarterHeight);
1284 }
1285 }
1286 canvas->scale(.5f, .5f);
1287 SkBitmap bitmap;
1288 bitmap.installPixels(SkImageInfo::MakeN32Premul(image->width(), image->height()),
1289 &srcPixels.front(), rowBytes);
1290 canvas->drawBitmap(bitmap, 0, 0);
1291##
1292
1293#SeeAlso scalePixels SkBitmap::readPixels SkPixmap::readPixels SkCanvas::readPixels SkSurface::readPixels
Cary Clarka560c472017-11-27 10:44:06 -05001294
1295#Method ##
1296
1297# ------------------------------------------------------------------------------
1298
1299#Method bool scalePixels(const SkPixmap& dst, SkFilterQuality filterQuality,
1300 CachingHint cachingHint = kAllow_CachingHint) const
Cary Clark78de7512018-02-07 07:27:09 -05001301#In Pixels
Cary Clark4855f782018-02-06 09:41:53 -05001302#Line # scales and converts one Image to another ##
Cary Clark09d80c02018-10-31 12:14:03 -04001303#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001304
1305#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001306#Image 3
1307#Height 128
1308 std::vector<int32_t> srcPixels;
1309 int quarterWidth = image->width() / 16;
1310 int rowBytes = quarterWidth * 4;
1311 int quarterHeight = image->height() / 16;
1312 srcPixels.resize(quarterHeight * rowBytes);
1313 SkPixmap pixmap(SkImageInfo::MakeN32Premul(quarterWidth, quarterHeight),
1314 &srcPixels.front(), rowBytes);
1315 canvas->scale(4, 4);
1316 SkFilterQuality qualities[] = { kNone_SkFilterQuality, kLow_SkFilterQuality,
1317 kMedium_SkFilterQuality, kHigh_SkFilterQuality };
1318 for (unsigned index = 0; index < SK_ARRAY_COUNT(qualities); ++index) {
1319 image->scalePixels(pixmap, qualities[index]);
1320 sk_sp<SkImage> filtered = SkImage::MakeFromRaster(pixmap, nullptr, nullptr);
1321 canvas->drawImage(filtered, 16 * index, 0);
1322 }
Cary Clarka560c472017-11-27 10:44:06 -05001323##
1324
Cary Clarkac47b882018-01-11 10:35:44 -05001325#SeeAlso SkCanvas::drawImage readPixels SkPixmap::scalePixels
Cary Clarka560c472017-11-27 10:44:06 -05001326
1327#Method ##
1328
1329# ------------------------------------------------------------------------------
1330
1331#Method sk_sp<SkData> encodeToData(SkEncodedImageFormat encodedImageFormat, int quality) const
Cary Clark78de7512018-02-07 07:27:09 -05001332#In Utility
Cary Clark4855f782018-02-06 09:41:53 -05001333#Line # returns encoded Image as SkData ##
Cary Clark09d80c02018-10-31 12:14:03 -04001334#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001335
1336#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001337#Image 3
1338 canvas->scale(4, 4);
1339 SkIRect subset = {0, 0, 16, 64};
1340 int x = 0;
1341 for (int quality : { 0, 10, 50, 100 } ) {
1342 sk_sp<SkData> data(image->encodeToData(SkEncodedImageFormat::kJPEG, quality));
1343 sk_sp<SkImage> filtered = SkImage::MakeFromEncoded(data, &subset);
1344 canvas->drawImage(filtered, x, 0);
1345 x += 16;
1346 }
Cary Clarka560c472017-11-27 10:44:06 -05001347##
1348
Cary Clarkac47b882018-01-11 10:35:44 -05001349#SeeAlso refEncodedData MakeFromEncoded
Cary Clarka560c472017-11-27 10:44:06 -05001350
1351#Method ##
1352
1353# ------------------------------------------------------------------------------
1354
Cary Clark61ca7c52018-01-02 11:34:14 -05001355#Method sk_sp<SkData> encodeToData() const
Cary Clark09d80c02018-10-31 12:14:03 -04001356#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001357
1358#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001359#Image 3
1360 canvas->scale(4, 4);
1361 SkIRect subset = {136, 32, 200, 96};
1362 sk_sp<SkData> data(image->encodeToData());
1363 sk_sp<SkImage> eye = SkImage::MakeFromEncoded(data, &subset);
1364 canvas->drawImage(eye, 0, 0);
Cary Clarka560c472017-11-27 10:44:06 -05001365##
1366
Cary Clarkac47b882018-01-11 10:35:44 -05001367#SeeAlso refEncodedData MakeFromEncoded
Cary Clarka560c472017-11-27 10:44:06 -05001368
1369#Method ##
1370
1371# ------------------------------------------------------------------------------
1372
1373#Method sk_sp<SkData> refEncodedData() const
Cary Clark78de7512018-02-07 07:27:09 -05001374#In Utility
Cary Clark4855f782018-02-06 09:41:53 -05001375#Line # returns Image encoded in SkData if present ##
Cary Clark09d80c02018-10-31 12:14:03 -04001376#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001377
1378#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001379#Image 3
1380#Platform gpu
1381 struct {
1382 const char* name;
1383 sk_sp<SkImage> image;
1384 } tests[] = { { "image", image }, { "bitmap", SkImage::MakeFromBitmap(source) },
1385 { "texture", SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04001386 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
1387 kOpaque_SkAlphaType, nullptr) } };
Cary Clarkac47b882018-01-11 10:35:44 -05001388 SkString string;
1389 SkPaint paint;
1390 for (const auto& test : tests ) {
1391 if (!test.image) {
1392 string.printf("no %s", test.name);
1393 } else {
1394 string.printf("%s" "encoded %s", test.image->refEncodedData() ? "" : "no ", test.name);
1395 }
1396 canvas->drawString(string, 10, 20, paint);
1397 canvas->translate(0, 20);
1398 }
Cary Clarka560c472017-11-27 10:44:06 -05001399##
1400
Cary Clarkac47b882018-01-11 10:35:44 -05001401#SeeAlso encodeToData MakeFromEncoded
Cary Clarka560c472017-11-27 10:44:06 -05001402
1403#Method ##
1404
1405# ------------------------------------------------------------------------------
Cary Clark4855f782018-02-06 09:41:53 -05001406#Subtopic Utility
Cary Clark4855f782018-02-06 09:41:53 -05001407#Line # rarely called management functions ##
1408##
Cary Clarka560c472017-11-27 10:44:06 -05001409
Cary Clarka560c472017-11-27 10:44:06 -05001410#Method sk_sp<SkImage> makeSubset(const SkIRect& subset) const
Cary Clark61313f32018-10-08 14:57:48 -04001411#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05001412#Line # creates Image containing part of original ##
Cary Clark09d80c02018-10-31 12:14:03 -04001413#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001414
1415#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001416#Image 3
1417 canvas->scale(.5f, .5f);
Cary Clarkc30382f2018-07-24 08:09:27 -04001418 const int width = 64;
1419 const int height = 64;
Cary Clarkac47b882018-01-11 10:35:44 -05001420 for (int y = 0; y < 512; y += height ) {
1421 for (int x = 0; x < 512; x += width ) {
1422 sk_sp<SkImage> subset(image->makeSubset({x, y, x + width, y + height}));
1423 canvas->drawImage(subset, x * 3 / 2, y * 3 / 2);
1424 }
1425 }
Cary Clarka560c472017-11-27 10:44:06 -05001426##
1427
Cary Clarkac47b882018-01-11 10:35:44 -05001428#SeeAlso MakeFromEncoded
Cary Clarka560c472017-11-27 10:44:06 -05001429
1430#Method ##
1431
1432# ------------------------------------------------------------------------------
1433
Greg Daniel5f4b09d2018-06-12 16:39:59 -04001434#Method sk_sp<SkImage> makeTextureImage(GrContext* context, SkColorSpace* dstColorSpace,
1435 GrMipMapped mipMapped = GrMipMapped::kNo) const
Cary Clark61313f32018-10-08 14:57:48 -04001436#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05001437#Line # creates Image matching Color_Space if possible ##
Cary Clark09d80c02018-10-31 12:14:03 -04001438#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001439
1440#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001441#Platform gpu
1442#Image 5
1443 auto drawImage = [=](sk_sp<SkImage> image, GrContext* context, const char* label) -> void {
1444 if (nullptr == image || nullptr == context) {
1445 return;
1446 }
1447 SkPaint paint;
1448 paint.setAntiAlias(true);
Cary Clarkac47b882018-01-11 10:35:44 -05001449 sk_sp<SkImage> texture(image->makeTextureImage(context, nullptr));
1450 canvas->drawImage(texture, 0, 0);
Cary Clark14768f62018-10-29 20:33:51 -04001451 canvas->drawString(label, 20, texture->height() / 4, paint);
Cary Clarkac47b882018-01-11 10:35:44 -05001452 };
1453 sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
1454 GrContext* context = canvas->getGrContext();
1455 sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(context, backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04001456 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
1457 kOpaque_SkAlphaType, nullptr));
Cary Clarkac47b882018-01-11 10:35:44 -05001458 drawImage(image, context, "image");
1459 canvas->translate(image->width(), 0);
1460 drawImage(bitmapImage, context, "source");
1461 canvas->translate(-image->width(), image->height());
1462 drawImage(textureImage, context, "backEndTexture");
Cary Clarka560c472017-11-27 10:44:06 -05001463##
1464
Cary Clarkac47b882018-01-11 10:35:44 -05001465#SeeAlso MakeFromTexture
Cary Clarka560c472017-11-27 10:44:06 -05001466
1467#Method ##
1468
1469# ------------------------------------------------------------------------------
1470
1471#Method sk_sp<SkImage> makeNonTextureImage() const
Cary Clark61313f32018-10-08 14:57:48 -04001472#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05001473#Line # creates Image without dependency on GPU_Texture ##
Cary Clark09d80c02018-10-31 12:14:03 -04001474#Populate
Cary Clark61ca7c52018-01-02 11:34:14 -05001475
1476#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001477#Image 5
1478#Platform gpu
1479 auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {
1480 if (nullptr == image) {
1481 return;
1482 }
1483 SkPaint paint;
1484 paint.setAntiAlias(true);
Cary Clarkac47b882018-01-11 10:35:44 -05001485 sk_sp<SkImage> nonTexture(image->makeNonTextureImage());
1486 canvas->drawImage(nonTexture, 0, 0);
Cary Clark14768f62018-10-29 20:33:51 -04001487 canvas->drawString(label, 20, nonTexture->height() / 4, paint);
Cary Clarkac47b882018-01-11 10:35:44 -05001488 };
1489 sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
1490 sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04001491 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
1492 kOpaque_SkAlphaType, nullptr));
Cary Clarkac47b882018-01-11 10:35:44 -05001493 drawImage(image, "image");
1494 canvas->translate(image->width(), 0);
1495 drawImage(bitmapImage, "source");
1496 canvas->translate(-image->width(), image->height());
1497 drawImage(textureImage, "backEndTexture");
Cary Clark61ca7c52018-01-02 11:34:14 -05001498##
1499
Cary Clark56356312018-02-08 14:45:18 -05001500#SeeAlso makeTextureImage makeRasterImage MakeBackendTextureFromSkImage
Cary Clark61ca7c52018-01-02 11:34:14 -05001501
1502#Method ##
1503
1504# ------------------------------------------------------------------------------
1505
1506#Method sk_sp<SkImage> makeRasterImage() const
Cary Clark61313f32018-10-08 14:57:48 -04001507#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05001508#Line # creates Image compatible with Raster_Surface if possible ##
Cary Clark09d80c02018-10-31 12:14:03 -04001509#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001510
Cary Clarka560c472017-11-27 10:44:06 -05001511#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001512#Image 5
1513#Platform gpu
1514 auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {
1515 if (nullptr == image) {
1516 return;
1517 }
1518 SkPaint paint;
1519 paint.setAntiAlias(true);
Cary Clarkac47b882018-01-11 10:35:44 -05001520 sk_sp<SkImage> raster(image->makeRasterImage());
1521 canvas->drawImage(raster, 0, 0);
Cary Clark14768f62018-10-29 20:33:51 -04001522 canvas->drawString(label, 20, raster->height() / 4, paint);
Cary Clarkac47b882018-01-11 10:35:44 -05001523 };
1524 sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
1525 sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04001526 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
1527 kOpaque_SkAlphaType, nullptr));
Cary Clarkac47b882018-01-11 10:35:44 -05001528 drawImage(image, "image");
1529 canvas->translate(image->width(), 0);
1530 drawImage(bitmapImage, "source");
1531 canvas->translate(-image->width(), image->height());
1532 drawImage(textureImage, "backEndTexture");
Cary Clarka560c472017-11-27 10:44:06 -05001533##
1534
Cary Clarkac47b882018-01-11 10:35:44 -05001535#SeeAlso isTextureBacked isLazyGenerated MakeFromRaster
Cary Clarka560c472017-11-27 10:44:06 -05001536
1537#Method ##
1538
1539# ------------------------------------------------------------------------------
1540
1541#Method sk_sp<SkImage> makeWithFilter(const SkImageFilter* filter, const SkIRect& subset,
1542 const SkIRect& clipBounds, SkIRect* outSubset,
1543 SkIPoint* offset) const
Cary Clark61313f32018-10-08 14:57:48 -04001544#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05001545#Line # creates filtered, clipped Image ##
Cary Clark09d80c02018-10-31 12:14:03 -04001546#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001547
Cary Clarka560c472017-11-27 10:44:06 -05001548#Example
Cary Clarkac47b882018-01-11 10:35:44 -05001549#Description
1550In each frame of the animation, filtered Image is drawn in a different location.
1551By translating canvas by returned offset, Image appears stationary.
1552##
1553#Image 5
1554#Platform gpu
Cary Clark5717e822018-09-21 11:36:41 -04001555#Duration 1
Cary Clarkac47b882018-01-11 10:35:44 -05001556 sk_sp<SkImageFilter> shadowFilter = SkDropShadowImageFilter::Make(
1557 -10.0f * frame, 5.0f * frame, 3.0f, 3.0f, SK_ColorBLUE,
1558 SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode,
1559 nullptr);
1560 sk_sp<SkImageFilter> offsetFilter = SkOffsetImageFilter::Make(40, 40, shadowFilter, nullptr);
1561 SkIRect subset = image->bounds();
1562 SkIRect clipBounds = image->bounds();
1563 clipBounds.outset(60, 60);
1564 SkIRect outSubset;
1565 SkIPoint offset;
1566 sk_sp<SkImage> filtered(image->makeWithFilter(offsetFilter.get(), subset, clipBounds,
1567 &outSubset, &offset));
1568 SkPaint paint;
1569 paint.setAntiAlias(true);
1570 paint.setStyle(SkPaint::kStroke_Style);
1571 canvas->drawLine(0, 0, offset.fX, offset.fY, paint);
1572 canvas->translate(offset.fX, offset.fY);
1573 canvas->drawImage(filtered, 0, 0);
Cary Clark681287e2018-03-16 11:34:15 -04001574 canvas->drawRect(SkRect::Make(outSubset), paint);
Cary Clarka560c472017-11-27 10:44:06 -05001575##
1576
Cary Clark56356312018-02-08 14:45:18 -05001577#SeeAlso makeShader SkPaint::setImageFilter
Cary Clarka560c472017-11-27 10:44:06 -05001578
1579#Method ##
1580
1581# ------------------------------------------------------------------------------
1582
Cary Clarka560c472017-11-27 10:44:06 -05001583#Typedef std::function<void(GrBackendTexture)> BackendTextureReleaseProc
Cary Clark682c58d2018-05-16 07:07:07 -04001584#Line # parameter type for MakeBackendTextureFromSkImage ##
Cary Clarkffb3d682018-05-17 12:17:28 -04001585
1586#Code
Cary Clarka90ea222018-10-16 10:30:28 -04001587#Populate
Cary Clarkffb3d682018-05-17 12:17:28 -04001588##
1589
Cary Clark0d225392018-06-07 09:59:07 -04001590Defines a callback function, taking one parameter of type GrBackendTexture with
1591no return value. Function is called when back-end texture is to be released.
Cary Clarka560c472017-11-27 10:44:06 -05001592##
1593
1594# ------------------------------------------------------------------------------
1595
1596#Method static bool MakeBackendTextureFromSkImage(GrContext* context,
1597 sk_sp<SkImage> image,
1598 GrBackendTexture* backendTexture,
1599 BackendTextureReleaseProc* backendTextureReleaseProc)
Cary Clark61313f32018-10-08 14:57:48 -04001600#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05001601#Line # creates GPU_Texture from Image ##
Cary Clark09d80c02018-10-31 12:14:03 -04001602#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001603
1604#Example
Cary Clark56356312018-02-08 14:45:18 -05001605#Platform gpu
1606#Height 64
1607#Function
Brian Salomon67f85842018-02-09 08:50:22 -05001608static sk_sp<SkImage> create_gpu_image(GrContext* grContext) {
1609 const SkImageInfo info = SkImageInfo::MakeN32(20, 20, kOpaque_SkAlphaType);
1610 auto surface(SkSurface::MakeRenderTarget(grContext, SkBudgeted::kNo, info));
1611 SkCanvas* canvas = surface->getCanvas();
1612 canvas->clear(SK_ColorWHITE);
1613 SkPaint paint;
1614 paint.setColor(SK_ColorBLACK);
1615 canvas->drawRect(SkRect::MakeXYWH(5, 5, 10, 10), paint);
1616 return surface->makeImageSnapshot();
1617}
1618##
1619
Cary Clark682c58d2018-05-16 07:07:07 -04001620void draw(SkCanvas* canvas) {
Brian Salomon67f85842018-02-09 08:50:22 -05001621 GrContext* grContext = canvas->getGrContext();
1622 if (!grContext) {
1623 return;
1624 }
1625 sk_sp<SkImage> backEndImage = create_gpu_image(grContext);
1626 canvas->drawImage(backEndImage, 0, 0);
1627 GrBackendTexture texture;
1628 SkImage::BackendTextureReleaseProc proc;
1629 if (!SkImage::MakeBackendTextureFromSkImage(grContext, std::move(backEndImage),
1630 &texture, &proc)) {
1631 return;
1632 }
1633 sk_sp<SkImage> i2 = SkImage::MakeFromTexture(grContext, texture, kTopLeft_GrSurfaceOrigin,
1634 kN32_SkColorType, kOpaque_SkAlphaType, nullptr);
1635 canvas->drawImage(i2, 30, 30);
Cary Clark56356312018-02-08 14:45:18 -05001636}
Cary Clarka560c472017-11-27 10:44:06 -05001637##
1638
Cary Clark56356312018-02-08 14:45:18 -05001639#SeeAlso MakeFromTexture makeTextureImage
Cary Clarka560c472017-11-27 10:44:06 -05001640
1641#Method ##
1642
1643# ------------------------------------------------------------------------------
1644
Cary Clarka560c472017-11-27 10:44:06 -05001645#Method bool isLazyGenerated() const
Cary Clark4855f782018-02-06 09:41:53 -05001646#In Property
1647#Line # returns if Image is created as needed ##
Cary Clark09d80c02018-10-31 12:14:03 -04001648#Populate
Cary Clarka560c472017-11-27 10:44:06 -05001649
1650#Example
Cary Clark2f466242017-12-11 16:03:17 -05001651#Height 80
1652#Function
1653class TestImageGenerator : public SkImageGenerator {
1654public:
1655 TestImageGenerator() : SkImageGenerator(SkImageInfo::MakeN32Premul(10, 10)) {}
1656 ~TestImageGenerator() override {}
1657protected:
1658 bool onGetPixels(const SkImageInfo& info, void* pixelPtr, size_t rowBytes,
1659 const Options& options) override {
1660 SkPMColor* pixels = static_cast<SkPMColor*>(pixelPtr);
1661 for (int y = 0; y < info.height(); ++y) {
1662 for (int x = 0; x < info.width(); ++x) {
1663 pixels[y * info.width() + x] = 0xff223344 + y * 0x000C0811;
1664 }
1665 }
1666 return true;
1667 }
1668};
1669##
1670void draw(SkCanvas* canvas) {
1671 auto gen = std::unique_ptr<TestImageGenerator>(new TestImageGenerator());
1672 sk_sp<SkImage> image(SkImage::MakeFromGenerator(std::move(gen)));
1673 SkString lazy(image->isLazyGenerated() ? "is lazy" : "not lazy");
1674 canvas->scale(8, 8);
1675 canvas->drawImage(image, 0, 0, nullptr);
1676 SkPaint paint;
1677 paint.setTextSize(4);
1678 canvas->drawString(lazy, 2, 5, paint);
1679}
Cary Clarka560c472017-11-27 10:44:06 -05001680##
1681
Cary Clarkf5404bb2018-01-05 12:10:09 -05001682#Example
1683#Image 5
1684#Platform gpu
1685void draw(SkCanvas* canvas) {
1686 auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {
1687 if (nullptr == image) {
1688 return;
1689 }
1690 SkPaint paint;
1691 paint.setAntiAlias(true);
Cary Clarkf5404bb2018-01-05 12:10:09 -05001692 canvas->drawImage(image, 0, 0);
Cary Clark14768f62018-10-29 20:33:51 -04001693 canvas->drawString(label, 30, image->height() / 4, paint);
Cary Clarkf5404bb2018-01-05 12:10:09 -05001694 canvas->drawString(
1695 image->isLazyGenerated() ? "is lazily generated" : "not lazily generated",
Cary Clark14768f62018-10-29 20:33:51 -04001696 20, image->height() * 3 / 4, paint);
Cary Clarkf5404bb2018-01-05 12:10:09 -05001697 };
1698 sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
1699 sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
Cary Clarkae957c42018-06-07 17:07:17 -04001700 kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
1701 kOpaque_SkAlphaType, nullptr));
Cary Clarkf5404bb2018-01-05 12:10:09 -05001702 drawImage(image, "image");
1703 canvas->translate(image->width(), 0);
1704 drawImage(bitmapImage, "source");
1705 canvas->translate(-image->width(), image->height());
1706 drawImage(textureImage, "backEndTexture");
1707}
1708##
1709
Cary Clark77b3f3a2018-11-07 14:59:03 -05001710#SeeAlso isTextureBacked makeNonTextureImage
Cary Clarka560c472017-11-27 10:44:06 -05001711
1712#Method ##
1713
1714# ------------------------------------------------------------------------------
1715
Cary Clarke80cd442018-07-17 13:19:56 -04001716#Method sk_sp<SkImage> makeColorSpace(sk_sp<SkColorSpace> target) const
Cary Clark61313f32018-10-08 14:57:48 -04001717#In Constructors
Cary Clark4855f782018-02-06 09:41:53 -05001718#Line # creates Image matching Color_Space if possible ##
Cary Clark09d80c02018-10-31 12:14:03 -04001719#Populate
Cary Clarkac47b882018-01-11 10:35:44 -05001720
1721#Example
1722#Image 5
1723#Set sRGB
1724 sk_sp<SkColorSpace> normalColorSpace = SkColorSpace::MakeRGB(
1725 SkColorSpace::kSRGB_RenderTargetGamma, SkColorSpace::kSRGB_Gamut);
1726 sk_sp<SkColorSpace> wackyColorSpace = normalColorSpace->makeColorSpin();
1727 for (auto colorSpace : { normalColorSpace, wackyColorSpace } ) {
Cary Clarkc3c1c312018-07-18 09:25:15 -04001728 sk_sp<SkImage> colorSpaced = image->makeColorSpace(colorSpace);
1729 canvas->drawImage(colorSpaced, 0, 0);
1730 canvas->translate(128, 0);
Cary Clarkac47b882018-01-11 10:35:44 -05001731 }
1732##
1733
Cary Clark77b3f3a2018-11-07 14:59:03 -05001734#SeeAlso MakeFromPicture MakeFromTexture
Cary Clarka560c472017-11-27 10:44:06 -05001735
1736#Method ##
1737
1738#Class SkImage ##
1739
1740#Topic Image ##