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