• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2015 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef SkPixmap_DEFINED
9 #define SkPixmap_DEFINED
10 
11 #include "include/core/SkColor.h"
12 #include "include/core/SkImageInfo.h"
13 #include "include/core/SkSamplingOptions.h"
14 
15 class SkData;
16 struct SkMask;
17 
18 /** \class SkPixmap
19     SkPixmap provides a utility to pair SkImageInfo with pixels and row bytes.
20     SkPixmap is a low level class which provides convenience functions to access
21     raster destinations. SkCanvas can not draw SkPixmap, nor does SkPixmap provide
22     a direct drawing destination.
23 
24     Use SkBitmap to draw pixels referenced by SkPixmap; use SkSurface to draw into
25     pixels referenced by SkPixmap.
26 
27     SkPixmap does not try to manage the lifetime of the pixel memory. Use SkPixelRef
28     to manage pixel memory; SkPixelRef is safe across threads.
29 */
30 class SK_API SkPixmap {
31 public:
32 
33     /** Creates an empty SkPixmap without pixels, with kUnknown_SkColorType, with
34         kUnknown_SkAlphaType, and with a width and height of zero. Use
35         reset() to associate pixels, SkColorType, SkAlphaType, width, and height
36         after SkPixmap has been created.
37 
38         @return  empty SkPixmap
39     */
SkPixmap()40     SkPixmap()
41         : fPixels(nullptr), fRowBytes(0), fInfo(SkImageInfo::MakeUnknown(0, 0))
42     {}
43 
44     /** Creates SkPixmap from info width, height, SkAlphaType, and SkColorType.
45         addr points to pixels, or nullptr. rowBytes should be info.width() times
46         info.bytesPerPixel(), or larger.
47 
48         No parameter checking is performed; it is up to the caller to ensure that
49         addr and rowBytes agree with info.
50 
51         The memory lifetime of pixels is managed by the caller. When SkPixmap goes
52         out of scope, addr is unaffected.
53 
54         SkPixmap may be later modified by reset() to change its size, pixel type, or
55         storage.
56 
57         @param info      width, height, SkAlphaType, SkColorType of SkImageInfo
58         @param addr      pointer to pixels allocated by caller; may be nullptr
59         @param rowBytes  size of one row of addr; width times pixel size, or larger
60         @return          initialized SkPixmap
61     */
SkPixmap(const SkImageInfo & info,const void * addr,size_t rowBytes)62     SkPixmap(const SkImageInfo& info, const void* addr, size_t rowBytes)
63         : fPixels(addr), fRowBytes(rowBytes), fInfo(info)
64     {}
65 
66     /** Sets width, height, row bytes to zero; pixel address to nullptr; SkColorType to
67         kUnknown_SkColorType; and SkAlphaType to kUnknown_SkAlphaType.
68 
69         The prior pixels are unaffected; it is up to the caller to release pixels
70         memory if desired.
71 
72         example: https://fiddle.skia.org/c/@Pixmap_reset
73     */
74     void reset();
75 
76     /** Sets width, height, SkAlphaType, and SkColorType from info.
77         Sets pixel address from addr, which may be nullptr.
78         Sets row bytes from rowBytes, which should be info.width() times
79         info.bytesPerPixel(), or larger.
80 
81         Does not check addr. Asserts if built with SK_DEBUG defined and if rowBytes is
82         too small to hold one row of pixels.
83 
84         The memory lifetime pixels are managed by the caller. When SkPixmap goes
85         out of scope, addr is unaffected.
86 
87         @param info      width, height, SkAlphaType, SkColorType of SkImageInfo
88         @param addr      pointer to pixels allocated by caller; may be nullptr
89         @param rowBytes  size of one row of addr; width times pixel size, or larger
90 
91         example: https://fiddle.skia.org/c/@Pixmap_reset_2
92     */
93     void reset(const SkImageInfo& info, const void* addr, size_t rowBytes);
94 
95     /** Changes SkColorSpace in SkImageInfo; preserves width, height, SkAlphaType, and
96         SkColorType in SkImage, and leaves pixel address and row bytes unchanged.
97         SkColorSpace reference count is incremented.
98 
99         @param colorSpace  SkColorSpace moved to SkImageInfo
100 
101         example: https://fiddle.skia.org/c/@Pixmap_setColorSpace
102     */
103     void setColorSpace(sk_sp<SkColorSpace> colorSpace);
104 
105     /** Deprecated.
106     */
107     bool SK_WARN_UNUSED_RESULT reset(const SkMask& mask);
108 
109     /** Sets subset width, height, pixel address to intersection of SkPixmap with area,
110         if intersection is not empty; and return true. Otherwise, leave subset unchanged
111         and return false.
112 
113         Failing to read the return value generates a compile time warning.
114 
115         @param subset  storage for width, height, pixel address of intersection
116         @param area    bounds to intersect with SkPixmap
117         @return        true if intersection of SkPixmap and area is not empty
118     */
119     bool SK_WARN_UNUSED_RESULT extractSubset(SkPixmap* subset, const SkIRect& area) const;
120 
121     /** Returns width, height, SkAlphaType, SkColorType, and SkColorSpace.
122 
123         @return  reference to SkImageInfo
124     */
info()125     const SkImageInfo& info() const { return fInfo; }
126 
127     /** Returns row bytes, the interval from one pixel row to the next. Row bytes
128         is at least as large as: width() * info().bytesPerPixel().
129 
130         Returns zero if colorType() is kUnknown_SkColorType.
131         It is up to the SkBitmap creator to ensure that row bytes is a useful value.
132 
133         @return  byte length of pixel row
134     */
rowBytes()135     size_t rowBytes() const { return fRowBytes; }
136 
137     /** Returns pixel address, the base address corresponding to the pixel origin.
138 
139         It is up to the SkPixmap creator to ensure that pixel address is a useful value.
140 
141         @return  pixel address
142     */
addr()143     const void* addr() const { return fPixels; }
144 
145     /** Returns pixel count in each pixel row. Should be equal or less than:
146         rowBytes() / info().bytesPerPixel().
147 
148         @return  pixel width in SkImageInfo
149     */
width()150     int width() const { return fInfo.width(); }
151 
152     /** Returns pixel row count.
153 
154         @return  pixel height in SkImageInfo
155     */
height()156     int height() const { return fInfo.height(); }
157 
158     /**
159      *  Return the dimensions of the pixmap (from its ImageInfo)
160      */
dimensions()161     SkISize dimensions() const { return fInfo.dimensions(); }
162 
colorType()163     SkColorType colorType() const { return fInfo.colorType(); }
164 
alphaType()165     SkAlphaType alphaType() const { return fInfo.alphaType(); }
166 
167     /** Returns SkColorSpace, the range of colors, associated with SkImageInfo. The
168         reference count of SkColorSpace is unchanged. The returned SkColorSpace is
169         immutable.
170 
171         @return  SkColorSpace in SkImageInfo, or nullptr
172     */
colorSpace()173     SkColorSpace* colorSpace() const { return fInfo.colorSpace(); }
174 
175     /** Returns smart pointer to SkColorSpace, the range of colors, associated with
176         SkImageInfo. The smart pointer tracks the number of objects sharing this
177         SkColorSpace reference so the memory is released when the owners destruct.
178 
179         The returned SkColorSpace is immutable.
180 
181         @return  SkColorSpace in SkImageInfo wrapped in a smart pointer
182     */
refColorSpace()183     sk_sp<SkColorSpace> refColorSpace() const { return fInfo.refColorSpace(); }
184 
185     /** Returns true if SkAlphaType is kOpaque_SkAlphaType.
186         Does not check if SkColorType allows alpha, or if any pixel value has
187         transparency.
188 
189         @return  true if SkImageInfo has opaque SkAlphaType
190     */
isOpaque()191     bool isOpaque() const { return fInfo.isOpaque(); }
192 
193     /** Returns SkIRect { 0, 0, width(), height() }.
194 
195         @return  integral rectangle from origin to width() and height()
196     */
bounds()197     SkIRect bounds() const { return SkIRect::MakeWH(this->width(), this->height()); }
198 
199     /** Returns number of pixels that fit on row. Should be greater than or equal to
200         width().
201 
202         @return  maximum pixels per row
203     */
rowBytesAsPixels()204     int rowBytesAsPixels() const { return int(fRowBytes >> this->shiftPerPixel()); }
205 
206     /** Returns bit shift converting row bytes to row pixels.
207         Returns zero for kUnknown_SkColorType.
208 
209         @return  one of: 0, 1, 2, 3; left shift to convert pixels to bytes
210     */
shiftPerPixel()211     int shiftPerPixel() const { return fInfo.shiftPerPixel(); }
212 
213     /** Returns minimum memory required for pixel storage.
214         Does not include unused memory on last row when rowBytesAsPixels() exceeds width().
215         Returns SIZE_MAX if result does not fit in size_t.
216         Returns zero if height() or width() is 0.
217         Returns height() times rowBytes() if colorType() is kUnknown_SkColorType.
218 
219         @return  size in bytes of image buffer
220     */
computeByteSize()221     size_t computeByteSize() const { return fInfo.computeByteSize(fRowBytes); }
222 
223     /** Returns true if all pixels are opaque. SkColorType determines how pixels
224         are encoded, and whether pixel describes alpha. Returns true for SkColorType
225         without alpha in each pixel; for other SkColorType, returns true if all
226         pixels have alpha values equivalent to 1.0 or greater.
227 
228         For SkColorType kRGB_565_SkColorType or kGray_8_SkColorType: always
229         returns true. For SkColorType kAlpha_8_SkColorType, kBGRA_8888_SkColorType,
230         kRGBA_8888_SkColorType: returns true if all pixel alpha values are 255.
231         For SkColorType kARGB_4444_SkColorType: returns true if all pixel alpha values are 15.
232         For kRGBA_F16_SkColorType: returns true if all pixel alpha values are 1.0 or
233         greater.
234 
235         Returns false for kUnknown_SkColorType.
236 
237         @return  true if all pixels have opaque values or SkColorType is opaque
238 
239         example: https://fiddle.skia.org/c/@Pixmap_computeIsOpaque
240     */
241     bool computeIsOpaque() const;
242 
243     /** Returns pixel at (x, y) as unpremultiplied color.
244         Returns black with alpha if SkColorType is kAlpha_8_SkColorType.
245 
246         Input is not validated: out of bounds values of x or y trigger an assert() if
247         built with SK_DEBUG defined; and returns undefined values or may crash if
248         SK_RELEASE is defined. Fails if SkColorType is kUnknown_SkColorType or
249         pixel address is nullptr.
250 
251         SkColorSpace in SkImageInfo is ignored. Some color precision may be lost in the
252         conversion to unpremultiplied color; original pixel data may have additional
253         precision.
254 
255         @param x  column index, zero or greater, and less than width()
256         @param y  row index, zero or greater, and less than height()
257         @return   pixel converted to unpremultiplied color
258 
259         example: https://fiddle.skia.org/c/@Pixmap_getColor
260     */
261     SkColor getColor(int x, int y) const;
262 
263     /** Look up the pixel at (x,y) and return its alpha component, normalized to [0..1].
264         This is roughly equivalent to SkGetColorA(getColor()), but can be more efficent
265         (and more precise if the pixels store more than 8 bits per component).
266 
267         @param x  column index, zero or greater, and less than width()
268         @param y  row index, zero or greater, and less than height()
269         @return   alpha converted to normalized float
270      */
271     float getAlphaf(int x, int y) const;
272 
273     /** Returns readable pixel address at (x, y). Returns nullptr if SkPixelRef is nullptr.
274 
275         Input is not validated: out of bounds values of x or y trigger an assert() if
276         built with SK_DEBUG defined. Returns nullptr if SkColorType is kUnknown_SkColorType.
277 
278         Performs a lookup of pixel size; for better performance, call
279         one of: addr8, addr16, addr32, addr64, or addrF16().
280 
281         @param x  column index, zero or greater, and less than width()
282         @param y  row index, zero or greater, and less than height()
283         @return   readable generic pointer to pixel
284     */
addr(int x,int y)285     const void* addr(int x, int y) const {
286         return (const char*)fPixels + fInfo.computeOffset(x, y, fRowBytes);
287     }
288 
289     /** Returns readable base pixel address. Result is addressable as unsigned 8-bit bytes.
290         Will trigger an assert() if SkColorType is not kAlpha_8_SkColorType or
291         kGray_8_SkColorType, and is built with SK_DEBUG defined.
292 
293         One byte corresponds to one pixel.
294 
295         @return  readable unsigned 8-bit pointer to pixels
296     */
addr8()297     const uint8_t* addr8() const {
298         SkASSERT(1 == fInfo.bytesPerPixel());
299         return reinterpret_cast<const uint8_t*>(fPixels);
300     }
301 
302     /** Returns readable base pixel address. Result is addressable as unsigned 16-bit words.
303         Will trigger an assert() if SkColorType is not kRGB_565_SkColorType or
304         kARGB_4444_SkColorType, and is built with SK_DEBUG defined.
305 
306         One word corresponds to one pixel.
307 
308         @return  readable unsigned 16-bit pointer to pixels
309     */
addr16()310     const uint16_t* addr16() const {
311         SkASSERT(2 == fInfo.bytesPerPixel());
312         return reinterpret_cast<const uint16_t*>(fPixels);
313     }
314 
315     /** Returns readable base pixel address. Result is addressable as unsigned 32-bit words.
316         Will trigger an assert() if SkColorType is not kRGBA_8888_SkColorType or
317         kBGRA_8888_SkColorType, and is built with SK_DEBUG defined.
318 
319         One word corresponds to one pixel.
320 
321         @return  readable unsigned 32-bit pointer to pixels
322     */
addr32()323     const uint32_t* addr32() const {
324         SkASSERT(4 == fInfo.bytesPerPixel());
325         return reinterpret_cast<const uint32_t*>(fPixels);
326     }
327 
328     /** Returns readable base pixel address. Result is addressable as unsigned 64-bit words.
329         Will trigger an assert() if SkColorType is not kRGBA_F16_SkColorType and is built
330         with SK_DEBUG defined.
331 
332         One word corresponds to one pixel.
333 
334         @return  readable unsigned 64-bit pointer to pixels
335     */
addr64()336     const uint64_t* addr64() const {
337         SkASSERT(8 == fInfo.bytesPerPixel());
338         return reinterpret_cast<const uint64_t*>(fPixels);
339     }
340 
341     /** Returns readable base pixel address. Result is addressable as unsigned 16-bit words.
342         Will trigger an assert() if SkColorType is not kRGBA_F16_SkColorType and is built
343         with SK_DEBUG defined.
344 
345         Each word represents one color component encoded as a half float.
346         Four words correspond to one pixel.
347 
348         @return  readable unsigned 16-bit pointer to first component of pixels
349     */
addrF16()350     const uint16_t* addrF16() const {
351         SkASSERT(8 == fInfo.bytesPerPixel());
352         SkASSERT(kRGBA_F16_SkColorType     == fInfo.colorType() ||
353                  kRGBA_F16Norm_SkColorType == fInfo.colorType());
354         return reinterpret_cast<const uint16_t*>(fPixels);
355     }
356 
357     /** Returns readable pixel address at (x, y).
358 
359         Input is not validated: out of bounds values of x or y trigger an assert() if
360         built with SK_DEBUG defined.
361 
362         Will trigger an assert() if SkColorType is not kAlpha_8_SkColorType or
363         kGray_8_SkColorType, and is built with SK_DEBUG defined.
364 
365         @param x  column index, zero or greater, and less than width()
366         @param y  row index, zero or greater, and less than height()
367         @return   readable unsigned 8-bit pointer to pixel at (x, y)
368     */
addr8(int x,int y)369     const uint8_t* addr8(int x, int y) const {
370         SkASSERT((unsigned)x < (unsigned)fInfo.width());
371         SkASSERT((unsigned)y < (unsigned)fInfo.height());
372         return (const uint8_t*)((const char*)this->addr8() + (size_t)y * fRowBytes + (x << 0));
373     }
374 
375     /** Returns readable pixel address at (x, y).
376 
377         Input is not validated: out of bounds values of x or y trigger an assert() if
378         built with SK_DEBUG defined.
379 
380         Will trigger an assert() if SkColorType is not kRGB_565_SkColorType or
381         kARGB_4444_SkColorType, and is built with SK_DEBUG defined.
382 
383         @param x  column index, zero or greater, and less than width()
384         @param y  row index, zero or greater, and less than height()
385         @return   readable unsigned 16-bit pointer to pixel at (x, y)
386     */
addr16(int x,int y)387     const uint16_t* addr16(int x, int y) const {
388         SkASSERT((unsigned)x < (unsigned)fInfo.width());
389         SkASSERT((unsigned)y < (unsigned)fInfo.height());
390         return (const uint16_t*)((const char*)this->addr16() + (size_t)y * fRowBytes + (x << 1));
391     }
392 
393     /** Returns readable pixel address at (x, y).
394 
395         Input is not validated: out of bounds values of x or y trigger an assert() if
396         built with SK_DEBUG defined.
397 
398         Will trigger an assert() if SkColorType is not kRGBA_8888_SkColorType or
399         kBGRA_8888_SkColorType, and is built with SK_DEBUG defined.
400 
401         @param x  column index, zero or greater, and less than width()
402         @param y  row index, zero or greater, and less than height()
403         @return   readable unsigned 32-bit pointer to pixel at (x, y)
404     */
addr32(int x,int y)405     const uint32_t* addr32(int x, int y) const {
406         SkASSERT((unsigned)x < (unsigned)fInfo.width());
407         SkASSERT((unsigned)y < (unsigned)fInfo.height());
408         return (const uint32_t*)((const char*)this->addr32() + (size_t)y * fRowBytes + (x << 2));
409     }
410 
411     /** Returns readable pixel address at (x, y).
412 
413         Input is not validated: out of bounds values of x or y trigger an assert() if
414         built with SK_DEBUG defined.
415 
416         Will trigger an assert() if SkColorType is not kRGBA_F16_SkColorType and is built
417         with SK_DEBUG defined.
418 
419         @param x  column index, zero or greater, and less than width()
420         @param y  row index, zero or greater, and less than height()
421         @return   readable unsigned 64-bit pointer to pixel at (x, y)
422     */
addr64(int x,int y)423     const uint64_t* addr64(int x, int y) const {
424         SkASSERT((unsigned)x < (unsigned)fInfo.width());
425         SkASSERT((unsigned)y < (unsigned)fInfo.height());
426         return (const uint64_t*)((const char*)this->addr64() + (size_t)y * fRowBytes + (x << 3));
427     }
428 
429     /** Returns readable pixel address at (x, y).
430 
431         Input is not validated: out of bounds values of x or y trigger an assert() if
432         built with SK_DEBUG defined.
433 
434         Will trigger an assert() if SkColorType is not kRGBA_F16_SkColorType and is built
435         with SK_DEBUG defined.
436 
437         Each unsigned 16-bit word represents one color component encoded as a half float.
438         Four words correspond to one pixel.
439 
440         @param x  column index, zero or greater, and less than width()
441         @param y  row index, zero or greater, and less than height()
442         @return   readable unsigned 16-bit pointer to pixel component at (x, y)
443     */
addrF16(int x,int y)444     const uint16_t* addrF16(int x, int y) const {
445         SkASSERT(kRGBA_F16_SkColorType     == fInfo.colorType() ||
446                  kRGBA_F16Norm_SkColorType == fInfo.colorType());
447         return reinterpret_cast<const uint16_t*>(this->addr64(x, y));
448     }
449 
450     /** Returns writable base pixel address.
451 
452         @return  writable generic base pointer to pixels
453     */
writable_addr()454     void* writable_addr() const { return const_cast<void*>(fPixels); }
455 
456     /** Returns writable pixel address at (x, y).
457 
458         Input is not validated: out of bounds values of x or y trigger an assert() if
459         built with SK_DEBUG defined. Returns zero if SkColorType is kUnknown_SkColorType.
460 
461         @param x  column index, zero or greater, and less than width()
462         @param y  row index, zero or greater, and less than height()
463         @return   writable generic pointer to pixel
464     */
writable_addr(int x,int y)465     void* writable_addr(int x, int y) const {
466         return const_cast<void*>(this->addr(x, y));
467     }
468 
469     /** Returns writable pixel address at (x, y). Result is addressable as unsigned
470         8-bit bytes. Will trigger an assert() if SkColorType is not kAlpha_8_SkColorType
471         or kGray_8_SkColorType, and is built with SK_DEBUG defined.
472 
473         One byte corresponds to one pixel.
474 
475         @param x  column index, zero or greater, and less than width()
476         @param y  row index, zero or greater, and less than height()
477         @return   writable unsigned 8-bit pointer to pixels
478     */
writable_addr8(int x,int y)479     uint8_t* writable_addr8(int x, int y) const {
480         return const_cast<uint8_t*>(this->addr8(x, y));
481     }
482 
483     /** Returns writable_addr pixel address at (x, y). Result is addressable as unsigned
484         16-bit words. Will trigger an assert() if SkColorType is not kRGB_565_SkColorType
485         or kARGB_4444_SkColorType, and is built with SK_DEBUG defined.
486 
487         One word corresponds to one pixel.
488 
489         @param x  column index, zero or greater, and less than width()
490         @param y  row index, zero or greater, and less than height()
491         @return   writable unsigned 16-bit pointer to pixel
492     */
writable_addr16(int x,int y)493     uint16_t* writable_addr16(int x, int y) const {
494         return const_cast<uint16_t*>(this->addr16(x, y));
495     }
496 
497     /** Returns writable pixel address at (x, y). Result is addressable as unsigned
498         32-bit words. Will trigger an assert() if SkColorType is not
499         kRGBA_8888_SkColorType or kBGRA_8888_SkColorType, and is built with SK_DEBUG
500         defined.
501 
502         One word corresponds to one pixel.
503 
504         @param x  column index, zero or greater, and less than width()
505         @param y  row index, zero or greater, and less than height()
506         @return   writable unsigned 32-bit pointer to pixel
507     */
writable_addr32(int x,int y)508     uint32_t* writable_addr32(int x, int y) const {
509         return const_cast<uint32_t*>(this->addr32(x, y));
510     }
511 
512     /** Returns writable pixel address at (x, y). Result is addressable as unsigned
513         64-bit words. Will trigger an assert() if SkColorType is not
514         kRGBA_F16_SkColorType and is built with SK_DEBUG defined.
515 
516         One word corresponds to one pixel.
517 
518         @param x  column index, zero or greater, and less than width()
519         @param y  row index, zero or greater, and less than height()
520         @return   writable unsigned 64-bit pointer to pixel
521     */
writable_addr64(int x,int y)522     uint64_t* writable_addr64(int x, int y) const {
523         return const_cast<uint64_t*>(this->addr64(x, y));
524     }
525 
526     /** Returns writable pixel address at (x, y). Result is addressable as unsigned
527         16-bit words. Will trigger an assert() if SkColorType is not
528         kRGBA_F16_SkColorType and is built with SK_DEBUG defined.
529 
530         Each word represents one color component encoded as a half float.
531         Four words correspond to one pixel.
532 
533         @param x  column index, zero or greater, and less than width()
534         @param y  row index, zero or greater, and less than height()
535         @return   writable unsigned 16-bit pointer to first component of pixel
536     */
writable_addrF16(int x,int y)537     uint16_t* writable_addrF16(int x, int y) const {
538         return reinterpret_cast<uint16_t*>(writable_addr64(x, y));
539     }
540 
541     /** Copies a SkRect of pixels to dstPixels. Copy starts at (0, 0), and does not
542         exceed SkPixmap (width(), height()).
543 
544         dstInfo specifies width, height, SkColorType, SkAlphaType, and
545         SkColorSpace of destination. dstRowBytes specifics the gap from one destination
546         row to the next. Returns true if pixels are copied. Returns false if
547         dstInfo address equals nullptr, or dstRowBytes is less than dstInfo.minRowBytes().
548 
549         Pixels are copied only if pixel conversion is possible. If SkPixmap colorType() is
550         kGray_8_SkColorType, or kAlpha_8_SkColorType; dstInfo.colorType() must match.
551         If SkPixmap colorType() is kGray_8_SkColorType, dstInfo.colorSpace() must match.
552         If SkPixmap alphaType() is kOpaque_SkAlphaType, dstInfo.alphaType() must
553         match. If SkPixmap colorSpace() is nullptr, dstInfo.colorSpace() must match. Returns
554         false if pixel conversion is not possible.
555 
556         Returns false if SkPixmap width() or height() is zero or negative.
557 
558         @param dstInfo      destination width, height, SkColorType, SkAlphaType, SkColorSpace
559         @param dstPixels    destination pixel storage
560         @param dstRowBytes  destination row length
561         @return             true if pixels are copied to dstPixels
562     */
readPixels(const SkImageInfo & dstInfo,void * dstPixels,size_t dstRowBytes)563     bool readPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRowBytes) const {
564         return this->readPixels(dstInfo, dstPixels, dstRowBytes, 0, 0);
565     }
566 
567     /** Copies a SkRect of pixels to dstPixels. Copy starts at (srcX, srcY), and does not
568         exceed SkPixmap (width(), height()).
569 
570         dstInfo specifies width, height, SkColorType, SkAlphaType, and
571         SkColorSpace of destination. dstRowBytes specifics the gap from one destination
572         row to the next. Returns true if pixels are copied. Returns false if
573         dstInfo address equals nullptr, or dstRowBytes is less than dstInfo.minRowBytes().
574 
575         Pixels are copied only if pixel conversion is possible. If SkPixmap colorType() is
576         kGray_8_SkColorType, or kAlpha_8_SkColorType; dstInfo.colorType() must match.
577         If SkPixmap colorType() is kGray_8_SkColorType, dstInfo.colorSpace() must match.
578         If SkPixmap alphaType() is kOpaque_SkAlphaType, dstInfo.alphaType() must
579         match. If SkPixmap colorSpace() is nullptr, dstInfo.colorSpace() must match. Returns
580         false if pixel conversion is not possible.
581 
582         srcX and srcY may be negative to copy only top or left of source. Returns
583         false if SkPixmap width() or height() is zero or negative. Returns false if:
584         abs(srcX) >= Pixmap width(), or if abs(srcY) >= Pixmap height().
585 
586         @param dstInfo      destination width, height, SkColorType, SkAlphaType, SkColorSpace
587         @param dstPixels    destination pixel storage
588         @param dstRowBytes  destination row length
589         @param srcX         column index whose absolute value is less than width()
590         @param srcY         row index whose absolute value is less than height()
591         @return             true if pixels are copied to dstPixels
592     */
593     bool readPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRowBytes, int srcX,
594                     int srcY) const;
595 
596     /** Copies a SkRect of pixels to dst. Copy starts at (srcX, srcY), and does not
597         exceed SkPixmap (width(), height()). dst specifies width, height, SkColorType,
598         SkAlphaType, and SkColorSpace of destination.  Returns true if pixels are copied.
599         Returns false if dst address equals nullptr, or dst.rowBytes() is less than
600         dst SkImageInfo::minRowBytes.
601 
602         Pixels are copied only if pixel conversion is possible. If SkPixmap colorType() is
603         kGray_8_SkColorType, or kAlpha_8_SkColorType; dst.info().colorType must match.
604         If SkPixmap colorType() is kGray_8_SkColorType, dst.info().colorSpace must match.
605         If SkPixmap alphaType() is kOpaque_SkAlphaType, dst.info().alphaType must
606         match. If SkPixmap colorSpace() is nullptr, dst.info().colorSpace must match. Returns
607         false if pixel conversion is not possible.
608 
609         srcX and srcY may be negative to copy only top or left of source. Returns
610         false SkPixmap width() or height() is zero or negative. Returns false if:
611         abs(srcX) >= Pixmap width(), or if abs(srcY) >= Pixmap height().
612 
613         @param dst   SkImageInfo and pixel address to write to
614         @param srcX  column index whose absolute value is less than width()
615         @param srcY  row index whose absolute value is less than height()
616         @return      true if pixels are copied to dst
617     */
readPixels(const SkPixmap & dst,int srcX,int srcY)618     bool readPixels(const SkPixmap& dst, int srcX, int srcY) const {
619         return this->readPixels(dst.info(), dst.writable_addr(), dst.rowBytes(), srcX, srcY);
620     }
621 
622     /** Copies pixels inside bounds() to dst. dst specifies width, height, SkColorType,
623         SkAlphaType, and SkColorSpace of destination.  Returns true if pixels are copied.
624         Returns false if dst address equals nullptr, or dst.rowBytes() is less than
625         dst SkImageInfo::minRowBytes.
626 
627         Pixels are copied only if pixel conversion is possible. If SkPixmap colorType() is
628         kGray_8_SkColorType, or kAlpha_8_SkColorType; dst SkColorType must match.
629         If SkPixmap colorType() is kGray_8_SkColorType, dst SkColorSpace must match.
630         If SkPixmap alphaType() is kOpaque_SkAlphaType, dst SkAlphaType must
631         match. If SkPixmap colorSpace() is nullptr, dst SkColorSpace must match. Returns
632         false if pixel conversion is not possible.
633 
634         Returns false if SkPixmap width() or height() is zero or negative.
635 
636         @param dst  SkImageInfo and pixel address to write to
637         @return     true if pixels are copied to dst
638     */
readPixels(const SkPixmap & dst)639     bool readPixels(const SkPixmap& dst) const {
640         return this->readPixels(dst.info(), dst.writable_addr(), dst.rowBytes(), 0, 0);
641     }
642 
643     /** Copies SkBitmap to dst, scaling pixels to fit dst.width() and dst.height(), and
644         converting pixels to match dst.colorType() and dst.alphaType(). Returns true if
645         pixels are copied. Returns false if dst address is nullptr, or dst.rowBytes() is
646         less than dst SkImageInfo::minRowBytes.
647 
648         Pixels are copied only if pixel conversion is possible. If SkPixmap colorType() is
649         kGray_8_SkColorType, or kAlpha_8_SkColorType; dst SkColorType must match.
650         If SkPixmap colorType() is kGray_8_SkColorType, dst SkColorSpace must match.
651         If SkPixmap alphaType() is kOpaque_SkAlphaType, dst SkAlphaType must
652         match. If SkPixmap colorSpace() is nullptr, dst SkColorSpace must match. Returns
653         false if pixel conversion is not possible.
654 
655         Returns false if SkBitmap width() or height() is zero or negative.
656 
657         @param dst            SkImageInfo and pixel address to write to
658         @return               true if pixels are scaled to fit dst
659 
660         example: https://fiddle.skia.org/c/@Pixmap_scalePixels
661     */
662     bool scalePixels(const SkPixmap& dst, const SkSamplingOptions&) const;
663 
664     /** Writes color to pixels bounded by subset; returns true on success.
665         Returns false if colorType() is kUnknown_SkColorType, or if subset does
666         not intersect bounds().
667 
668         @param color   sRGB unpremultiplied color to write
669         @param subset  bounding integer SkRect of written pixels
670         @return        true if pixels are changed
671 
672         example: https://fiddle.skia.org/c/@Pixmap_erase
673     */
674     bool erase(SkColor color, const SkIRect& subset) const;
675 
676     /** Writes color to pixels inside bounds(); returns true on success.
677         Returns false if colorType() is kUnknown_SkColorType, or if bounds()
678         is empty.
679 
680         @param color  sRGB unpremultiplied color to write
681         @return       true if pixels are changed
682     */
erase(SkColor color)683     bool erase(SkColor color) const { return this->erase(color, this->bounds()); }
684 
685     /** Writes color to pixels bounded by subset; returns true on success.
686         if subset is nullptr, writes colors pixels inside bounds(). Returns false if
687         colorType() is kUnknown_SkColorType, if subset is not nullptr and does
688         not intersect bounds(), or if subset is nullptr and bounds() is empty.
689 
690         @param color   sRGB unpremultiplied color to write
691         @param subset  bounding integer SkRect of pixels to write; may be nullptr
692         @return        true if pixels are changed
693 
694         example: https://fiddle.skia.org/c/@Pixmap_erase_3
695     */
696     bool erase(const SkColor4f& color, const SkIRect* subset = nullptr) const {
697         return this->erase(color, nullptr, subset);
698     }
699 
700     /** Writes color to pixels bounded by subset; returns true on success.
701         if subset is nullptr, writes colors pixels inside bounds(). Returns false if
702         colorType() is kUnknown_SkColorType, if subset is not nullptr and does
703         not intersect bounds(), or if subset is nullptr and bounds() is empty.
704 
705         @param color   unpremultiplied color to write
706         @param cs      SkColorSpace of color
707         @param subset  bounding integer SkRect of pixels to write; may be nullptr
708         @return        true if pixels are changed
709     */
710     bool erase(const SkColor4f& color, SkColorSpace* cs, const SkIRect* subset = nullptr) const;
711 
712 private:
713     const void*     fPixels;
714     size_t          fRowBytes;
715     SkImageInfo     fInfo;
716 
717     friend class SkPixmapPriv;
718 };
719 
720 #endif
721