1 #Topic Pixmap 2 #Alias Pixmap_Reference ## 3 4 #Class SkPixmap 5 6 #Code 7 #Populate 8 ## 9 10 Pixmap provides a utility to pair SkImageInfo with pixels and row bytes. 11 Pixmap is a low level class which provides convenience functions to access 12 raster destinations. Canvas can not draw Pixmap, nor does Pixmap provide 13 a direct drawing destination. 14 15 Use Bitmap to draw pixels referenced by Pixmap; use Surface to draw into 16 pixels referenced by Pixmap. 17 18 Pixmap does not try to manage the lifetime of the pixel memory. Use Pixel_Ref 19 to manage pixel memory; Pixel_Ref is safe across threads. 20 21 22 #Subtopic Initialization 23 #Line # sets fields for use ## 24 25 # ------------------------------------------------------------------------------ 26 27 #Method SkPixmap() 28 29 #In Initialization 30 #Line # constructs with default values ## 31 #Populate 32 33 #Example 34 void draw(SkCanvas* canvas) { 35 const char* alphas[] = {"Unknown", "Opaque", "Premul", "Unpremul"}; 36 const char* colors[] = {"Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x", 37 "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16"}; 38 SkPixmap pixmap; 39 for (int i = 0; i < 2; ++i) { 40 SkDebugf("width: %2d height: %2d", pixmap.width(), pixmap.height()); 41 SkDebugf(" color: k%s_SkColorType", colors[pixmap.colorType()]); 42 SkDebugf(" alpha: k%s_SkAlphaType\n", alphas[pixmap.alphaType()]); 43 pixmap.reset(SkImageInfo::Make(25, 35, kRGBA_8888_SkColorType, kOpaque_SkAlphaType), 44 nullptr, 0); 45 } 46 } 47 #StdOut 48 width: 0 height: 0 color: kUnknown_SkColorType alpha: kUnknown_SkAlphaType 49 width: 25 height: 35 color: kRGBA_8888_SkColorType alpha: kOpaque_SkAlphaType 50 ## 51 ## 52 53 #SeeAlso SkPixmap(const SkImageInfo& info, const void* addr, size_t rowBytes) reset() SkAlphaType SkColorType 54 55 ## 56 57 # ------------------------------------------------------------------------------ 58 59 #Method SkPixmap(const SkImageInfo& info, const void* addr, size_t rowBytes) 60 61 #In Initialization 62 #Line # constructs from Image_Info, pixels ## 63 #Populate 64 65 #Example 66 #Image 3 67 #Description 68 SkImage::MakeRasterCopy takes const SkPixmap& as an argument. The example 69 constructs a SkPixmap from the brace-delimited parameters. 70 ## 71 SkDebugf("image alpha only = %s\n", image->isAlphaOnly() ? "true" : "false"); 72 SkPMColor pmColors = 0; 73 sk_sp<SkImage> copy = SkImage::MakeRasterCopy({SkImageInfo::MakeA8(1, 1), 74 (uint8_t*)&pmColors, 75 1}); 76 SkDebugf("copy alpha only = %s\n", copy->isAlphaOnly() ? "true" : "false"); 77 #StdOut 78 image alpha only = false 79 copy alpha only = true 80 ## 81 ## 82 83 #SeeAlso SkPixmap() reset() SkAlphaType SkColorType 84 85 ## 86 87 # ------------------------------------------------------------------------------ 88 89 #Method void reset() 90 91 #In Initialization 92 #Line # reuses existing Pixmap with replacement values ## 93 #Populate 94 95 #Example 96 void draw(SkCanvas* canvas) { 97 const char* alphas[] = {"Unknown", "Opaque", "Premul", "Unpremul"}; 98 const char* colors[] = {"Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x", 99 "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16"}; 100 SkPixmap pixmap(SkImageInfo::Make(25, 35, kRGBA_8888_SkColorType, kOpaque_SkAlphaType), 101 nullptr, 0); 102 for (int i = 0; i < 2; ++i) { 103 SkDebugf("width: %2d height: %2d", pixmap.width(), pixmap.height()); 104 SkDebugf(" color: k%s_SkColorType", colors[pixmap.colorType()]); 105 SkDebugf(" alpha: k%s_SkAlphaType\n", alphas[pixmap.alphaType()]); 106 pixmap.reset(); 107 } 108 } 109 #StdOut 110 width: 25 height: 35 color: kRGBA_8888_SkColorType alpha: kOpaque_SkAlphaType 111 width: 0 height: 0 color: kUnknown_SkColorType alpha: kUnknown_SkAlphaType 112 ## 113 ## 114 115 #SeeAlso SkPixmap() SkAlphaType SkColorType 116 117 ## 118 119 # ------------------------------------------------------------------------------ 120 121 #Method void reset(const SkImageInfo& info, const void* addr, size_t rowBytes) 122 123 #In Initialization 124 #Populate 125 126 #Example 127 #Image 4 128 #Height 64 129 void draw(SkCanvas* canvas) { 130 std::vector<int32_t> pixels; 131 pixels.resize(image->height() * image->width() * 4); 132 SkPixmap pixmap(SkImageInfo::Make(image->width(), image->height(), kN32_SkColorType, 133 image->alphaType()), (const void*) &pixels.front(), image->width() * 4); 134 image->readPixels(pixmap, 0, 0); 135 int x = 0; 136 for (auto colorType : { kRGBA_8888_SkColorType, kBGRA_8888_SkColorType } ) { 137 pixmap.reset(SkImageInfo::Make(image->width(), image->height(), colorType, 138 image->alphaType()), (const void*) &pixels.front(), image->width() * 4); 139 SkBitmap bitmap; 140 bitmap.installPixels(pixmap); 141 canvas->drawBitmap(bitmap, x, 0); 142 x += 128; 143 } 144 } 145 ## 146 147 #SeeAlso SkPixmap(const SkImageInfo& info, const void* addr, size_t rowBytes) reset() SkAlphaType SkColorType 148 149 ## 150 151 # ------------------------------------------------------------------------------ 152 153 #Method void setColorSpace(sk_sp<SkColorSpace> colorSpace) 154 155 #In Initialization 156 #Line # sets Image_Info Color_Space ## 157 #Populate 158 159 #Example 160 void draw(SkCanvas* canvas) { 161 SkPixmap pixmap; 162 sk_sp<SkColorSpace> colorSpace1 = SkColorSpace::MakeRGB(SkNamedTransferFn::kLinear, 163 SkNamedGamut::kRec2020); 164 SkDebugf("is %sunique\n", colorSpace1->unique() ? "" : "not "); 165 pixmap.setColorSpace(colorSpace1); 166 SkDebugf("is %sunique\n", colorSpace1->unique() ? "" : "not "); 167 } 168 #StdOut 169 is unique 170 is not unique 171 ## 172 ## 173 174 #SeeAlso Color_Space SkImageInfo::makeColorSpace 175 176 ## 177 178 # ------------------------------------------------------------------------------ 179 180 #Method bool extractSubset(SkPixmap* subset, const SkIRect& area) const 181 182 #In Initialization 183 #Line # sets pointer to portion of original ## 184 #Populate 185 186 #Example 187 #Image 3 188 #Height 128 189 void draw(SkCanvas* canvas) { 190 std::vector<int32_t> pixels; 191 pixels.resize(image->height() * image->width() * 4); 192 SkPixmap pixmap(SkImageInfo::Make(image->width(), image->height(), kN32_SkColorType, 193 image->alphaType()), (const void*) &pixels.front(), image->width() * 4); 194 image->readPixels(pixmap, 0, 0); 195 SkPixmap inset; 196 if (pixmap.extractSubset(&inset, {128, 128, 512, 512})) { 197 SkBitmap bitmap; 198 bitmap.installPixels(inset); 199 canvas->drawBitmap(bitmap, 0, 0); 200 } 201 } 202 ## 203 204 #SeeAlso reset() SkIRect::intersect 205 206 ## 207 208 #Subtopic Initialization ## 209 210 #Subtopic Image_Info_Access 211 #Line # returns all or part of Image_Info ## 212 213 # ------------------------------------------------------------------------------ 214 215 #Method const SkImageInfo& info() const 216 217 #In Image_Info_Access 218 #Line # returns Image_Info ## 219 #Populate 220 221 #Example 222 #Image 3 223 std::vector<int32_t> pixels; 224 pixels.resize(image->height() * image->width() * 4); 225 SkPixmap pixmap(SkImageInfo::Make(image->width(), image->height(), kN32_SkColorType, 226 image->alphaType()), (const void*) &pixels.front(), image->width() * 4); 227 image->readPixels(pixmap, 0, 0); 228 SkPixmap inset; 229 if (pixmap.extractSubset(&inset, {128, 128, 512, 512})) { 230 const SkImageInfo& info = inset.info(); 231 const char* alphas[] = {"Unknown", "Opaque", "Premul", "Unpremul"}; 232 const char* colors[] = {"Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", 233 "RGB_888x", "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16"}; 234 SkDebugf("width: %d height: %d color: %s alpha: %s\n", info.width(), info.height(), 235 colors[info.colorType()], alphas[info.alphaType()]); 236 } 237 #StdOut 238 width: 384 height: 384 color: BGRA_8888 alpha: Opaque 239 ## 240 ## 241 242 #SeeAlso Image_Info 243 244 ## 245 246 # ------------------------------------------------------------------------------ 247 248 #Method size_t rowBytes() const 249 250 #In Image_Info_Access 251 #Line # returns interval between rows in bytes ## 252 Returns row bytes, the interval from one pixel row to the next. Row bytes 253 is at least as large as: #Formula # width() * info().bytesPerPixel() ##. 254 255 Returns zero if colorType is kUnknown_SkColorType. 256 It is up to the Bitmap creator to ensure that row bytes is a useful value. 257 258 #Return byte length of pixel row ## 259 260 #Example 261 SkPixmap badPixmap = {SkImageInfo::MakeA8(4, 4), nullptr, 2}; 262 SkPixmap okPixmap = {SkImageInfo::MakeA8(4, 4), nullptr, 8}; 263 for (auto& pixmap : { badPixmap, okPixmap } ) { 264 SkDebugf("rowBytes: %d minRowBytes: %d\n", pixmap.rowBytes(), 265 pixmap.info().minRowBytes()); 266 } 267 #StdOut 268 rowBytes: 2 minRowBytes: 4 269 rowBytes: 8 minRowBytes: 4 270 ## 271 ## 272 273 #SeeAlso addr() info() SkImageInfo::minRowBytes 274 275 ## 276 277 # ------------------------------------------------------------------------------ 278 279 #Method const void* addr() const 280 281 #In Image_Info_Access 282 #Line # returns readable pixel address as void pointer ## 283 #Populate 284 285 #Example 286 #Image 3 287 std::vector<int32_t> pixels; 288 pixels.resize(image->height() * image->width() * 4); 289 SkPixmap pixmap(SkImageInfo::Make(image->width(), image->height(), kN32_SkColorType, 290 image->alphaType()), (const void*) &pixels.front(), image->width() * 4); 291 image->readPixels(pixmap, 0, 0); 292 SkDebugf("pixels address: 0x%llx\n", pixmap.addr()); 293 SkPixmap inset; 294 if (pixmap.extractSubset(&inset, {128, 128, 512, 512})) { 295 SkDebugf("inset address: 0x%llx\n", inset.addr()); 296 } 297 #StdOut 298 #Volatile 299 pixels address: 0x7f2a440bb010 300 inset address: 0x7f2a440fb210 301 ## 302 ## 303 304 #SeeAlso addr(int x, int y) addr8 addr16 addr32 addr64 info() rowBytes() 305 306 ## 307 308 # ------------------------------------------------------------------------------ 309 310 #Method int width() const 311 312 #In Image_Info_Access 313 #Line # returns pixel column count ## 314 Returns pixel count in each pixel row. Should be equal or less than: 315 316 #Formula # rowBytes() / info().bytesPerPixel() ##. 317 318 #Return pixel width in Image_Info ## 319 320 #Example 321 SkImageInfo info = SkImageInfo::MakeA8(16, 32); 322 SkPixmap pixmap(info, nullptr, 64); 323 SkDebugf("pixmap width: %d info width: %d\n", pixmap.width(), info.width()); 324 #StdOut 325 pixmap width: 16 info width: 16 326 ## 327 ## 328 329 #SeeAlso height() SkImageInfo::width() 330 331 ## 332 333 # ------------------------------------------------------------------------------ 334 335 #Method int height() const 336 337 #In Image_Info_Access 338 #Line # returns pixel row count ## 339 #Populate 340 341 #Example 342 SkPixmap pixmap(SkImageInfo::MakeA8(16, 32), nullptr, 64); 343 SkDebugf("pixmap height: %d info height: %d\n", pixmap.height(), pixmap.info().height()); 344 #StdOut 345 pixmap height: 32 info height: 32 346 ## 347 ## 348 349 #SeeAlso width SkImageInfo::height 350 351 ## 352 353 # ------------------------------------------------------------------------------ 354 355 #Method SkColorType colorType() const 356 357 #In Image_Info_Access 358 #Line # returns Image_Info Color_Type ## 359 Returns Color_Type, one of: #list_of_color_types#. 360 361 #Return Color_Type in Image_Info ## 362 363 #Example 364 const char* colors[] = {"Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x", 365 "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16"}; 366 SkPixmap pixmap(SkImageInfo::MakeA8(16, 32), nullptr, 64); 367 SkDebugf("color type: k" "%s" "_SkColorType\n", colors[pixmap.colorType()]); 368 #StdOut 369 color type: kAlpha_8_SkColorType 370 ## 371 ## 372 373 #SeeAlso alphaType() SkImageInfo::colorType 374 375 ## 376 377 # ------------------------------------------------------------------------------ 378 379 #Method SkAlphaType alphaType() const 380 381 #In Image_Info_Access 382 #Line # returns Image_Info Alpha_Type ## 383 Returns Alpha_Type, one of: #list_of_alpha_types#. 384 385 #Return Alpha_Type in Image_Info ## 386 387 #Example 388 const char* alphas[] = {"Unknown", "Opaque", "Premul", "Unpremul"}; 389 SkPixmap pixmap(SkImageInfo::MakeA8(16, 32), nullptr, 64); 390 SkDebugf("alpha type: k" "%s" "_SkAlphaType\n", alphas[pixmap.alphaType()]); 391 #StdOut 392 alpha type: kPremul_SkAlphaType 393 ## 394 ## 395 396 #SeeAlso colorType() SkImageInfo::alphaType 397 398 ## 399 400 # ------------------------------------------------------------------------------ 401 402 #Method SkColorSpace* colorSpace() const 403 404 #In Image_Info_Access 405 #Line # returns Image_Info Color_Space ## 406 #Populate 407 408 #Example 409 #Description 410 SkColorSpace::MakeSRGBLinear creates Color_Space with linear gamma 411 and an sRGB gamut. This Color_Space gamma is not close to sRGB gamma. 412 ## 413 SkPixmap pixmap(SkImageInfo::MakeN32(16, 32, kPremul_SkAlphaType, 414 SkColorSpace::MakeSRGBLinear()), nullptr, 64); 415 SkColorSpace* colorSpace = pixmap.colorSpace(); 416 SkDebugf("gammaCloseToSRGB: %s gammaIsLinear: %s isSRGB: %s\n", 417 colorSpace->gammaCloseToSRGB() ? "true" : "false", 418 colorSpace->gammaIsLinear() ? "true" : "false", 419 colorSpace->isSRGB() ? "true" : "false"); 420 #StdOut 421 gammaCloseToSRGB: false gammaIsLinear: true isSRGB: false 422 ## 423 ## 424 425 #SeeAlso Color_Space SkImageInfo::colorSpace 426 427 ## 428 429 # ------------------------------------------------------------------------------ 430 431 #Method bool isOpaque() const 432 433 #In Image_Info_Access 434 #Line # returns true if Image_Info describes opaque pixels ## 435 #Populate 436 437 #Example 438 #Description 439 isOpaque ignores whether all pixels are opaque or not. 440 ## 441 std::vector<uint32_t> pixels; 442 const int height = 2; 443 const int width = 2; 444 pixels.resize(height * width * 4); 445 SkPixmap pixmap(SkImageInfo::Make(width, height, kN32_SkColorType, 446 kPremul_SkAlphaType), (const void*) &pixels.front(), width * 4); 447 for (int index = 0; index < 2; ++index) { 448 pixmap.erase(0x00000000); 449 SkDebugf("isOpaque: %s\n", pixmap.isOpaque() ? "true" : "false"); 450 pixmap.erase(0xFFFFFFFF); 451 SkDebugf("isOpaque: %s\n", pixmap.isOpaque() ? "true" : "false"); 452 pixmap.reset(pixmap.info().makeAlphaType(kOpaque_SkAlphaType), 453 (const void*) &pixels.front(), width * 4); 454 } 455 #StdOut 456 isOpaque: false 457 isOpaque: false 458 isOpaque: true 459 isOpaque: true 460 ## 461 ## 462 463 #SeeAlso computeIsOpaque SkImageInfo::isOpaque 464 465 ## 466 467 # ------------------------------------------------------------------------------ 468 469 #Method SkIRect bounds() const 470 471 #In Image_Info_Access 472 #Line # returns width and height as Rectangle ## 473 #Populate 474 475 #Example 476 for (int width : { 0, 2 } ) { 477 for (int height : { 0, 2 } ) { 478 SkPixmap pixmap(SkImageInfo::MakeA8(width, height), nullptr, width); 479 SkDebugf("width: %d height: %d empty: %s\n", width, height, 480 pixmap.bounds().isEmpty() ? "true" : "false"); 481 } 482 } 483 #StdOut 484 width: 0 height: 0 empty: true 485 width: 0 height: 2 empty: true 486 width: 2 height: 0 empty: true 487 width: 2 height: 2 empty: false 488 ## 489 ## 490 491 #SeeAlso height() width() IRect 492 493 ## 494 495 # ------------------------------------------------------------------------------ 496 497 #Method int rowBytesAsPixels() const 498 499 #In Image_Info_Access 500 #Line # returns interval between rows in pixels ## 501 #Populate 502 503 #Example 504 for (int rowBytes : { 4, 5, 6, 7, 8} ) { 505 SkPixmap pixmap(SkImageInfo::MakeN32(1, 1, kPremul_SkAlphaType), nullptr, rowBytes); 506 SkDebugf("rowBytes: %d rowBytesAsPixels: %d\n", rowBytes, pixmap.rowBytesAsPixels()); 507 } 508 #StdOut 509 rowBytes: 4 rowBytesAsPixels: 1 510 rowBytes: 5 rowBytesAsPixels: 1 511 rowBytes: 6 rowBytesAsPixels: 1 512 rowBytes: 7 rowBytesAsPixels: 1 513 rowBytes: 8 rowBytesAsPixels: 2 514 ## 515 ## 516 517 #SeeAlso rowBytes shiftPerPixel width SkImageInfo::bytesPerPixel 518 519 ## 520 521 # ------------------------------------------------------------------------------ 522 523 #Method int shiftPerPixel() const 524 525 #In Image_Info_Access 526 #Line # returns bit shift from pixels to bytes ## 527 #Populate 528 529 #Example 530 const char* colors[] = {"Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x", 531 "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16"}; 532 SkImageInfo info = SkImageInfo::MakeA8(1, 1); 533 for (SkColorType colorType : { kUnknown_SkColorType, kAlpha_8_SkColorType, 534 kRGB_565_SkColorType, kARGB_4444_SkColorType, 535 kRGBA_8888_SkColorType, kBGRA_8888_SkColorType, 536 kGray_8_SkColorType, kRGBA_F16_SkColorType } ) { 537 SkPixmap pixmap(info.makeColorType(colorType), nullptr, 4); 538 SkDebugf("color: k" "%s" "_SkColorType" "%*s" "bytesPerPixel: %d shiftPerPixel: %d\n", 539 colors[colorType], 10 - strlen(colors[colorType]), " ", 540 pixmap.info().bytesPerPixel(), pixmap.shiftPerPixel()); 541 } 542 #StdOut 543 color: kUnknown_SkColorType bytesPerPixel: 0 shiftPerPixel: 0 544 color: kAlpha_8_SkColorType bytesPerPixel: 1 shiftPerPixel: 0 545 color: kRGB_565_SkColorType bytesPerPixel: 2 shiftPerPixel: 1 546 color: kARGB_4444_SkColorType bytesPerPixel: 2 shiftPerPixel: 1 547 color: kRGBA_8888_SkColorType bytesPerPixel: 4 shiftPerPixel: 2 548 color: kBGRA_8888_SkColorType bytesPerPixel: 4 shiftPerPixel: 2 549 color: kGray_8_SkColorType bytesPerPixel: 1 shiftPerPixel: 0 550 color: kRGBA_F16_SkColorType bytesPerPixel: 8 shiftPerPixel: 3 551 ## 552 ## 553 554 #SeeAlso rowBytes rowBytesAsPixels width SkImageInfo::bytesPerPixel 555 556 ## 557 558 # ------------------------------------------------------------------------------ 559 560 #Method size_t computeByteSize() const 561 562 #In Image_Info_Access 563 #Line # returns size required for pixels ## 564 #Populate 565 566 #Example 567 SkPixmap pixmap; 568 for (int width : { 1, 1000, 1000000 } ) { 569 for (int height: { 1, 1000, 1000000 } ) { 570 SkImageInfo imageInfo = SkImageInfo::MakeN32(width, height, kPremul_SkAlphaType); 571 pixmap.reset(imageInfo, nullptr, width * 5); 572 SkDebugf("width: %7d height: %7d computeByteSize: %13lld\n", width, height, 573 pixmap.computeByteSize()); 574 } 575 } 576 #StdOut 577 width: 1 height: 1 computeByteSize: 4 578 width: 1 height: 1000 computeByteSize: 4999 579 width: 1 height: 1000000 computeByteSize: 4999999 580 width: 1000 height: 1 computeByteSize: 4000 581 width: 1000 height: 1000 computeByteSize: 4999000 582 width: 1000 height: 1000000 computeByteSize: 4999999000 583 width: 1000000 height: 1 computeByteSize: 4000000 584 width: 1000000 height: 1000 computeByteSize: 4999000000 585 width: 1000000 height: 1000000 computeByteSize: 4999999000000 586 ## 587 ## 588 589 #SeeAlso SkImageInfo::computeByteSize 590 591 ## 592 593 #Subtopic Image_Info_Access ## 594 595 #Subtopic Reader 596 #Line # examine pixel value ## 597 598 # ------------------------------------------------------------------------------ 599 600 #Method bool computeIsOpaque() const 601 602 #In Reader 603 #Line # returns true if all pixels are opaque ## 604 #Populate 605 606 #Example 607 std::vector<uint32_t> pixels; 608 const int height = 2; 609 const int width = 2; 610 pixels.resize(height * width * 4); 611 SkPixmap pixmap(SkImageInfo::Make(width, height, kN32_SkColorType, 612 kPremul_SkAlphaType), (const void*) &pixels.front(), width * 4); 613 for (int index = 0; index < 2; ++index) { 614 pixmap.erase(0x00000000); 615 SkDebugf("computeIsOpaque: %s\n", pixmap.computeIsOpaque() ? "true" : "false"); 616 pixmap.erase(0xFFFFFFFF); 617 SkDebugf("computeIsOpaque: %s\n", pixmap.computeIsOpaque() ? "true" : "false"); 618 pixmap.reset(pixmap.info().makeAlphaType(kOpaque_SkAlphaType), 619 (const void*) &pixels.front(), width * 4); 620 } 621 #StdOut 622 computeIsOpaque: false 623 computeIsOpaque: true 624 computeIsOpaque: false 625 computeIsOpaque: true 626 ## 627 ## 628 629 #SeeAlso isOpaque Color_Type Alpha 630 631 ## 632 633 # ------------------------------------------------------------------------------ 634 635 #Method SkColor getColor(int x, int y) const 636 637 #In Reader 638 #Line # returns one pixel as Unpremultiplied Color ## 639 #Populate 640 641 #Example 642 const int w = 4; 643 const int h = 4; 644 std::vector<SkPMColor> storage; 645 storage.resize(w * h); 646 SkDebugf("Premultiplied:\n"); 647 for (int y = 0; y < h; ++y) { 648 SkDebugf("(0, %d) ", y); 649 for (int x = 0; x < w; ++x) { 650 int a = 0xFF * (x + y) / (w - 1 + h - 1); 651 storage[x + y * w] = SkPackARGB32(a, a * x / (w - 1), a * y / (h - 1), a); 652 SkDebugf("0x%08x%c", storage[x + y * w], x == w - 1 ? '\n' : ' '); 653 } 654 } 655 SkPixmap pixmap(SkImageInfo::MakeN32(w, h, kPremul_SkAlphaType), &storage.front(), w * 4); 656 SkDebugf("Unpremultiplied:\n"); 657 for (int y = 0; y < h; ++y) { 658 SkDebugf("(0, %d) ", y); 659 for (int x = 0; x < w; ++x) { 660 SkDebugf("0x%08x%c", pixmap.getColor(x, y), x == w - 1 ? '\n' : ' '); 661 } 662 } 663 #StdOut 664 Premultiplied: 665 (0, 0) 0x00000000 0x2a0e002a 0x55380055 0x7f7f007f 666 (0, 1) 0x2a000e2a 0x551c1c55 0x7f542a7f 0xaaaa38aa 667 (0, 2) 0x55003855 0x7f2a547f 0xaa7171aa 0xd4d48dd4 668 (0, 3) 0x7f007f7f 0xaa38aaaa 0xd48dd4d4 0xffffffff 669 Unpremultiplied: 670 (0, 0) 0x00000000 0x2a5500ff 0x55a800ff 0x7fff00ff 671 (0, 1) 0x2a0055ff 0x555454ff 0x7fa954ff 0xaaff54ff 672 (0, 2) 0x5500a8ff 0x7f54a9ff 0xaaaaaaff 0xd4ffaaff 673 (0, 3) 0x7f00ffff 0xaa54ffff 0xd4aaffff 0xffffffff 674 ## 675 ## 676 677 #SeeAlso getAlphaf addr() readPixels 678 679 ## 680 681 #Method float getAlphaf(int x, int y) const 682 #In Property 683 #Line # returns Alpha normalized from zero to one ## 684 685 Looks up the pixel at (x,y) and return its alpha component, normalized to [0..1]. 686 This is roughly equivalent to #Formula # SkGetColorA(getColor()) ##, but can be more efficient 687 (and more precise if the pixels store more than 8 bits per component). 688 689 #Param x column index, zero or greater, and less than width() ## 690 #Param y row index, zero or greater, and less than height() ## 691 692 #Return alpha converted to normalized float ## 693 694 #NoExample 695 ## 696 697 #SeeAlso getColor 698 699 ## 700 701 #Subtopic Reader ## 702 703 #Subtopic Readable_Address 704 #Line # returns read only pixels ## 705 706 # ------------------------------------------------------------------------------ 707 708 #Method const void* addr(int x, int y) const 709 710 #In Readable_Address 711 #Populate 712 713 #Example 714 const int w = 4; 715 const int h = 4; 716 std::vector<SkPMColor> storage; 717 storage.resize(w * h); 718 SkPixmap pixmap(SkImageInfo::MakeN32(w, h, kPremul_SkAlphaType), &storage.front(), w * 4); 719 SkDebugf("pixmap.addr(1, 2) %c= &storage[1 + 2 * w]\n", 720 pixmap.addr(1, 2) == &storage[1 + 2 * w] ? '=' : '!'); 721 #StdOut 722 pixmap.addr(1, 2) == &storage[1 + 2 * w] 723 ## 724 ## 725 726 #SeeAlso addr8 addr16 addr32 addr64 addrF16 getColor writable_addr SkBitmap::getAddr 727 728 ## 729 730 # ------------------------------------------------------------------------------ 731 732 #Method const uint8_t* addr8() const 733 734 #In Readable_Address 735 #Line # returns readable pixel address as 8-bit pointer ## 736 #Populate 737 738 #Example 739 const int w = 4; 740 const int h = 4; 741 uint8_t storage[w * h]; 742 SkPixmap pixmap(SkImageInfo::Make(w, h, kGray_8_SkColorType, kPremul_SkAlphaType), 743 storage, w * sizeof(storage[0])); 744 SkDebugf("pixmap.addr8() %c= storage\n", 745 pixmap.addr8() == storage ? '=' : '!'); 746 #StdOut 747 pixmap.addr8() == storage 748 ## 749 ## 750 751 #SeeAlso addr() addr16 addr32 addr64 addrF16 getColor writable_addr writable_addr8 752 753 ## 754 755 # ------------------------------------------------------------------------------ 756 757 #Method const uint16_t* addr16() const 758 759 #In Readable_Address 760 #Line # returns readable pixel address as 16-bit pointer ## 761 #Populate 762 763 #Example 764 const int w = 4; 765 const int h = 4; 766 uint16_t storage[w * h]; 767 SkPixmap pixmap(SkImageInfo::Make(w, h, kARGB_4444_SkColorType, kPremul_SkAlphaType), 768 storage, w * sizeof(storage[0])); 769 SkDebugf("pixmap.addr16() %c= storage\n", 770 pixmap.addr16() == storage ? '=' : '!'); 771 #StdOut 772 pixmap.addr16() == storage 773 ## 774 ## 775 776 #SeeAlso addr() addr8 addr32 addr64 addrF16 getColor writable_addr writable_addr16 777 778 ## 779 780 # ------------------------------------------------------------------------------ 781 782 #Method const uint32_t* addr32() const 783 784 #In Readable_Address 785 #Line # returns readable pixel address as 32-bit pointer ## 786 #Populate 787 788 #Example 789 const int w = 4; 790 const int h = 4; 791 uint32_t storage[w * h]; 792 SkPixmap pixmap(SkImageInfo::MakeN32(w, h, kPremul_SkAlphaType), 793 storage, w * sizeof(storage[0])); 794 SkDebugf("pixmap.addr32() %c= storage\n", 795 pixmap.addr32() == storage ? '=' : '!'); 796 #StdOut 797 pixmap.addr32() == storage 798 ## 799 ## 800 801 #SeeAlso addr() addr8 addr16 addr64 addrF16 getColor writable_addr writable_addr32 802 803 ## 804 805 # ------------------------------------------------------------------------------ 806 807 #Method const uint64_t* addr64() const 808 809 #In Readable_Address 810 #Line # returns readable pixel address as 64-bit pointer ## 811 #Populate 812 813 #Example 814 const int w = 4; 815 const int h = 4; 816 uint64_t storage[w * h]; 817 SkPixmap pixmap(SkImageInfo::Make(w, h, kRGBA_F16_SkColorType, kPremul_SkAlphaType), 818 storage, w * sizeof(storage[0])); 819 SkDebugf("pixmap.addr64() %c= storage\n", 820 pixmap.addr64() == storage ? '=' : '!'); 821 #StdOut 822 pixmap.addr64() == storage 823 ## 824 ## 825 826 #SeeAlso addr() addr8 addr16 addr32 addrF16 getColor writable_addr writable_addr64 827 828 ## 829 830 # ------------------------------------------------------------------------------ 831 832 #Method const uint16_t* addrF16() const 833 834 #In Readable_Address 835 #Line # returns readable pixel component address as 16-bit pointer ## 836 #Populate 837 838 #Example 839 const int w = 4; 840 const int h = 4; 841 uint16_t storage[w * h * 4]; 842 SkPixmap pixmap(SkImageInfo::Make(w, h, kRGBA_F16_SkColorType, kPremul_SkAlphaType), 843 storage, w * 4 * sizeof(storage[0])); 844 SkDebugf("pixmap.addrF16() %c= storage\n", 845 pixmap.addrF16() == storage ? '=' : '!'); 846 #StdOut 847 pixmap.addrF16() == storage 848 ## 849 ## 850 851 #SeeAlso addr() addr8 addr16 addr32 addr64 getColor writable_addr writable_addrF16 852 853 ## 854 855 # ------------------------------------------------------------------------------ 856 857 #Method const uint8_t* addr8(int x, int y) const 858 859 #In Readable_Address 860 #Populate 861 862 #Example 863 const int w = 4; 864 const int h = 4; 865 uint8_t storage[w * h]; 866 SkPixmap pixmap(SkImageInfo::Make(w, h, kGray_8_SkColorType, kPremul_SkAlphaType), 867 storage, w * sizeof(storage[0])); 868 SkDebugf("pixmap.addr8(1, 2) %c= &storage[1 + 2 * w]\n", 869 pixmap.addr8(1, 2) == &storage[1 + 2 * w] ? '=' : '!'); 870 #StdOut 871 pixmap.addr8(1, 2) == &storage[1 + 2 * w] 872 ## 873 ## 874 875 #SeeAlso addr() addr16 addr32 addr64 addrF16 getColor writable_addr writable_addr8 876 877 ## 878 879 # ------------------------------------------------------------------------------ 880 881 #Method const uint16_t* addr16(int x, int y) const 882 883 #In Readable_Address 884 #Populate 885 886 #Example 887 const int w = 4; 888 const int h = 4; 889 uint16_t storage[w * h]; 890 SkPixmap pixmap(SkImageInfo::Make(w, h, kARGB_4444_SkColorType, kPremul_SkAlphaType), 891 storage, w * sizeof(storage[0])); 892 SkDebugf("pixmap.addr16(1, 2) %c= &storage[1 + 2 * w]\n", 893 pixmap.addr16(1, 2) == &storage[1 + 2 * w] ? '=' : '!'); 894 #StdOut 895 pixmap.addr16(1, 2) == &storage[1 + 2 * w] 896 ## 897 ## 898 899 #SeeAlso addr() addr8 addr32 addr64 addrF16 getColor writable_addr writable_addr16 900 901 ## 902 903 # ------------------------------------------------------------------------------ 904 905 #Method const uint32_t* addr32(int x, int y) const 906 907 #In Readable_Address 908 #Populate 909 910 #Example 911 const int w = 4; 912 const int h = 4; 913 uint32_t storage[w * h]; 914 SkPixmap pixmap(SkImageInfo::Make(w, h, kRGBA_8888_SkColorType, kPremul_SkAlphaType), 915 storage, w * sizeof(storage[0])); 916 SkDebugf("pixmap.addr32(1, 2) %c= &storage[1 + 2 * w]\n", 917 pixmap.addr32(1, 2) == &storage[1 + 2 * w] ? '=' : '!'); 918 #StdOut 919 pixmap.addr32(1, 2) == &storage[1 + 2 * w] 920 ## 921 ## 922 923 #SeeAlso addr() addr8 addr16 addr64 addrF16 getColor writable_addr writable_addr64 924 925 ## 926 927 # ------------------------------------------------------------------------------ 928 929 #Method const uint64_t* addr64(int x, int y) const 930 931 #In Readable_Address 932 #Populate 933 934 #Example 935 const int w = 4; 936 const int h = 4; 937 uint64_t storage[w * h]; 938 SkPixmap pixmap(SkImageInfo::Make(w, h, kRGBA_F16_SkColorType, kPremul_SkAlphaType), 939 storage, w * sizeof(storage[0])); 940 SkDebugf("pixmap.addr64(1, 2) %c= &storage[1 + 2 * w]\n", 941 pixmap.addr64(1, 2) == &storage[1 + 2 * w] ? '=' : '!'); 942 #StdOut 943 pixmap.addr64(1, 2) == &storage[1 + 2 * w] 944 ## 945 ## 946 947 #SeeAlso addr() addr8 addr16 addr32 addrF16 getColor writable_addr writable_addr64 948 949 ## 950 951 # ------------------------------------------------------------------------------ 952 953 #Method const uint16_t* addrF16(int x, int y) const 954 955 #In Readable_Address 956 #Populate 957 958 #Example 959 const int w = 4; 960 const int h = 4; 961 const int wordsPerPixel = 4; 962 const int rowWords = w * wordsPerPixel; 963 uint16_t storage[rowWords * h]; 964 SkPixmap pixmap(SkImageInfo::Make(w, h, kRGBA_F16_SkColorType, kPremul_SkAlphaType), 965 storage, rowWords * sizeof(storage[0])); 966 SkDebugf("pixmap.addrF16(1, 2) %c= &storage[1 * wordsPerPixel + 2 * rowWords]\n", 967 pixmap.addrF16(1, 2) == &storage[1 * wordsPerPixel + 2 * rowWords] ? '=' : '!'); 968 #StdOut 969 pixmap.addrF16(1, 2) == &storage[1 * wordsPerPixel + 2 * rowWords] 970 ## 971 ## 972 973 #SeeAlso addr() addr8 addr16 addr32 addr64 getColor writable_addr writable_addrF16 974 975 ## 976 977 #Subtopic Readable_Address ## 978 979 #Subtopic Writable_Address 980 #Line # returns writable pixels ## 981 982 # ------------------------------------------------------------------------------ 983 984 #Method void* writable_addr() const 985 986 #In Writable_Address 987 #Line # returns writable pixel address as void pointer ## 988 #Populate 989 990 #Example 991 const int w = 4; 992 const int h = 4; 993 SkPMColor storage[w * h * 4]; 994 SkPixmap pixmap(SkImageInfo::MakeN32(w, h, kPremul_SkAlphaType), storage, w * 4); 995 SkDebugf("pixmap.writable_addr() %c= (void *)storage\n", 996 pixmap.writable_addr() == (void *)storage ? '=' : '!'); 997 pixmap.erase(0x00000000); 998 *(SkPMColor*)pixmap.writable_addr() = 0xFFFFFFFF; 999 SkDebugf("pixmap.getColor(0, 1) %c= 0x00000000\n", 1000 pixmap.getColor(0, 1) == 0x00000000 ? '=' : '!'); 1001 SkDebugf("pixmap.getColor(0, 0) %c= 0xFFFFFFFF\n", 1002 pixmap.getColor(0, 0) == 0xFFFFFFFF ? '=' : '!'); 1003 #StdOut 1004 pixmap.writable_addr() == (void *)storage 1005 pixmap.getColor(0, 1) == 0x00000000 1006 pixmap.getColor(0, 0) == 0xFFFFFFFF 1007 ## 1008 ## 1009 1010 #SeeAlso writable_addr8 writable_addr16 writable_addr32 writable_addr64 writable_addrF16 addr() 1011 1012 ## 1013 1014 # ------------------------------------------------------------------------------ 1015 1016 #Method void* writable_addr(int x, int y) const 1017 1018 #In Writable_Address 1019 #Populate 1020 1021 #Example 1022 const int w = 4; 1023 const int h = 4; 1024 SkPMColor storage[w * h * 4]; 1025 SkPixmap pixmap(SkImageInfo::MakeN32(w, h, kPremul_SkAlphaType), storage, w * 4); 1026 SkDebugf("pixmap.writable_addr() %c= (void *)storage\n", 1027 pixmap.writable_addr() == (void *)storage ? '=' : '!'); 1028 pixmap.erase(0x00000000); 1029 *(SkPMColor*)pixmap.writable_addr(1, 2) = 0xFFFFFFFF; 1030 SkDebugf("pixmap.getColor(0, 0) %c= 0x00000000\n", 1031 pixmap.getColor(0, 0) == 0x00000000 ? '=' : '!'); 1032 SkDebugf("pixmap.getColor(1, 2) %c= 0xFFFFFFFF\n", 1033 pixmap.getColor(1, 2) == 0xFFFFFFFF ? '=' : '!'); 1034 #StdOut 1035 pixmap.writable_addr() == (void *)storage 1036 pixmap.getColor(0, 0) == 0x00000000 1037 pixmap.getColor(1, 2) == 0xFFFFFFFF 1038 ## 1039 ## 1040 1041 #SeeAlso writable_addr8 writable_addr16 writable_addr32 writable_addr64 writable_addrF16 addr() 1042 1043 ## 1044 1045 # ------------------------------------------------------------------------------ 1046 1047 #Method uint8_t* writable_addr8(int x, int y) const 1048 1049 #In Writable_Address 1050 #Line # returns writable pixel address as 8-bit pointer ## 1051 #Populate 1052 1053 #Example 1054 #Height 64 1055 #Description 1056 Altering pixels after drawing Bitmap is not guaranteed to affect subsequent 1057 drawing on all platforms. Adding a second SkBitmap::installPixels after editing 1058 pixel memory is safer. 1059 ## 1060 void draw(SkCanvas* canvas) { 1061 uint8_t storage[][5] = {{ 0, 0, 64, 0, 0}, 1062 { 0, 128, 255, 128, 0}, 1063 {64, 255, 255, 255, 64}, 1064 { 0, 128, 255, 128, 0}, 1065 { 0, 0, 64, 0, 0}}; 1066 SkImageInfo imageInfo = SkImageInfo::Make(5, 5, kGray_8_SkColorType, kPremul_SkAlphaType); 1067 SkPixmap pixmap(imageInfo, storage[0], 5); 1068 SkBitmap bitmap; 1069 bitmap.installPixels(pixmap); 1070 canvas->scale(10, 10); 1071 canvas->drawBitmap(bitmap, 0, 0); 1072 *pixmap.writable_addr8(2, 2) = 0; 1073 // bitmap.installPixels(pixmap); // uncomment to fix on GPU 1074 canvas->drawBitmap(bitmap, 10, 0); 1075 } 1076 ## 1077 1078 #SeeAlso writable_addr writable_addr16 writable_addr32 writable_addr64 writable_addrF16 addr() addr8 1079 1080 ## 1081 1082 # ------------------------------------------------------------------------------ 1083 1084 #Method uint16_t* writable_addr16(int x, int y) const 1085 1086 #In Writable_Address 1087 #Line # returns writable pixel address as 16-bit pointer ## 1088 #Populate 1089 1090 #Example 1091 #Description 1092 Draw a five by five bitmap, and draw it again with a center black pixel. 1093 The low nibble of the 16-bit word is Alpha. 1094 ## 1095 #Height 64 1096 uint16_t storage[][5] = {{ 0xCABF, 0xDABE, 0xCA9D, 0xC96C, 0xA39B }, 1097 { 0xACEE, 0xA87C, 0x893A, 0x4779, 0x8708 }, 1098 { 0x4B7C, 0x255B, 0x2559, 0x2557, 0x4656 }, 1099 { 0x9099, 0x8128, 0x2557, 0x4124, 0x3323 }, 1100 { 0x7547, 0x5505, 0x4434, 0x2012, 0x0000 }}; 1101 SkImageInfo imageInfo = SkImageInfo::Make(5, 5, kARGB_4444_SkColorType, kPremul_SkAlphaType); 1102 SkPixmap pixmap(imageInfo, storage[0], sizeof(storage) / 5); 1103 SkBitmap bitmap; 1104 bitmap.installPixels(pixmap); 1105 canvas->scale(10, 10); 1106 canvas->drawBitmap(bitmap, 0, 0); 1107 *pixmap.writable_addr16(2, 2) = 0x000F; 1108 bitmap.installPixels(pixmap); 1109 canvas->drawBitmap(bitmap, 10, 0); 1110 ## 1111 1112 #SeeAlso writable_addr writable_addr8 writable_addr32 writable_addr64 writable_addrF16 addr() addr16 1113 1114 ## 1115 1116 # ------------------------------------------------------------------------------ 1117 1118 #Method uint32_t* writable_addr32(int x, int y) const 1119 1120 #In Writable_Address 1121 #Line # returns writable pixel address as 32-bit pointer ## 1122 #Populate 1123 1124 #Example 1125 #Image 4 1126 #Height 72 1127 std::vector<int32_t> pixels; 1128 pixels.resize(image->height() * image->width() * 4); 1129 SkPixmap pixmap(SkImageInfo::Make(image->width(), image->height(), kN32_SkColorType, 1130 image->alphaType()), (const void*) &pixels.front(), image->width() * 4); 1131 image->readPixels(pixmap, 0, 0); 1132 for (int y = 0; y < pixmap.height() / 2; ++y) { 1133 for (int x = 0; x < pixmap.width(); ++x) { 1134 if ((x & 4) == (y & 4)) { 1135 *pixmap.writable_addr32(x, y) = 1136 *pixmap.writable_addr32(pixmap.width() - x, pixmap.height() - y); 1137 } 1138 } 1139 } 1140 SkBitmap bitmap; 1141 bitmap.installPixels(pixmap); 1142 canvas->drawBitmap(bitmap, 0, 0); 1143 ## 1144 1145 #SeeAlso writable_addr writable_addr8 writable_addr16 writable_addr64 writable_addrF16 addr() addr32 1146 1147 ## 1148 1149 # ------------------------------------------------------------------------------ 1150 1151 #Method uint64_t* writable_addr64(int x, int y) const 1152 1153 #In Writable_Address 1154 #Line # returns writable pixel address as 64-bit pointer ## 1155 #Populate 1156 1157 #Example 1158 #Height 40 1159 SkImageInfo info = SkImageInfo::Make(3, 3, kRGBA_F16_SkColorType, kPremul_SkAlphaType); 1160 uint64_t storage[9]; 1161 SkPixmap pixmap(info, storage, 3 * sizeof(uint64_t)); 1162 SkColor4f c4 { 1, 0.45f, 0.25f, 0.65f }; 1163 pixmap.erase(c4); 1164 SkBitmap bitmap; 1165 canvas->scale(10, 10); 1166 bitmap.installPixels(pixmap); 1167 canvas->drawBitmap(bitmap, 0, 0); 1168 *pixmap.writable_addr64(1, 1) |= 0x00ff000000000000LL; 1169 bitmap.installPixels(pixmap); 1170 canvas->drawBitmap(bitmap, 10, 0); 1171 ## 1172 1173 #SeeAlso writable_addr writable_addr8 writable_addr16 writable_addr32 writable_addrF16 addr() addr64 1174 1175 ## 1176 1177 # ------------------------------------------------------------------------------ 1178 1179 #Method uint16_t* writable_addrF16(int x, int y) const 1180 1181 #In Writable_Address 1182 #Line # returns writable pixel component address as 16-bit pointer ## 1183 #Populate 1184 1185 #Example 1186 #Height 64 1187 #Description 1188 Left bitmap is drawn with two pixels defined in half float format. Right bitmap 1189 is drawn after overwriting bottom half float color with top half float color. 1190 ## 1191 SkImageInfo info = SkImageInfo::Make(1, 2, kRGBA_F16_SkColorType, kPremul_SkAlphaType); 1192 uint16_t storage[2][4]; 1193 SkPixmap pixmap(info, storage[0], sizeof(uint64_t)); 1194 SkIRect topPixelBounds = {0, 0, 1, 1}; 1195 pixmap.erase({ 0.65f, 0.45f, 0.25f, 1 }, &topPixelBounds); 1196 SkIRect bottomPixelBounds = {0, 1, 1, 2}; 1197 pixmap.erase({ 0.25f, 0.65f, 0.45f, 1 }, &bottomPixelBounds); 1198 SkBitmap bitmap; 1199 canvas->scale(20, 20); 1200 bitmap.installPixels(pixmap); 1201 canvas->drawBitmap(bitmap, 0, 0); 1202 uint16_t* pixel2 = pixmap.writable_addrF16(0, 1); 1203 for (int i = 0; i < 4; ++i) { 1204 pixel2[i] = storage[0][i]; 1205 } 1206 bitmap.installPixels(pixmap); 1207 canvas->drawBitmap(bitmap, 4, 0); 1208 ## 1209 1210 #SeeAlso writable_addr writable_addr8 writable_addr16 writable_addr32 writable_addr64 addr() addrF16 1211 1212 ## 1213 1214 #Subtopic Writable_Address ## 1215 1216 #Subtopic Pixels 1217 #Line # read and write pixel values ## 1218 ## 1219 1220 # ------------------------------------------------------------------------------ 1221 1222 #Method bool readPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRowBytes) const 1223 #In Pixels 1224 #Line # copies and converts pixels ## 1225 #Populate 1226 1227 #Example 1228 #Height 128 1229 #Description 1230 Transferring the gradient from 8 bits per component to 4 bits per component 1231 creates visible banding. 1232 ## 1233 std::vector<int32_t> pixels; 1234 const int width = 256; 1235 const int height = 64; 1236 pixels.resize(height * width * 4); 1237 SkImageInfo srcInfo = SkImageInfo::MakeN32Premul(width, height); 1238 SkPixmap srcPixmap(srcInfo, (const void*) &pixels.front(), width * 4); 1239 SkColor gradColors[] = { 0xFFAA3300, 0x7F881122 }; 1240 SkPoint gradPoints[] = { { 0, 0 }, { 256, 0 } }; 1241 SkPaint paint; 1242 paint.setShader(SkGradientShader::MakeLinear(gradPoints, gradColors, nullptr, 1243 SK_ARRAY_COUNT(gradColors), SkShader::kClamp_TileMode)); 1244 SkBitmap bitmap; 1245 bitmap.installPixels(srcPixmap); 1246 SkCanvas srcCanvas(bitmap); 1247 srcCanvas.drawRect(SkRect::MakeWH(width, height), paint); 1248 canvas->drawBitmap(bitmap, 0, 0); 1249 std::vector<int32_t> dstPixels; 1250 dstPixels.resize(height * width * 2); 1251 SkImageInfo dstInfo = srcInfo.makeColorType(kARGB_4444_SkColorType); 1252 srcPixmap.readPixels(dstInfo, &dstPixels.front(), width * 2); 1253 SkPixmap dstPixmap(dstInfo, &dstPixels.front(), width * 2); 1254 bitmap.installPixels(dstPixmap); 1255 canvas->drawBitmap(bitmap, 0, 128); 1256 ## 1257 1258 #SeeAlso erase SkBitmap::readPixels SkCanvas::drawBitmap SkCanvas::readPixels SkImage::readPixels SkSurface::readPixels 1259 1260 ## 1261 1262 # ------------------------------------------------------------------------------ 1263 1264 #Method bool readPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRowBytes, int srcX, 1265 int srcY) const 1266 1267 Copies a Rect of pixels to dstPixels. Copy starts at (srcX, srcY), and does not 1268 exceed Pixmap (width(), height()). 1269 1270 dstInfo specifies width, height, Color_Type, Alpha_Type, and 1271 Color_Space of destination. dstRowBytes specifics the gap from one destination 1272 row to the next. Returns true if pixels are copied. Returns false if 1273 dstInfo has no address, or dstRowBytes is less than dstInfo.minRowBytes(). 1274 1275 Pixels are copied only if pixel conversion is possible. If Pixmap colorType is 1276 kGray_8_SkColorType, or kAlpha_8_SkColorType; dstInfo.colorType() must match. 1277 If Pixmap colorType is kGray_8_SkColorType, dstInfo.colorSpace() must match. 1278 If Pixmap alphaType is kOpaque_SkAlphaType, dstInfo.alphaType() must 1279 match. If Pixmap colorSpace is nullptr, dstInfo.colorSpace() must match. Returns 1280 false if pixel conversion is not possible. 1281 1282 srcX and srcY may be negative to copy only top or left of source. Returns 1283 false if Pixmap width() or height() is zero or negative. Returns false if: 1284 1285 #Formula # abs(srcX) >= Pixmap width() ##, or if #Formula # abs(srcY) >= Pixmap height() ##. 1286 1287 #Param dstInfo destination width, height, Color_Type, Alpha_Type, Color_Space ## 1288 #Param dstPixels destination pixel storage ## 1289 #Param dstRowBytes destination row length ## 1290 #Param srcX column index whose absolute value is less than width() ## 1291 #Param srcY row index whose absolute value is less than height() ## 1292 1293 #Return true if pixels are copied to dstPixels ## 1294 1295 #Example 1296 #Image 3 1297 void draw(SkCanvas* canvas) { 1298 SkImageInfo info = SkImageInfo::MakeN32Premul(image->width(), image->height()); 1299 std::vector<int32_t> srcPixels; 1300 const int rowBytes = image->width() * 4; 1301 srcPixels.resize(image->height() * rowBytes); 1302 SkPixmap pixmap(info, (const void*) &srcPixels.front(), rowBytes); 1303 image->readPixels(pixmap, 0, 0); 1304 for (int offset : { 32, 64, 96 } ) { 1305 std::vector<int32_t> dstPixels; 1306 dstPixels.resize(image->height() * rowBytes); 1307 pixmap.readPixels(info, &dstPixels.front(), rowBytes, offset, 0); 1308 SkBitmap bitmap; 1309 SkPixmap dstmap(info, &dstPixels.front(), rowBytes); 1310 bitmap.installPixels(dstmap); 1311 canvas->translate(32, 32); 1312 canvas->drawBitmap(bitmap, 0, 0); 1313 } 1314 } 1315 ## 1316 1317 #SeeAlso erase SkBitmap::readPixels SkCanvas::drawBitmap SkCanvas::readPixels SkImage::readPixels SkSurface::readPixels 1318 1319 ## 1320 1321 # ------------------------------------------------------------------------------ 1322 1323 #Method bool readPixels(const SkPixmap& dst, int srcX, int srcY) const 1324 1325 Copies a Rect of pixels to dst. Copy starts at (srcX, srcY), and does not 1326 exceed Pixmap (width(), height()). dst specifies width, height, Color_Type, 1327 Alpha_Type, and Color_Space of destination. Returns true if pixels are copied. 1328 Returns false if dst.addr() equals nullptr, or dst.rowBytes() is less than 1329 dst SkImageInfo::minRowBytes. 1330 1331 Pixels are copied only if pixel conversion is possible. If Pixmap colorType is 1332 kGray_8_SkColorType, or kAlpha_8_SkColorType; dst.info().colorType() must match. 1333 If Pixmap colorType is kGray_8_SkColorType, dst.info().colorSpace() must match. 1334 If Pixmap alphaType is kOpaque_SkAlphaType, dst.info().alphaType() must 1335 match. If Pixmap colorSpace is nullptr, dst.info().colorSpace() must match. Returns 1336 false if pixel conversion is not possible. 1337 1338 srcX and srcY may be negative to copy only top or left of source. Returns 1339 false Pixmap width() or height() is zero or negative. Returns false if: 1340 1341 #Formula # abs(srcX) >= Pixmap width() ##, or if #Formula # abs(srcY) >= Pixmap height() ##. 1342 1343 #Param dst Image_Info and pixel address to write to ## 1344 #Param srcX column index whose absolute value is less than width() ## 1345 #Param srcY row index whose absolute value is less than height() ## 1346 1347 #Return true if pixels are copied to dst ## 1348 1349 #Example 1350 #Image 3 1351 void draw(SkCanvas* canvas) { 1352 SkImageInfo info = SkImageInfo::MakeN32Premul(image->width(), image->height()); 1353 std::vector<int32_t> srcPixels; 1354 const int rowBytes = image->width() * 4; 1355 srcPixels.resize(image->height() * rowBytes); 1356 SkPixmap pixmap(info, (const void*) &srcPixels.front(), rowBytes); 1357 image->readPixels(pixmap, 0, 0); 1358 for (int offset : { 32, 64, 96 } ) { 1359 std::vector<int32_t> dstPixels; 1360 dstPixels.resize(image->height() * rowBytes); 1361 SkPixmap dstmap(info, &dstPixels.front(), rowBytes); 1362 pixmap.readPixels(dstmap, offset, 0); 1363 SkBitmap bitmap; 1364 bitmap.installPixels(dstmap); 1365 canvas->translate(32, 32); 1366 canvas->drawBitmap(bitmap, 0, 0); 1367 } 1368 } 1369 ## 1370 1371 #SeeAlso erase SkBitmap::readPixels SkCanvas::drawBitmap SkCanvas::readPixels SkImage::readPixels SkSurface::readPixels 1372 1373 ## 1374 1375 # ------------------------------------------------------------------------------ 1376 1377 #Method bool readPixels(const SkPixmap& dst) const 1378 #Populate 1379 1380 #Example 1381 #Image 3 1382 void draw(SkCanvas* canvas) { 1383 SkImageInfo info = SkImageInfo::MakeN32Premul(image->width(), image->height()); 1384 std::vector<int32_t> srcPixels; 1385 const int rowBytes = image->width() * 4; 1386 srcPixels.resize(image->height() * rowBytes); 1387 SkPixmap pixmap(info, (const void*) &srcPixels.front(), rowBytes); 1388 image->readPixels(pixmap, 0, 0); 1389 for (int index = 0; index < 3; ++index ) { 1390 std::vector<int32_t> dstPixels; 1391 dstPixels.resize(image->height() * rowBytes); 1392 SkPixmap dstmap(info, &dstPixels.front(), rowBytes); 1393 pixmap.readPixels(dstmap); 1394 SkBitmap bitmap; 1395 bitmap.installPixels(dstmap); 1396 canvas->translate(32, 32); 1397 canvas->drawBitmap(bitmap, 0, 0); 1398 } 1399 } 1400 ## 1401 1402 #SeeAlso erase SkBitmap::readPixels SkCanvas::drawBitmap SkCanvas::readPixels SkImage::readPixels SkSurface::readPixels 1403 1404 ## 1405 1406 # ------------------------------------------------------------------------------ 1407 1408 #Method bool scalePixels(const SkPixmap& dst, SkFilterQuality filterQuality) const 1409 1410 #In Pixels 1411 #Line # scales and converts pixels ## 1412 #Populate 1413 1414 #Example 1415 #Image 3 1416 void draw(SkCanvas* canvas) { 1417 SkImageInfo info = SkImageInfo::MakeN32Premul(image->width(), image->height()); 1418 std::vector<int32_t> srcPixels; 1419 int rowBytes = image->width() * 4; 1420 srcPixels.resize(image->height() * rowBytes); 1421 SkPixmap pixmap(info, (const void*) &srcPixels.front(), rowBytes); 1422 image->readPixels(pixmap, 0, 0); 1423 for (int offset : { 32, 64, 96 } ) { 1424 info = SkImageInfo::MakeN32Premul(image->width() + offset, image->height()); 1425 rowBytes = info.width() * 4; 1426 std::vector<int32_t> dstPixels; 1427 dstPixels.resize(image->height() * rowBytes); 1428 SkPixmap dstmap(info, &dstPixels.front(), rowBytes); 1429 pixmap.scalePixels(dstmap, kMedium_SkFilterQuality); 1430 SkBitmap bitmap; 1431 bitmap.installPixels(dstmap); 1432 canvas->translate(32, 32); 1433 canvas->drawBitmap(bitmap, 0, 0); 1434 } 1435 } 1436 ## 1437 1438 #SeeAlso SkCanvas::drawBitmap SkImage::scalePixels 1439 1440 ## 1441 1442 # ------------------------------------------------------------------------------ 1443 1444 #Method bool erase(SkColor color, const SkIRect& subset) const 1445 1446 #In Pixels 1447 #Line # writes Color to pixels ## 1448 #Populate 1449 1450 #Example 1451 #Height 50 1452 uint32_t storage[2]; 1453 SkImageInfo info = SkImageInfo::MakeN32Premul(1, 2); 1454 SkPixmap pixmap(info, storage, info.minRowBytes()); 1455 pixmap.erase(SK_ColorBLUE, {0, 0, 1, 1}); 1456 pixmap.erase(SK_ColorRED, {0, 1, 1, 2}); 1457 SkBitmap bitmap; 1458 canvas->scale(20, 20); 1459 bitmap.installPixels(pixmap); 1460 canvas->drawBitmap(bitmap, 0, 0); 1461 ## 1462 1463 #SeeAlso SkBitmap::erase SkCanvas::clear SkCanvas::drawColor 1464 1465 ## 1466 1467 # ------------------------------------------------------------------------------ 1468 1469 #Method bool erase(SkColor color) const 1470 #Populate 1471 1472 #Example 1473 #Height 50 1474 uint32_t storage[2]; 1475 SkImageInfo info = SkImageInfo::MakeN32Premul(1, 2); 1476 SkPixmap pixmap(info, storage, info.minRowBytes()); 1477 pixmap.erase(SK_ColorBLUE); 1478 SkBitmap bitmap; 1479 canvas->scale(20, 20); 1480 bitmap.installPixels(pixmap); 1481 canvas->drawBitmap(bitmap, 0, 0); 1482 ## 1483 1484 #SeeAlso SkBitmap::erase SkCanvas::clear SkCanvas::drawColor 1485 1486 ## 1487 1488 # ------------------------------------------------------------------------------ 1489 1490 #Method bool erase(const SkColor4f& color, const SkIRect* subset = nullptr) const 1491 #Populate 1492 1493 #Example 1494 #Height 50 1495 uint32_t storage[2]; 1496 SkImageInfo info = SkImageInfo::MakeN32Premul(1, 2); 1497 SkPixmap pixmap(info, storage, info.minRowBytes()); 1498 SkIRect topPixelBounds = {0, 0, 1, 1}; 1499 pixmap.erase({ 0.65f, 0.45f, 0.25f, 1 }, &topPixelBounds); 1500 SkIRect bottomPixelBounds = {0, 1, 1, 2}; 1501 pixmap.erase({ 0.25f, 0.65f, 0.45f, 1 }, &bottomPixelBounds); 1502 SkBitmap bitmap; 1503 canvas->scale(20, 20); 1504 bitmap.installPixels(pixmap); 1505 canvas->drawBitmap(bitmap, 0, 0); 1506 ## 1507 1508 #SeeAlso SkBitmap::erase SkCanvas::clear SkCanvas::drawColor 1509 1510 ## 1511 1512 #Class SkPixmap ## 1513 1514 #Topic Pixmap ## 1515