|  | #Topic Bitmap | 
|  | #Alias Bitmaps ## | 
|  | #Alias Bitmap_Reference ## | 
|  |  | 
|  | #Class SkBitmap | 
|  | #Line # two-dimensional raster pixel array ## | 
|  |  | 
|  | #Code | 
|  | #Populate | 
|  | ## | 
|  |  | 
|  | Bitmap describes a two-dimensional raster pixel array. Bitmap is built on | 
|  | Image_Info, containing integer width and height, Color_Type and Alpha_Type | 
|  | describing the pixel format, and Color_Space describing the range of colors. | 
|  | Bitmap points to Pixel_Ref, which describes the physical array of pixels. | 
|  | Image_Info bounds may be located anywhere fully inside Pixel_Ref bounds. | 
|  |  | 
|  | Bitmap can be drawn using Canvas. Bitmap can be a drawing destination for Canvas | 
|  | draw member functions. Bitmap flexibility as a pixel container limits some | 
|  | optimizations available to the target platform. | 
|  |  | 
|  | If pixel array is primarily read-only, use Image for better performance. | 
|  | If pixel array is primarily written to, use Surface for better performance. | 
|  |  | 
|  | Declaring SkBitmap const prevents altering Image_Info: the Bitmap height, width, | 
|  | and so on cannot change. It does not affect Pixel_Ref: a caller may write its | 
|  | pixels. Declaring SkBitmap const affects Bitmap configuration, not its contents. | 
|  |  | 
|  | Bitmap is not thread safe. Each thread must have its own copy of Bitmap fields, | 
|  | although threads may share the underlying pixel array. | 
|  |  | 
|  | #Subtopic Row_Bytes | 
|  | #Line # interval from one row to the next ## | 
|  | Bitmap pixels may be contiguous, or may have a gap at the end of each row. | 
|  | Row_Bytes is the interval from one row to the next. Row_Bytes may be specified; | 
|  | sometimes passing zero will compute the Row_Bytes from the row width and the | 
|  | number of bytes in a pixel. Row_Bytes may be larger than the row requires. This | 
|  | is useful to position one or more Bitmaps within a shared pixel array. | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Class Allocator | 
|  | #Line # abstract subclass of HeapAllocator ## | 
|  | #Code | 
|  | #Populate | 
|  | ## | 
|  |  | 
|  | Abstract subclass of HeapAllocator. | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method virtual bool allocPixelRef(SkBitmap* bitmap) = 0 | 
|  | #Line # allocates pixel memory ## | 
|  | #Populate | 
|  |  | 
|  | #NoExample | 
|  | ## | 
|  |  | 
|  | #SeeAlso HeapAllocator | 
|  |  | 
|  | ## | 
|  |  | 
|  | #Class Allocator ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Class HeapAllocator | 
|  | #Line # allocates pixel memory from heap ## | 
|  |  | 
|  | #Code | 
|  | #Populate | 
|  | ## | 
|  |  | 
|  | Subclass of SkBitmap::Allocator that returns a Pixel_Ref that allocates its pixel | 
|  | memory from the heap. This is the default SkBitmap::Allocator invoked by | 
|  | allocPixels. | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method bool allocPixelRef(SkBitmap* bitmap) override | 
|  | #Line # allocates pixel memory ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | SkBitmap bitmap; | 
|  | bitmap.setInfo(SkImageInfo::MakeN32(16, 16, kPremul_SkAlphaType)); | 
|  | SkDebugf("pixel address = %p\n", bitmap.getPixels()); | 
|  | SkBitmap::HeapAllocator stdalloc; | 
|  | if (!stdalloc.allocPixelRef(&bitmap)) { | 
|  | SkDebugf("pixel allocation failed\n"); | 
|  | } else { | 
|  | SkDebugf("pixel address = %p\n", bitmap.getPixels()); | 
|  | } | 
|  | #StdOut | 
|  | #Volatile | 
|  | pixel address = (nil) | 
|  | pixel address = 0x560ddd0ac670 | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso SkBitmap::Allocator tryAllocPixels | 
|  |  | 
|  | ## | 
|  |  | 
|  | #Class HeapAllocator ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method SkBitmap() | 
|  |  | 
|  | #Line # constructs with default values ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | void draw(SkCanvas* canvas) { | 
|  | const char* alphas[] = {"Unknown", "Opaque", "Premul", "Unpremul"}; | 
|  | const char* colors[] = {"Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x", | 
|  | "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16"}; | 
|  | SkBitmap bitmap; | 
|  | for (int i = 0; i < 2; ++i) { | 
|  | SkDebugf("width: %2d  height: %2d", bitmap.width(), bitmap.height()); | 
|  | SkDebugf("  color: k%s_SkColorType", colors[bitmap.colorType()]); | 
|  | SkDebugf("  alpha: k%s_SkAlphaType\n", alphas[bitmap.alphaType()]); | 
|  | bitmap.setInfo(SkImageInfo::Make(25, 35, kRGBA_8888_SkColorType, kOpaque_SkAlphaType), | 
|  | 0); | 
|  | } | 
|  | } | 
|  | #StdOut | 
|  | width:  0  height:  0  color: kUnknown_SkColorType  alpha: kUnknown_SkAlphaType | 
|  | width: 25  height: 35  color: kRGBA_8888_SkColorType  alpha: kOpaque_SkAlphaType | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso setInfo | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method SkBitmap(const SkBitmap& src) | 
|  |  | 
|  | #Line # shares ownership of pixels ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | void draw(SkCanvas* canvas) { | 
|  | SkBitmap original; | 
|  | if (original.tryAllocPixels( | 
|  | SkImageInfo::Make(25, 35, kRGBA_8888_SkColorType, kOpaque_SkAlphaType))) { | 
|  | SkDebugf("original has pixels before copy: %s\n", original.getPixels() ? "true" : "false"); | 
|  | SkBitmap copy(original); | 
|  | SkDebugf("original has pixels after copy: %s\n", original.getPixels() ? "true" : "false"); | 
|  | SkDebugf("copy has pixels: %s\n", copy.getPixels() ? "true" : "false"); | 
|  | } | 
|  | } | 
|  | #StdOut | 
|  | original has pixels before copy: true | 
|  | original has pixels after copy: true | 
|  | copy has pixels: true | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso setInfo setPixelRef setPixels swap | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method SkBitmap(SkBitmap&& src) | 
|  |  | 
|  | #Line # takes ownership of pixels ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | void draw(SkCanvas* canvas) { | 
|  | SkBitmap original; | 
|  | if (original.tryAllocPixels( | 
|  | SkImageInfo::Make(25, 35, kRGBA_8888_SkColorType, kOpaque_SkAlphaType))) { | 
|  | SkDebugf("original has pixels before move: %s\n", original.getPixels() ? "true" : "false"); | 
|  | SkBitmap copy(std::move(original)); | 
|  | SkDebugf("original has pixels after move: %s\n", original.getPixels() ? "true" : "false"); | 
|  | SkDebugf("copy has pixels: %s\n", copy.getPixels() ? "true" : "false"); | 
|  | } | 
|  | } | 
|  | #StdOut | 
|  | original has pixels before move: true | 
|  | original has pixels after move: false | 
|  | copy has pixels: true | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso setInfo setPixelRef setPixels swap | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method ~SkBitmap() | 
|  |  | 
|  | #Line # releases ownership of pixels ## | 
|  | #Populate | 
|  |  | 
|  | #NoExample | 
|  | ## | 
|  |  | 
|  | #SeeAlso Pixel_Ref | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method SkBitmap& operator=(const SkBitmap& src) | 
|  |  | 
|  | #Line # shares ownership of pixels ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | void draw(SkCanvas* canvas) { | 
|  | SkBitmap original; | 
|  | if (original.tryAllocPixels( | 
|  | SkImageInfo::Make(25, 35, kRGBA_8888_SkColorType, kOpaque_SkAlphaType))) { | 
|  | SkDebugf("original has pixels before copy: %s\n", original.getPixels() ? "true" : "false"); | 
|  | SkBitmap copy = original; | 
|  | SkDebugf("original has pixels after copy: %s\n", original.getPixels() ? "true" : "false"); | 
|  | SkDebugf("copy has pixels: %s\n", copy.getPixels() ? "true" : "false"); | 
|  | } | 
|  | } | 
|  | #StdOut | 
|  | original has pixels before copy: true | 
|  | original has pixels after copy: true | 
|  | copy has pixels: true | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso setInfo setPixelRef setPixels swap | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method SkBitmap& operator=(SkBitmap&& src) | 
|  |  | 
|  | #Line # takes ownership of pixels ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | void draw(SkCanvas* canvas) { | 
|  | SkBitmap original; | 
|  | if (original.tryAllocPixels( | 
|  | SkImageInfo::Make(25, 35, kRGBA_8888_SkColorType, kOpaque_SkAlphaType))) { | 
|  | SkDebugf("original has pixels before move: %s\n", original.getPixels() ? "true" : "false"); | 
|  | SkBitmap copy = std::move(original); | 
|  | SkDebugf("original has pixels after move: %s\n", original.getPixels() ? "true" : "false"); | 
|  | SkDebugf("copy has pixels: %s\n", copy.getPixels() ? "true" : "false"); | 
|  | } | 
|  | } | 
|  | #StdOut | 
|  | original has pixels before move: true | 
|  | original has pixels after move: false | 
|  | copy has pixels: true | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso setInfo setPixelRef setPixels swap | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method void swap(SkBitmap& other) | 
|  | #In Utility | 
|  | #Line # exchanges Bitmap pair ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | void draw(SkCanvas* canvas) { | 
|  | auto debugster = [](const char* prefix, const SkBitmap& b) -> void { | 
|  | const char* alphas[] = {"Unknown", "Opaque", "Premul", "Unpremul"}; | 
|  | const char* colors[] = {"Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x", | 
|  | "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16"}; | 
|  | SkDebugf("%s width:%d height:%d colorType:k%s_SkColorType alphaType:k%s_SkAlphaType\n", | 
|  | prefix, b.width(), b.height(), colors[b.colorType()], alphas[b.alphaType()]); | 
|  | }; | 
|  | SkBitmap one, two; | 
|  | if (!one.tryAllocPixels( | 
|  | SkImageInfo::Make(1, 1, kRGBA_8888_SkColorType, kOpaque_SkAlphaType))) { | 
|  | return; | 
|  | } | 
|  | if (!two.tryAllocPixels( | 
|  | SkImageInfo::Make(2, 2, kBGRA_8888_SkColorType, kPremul_SkAlphaType))) { | 
|  | return; | 
|  | } | 
|  | for (int index = 0; index < 2; ++index) { | 
|  | debugster("one", one); | 
|  | debugster("two", two); | 
|  | one.swap(two); | 
|  | } | 
|  | } | 
|  | #StdOut | 
|  | one width:1 height:1 colorType:kRGBA_8888_SkColorType alphaType:kOpaque_SkAlphaType | 
|  | two width:2 height:2 colorType:kBGRA_8888_SkColorType alphaType:kPremul_SkAlphaType | 
|  | one width:2 height:2 colorType:kBGRA_8888_SkColorType alphaType:kPremul_SkAlphaType | 
|  | two width:1 height:1 colorType:kRGBA_8888_SkColorType alphaType:kOpaque_SkAlphaType | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso SkBitmap(SkBitmap&& src) operator=(SkBitmap&& src) | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  | #Subtopic Property | 
|  | #Line # metrics and attributes ## | 
|  | ## | 
|  |  | 
|  | #Method const SkPixmap& pixmap() const | 
|  | #In Property | 
|  | #Line # returns Pixmap ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | SkBitmap bitmap; | 
|  | bitmap.allocPixels(SkImageInfo::MakeN32Premul(10, 11)); | 
|  | SkCanvas offscreen(bitmap); | 
|  | offscreen.clear(SK_ColorWHITE); | 
|  | SkPaint paint; | 
|  | offscreen.drawString("&", 0, 10, paint); | 
|  | const SkPixmap& pixmap = bitmap.pixmap(); | 
|  | if (pixmap.addr()) { | 
|  | SkPMColor pmWhite = *pixmap.addr32(0, 0); | 
|  | for (int y = 0; y < pixmap.height(); ++y) { | 
|  | for (int x = 0; x < pixmap.width(); ++x) { | 
|  | SkDebugf("%c", *pixmap.addr32(x, y) == pmWhite ? '-' : 'x'); | 
|  | } | 
|  | SkDebugf("\n"); | 
|  | } | 
|  | } | 
|  | #StdOut | 
|  | ---------- | 
|  | ---xx----- | 
|  | --x--x---- | 
|  | --x------- | 
|  | --xx------ | 
|  | --x-x---x- | 
|  | -x---x--x- | 
|  | -x----xx-- | 
|  | -xx---x--- | 
|  | --xxxx-xx- | 
|  | ---------- | 
|  | #StdOut ## | 
|  |  | 
|  | ## | 
|  |  | 
|  | #SeeAlso peekPixels installPixels readPixels writePixels | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method const SkImageInfo& info() const | 
|  | #In Property | 
|  | #Line # returns Image_Info ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Image 4 | 
|  | void draw(SkCanvas* canvas) { | 
|  | // SkBitmap source;  // pre-populated with soccer ball by fiddle.skia.org | 
|  | const SkImageInfo& info = source.info(); | 
|  | const char* alphas[] = {"Unknown", "Opaque", "Premul", "Unpremul"}; | 
|  | const char* colors[] = {"Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x", | 
|  | "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16"}; | 
|  | SkDebugf("width: %d height: %d color: %s alpha: %s\n", info.width(), info.height(), | 
|  | colors[info.colorType()], alphas[info.alphaType()]); | 
|  | #StdOut | 
|  | width: 56 height: 56 color: BGRA_8888 alpha: Opaque | 
|  | ## | 
|  | } | 
|  | ## | 
|  |  | 
|  | #SeeAlso Image_Info | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method int width() const | 
|  | #In Property | 
|  | #Line # returns pixel column count ## | 
|  | Returns pixel count in each row. Should be equal or less than | 
|  | #Formula # rowBytes() / info().bytesPerPixel() ##. | 
|  |  | 
|  | May be less than pixelRef().width(). Will not exceed pixelRef().width() less | 
|  | pixelRefOrigin().fX. | 
|  |  | 
|  | #Return  pixel width in Image_Info ## | 
|  |  | 
|  | #Example | 
|  | SkImageInfo info = SkImageInfo::MakeA8(16, 32); | 
|  | SkBitmap bitmap; | 
|  | bitmap.setInfo(info); | 
|  | SkDebugf("bitmap width: %d  info width: %d\n", bitmap.width(), info.width()); | 
|  | #StdOut | 
|  | bitmap width: 16  info width: 16 | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso height() SkPixelRef::width() SkImageInfo::width() | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method int height() const | 
|  | #In Property | 
|  | #Line # returns pixel row count ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | SkImageInfo info = SkImageInfo::MakeA8(16, 32); | 
|  | SkBitmap bitmap; | 
|  | bitmap.setInfo(info); | 
|  | SkDebugf("bitmap height: %d  info height: %d\n", bitmap.height(), info.height()); | 
|  | #StdOut | 
|  | bitmap height: 32  info height: 32 | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso width() SkPixelRef::height() SkImageInfo::height() | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method SkColorType colorType() const | 
|  | #In Property | 
|  | #Line # returns Image_Info Color_Type ## | 
|  | Returns Color_Type, one of: #list_of_color_types#. | 
|  |  | 
|  | #Return  Color_Type in Image_Info ## | 
|  |  | 
|  | #Example | 
|  | const char* colors[] = {"Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x", | 
|  | "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16"}; | 
|  | SkBitmap bitmap; | 
|  | bitmap.setInfo(SkImageInfo::MakeA8(16, 32)); | 
|  | SkDebugf("color type: k" "%s" "_SkColorType\n", colors[bitmap.colorType()]); | 
|  | #StdOut | 
|  | color type: kAlpha_8_SkColorType | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso alphaType() SkImageInfo::colorType | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method SkAlphaType alphaType() const | 
|  | #In Property | 
|  | #Line # returns Image_Info Alpha_Type ## | 
|  | Returns Alpha_Type, one of: #list_of_alpha_types#. | 
|  |  | 
|  | #Return  Alpha_Type in Image_Info ## | 
|  |  | 
|  | #Example | 
|  | const char* alphas[] = {"Unknown", "Opaque", "Premul", "Unpremul"}; | 
|  | SkPixmap pixmap(SkImageInfo::MakeA8(16, 32), nullptr, 64); | 
|  | SkDebugf("alpha type: k" "%s" "_SkAlphaType\n", alphas[pixmap.alphaType()]); | 
|  | #StdOut | 
|  | alpha type: kPremul_SkAlphaType | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso colorType() SkImageInfo::alphaType | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method SkColorSpace* colorSpace() const | 
|  | #In Property | 
|  | #Line # returns Image_Info Color_Space ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Description | 
|  | SkColorSpace::MakeSRGBLinear creates Color_Space with linear gamma | 
|  | and an sRGB gamut. This Color_Space gamma is not close to sRGB gamma. | 
|  | ## | 
|  | SkBitmap bitmap; | 
|  | bitmap.setInfo(SkImageInfo::MakeN32(16, 32, kPremul_SkAlphaType, | 
|  | SkColorSpace::MakeSRGBLinear())); | 
|  | SkColorSpace* colorSpace = bitmap.colorSpace(); | 
|  | SkDebugf("gammaCloseToSRGB: %s  gammaIsLinear: %s  isSRGB: %s\n", | 
|  | colorSpace->gammaCloseToSRGB() ? "true" : "false", | 
|  | colorSpace->gammaIsLinear() ? "true" : "false", | 
|  | colorSpace->isSRGB() ? "true" : "false"); | 
|  | #StdOut | 
|  | gammaCloseToSRGB: false  gammaIsLinear: true  isSRGB: false | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso Color_Space SkImageInfo::colorSpace | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method sk_sp<SkColorSpace> refColorSpace() const | 
|  | #In Property | 
|  | #Line # returns Image_Info Color_Space ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | SkBitmap bitmap1, bitmap2; | 
|  | bitmap1.setInfo(SkImageInfo::MakeN32(16, 32, kPremul_SkAlphaType, | 
|  | SkColorSpace::MakeSRGBLinear())); | 
|  | bitmap2.setInfo(SkImageInfo::MakeN32(16, 32, kPremul_SkAlphaType, | 
|  | bitmap1.refColorSpace())); | 
|  | SkColorSpace* colorSpace = bitmap2.colorSpace(); | 
|  | SkDebugf("gammaCloseToSRGB: %s  gammaIsLinear: %s  isSRGB: %s\n", | 
|  | colorSpace->gammaCloseToSRGB() ? "true" : "false", | 
|  | colorSpace->gammaIsLinear() ? "true" : "false", | 
|  | colorSpace->isSRGB() ? "true" : "false"); | 
|  | #StdOut | 
|  | gammaCloseToSRGB: false  gammaIsLinear: true  isSRGB: false | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso Color_Space SkImageInfo::colorSpace | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method int bytesPerPixel() const | 
|  | #In Property | 
|  | #Line # returns number of bytes in pixel based on Color_Type ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | const char* colors[] = {"Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x", | 
|  | "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16"}; | 
|  | SkImageInfo info = SkImageInfo::MakeA8(1, 1); | 
|  | SkBitmap bitmap; | 
|  | for (SkColorType colorType : { #list_of_color_types# | 
|  | } ) { | 
|  | bitmap.setInfo(info.makeColorType(colorType)); | 
|  | SkDebugf("color: k" "%s" "_SkColorType" "%*s" "bytesPerPixel: %d\n", | 
|  | colors[colorType], 13 - strlen(colors[colorType]), " ", | 
|  | bitmap.bytesPerPixel()); | 
|  | } | 
|  | #StdOut | 
|  | color: kUnknown_SkColorType      bytesPerPixel: 0 | 
|  | color: kAlpha_8_SkColorType      bytesPerPixel: 1 | 
|  | color: kRGB_565_SkColorType      bytesPerPixel: 2 | 
|  | color: kARGB_4444_SkColorType    bytesPerPixel: 2 | 
|  | color: kRGBA_8888_SkColorType    bytesPerPixel: 4 | 
|  | color: kRGB_888x_SkColorType     bytesPerPixel: 4 | 
|  | color: kBGRA_8888_SkColorType    bytesPerPixel: 4 | 
|  | color: kRGBA_1010102_SkColorType bytesPerPixel: 4 | 
|  | color: kRGB_101010x_SkColorType  bytesPerPixel: 4 | 
|  | color: kGray_8_SkColorType       bytesPerPixel: 1 | 
|  | color: kRGBA_F16_SkColorType     bytesPerPixel: 8 | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso rowBytes rowBytesAsPixels width shiftPerPixel SkImageInfo::bytesPerPixel | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method int rowBytesAsPixels() const | 
|  | #In Property | 
|  | #Line # returns interval between rows in pixels ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | SkBitmap bitmap; | 
|  | for (int rowBytes : { 4, 5, 6, 7, 8} ) { | 
|  | bitmap.setInfo(SkImageInfo::MakeN32(1, 1, kPremul_SkAlphaType), rowBytes); | 
|  | SkDebugf("rowBytes: %d rowBytesAsPixels: %d\n", rowBytes, bitmap.rowBytesAsPixels()); | 
|  | } | 
|  | #StdOut | 
|  | rowBytes: 4 rowBytesAsPixels: 1 | 
|  | rowBytes: 5 rowBytesAsPixels: 1 | 
|  | rowBytes: 6 rowBytesAsPixels: 1 | 
|  | rowBytes: 7 rowBytesAsPixels: 1 | 
|  | rowBytes: 8 rowBytesAsPixels: 2 | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso rowBytes shiftPerPixel width bytesPerPixel | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method int shiftPerPixel() const | 
|  | #In Property | 
|  | #Line # returns bit shift from pixels to bytes ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | const char* colors[] = {"Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x", | 
|  | "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16"}; | 
|  | SkImageInfo info = SkImageInfo::MakeA8(1, 1); | 
|  | SkBitmap bitmap; | 
|  | for (SkColorType colorType : { #list_of_color_types# | 
|  | } ) { | 
|  | bitmap.setInfo(info.makeColorType(colorType)); | 
|  | SkDebugf("color: k" "%s" "_SkColorType" "%*s" "shiftPerPixel: %d\n", | 
|  | colors[colorType], 14 - strlen(colors[colorType]), " ", | 
|  | bitmap.shiftPerPixel()); | 
|  | } | 
|  | #StdOut | 
|  | color: kUnknown_SkColorType       shiftPerPixel: 0 | 
|  | color: kAlpha_8_SkColorType       shiftPerPixel: 0 | 
|  | color: kRGB_565_SkColorType       shiftPerPixel: 1 | 
|  | color: kARGB_4444_SkColorType     shiftPerPixel: 1 | 
|  | color: kRGBA_8888_SkColorType     shiftPerPixel: 2 | 
|  | color: kRGB_888x_SkColorType      shiftPerPixel: 2 | 
|  | color: kBGRA_8888_SkColorType     shiftPerPixel: 2 | 
|  | color: kRGBA_1010102_SkColorType  shiftPerPixel: 2 | 
|  | color: kRGB_101010x_SkColorType   shiftPerPixel: 2 | 
|  | color: kGray_8_SkColorType        shiftPerPixel: 0 | 
|  | color: kRGBA_F16_SkColorType      shiftPerPixel: 3 | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso rowBytes rowBytesAsPixels width bytesPerPixel | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method bool empty() const | 
|  | #In Property | 
|  | #Line # returns true if Image_Info has zero width() or height() ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | SkBitmap bitmap; | 
|  | for (int width : { 0, 2 } ) { | 
|  | for (int height : { 0, 2 } ) { | 
|  | bitmap.setInfo(SkImageInfo::MakeA8(width, height)); | 
|  | SkDebugf("width: %d height: %d empty: %s\n", width, height, | 
|  | bitmap.empty() ? "true" : "false"); | 
|  | } | 
|  | } | 
|  | #StdOut | 
|  | width: 0 height: 0 empty: true | 
|  | width: 0 height: 2 empty: true | 
|  | width: 2 height: 0 empty: true | 
|  | width: 2 height: 2 empty: false | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso height() width() drawsNothing | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method bool isNull() const | 
|  | #In Property | 
|  | #Line # returns true if Pixel_Ref is nullptr ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | SkBitmap bitmap; | 
|  | SkDebugf("empty bitmap does %shave pixels\n", bitmap.isNull() ? "not " : ""); | 
|  | bitmap.setInfo(SkImageInfo::MakeA8(8, 8)); | 
|  | SkDebugf("bitmap with dimensions does %shave pixels\n", bitmap.isNull() ? "not " : ""); | 
|  | bitmap.allocPixels(); | 
|  | SkDebugf("allocated bitmap does %shave pixels\n", bitmap.isNull() ? "not " : ""); | 
|  | #StdOut | 
|  | empty bitmap does not have pixels | 
|  | bitmap with dimensions does not have pixels | 
|  | allocated bitmap does have pixels | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso empty() drawsNothing pixelRef | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method bool drawsNothing() const | 
|  | #In Property | 
|  | #Line # returns true if no width(), no height(), or no Pixel_Ref ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | SkBitmap bitmap; | 
|  | for (int w : { 0, 8 } ) { | 
|  | for (bool allocate : { false, true} ) { | 
|  | bitmap.setInfo(SkImageInfo::MakeA8(w, 8)); | 
|  | allocate ? bitmap.allocPixels() : (void) 0 ; | 
|  | SkDebugf("empty:%s isNull:%s drawsNothing:%s\n", bitmap.empty() ? "true " : "false", | 
|  | bitmap.isNull() ? "true " : "false", bitmap.drawsNothing() ? "true" : "false"); | 
|  | } | 
|  | } | 
|  | #StdOut | 
|  | empty:true  isNull:true  drawsNothing:true | 
|  | empty:true  isNull:false drawsNothing:true | 
|  | empty:false isNull:true  drawsNothing:true | 
|  | empty:false isNull:false drawsNothing:false | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso empty() isNull pixelRef | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method size_t rowBytes() const | 
|  | #In Property | 
|  | #Line # returns interval between rows in bytes ## | 
|  | Returns row bytes, the interval from one pixel row to the next. Row bytes | 
|  | is at least as large as: #Formula # width() * info().bytesPerPixel() ##. | 
|  |  | 
|  | Returns zero if colorType is kUnknown_SkColorType, or if row bytes supplied to | 
|  | setInfo is not large enough to hold a row of pixels. | 
|  |  | 
|  | #Return  byte length of pixel row ## | 
|  |  | 
|  | #Example | 
|  | SkBitmap bitmap; | 
|  | for (int rowBytes : { 2, 8 } ) { | 
|  | bool result = bitmap.setInfo(SkImageInfo::MakeA8(4, 4), rowBytes); | 
|  | SkDebugf("setInfo returned:%s rowBytes:%d\n", result ? "true " : "false", bitmap.rowBytes()); | 
|  | } | 
|  | #StdOut | 
|  | setInfo returned:false rowBytes:0 | 
|  | setInfo returned:true  rowBytes:8 | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso info() setInfo SkImageInfo::minRowBytes | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method bool setAlphaType(SkAlphaType alphaType) | 
|  | #In Set | 
|  | #Line # sets Alpha_Type of shared pixels ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | void draw(SkCanvas* canvas) { | 
|  | const char* colors[] = { "Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x", | 
|  | "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16" }; | 
|  | const char* alphas[] = {"Unknown ", "Opaque  ", "Premul  ", "Unpremul"}; | 
|  | SkBitmap bitmap; | 
|  | SkAlphaType alphaTypes[] = { #list_of_alpha_types# | 
|  | }; | 
|  | SkDebugf("%18s%15s%17s%18s%19s\n", "Canonical", "Unknown", "Opaque", "Premul", "Unpremul"); | 
|  | for (SkColorType colorType : { #list_of_color_types# | 
|  | } ) { | 
|  | for (SkAlphaType canonicalAlphaType : alphaTypes) { | 
|  | SkColorTypeValidateAlphaType(colorType, kUnknown_SkAlphaType, &canonicalAlphaType ); | 
|  | SkDebugf("%12s %9s  ", colors[(int) colorType], alphas[(int) canonicalAlphaType ]); | 
|  | for (SkAlphaType alphaType : alphaTypes) { | 
|  | bitmap.setInfo(SkImageInfo::Make(4, 4, colorType, canonicalAlphaType)); | 
|  | bool result = bitmap.setAlphaType(alphaType); | 
|  | SkDebugf("%s %s    ", result ? "true " : "false", alphas[(int) bitmap.alphaType()]); | 
|  | } | 
|  | SkDebugf("\n"); | 
|  | } | 
|  | } | 
|  | } | 
|  | ## | 
|  |  | 
|  | #SeeAlso Alpha_Type Color_Type Image_Info setInfo | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method void* getPixels() const | 
|  | #In Property | 
|  | #Line # returns address of pixels ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | SkBitmap bitmap; | 
|  | bitmap.setInfo(SkImageInfo::MakeN32(4, 4, kPremul_SkAlphaType)); | 
|  | bitmap.allocPixels(); | 
|  | bitmap.eraseColor(0x00000000); | 
|  | void* baseAddr = bitmap.getPixels(); | 
|  | *(SkPMColor*)baseAddr = 0xFFFFFFFF; | 
|  | SkDebugf("bitmap.getColor(0, 1) %c= 0x00000000\n", | 
|  | bitmap.getColor(0, 1)  == 0x00000000 ? '=' : '!'); | 
|  | SkDebugf("bitmap.getColor(0, 0) %c= 0xFFFFFFFF\n", | 
|  | bitmap.getColor(0, 0)  == 0xFFFFFFFF ? '=' : '!'); | 
|  | #StdOut | 
|  | bitmap.getColor(0, 1) == 0x00000000 | 
|  | bitmap.getColor(0, 0) == 0xFFFFFFFF | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso isNull drawsNothing | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method size_t computeByteSize() const | 
|  | #In Utility | 
|  | #Line # returns size required for pixels ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | SkBitmap bitmap; | 
|  | for (int width : { 1, 1000, 1000000 } ) { | 
|  | for (int height: { 1, 1000, 1000000 } ) { | 
|  | SkImageInfo imageInfo = SkImageInfo::MakeN32(width, height, kPremul_SkAlphaType); | 
|  | bitmap.setInfo(imageInfo, width * 5); | 
|  | SkDebugf("width: %7d height: %7d computeByteSize: %13lld\n", width, height, | 
|  | bitmap.computeByteSize()); | 
|  | } | 
|  | } | 
|  | #StdOut | 
|  | width:       1 height:       1 computeByteSize:             4 | 
|  | width:       1 height:    1000 computeByteSize:          4999 | 
|  | width:       1 height: 1000000 computeByteSize:       4999999 | 
|  | width:    1000 height:       1 computeByteSize:          4000 | 
|  | width:    1000 height:    1000 computeByteSize:       4999000 | 
|  | width:    1000 height: 1000000 computeByteSize:    4999999000 | 
|  | width: 1000000 height:       1 computeByteSize:       4000000 | 
|  | width: 1000000 height:    1000 computeByteSize:    4999000000 | 
|  | width: 1000000 height: 1000000 computeByteSize: 4999999000000 | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso SkImageInfo::computeByteSize | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method bool isImmutable() const | 
|  | #In Property | 
|  | #Line # returns true if pixels will not change ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | SkBitmap original; | 
|  | SkImageInfo info = SkImageInfo::Make(25, 35, kRGBA_8888_SkColorType, kOpaque_SkAlphaType); | 
|  | if (original.tryAllocPixels(info)) { | 
|  | original.setImmutable(); | 
|  | SkBitmap copy; | 
|  | original.extractSubset(©, {5, 10, 15, 20}); | 
|  | SkDebugf("original is " "%s" "immutable\n", original.isImmutable() ? "" : "not "); | 
|  | SkDebugf("copy is " "%s" "immutable\n", copy.isImmutable() ? "" : "not "); | 
|  | } | 
|  | #StdOut | 
|  | original is immutable | 
|  | copy is immutable | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso setImmutable SkPixelRef::isImmutable SkImage | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method void setImmutable() | 
|  | #In Set | 
|  | #Line # marks that pixels will not change ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Description | 
|  | Triggers assert if SK_DEBUG is true, runs fine otherwise. | 
|  | ## | 
|  | SkBitmap bitmap; | 
|  | bitmap.setInfo(SkImageInfo::MakeN32(4, 4, kPremul_SkAlphaType)); | 
|  | bitmap.allocPixels(); | 
|  | SkCanvas offscreen(bitmap); | 
|  | SkDebugf("draw white\n"); | 
|  | offscreen.clear(SK_ColorWHITE); | 
|  | bitmap.setImmutable(); | 
|  | SkDebugf("draw black\n"); | 
|  | offscreen.clear(SK_ColorBLACK); | 
|  | ## | 
|  |  | 
|  | #SeeAlso isImmutable SkPixelRef::setImmutable SkImage | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method bool isOpaque() const | 
|  | #In Property | 
|  | #Line # returns true if Image_Info describes opaque pixels ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Description | 
|  | isOpaque ignores whether all pixels are opaque or not. | 
|  | ## | 
|  | const int height = 2; | 
|  | const int width = 2; | 
|  | SkBitmap bitmap; | 
|  | bitmap.setInfo(SkImageInfo::Make(width, height, kN32_SkColorType, kPremul_SkAlphaType)); | 
|  | for (int index = 0; index < 2; ++index) { | 
|  | bitmap.allocPixels(); | 
|  | bitmap.eraseColor(0x00000000); | 
|  | SkDebugf("isOpaque: %s\n", bitmap.isOpaque() ? "true" : "false"); | 
|  | bitmap.eraseColor(0xFFFFFFFF); | 
|  | SkDebugf("isOpaque: %s\n", bitmap.isOpaque() ? "true" : "false"); | 
|  | bitmap.setInfo(bitmap.info().makeAlphaType(kOpaque_SkAlphaType)); | 
|  | } | 
|  | #StdOut | 
|  | isOpaque: false | 
|  | isOpaque: false | 
|  | isOpaque: true | 
|  | isOpaque: true | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso ComputeIsOpaque SkImageInfo::isOpaque | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method bool isVolatile() const | 
|  | #In Property | 
|  | #Line # returns true if pixels should not be cached ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | SkBitmap original; | 
|  | SkImageInfo info = SkImageInfo::Make(25, 35, kRGBA_8888_SkColorType, kOpaque_SkAlphaType); | 
|  | if (original.tryAllocPixels(info)) { | 
|  | original.setIsVolatile(true); | 
|  | SkBitmap copy; | 
|  | original.extractSubset(©, {5, 10, 15, 20}); | 
|  | SkDebugf("original is " "%s" "volatile\n", original.isVolatile() ? "" : "not "); | 
|  | SkDebugf("copy is " "%s" "volatile\n", copy.isImmutable() ? "" : "not "); | 
|  | } | 
|  | #StdOut | 
|  | original is volatile | 
|  | copy is not volatile | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso setIsVolatile | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method void setIsVolatile(bool isVolatile) | 
|  | #In Set | 
|  | #Line # marks if pixels should not be cached ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Height 20 | 
|  | SkBitmap bitmap; | 
|  | bitmap.setInfo(SkImageInfo::Make(1, 1, kRGBA_8888_SkColorType, kOpaque_SkAlphaType)); | 
|  | bitmap.allocPixels(); | 
|  | bitmap.eraseColor(SK_ColorRED); | 
|  | canvas->scale(16, 16); | 
|  | canvas->drawBitmap(bitmap, 0, 0); | 
|  | *(SkPMColor*) bitmap.getPixels() = SkPreMultiplyColor(SK_ColorBLUE); | 
|  | canvas->drawBitmap(bitmap, 2, 0); | 
|  | bitmap.setIsVolatile(true); | 
|  | *(SkPMColor*) bitmap.getPixels() = SkPreMultiplyColor(SK_ColorGREEN); | 
|  | canvas->drawBitmap(bitmap, 4, 0); | 
|  | ## | 
|  |  | 
|  | #SeeAlso isVolatile | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method void reset() | 
|  | #In Constructors | 
|  | #Line # sets to default values, releases pixel ownership ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | SkBitmap bitmap; | 
|  | bitmap.setInfo(SkImageInfo::Make(1, 1, kRGBA_8888_SkColorType, kOpaque_SkAlphaType)); | 
|  | bitmap.allocPixels(); | 
|  | SkDebugf("width:%d height:%d isNull:%s\n", bitmap.width(), bitmap.height(), | 
|  | bitmap.isNull() ? "true" : "false"); | 
|  | bitmap.reset(); | 
|  | SkDebugf("width:%d height:%d isNull:%s\n", bitmap.width(), bitmap.height(), | 
|  | bitmap.isNull() ? "true" : "false"); | 
|  | #StdOut | 
|  | width:1 height:1 isNull:false | 
|  | width:0 height:0 isNull:true | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso SkBitmap() SkAlphaType SkColorType | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method static bool ComputeIsOpaque(const SkBitmap& bm) | 
|  | #In Utility | 
|  | #Line # returns true if all pixels are opaque ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | SkBitmap bitmap; | 
|  | bitmap.setInfo(SkImageInfo::Make(2, 2, kN32_SkColorType, kPremul_SkAlphaType)); | 
|  | for (int index = 0; index < 2; ++index) { | 
|  | bitmap.allocPixels(); | 
|  | bitmap.eraseColor(0x00000000); | 
|  | SkDebugf("computeIsOpaque: %s\n", SkBitmap::ComputeIsOpaque(bitmap) ? "true" : "false"); | 
|  | bitmap.eraseColor(0xFFFFFFFF); | 
|  | SkDebugf("computeIsOpaque: %s\n", SkBitmap::ComputeIsOpaque(bitmap) ? "true" : "false"); | 
|  | bitmap.setInfo(bitmap.info().makeAlphaType(kOpaque_SkAlphaType)); | 
|  | } | 
|  | #StdOut | 
|  | computeIsOpaque: false | 
|  | computeIsOpaque: true | 
|  | computeIsOpaque: false | 
|  | computeIsOpaque: true | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso isOpaque Color_Type Alpha | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method void getBounds(SkRect* bounds) const | 
|  | #In Property | 
|  | #Line # returns width() and height() as Rectangle ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Height 160 | 
|  | #Image 3 | 
|  | SkRect bounds; | 
|  | source.getBounds(&bounds); | 
|  | bounds.offset(100, 100); | 
|  | SkPaint paint; | 
|  | paint.setColor(SK_ColorGRAY); | 
|  | canvas->scale(.25f, .25f); | 
|  | canvas->drawRect(bounds, paint); | 
|  | canvas->drawBitmap(source, 40, 40); | 
|  | ## | 
|  |  | 
|  | #SeeAlso bounds() | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method void getBounds(SkIRect* bounds) const | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Image 3 | 
|  | SkIRect bounds; | 
|  | source.getBounds(&bounds); | 
|  | bounds.inset(100, 100); | 
|  | SkBitmap bitmap; | 
|  | source.extractSubset(&bitmap, bounds); | 
|  | canvas->scale(.5f, .5f); | 
|  | canvas->drawBitmap(bitmap, 10, 10); | 
|  | ## | 
|  |  | 
|  | #SeeAlso bounds() | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method SkIRect bounds() const | 
|  | #In Property | 
|  | #Line # returns width() and height() as Rectangle ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Height 64 | 
|  | #Image 4 | 
|  | canvas->scale(.5f, .5f); | 
|  | SkIRect bounds = source.bounds(); | 
|  | for (int x : { 0, bounds.width() } ) { | 
|  | for (int y : { 0, bounds.height() } ) { | 
|  | canvas->drawBitmap(source, x, y); | 
|  | } | 
|  | } | 
|  | ## | 
|  |  | 
|  | #SeeAlso getBounds | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method SkISize dimensions() const | 
|  | #In Property | 
|  | #Line # returns width() and height() ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | SkBitmap bitmap; | 
|  | bitmap.setInfo(SkImageInfo::MakeN32(33, 55, kOpaque_SkAlphaType)); | 
|  | SkISize dimensions = bitmap.dimensions(); | 
|  | SkRect bounds; | 
|  | bitmap.getBounds(&bounds); | 
|  | SkRect dimensionsAsBounds = SkRect::Make(dimensions); | 
|  | SkDebugf("dimensionsAsBounds %c= bounds\n", dimensionsAsBounds == bounds ? '=' : '!'); | 
|  | ## | 
|  |  | 
|  | #SeeAlso height width | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method SkIRect getSubset() const | 
|  | #In Property | 
|  | #Line # returns bounds offset by origin ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Image 3 | 
|  | SkIRect bounds; | 
|  | source.getBounds(&bounds); | 
|  | bounds.inset(100, 100); | 
|  | SkBitmap subset; | 
|  | source.extractSubset(&subset, bounds); | 
|  | SkIRect r = source.getSubset(); | 
|  | SkDebugf("source: %d, %d, %d, %d\n", r.fLeft, r.fTop, r.fRight, r.fBottom); | 
|  | r = subset.getSubset(); | 
|  | SkDebugf("subset: %d, %d, %d, %d\n", r.fLeft, r.fTop, r.fRight, r.fBottom); | 
|  | #StdOut | 
|  | source: 0, 0, 512, 512 | 
|  | subset: 100, 100, 412, 412 | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso extractSubset getBounds | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method bool setInfo(const SkImageInfo& imageInfo, size_t rowBytes = 0) | 
|  | #In Set | 
|  | #Line # sets height, width, Color_Type, and so on, releasing pixels ## | 
|  | Sets width, height, Alpha_Type, Color_Type, Color_Space, and optional | 
|  | rowBytes. Frees pixels, and returns true if successful. | 
|  |  | 
|  | imageInfo.alphaType() may be altered to a value permitted by imageInfo.colorSpace(). | 
|  | If imageInfo.colorType() is kUnknown_SkColorType, imageInfo.alphaType() is | 
|  | set to kUnknown_SkAlphaType. | 
|  | If imageInfo.colorType() is kAlpha_8_SkColorType and imageInfo.alphaType() is | 
|  | kUnpremul_SkAlphaType, imageInfo.alphaType() is replaced by kPremul_SkAlphaType. | 
|  | If imageInfo.colorType() is kRGB_565_SkColorType or kGray_8_SkColorType, | 
|  | imageInfo.alphaType() is set to kOpaque_SkAlphaType. | 
|  | If imageInfo.colorType() is kARGB_4444_SkColorType, kRGBA_8888_SkColorType, | 
|  | kBGRA_8888_SkColorType, or kRGBA_F16_SkColorType: imageInfo.alphaType() remains | 
|  | unchanged. | 
|  |  | 
|  | rowBytes must equal or exceed imageInfo.minRowBytes(). If imageInfo.colorSpace() is | 
|  | kUnknown_SkColorType, rowBytes is ignored and treated as zero; for all other | 
|  | Color_Space values, rowBytes of zero is treated as imageInfo.minRowBytes(). | 
|  |  | 
|  | Calls reset() and returns false if: | 
|  | #List | 
|  | # rowBytes exceeds 31 bits ## | 
|  | # imageInfo.width() is negative ## | 
|  | # imageInfo.height() is negative ## | 
|  | # rowBytes is positive and less than imageInfo.width() times imageInfo.bytesPerPixel() ## | 
|  | ## | 
|  |  | 
|  | #Param imageInfo  contains width, height, Alpha_Type, Color_Type, Color_Space ## | 
|  | #Param rowBytes   imageInfo.minRowBytes() or larger; or zero ## | 
|  |  | 
|  | #Return  true if Image_Info set successfully ## | 
|  |  | 
|  | #Example | 
|  | #Height 96 | 
|  | ###^ | 
|  | SkBitmap bitmap; | 
|  | bitmap.setInfo(SkImageInfo::MakeN32(44, 16, kOpaque_SkAlphaType)); | 
|  | bitmap.allocPixels(); | 
|  | bitmap.eraseColor(SK_ColorGREEN); | 
|  | SkCanvas offscreen(bitmap); | 
|  | SkPaint paint; | 
|  | offscreen.drawString("!@#$%", 0, 12, paint); | 
|  | canvas->scale(6, 6); | 
|  | canvas->drawBitmap(bitmap, 0, 0); | 
|  | ^^^# | 
|  | ## | 
|  |  | 
|  | #SeeAlso Alpha_Type Color_Type Color_Space height rowBytes width | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Enum AllocFlags | 
|  | #Line # zero pixel memory ## | 
|  | #Code | 
|  | #Populate | 
|  | ## | 
|  |  | 
|  | AllocFlags provides the option to zero pixel memory when allocated. | 
|  |  | 
|  | #Const kZeroPixels_AllocFlag 1 | 
|  | #Line # zero pixel memory ## | 
|  | Instructs tryAllocPixelsFlags and allocPixelsFlags to zero pixel memory. | 
|  | ## | 
|  |  | 
|  | #NoExample | 
|  | ## | 
|  |  | 
|  | #SeeAlso tryAllocPixelsFlags allocPixelsFlags erase eraseColor | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  | #Subtopic Allocate | 
|  | #Line # allocates storage for pixels ## | 
|  | ## | 
|  |  | 
|  | #Method bool tryAllocPixelsFlags(const SkImageInfo& info, uint32_t flags) | 
|  | #In Allocate | 
|  | #Line # allocates pixels from Image_Info with options if possible ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | SkBitmap bitmap; | 
|  | if (!bitmap.tryAllocPixelsFlags(SkImageInfo::MakeN32(10000, 10000, kOpaque_SkAlphaType), | 
|  | SkBitmap::kZeroPixels_AllocFlag)) { | 
|  | SkDebugf("bitmap allocation failed!\n"); | 
|  | } else { | 
|  | SkDebugf("bitmap allocation succeeded!\n"); | 
|  | } | 
|  | #StdOut | 
|  | bitmap allocation succeeded! | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso allocPixelsFlags tryAllocPixels SkMallocPixelRef::MakeZeroed | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method void allocPixelsFlags(const SkImageInfo& info, uint32_t flags) | 
|  | #In Allocate | 
|  | #Line # allocates pixels from Image_Info with options, or aborts ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Height 128 | 
|  | #Description | 
|  | Text is drawn on a transparent background; drawing the bitmap a second time | 
|  | lets the first draw show through. | 
|  | ## | 
|  | ###^ | 
|  | SkBitmap bitmap; | 
|  | bitmap.allocPixelsFlags(SkImageInfo::MakeN32(44, 16, kPremul_SkAlphaType), | 
|  | SkBitmap::kZeroPixels_AllocFlag); | 
|  | SkCanvas offscreen(bitmap); | 
|  | SkPaint paint; | 
|  | offscreen.drawString("!@#$%", 0, 12, paint); | 
|  | canvas->scale(6, 6); | 
|  | canvas->drawBitmap(bitmap, 0, 0); | 
|  | canvas->drawBitmap(bitmap, 8, 8); | 
|  | ^^^# | 
|  | ## | 
|  |  | 
|  | #SeeAlso tryAllocPixelsFlags allocPixels SkMallocPixelRef::MakeZeroed | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method bool tryAllocPixels(const SkImageInfo& info, size_t rowBytes) | 
|  | #In Allocate | 
|  | #Line # allocates pixels from Image_Info if possible ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Image 3 | 
|  | SkBitmap bitmap; | 
|  | SkImageInfo info = SkImageInfo::Make(64, 256, kGray_8_SkColorType, kOpaque_SkAlphaType); | 
|  | if (bitmap.tryAllocPixels(info, 0)) { | 
|  | SkCanvas offscreen(bitmap); | 
|  | offscreen.scale(.5f, .5f); | 
|  | for (int x : { 0, 64, 128, 192 } ) { | 
|  | offscreen.drawBitmap(source, -x, 0); | 
|  | canvas->drawBitmap(bitmap, x, 0); | 
|  | } | 
|  | } | 
|  | ## | 
|  |  | 
|  | #SeeAlso tryAllocPixelsFlags allocPixels SkMallocPixelRef::MakeAllocate | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method void allocPixels(const SkImageInfo& info, size_t rowBytes) | 
|  | #In Allocate | 
|  | #Line # allocates pixels from Image_Info, or aborts ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Image 3 | 
|  | SkBitmap bitmap; | 
|  | SkImageInfo info = SkImageInfo::Make(256, 64, kGray_8_SkColorType, kOpaque_SkAlphaType); | 
|  | bitmap.allocPixels(info, info.width() * info.bytesPerPixel() + 64); | 
|  | SkCanvas offscreen(bitmap); | 
|  | offscreen.scale(.5f, .5f); | 
|  | for (int y : { 0, 64, 128, 192 } ) { | 
|  | offscreen.drawBitmap(source, 0, -y); | 
|  | canvas->drawBitmap(bitmap, 0, y); | 
|  | } | 
|  | ## | 
|  |  | 
|  | #SeeAlso tryAllocPixels allocPixelsFlags SkMallocPixelRef::MakeAllocate | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method bool tryAllocPixels(const SkImageInfo& info) | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Image 3 | 
|  | SkBitmap bitmap; | 
|  | if (bitmap.tryAllocPixels(SkImageInfo::Make(64, 64, kGray_8_SkColorType, kOpaque_SkAlphaType))) { | 
|  | SkCanvas offscreen(bitmap); | 
|  | offscreen.scale(.25f, .5f); | 
|  | for (int y : { 0, 64, 128, 192 } ) { | 
|  | offscreen.drawBitmap(source, -y, -y); | 
|  | canvas->drawBitmap(bitmap, y, y); | 
|  | } | 
|  | } | 
|  | ## | 
|  |  | 
|  | #SeeAlso tryAllocPixelsFlags allocPixels SkMallocPixelRef::MakeAllocate | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method void allocPixels(const SkImageInfo& info) | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Image 4 | 
|  | SkBitmap bitmap; | 
|  | bitmap.allocPixels(SkImageInfo::Make(64, 64, kGray_8_SkColorType, kOpaque_SkAlphaType)); | 
|  | SkCanvas offscreen(bitmap); | 
|  | offscreen.scale(.5f, .5f); | 
|  | for (int y : { 0, 64, 128, 192 } ) { | 
|  | offscreen.drawBitmap(source, -y, -y); | 
|  | canvas->drawBitmap(bitmap, y, y); | 
|  | } | 
|  | ## | 
|  |  | 
|  | #SeeAlso tryAllocPixels allocPixelsFlags SkMallocPixelRef::MakeAllocate | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method bool tryAllocN32Pixels(int width, int height, bool isOpaque = false) | 
|  | #In Allocate | 
|  | #Line # allocates compatible ARGB pixels if possible ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Height 160 | 
|  | SkBitmap bitmap; | 
|  | if (bitmap.tryAllocN32Pixels(80, 80)) { | 
|  | bitmap.eraseColor(SK_ColorTRANSPARENT); | 
|  | bitmap.erase(0x7f3f7fff, SkIRect::MakeWH(50, 30)); | 
|  | bitmap.erase(0x3f7fff3f, SkIRect::MakeXYWH(20, 10, 50, 30)); | 
|  | bitmap.erase(0x5fff3f7f, SkIRect::MakeXYWH(40, 20, 50, 30)); | 
|  | canvas->drawBitmap(bitmap, 0, 0); | 
|  | for (int x : { 0, 30, 60, 90 } ) { | 
|  | canvas->drawBitmap(bitmap, x, 70); | 
|  | } | 
|  | } | 
|  | ## | 
|  |  | 
|  | #SeeAlso tryAllocPixels allocN32Pixels SkMallocPixelRef::MakeAllocate | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method void allocN32Pixels(int width, int height, bool isOpaque = false) | 
|  | #In Allocate | 
|  | #Line # allocates compatible ARGB pixels, or aborts ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | SkRandom random; | 
|  | SkBitmap bitmap; | 
|  | bitmap.allocN32Pixels(64, 64); | 
|  | bitmap.eraseColor(SK_ColorTRANSPARENT); | 
|  | for (int y = 0; y < 256; y += 64) { | 
|  | for (int x = 0; x < 256; x += 64) { | 
|  | SkColor color = random.nextU(); | 
|  | uint32_t w = random.nextRangeU(4, 32); | 
|  | uint32_t cx = random.nextRangeU(0, 64 - w); | 
|  | uint32_t h = random.nextRangeU(4, 32); | 
|  | uint32_t cy = random.nextRangeU(0, 64 - h); | 
|  | bitmap.erase(color, SkIRect::MakeXYWH(cx, cy, w, h)); | 
|  | canvas->drawBitmap(bitmap, x, y); | 
|  | } | 
|  | } | 
|  | ## | 
|  |  | 
|  | #SeeAlso allocPixels tryAllocN32Pixels SkMallocPixelRef::MakeAllocate | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method bool installPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, | 
|  | void (*releaseProc)(void* addr, void* context), void* context) | 
|  | #In Allocate | 
|  | #Line # creates Pixel_Ref, with optional release function ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Description | 
|  | releaseProc is called immediately because rowBytes is too small for Pixel_Ref. | 
|  | ## | 
|  | #Function | 
|  | static void releaseProc(void* addr, void* ) { | 
|  | SkDebugf("releaseProc called\n"); | 
|  | delete[] (uint32_t*) addr; | 
|  | } | 
|  |  | 
|  | ## | 
|  |  | 
|  | void draw(SkCanvas* canvas) { | 
|  | SkBitmap bitmap; | 
|  | void* pixels = new uint32_t[8 * 8]; | 
|  | SkImageInfo info = SkImageInfo::MakeN32(8, 8, kOpaque_SkAlphaType); | 
|  | SkDebugf("before installPixels\n"); | 
|  | bool installed = bitmap.installPixels(info, pixels, 16, releaseProc, nullptr); | 
|  | SkDebugf("install " "%s" "successful\n", installed ? "" : "not "); | 
|  | } | 
|  | #StdOut | 
|  | before installPixels | 
|  | releaseProc called | 
|  | install not successful | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso allocPixels | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method bool installPixels(const SkImageInfo& info, void* pixels, size_t rowBytes) | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Bug 7079 | 
|  | #Description | 
|  | GPU does not support kUnpremul_SkAlphaType, does not assert that it does not. | 
|  | ## | 
|  | void draw(SkCanvas* canvas) { | 
|  | SkRandom random; | 
|  | SkBitmap bitmap; | 
|  | const int width = 8; | 
|  | const int height = 8; | 
|  | uint32_t pixels[width * height]; | 
|  | for (unsigned x = 0; x < width * height; ++x) { | 
|  | pixels[x] = random.nextU(); | 
|  | } | 
|  | SkImageInfo info = SkImageInfo::MakeN32(width, height, kUnpremul_SkAlphaType); | 
|  | if (bitmap.installPixels(info, pixels, info.minRowBytes())) { | 
|  | canvas->scale(32, 32); | 
|  | canvas->drawBitmap(bitmap, 0, 0); | 
|  | } | 
|  | } | 
|  | ## | 
|  |  | 
|  | #SeeAlso allocPixels | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method bool installPixels(const SkPixmap& pixmap) | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Description | 
|  | Draw a five by five bitmap, and draw it again with a center white pixel. | 
|  | ## | 
|  | #Height 64 | 
|  | uint8_t storage[][5] = {{ 0xCA, 0xDA, 0xCA, 0xC9, 0xA3 }, | 
|  | { 0xAC, 0xA8, 0x89, 0x47, 0x87 }, | 
|  | { 0x4B, 0x25, 0x25, 0x25, 0x46 }, | 
|  | { 0x90, 0x81, 0x25, 0x41, 0x33 }, | 
|  | { 0x75, 0x55, 0x44, 0x20, 0x00 }}; | 
|  | SkImageInfo imageInfo = SkImageInfo::Make(5, 5, kGray_8_SkColorType, kOpaque_SkAlphaType); | 
|  | SkPixmap pixmap(imageInfo, storage[0], sizeof(storage) / 5); | 
|  | SkBitmap bitmap; | 
|  | bitmap.installPixels(pixmap); | 
|  | canvas->scale(10, 10); | 
|  | canvas->drawBitmap(bitmap, 0, 0); | 
|  | *pixmap.writable_addr8(2, 2) = 0xFF; | 
|  | bitmap.installPixels(pixmap); | 
|  | canvas->drawBitmap(bitmap, 10, 0); | 
|  | ## | 
|  |  | 
|  | #SeeAlso allocPixels | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  | #Subtopic Pixels | 
|  | #Line # read and write pixel values ## | 
|  | ## | 
|  |  | 
|  | #Method void setPixels(void* pixels) | 
|  | #In Pixels | 
|  | #Line # sets Pixel_Ref without an offset ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Height 50 | 
|  | uint8_t set1[5] = { 0xCA, 0xDA, 0xCA, 0xC9, 0xA3 }; | 
|  | uint8_t set2[5] = { 0xAC, 0xA8, 0x89, 0x47, 0x87 }; | 
|  | SkBitmap bitmap; | 
|  | bitmap.installPixels(SkImageInfo::Make(5, 1, kGray_8_SkColorType, kOpaque_SkAlphaType), set1, 5); | 
|  | canvas->scale(10, 50); | 
|  | canvas->drawBitmap(bitmap, 0, 0); | 
|  | bitmap.setPixels(set2); | 
|  | canvas->drawBitmap(bitmap, 10, 0); | 
|  | ## | 
|  |  | 
|  | #SeeAlso installPixels allocPixels | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method bool tryAllocPixels() | 
|  | #In Allocate | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Height 50 | 
|  | #Description | 
|  | Bitmap hosts and draws gray values in set1. tryAllocPixels replaces Pixel_Ref | 
|  | and erases it to black, but does not alter set1. setPixels replaces black | 
|  | Pixel_Ref with set1. | 
|  | ## | 
|  | uint8_t set1[5] = { 0xCA, 0xDA, 0xCA, 0xC9, 0xA3 }; | 
|  | SkBitmap bitmap; | 
|  | bitmap.installPixels(SkImageInfo::Make(5, 1, kGray_8_SkColorType, kOpaque_SkAlphaType), set1, 5); | 
|  | canvas->scale(10, 50); | 
|  | canvas->drawBitmap(bitmap, 0, 0); | 
|  | if (bitmap.tryAllocPixels()) { | 
|  | bitmap.eraseColor(SK_ColorBLACK); | 
|  | canvas->drawBitmap(bitmap, 8, 0); | 
|  | bitmap.setPixels(set1); | 
|  | canvas->drawBitmap(bitmap, 16, 0); | 
|  | } | 
|  | ## | 
|  |  | 
|  | #SeeAlso allocPixels installPixels setPixels | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method void allocPixels() | 
|  | #In Allocate | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Height 50 | 
|  | #Description | 
|  | Bitmap hosts and draws gray values in set1. allocPixels replaces Pixel_Ref | 
|  | and erases it to black, but does not alter set1. setPixels replaces black | 
|  | Pixel_Ref with set2. | 
|  | ## | 
|  | uint8_t set1[5] = { 0xCA, 0xDA, 0xCA, 0xC9, 0xA3 }; | 
|  | uint8_t set2[5] = { 0xAC, 0xA8, 0x89, 0x47, 0x87 }; | 
|  | SkBitmap bitmap; | 
|  | bitmap.installPixels(SkImageInfo::Make(5, 1, kGray_8_SkColorType, kOpaque_SkAlphaType), set1, 5); | 
|  | canvas->scale(10, 50); | 
|  | canvas->drawBitmap(bitmap, 0, 0); | 
|  | bitmap.allocPixels(); | 
|  | bitmap.eraseColor(SK_ColorBLACK); | 
|  | canvas->drawBitmap(bitmap, 8, 0); | 
|  | bitmap.setPixels(set2); | 
|  | canvas->drawBitmap(bitmap, 16, 0); | 
|  | ## | 
|  |  | 
|  | #SeeAlso tryAllocPixels installPixels setPixels | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method bool tryAllocPixels(Allocator* allocator) | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Height 100 | 
|  | #Description | 
|  | HeapAllocator limits the maximum size of Bitmap to two gigabytes. Using | 
|  | a custom allocator, this limitation may be relaxed. This example can be | 
|  | modified to allocate an eight gigabyte Bitmap on a 64-bit platform with | 
|  | sufficient memory. | 
|  | ## | 
|  | #Function | 
|  | class LargePixelRef : public SkPixelRef { | 
|  | public: | 
|  | LargePixelRef(const SkImageInfo& info, char* storage, size_t rowBytes) | 
|  | : SkPixelRef(info.width(), info.height(), storage, rowBytes) { | 
|  | } | 
|  |  | 
|  | ~LargePixelRef() override { | 
|  | delete[] (char* ) this->pixels(); | 
|  | } | 
|  | }; | 
|  |  | 
|  | class LargeAllocator : public SkBitmap::Allocator { | 
|  | public: | 
|  | bool allocPixelRef(SkBitmap* bitmap) override { | 
|  | const SkImageInfo& info = bitmap->info(); | 
|  | uint64_t rowBytes = info.minRowBytes64(); | 
|  | uint64_t size = info.height() * rowBytes; | 
|  | char* addr = new char[size]; | 
|  | if (nullptr == addr) { | 
|  | return false; | 
|  | } | 
|  | sk_sp<SkPixelRef> pr = sk_sp<SkPixelRef>(new LargePixelRef(info, addr, rowBytes)); | 
|  | if (!pr) { | 
|  | return false; | 
|  | } | 
|  | bitmap->setPixelRef(std::move(pr), 0, 0); | 
|  | return true; | 
|  | } | 
|  | }; | 
|  |  | 
|  | ## | 
|  |  | 
|  | void draw(SkCanvas* canvas) { | 
|  | LargeAllocator largeAllocator; | 
|  | SkBitmap bitmap; | 
|  | int width = 100; // make this 20000 | 
|  | int height = 100; // and this 100000 to allocate 8 gigs on a 64-bit platform | 
|  | bitmap.setInfo(SkImageInfo::MakeN32(width, height, kOpaque_SkAlphaType)); | 
|  | if (bitmap.tryAllocPixels(&largeAllocator)) { | 
|  | bitmap.eraseColor(0xff55aa33); | 
|  | canvas->drawBitmap(bitmap, 0, 0); | 
|  | } | 
|  | } | 
|  |  | 
|  | ## | 
|  |  | 
|  | #SeeAlso allocPixels Allocator Pixel_Ref | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method void allocPixels(Allocator* allocator) | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Height 32 | 
|  | #Function | 
|  | class TinyAllocator : public SkBitmap::Allocator { | 
|  | public: | 
|  | bool allocPixelRef(SkBitmap* bitmap) override { | 
|  | const SkImageInfo& info = bitmap->info(); | 
|  | if (info.height() * info.minRowBytes() > sizeof(storage)) { | 
|  | return false; | 
|  | } | 
|  | sk_sp<SkPixelRef> pr = sk_sp<SkPixelRef>( | 
|  | new SkPixelRef(info.width(), info.height(), storage, info.minRowBytes())); | 
|  | bitmap->setPixelRef(std::move(pr), 0, 0); | 
|  | return true; | 
|  | } | 
|  |  | 
|  | char storage[16]; | 
|  | }; | 
|  |  | 
|  | ## | 
|  |  | 
|  | void draw(SkCanvas* canvas) { | 
|  | TinyAllocator tinyAllocator; | 
|  | SkBitmap bitmap; | 
|  | bitmap.setInfo(SkImageInfo::MakeN32(2, 2, kOpaque_SkAlphaType)); | 
|  | if (bitmap.tryAllocPixels(&tinyAllocator)) { | 
|  | bitmap.eraseColor(0xff55aa33); | 
|  | bitmap.erase(0xffaa3355, SkIRect::MakeXYWH(1, 1, 1, 1)); | 
|  | canvas->scale(16, 16); | 
|  | canvas->drawBitmap(bitmap, 0, 0); | 
|  | } | 
|  | } | 
|  | ## | 
|  |  | 
|  | #SeeAlso allocPixels Allocator Pixel_Ref | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method SkPixelRef* pixelRef() const | 
|  | #In Property | 
|  | #Line # returns Pixel_Ref, or nullptr ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Image 3 | 
|  | SkBitmap subset; | 
|  | source.extractSubset(&subset, SkIRect::MakeXYWH(32, 64, 128, 256)); | 
|  | SkDebugf("src ref %c= sub ref\n", source.pixelRef() == subset.pixelRef() ? '=' : '!'); | 
|  | SkDebugf("src pixels %c= sub pixels\n", source.getPixels() == subset.getPixels() ? '=' : '!'); | 
|  | SkDebugf("src addr %c= sub addr\n", source.getAddr(32, 64) == subset.getAddr(0, 0) ? '=' : '!'); | 
|  | ## | 
|  |  | 
|  | #SeeAlso getPixels getAddr | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method SkIPoint pixelRefOrigin() const | 
|  | #In Property | 
|  | #Line # returns offset within Pixel_Ref ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Image 3 | 
|  | SkBitmap subset; | 
|  | source.extractSubset(&subset, SkIRect::MakeXYWH(32, 64, 128, 256)); | 
|  | SkIPoint sourceOrigin = source.pixelRefOrigin(); | 
|  | SkIPoint subsetOrigin = subset.pixelRefOrigin(); | 
|  | SkDebugf("source origin: %d, %d\n", sourceOrigin.fX, sourceOrigin.fY); | 
|  | SkDebugf("subset origin: %d, %d\n", subsetOrigin.fX, subsetOrigin.fY); | 
|  | #StdOut | 
|  | source origin: 0, 0 | 
|  | subset origin: 32, 64 | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso SkPixelRef getSubset setPixelRef | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  | #Subtopic Set | 
|  | #Line # updates values and attributes ## | 
|  | ## | 
|  |  | 
|  | #Method void setPixelRef(sk_sp<SkPixelRef> pixelRef, int dx, int dy) | 
|  | #In Set | 
|  | #Line # sets Pixel_Ref and offset ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Height 140 | 
|  | #Image 5 | 
|  | #Description | 
|  | Treating 32-bit data as 8-bit data is unlikely to produce useful results. | 
|  | ## | 
|  | SkBitmap bitmap; | 
|  | bitmap.setInfo(SkImageInfo::Make(source.width() - 5, source.height() - 5, | 
|  | kGray_8_SkColorType, kOpaque_SkAlphaType), source.rowBytes()); | 
|  | bitmap.setPixelRef(sk_ref_sp(source.pixelRef()), 5, 5); | 
|  | canvas->drawBitmap(bitmap, 10, 10); | 
|  | ## | 
|  |  | 
|  | #SeeAlso setInfo | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method bool readyToDraw() const | 
|  | #In Utility | 
|  | #Line # returns true if address of pixels is not nullptr ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Image 5 | 
|  | #Height 160 | 
|  | if (source.readyToDraw()) { | 
|  | canvas->drawBitmap(source, 10, 10); | 
|  | } | 
|  | ## | 
|  |  | 
|  | #SeeAlso getPixels drawsNothing | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method uint32_t getGenerationID() const | 
|  | #In Utility | 
|  | #Line # returns unique ID ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | SkBitmap bitmap; | 
|  | SkDebugf("empty id %u\n", bitmap.getGenerationID()); | 
|  | bitmap.allocPixels(SkImageInfo::MakeN32(64, 64, kOpaque_SkAlphaType)); | 
|  | SkDebugf("alloc id %u\n", bitmap.getGenerationID()); | 
|  | bitmap.eraseColor(SK_ColorRED); | 
|  | SkDebugf("erase id %u\n", bitmap.getGenerationID()); | 
|  | #StdOut | 
|  | #Volatile | 
|  | empty id 0 | 
|  | alloc id 4 | 
|  | erase id 6 | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso notifyPixelsChanged Pixel_Ref | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method void notifyPixelsChanged() const | 
|  | #In Pixels | 
|  | #Line # marks pixels as changed, altering the unique ID ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Height 20 | 
|  | SkBitmap bitmap; | 
|  | bitmap.setInfo(SkImageInfo::Make(1, 1, kRGBA_8888_SkColorType, kOpaque_SkAlphaType)); | 
|  | bitmap.allocPixels(); | 
|  | bitmap.eraseColor(SK_ColorRED); | 
|  | canvas->scale(16, 16); | 
|  | canvas->drawBitmap(bitmap, 0, 0); | 
|  | *(SkPMColor*) bitmap.getPixels() = SkPreMultiplyColor(SK_ColorBLUE); | 
|  | canvas->drawBitmap(bitmap, 2, 0); | 
|  | bitmap.notifyPixelsChanged(); | 
|  | *(SkPMColor*) bitmap.getPixels() = SkPreMultiplyColor(SK_ColorGREEN); | 
|  | canvas->drawBitmap(bitmap, 4, 0); | 
|  | ## | 
|  |  | 
|  | #SeeAlso getGenerationID isVolatile Pixel_Ref | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  | #Subtopic Draw | 
|  | #Line # sets pixels to Color ## | 
|  | ## | 
|  |  | 
|  | #Method void eraseColor(SkColor c) const | 
|  | #In Draw | 
|  | #Line # writes Color to pixels ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Height 20 | 
|  | SkBitmap bitmap; | 
|  | bitmap.allocPixels(SkImageInfo::MakeN32(1, 1, kOpaque_SkAlphaType)); | 
|  | bitmap.eraseColor(SK_ColorRED); | 
|  | canvas->scale(16, 16); | 
|  | canvas->drawBitmap(bitmap, 0, 0); | 
|  | ## | 
|  |  | 
|  | #SeeAlso eraseARGB erase | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method void eraseARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b) const | 
|  | #In Draw | 
|  | #Line # writes Color to pixels ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Height 80 | 
|  | SkBitmap bitmap; | 
|  | bitmap.allocPixels(SkImageInfo::MakeN32(1, 1, kPremul_SkAlphaType)); | 
|  | bitmap.eraseARGB(0x7f, 0xff, 0x7f, 0x3f); | 
|  | canvas->scale(50, 50); | 
|  | canvas->drawBitmap(bitmap, 0, 0); | 
|  | canvas->drawBitmap(bitmap, .5f, .5f); | 
|  | ## | 
|  |  | 
|  | #SeeAlso eraseColor erase | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method void erase(SkColor c, const SkIRect& area) const | 
|  | #In Draw | 
|  | #Line # writes Color to rectangle of pixels ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Height 70 | 
|  | SkBitmap bitmap; | 
|  | bitmap.allocPixels(SkImageInfo::MakeN32(2, 2, kPremul_SkAlphaType)); | 
|  | bitmap.erase(0x7fff7f3f, SkIRect::MakeWH(1, 1)); | 
|  | bitmap.erase(0x7f7f3fff, SkIRect::MakeXYWH(0, 1, 1, 1)); | 
|  | bitmap.erase(0x7f3fff7f, SkIRect::MakeXYWH(1, 0, 1, 1)); | 
|  | bitmap.erase(0x7f1fbf5f, SkIRect::MakeXYWH(1, 1, 1, 1)); | 
|  | canvas->scale(25, 25); | 
|  | canvas->drawBitmap(bitmap, 0, 0); | 
|  | canvas->drawBitmap(bitmap, .5f, .5f); | 
|  |  | 
|  | ## | 
|  |  | 
|  | #SeeAlso eraseColor eraseARGB SkCanvas::drawRect | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method SkColor getColor(int x, int y) const | 
|  | #In Property | 
|  | #In Pixels | 
|  | #Line # returns one pixel as Unpremultiplied Color ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | const int w = 4; | 
|  | const int h = 4; | 
|  | SkColor colors[][w] = { | 
|  | { 0x00000000, 0x2a0e002a, 0x55380055, 0x7f7f007f }, | 
|  | { 0x2a000e2a, 0x551c1c55, 0x7f542a7f, 0xaaaa38aa }, | 
|  | { 0x55003855, 0x7f2a547f, 0xaa7171aa, 0xd4d48dd4 }, | 
|  | { 0x7f007f7f, 0xaa38aaaa, 0xd48dd4d4, 0xffffffff } | 
|  | }; | 
|  | SkDebugf("Premultiplied:\n"); | 
|  | for (int y = 0; y < h; ++y) { | 
|  | SkDebugf("(0, %d) ", y); | 
|  | for (int x = 0; x < w; ++x) { | 
|  | SkDebugf("0x%08x%c", colors[y][x], x == w - 1 ? '\n' : ' '); | 
|  | } | 
|  | } | 
|  | SkPixmap pixmap(SkImageInfo::MakeN32(w, h, kPremul_SkAlphaType), colors, w * 4); | 
|  | SkBitmap bitmap; | 
|  | bitmap.installPixels(pixmap); | 
|  | SkDebugf("Unpremultiplied:\n"); | 
|  | for (int y = 0; y < h; ++y) { | 
|  | SkDebugf("(0, %d) ", y); | 
|  | for (int x = 0; x < w; ++x) { | 
|  | SkDebugf("0x%08x%c", bitmap.getColor(x, y), x == w - 1 ? '\n' : ' '); | 
|  | } | 
|  | } | 
|  | #StdOut | 
|  | Premultiplied: | 
|  | (0, 0) 0x00000000 0x2a0e002a 0x55380055 0x7f7f007f | 
|  | (0, 1) 0x2a000e2a 0x551c1c55 0x7f542a7f 0xaaaa38aa | 
|  | (0, 2) 0x55003855 0x7f2a547f 0xaa7171aa 0xd4d48dd4 | 
|  | (0, 3) 0x7f007f7f 0xaa38aaaa 0xd48dd4d4 0xffffffff | 
|  | Unpremultiplied: | 
|  | (0, 0) 0x00000000 0x2a5500ff 0x55a800ff 0x7fff00ff | 
|  | (0, 1) 0x2a0055ff 0x555454ff 0x7fa954ff 0xaaff54ff | 
|  | (0, 2) 0x5500a8ff 0x7f54a9ff 0xaaaaaaff 0xd4ffaaff | 
|  | (0, 3) 0x7f00ffff 0xaa54ffff 0xd4aaffff 0xffffffff | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso getAlphaf getAddr readPixels | 
|  |  | 
|  | ## | 
|  |  | 
|  | #Method float getAlphaf(int x, int y) const | 
|  | #In Property | 
|  | #Line # returns Alpha normalized from zero to one ## | 
|  |  | 
|  | Looks up the pixel at (x,y) and return its alpha component, normalized to [0..1]. | 
|  | This is roughly equivalent to #Formula # SkGetColorA(getColor()) ##, but can be more efficient | 
|  | (and more precise if the pixels store more than 8 bits per component). | 
|  |  | 
|  | #Param x  column index, zero or greater, and less than width() ## | 
|  | #Param y  row index, zero or greater, and less than height() ## | 
|  |  | 
|  | #Return   alpha converted to normalized float ## | 
|  |  | 
|  | #NoExample | 
|  | ## | 
|  |  | 
|  | #SeeAlso getColor | 
|  |  | 
|  | ## | 
|  |  | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method void* getAddr(int x, int y) const | 
|  | #In Property | 
|  | #Line # returns readable pixel address as void pointer ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Image 3 | 
|  | char* row0 = (char* ) source.getAddr(0, 0); | 
|  | char* row1 = (char* ) source.getAddr(0, 1); | 
|  | SkDebugf("addr interval %c= rowBytes\n", | 
|  | (size_t) (row1 - row0) == source.rowBytes() ? '=' : '!'); | 
|  | #StdOut | 
|  | addr interval == rowBytes | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso getAddr8 getAddr16 getAddr32 readPixels SkPixmap::addr | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method uint32_t* getAddr32(int x, int y) const | 
|  | #In Property | 
|  | #Line # returns readable pixel address as 32-bit pointer ## | 
|  | Returns address at (x, y). | 
|  |  | 
|  | Input is not validated. Triggers an assert() if built with SK_DEBUG defined and: | 
|  | #List | 
|  | # Pixel_Ref is nullptr ## | 
|  | # bytesPerPixel() is not four ## | 
|  | # x is negative, or not less than width() ## | 
|  | # y is negative, or not less than height() ## | 
|  | ## | 
|  |  | 
|  | #Param x  column index, zero or greater, and less than width() ## | 
|  | #Param y  row index, zero or greater, and less than height() ## | 
|  |  | 
|  | #Return  unsigned 32-bit pointer to pixel at (x, y) ## | 
|  |  | 
|  | #Example | 
|  | #Image 3 | 
|  | uint32_t* row0 = source.getAddr32(0, 0); | 
|  | uint32_t* row1 = source.getAddr32(0, 1); | 
|  | size_t interval = (row1 - row0) * source.bytesPerPixel(); | 
|  | SkDebugf("addr interval %c= rowBytes\n", interval == source.rowBytes() ? '=' : '!'); | 
|  | #StdOut | 
|  | addr interval == rowBytes | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso getAddr8 getAddr16 getAddr readPixels SkPixmap::addr32 | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method uint16_t* getAddr16(int x, int y) const | 
|  | #In Property | 
|  | #Line # returns readable pixel address as 16-bit pointer ## | 
|  | Returns address at (x, y). | 
|  |  | 
|  | Input is not validated. Triggers an assert() if built with SK_DEBUG defined and: | 
|  | #List | 
|  | # Pixel_Ref is nullptr ## | 
|  | # bytesPerPixel() is not two ## | 
|  | # x is negative, or not less than width() ## | 
|  | # y is negative, or not less than height() ## | 
|  | ## | 
|  |  | 
|  | #Param x  column index, zero or greater, and less than width() ## | 
|  | #Param y  row index, zero or greater, and less than height() ## | 
|  |  | 
|  | #Return  unsigned 16-bit pointer to pixel at (x, y)## | 
|  |  | 
|  | #Example | 
|  | #Image 3 | 
|  | SkBitmap bitmap16; | 
|  | SkImageInfo dstInfo = SkImageInfo::Make(source.width(), source.height(), kARGB_4444_SkColorType, | 
|  | kPremul_SkAlphaType); | 
|  | bitmap16.allocPixels(dstInfo); | 
|  | if (source.readPixels(dstInfo, bitmap16.getPixels(), bitmap16.rowBytes(), 0, 0)) { | 
|  | uint16_t* row0 = bitmap16.getAddr16(0, 0); | 
|  | uint16_t* row1 = bitmap16.getAddr16(0, 1); | 
|  | size_t interval = (row1 - row0) * bitmap16.bytesPerPixel(); | 
|  | SkDebugf("addr interval %c= rowBytes\n", interval == bitmap16.rowBytes() ? '=' : '!'); | 
|  | } | 
|  | #StdOut | 
|  | addr interval == rowBytes | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso getAddr8 getAddr getAddr32 readPixels SkPixmap::addr16 | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method uint8_t* getAddr8(int x, int y) const | 
|  | #In Property | 
|  | #Line # returns readable pixel address as 8-bit pointer ## | 
|  | Returns address at (x, y). | 
|  |  | 
|  | Input is not validated. Triggers an assert() if built with SK_DEBUG defined and: | 
|  | #List | 
|  | # Pixel_Ref is nullptr ## | 
|  | # bytesPerPixel() is not one ## | 
|  | # x is negative, or not less than width() ## | 
|  | # y is negative, or not less than height() ## | 
|  | ## | 
|  |  | 
|  | #Param x  column index, zero or greater, and less than width() ## | 
|  | #Param y  row index, zero or greater, and less than height() ## | 
|  |  | 
|  | #Return unsigned 8-bit pointer to pixel at (x, y) ## | 
|  |  | 
|  | #Example | 
|  | SkBitmap bitmap; | 
|  | const int width = 8; | 
|  | const int height = 8; | 
|  | uint8_t pixels[height][width]; | 
|  | SkImageInfo info = SkImageInfo::Make(width, height, kGray_8_SkColorType, kOpaque_SkAlphaType); | 
|  | if (bitmap.installPixels(info, pixels, info.minRowBytes())) { | 
|  | SkDebugf("&pixels[4][2] %c= bitmap.getAddr8(2, 4)\n", | 
|  | &pixels[4][2]  == bitmap.getAddr8(2, 4) ? '=' : '!'); | 
|  | } | 
|  | #StdOut | 
|  | &pixels[4][2] == bitmap.getAddr8(2, 4) | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso getAddr getAddr16 getAddr32 readPixels SkPixmap::addr8 | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method bool extractSubset(SkBitmap* dst, const SkIRect& subset) const | 
|  | #In Constructors | 
|  | #Line # creates Bitmap, sharing pixels if possible ## | 
|  | Shares Pixel_Ref with dst. Pixels are not copied; Bitmap and dst point | 
|  | to the same pixels; dst bounds() are set to the intersection of subset | 
|  | and the original bounds(). | 
|  |  | 
|  | subset may be larger than bounds(). Any area outside of bounds() is ignored. | 
|  |  | 
|  | Any contents of dst are discarded. isVolatile setting is copied to dst. | 
|  | dst is set to colorType, alphaType, and colorSpace. | 
|  |  | 
|  | Return false if: | 
|  | #List | 
|  | # dst is nullptr ## | 
|  | # Pixel_Ref is nullptr ## | 
|  | # subset does not intersect bounds() ## | 
|  | ## | 
|  |  | 
|  | #Param dst  Bitmap set to subset ## | 
|  | #Param subset  rectangle of pixels to reference ## | 
|  |  | 
|  | #Return  true if dst is replaced by subset | 
|  | ## | 
|  |  | 
|  | #Example | 
|  | #Image 3 | 
|  | SkIRect bounds, s; | 
|  | source.getBounds(&bounds); | 
|  | SkDebugf("bounds: %d, %d, %d, %d\n", bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom); | 
|  | SkBitmap subset; | 
|  | for (int left: { -100, 0, 100, 1000 } ) { | 
|  | for (int right: { 0, 100, 1000 } ) { | 
|  | SkIRect b = SkIRect::MakeLTRB(left, 100, right, 200); | 
|  | bool success = source.extractSubset(&subset, b); | 
|  | SkDebugf("subset: %4d, %4d, %4d, %4d  ", b.fLeft, b.fTop, b.fRight, b.fBottom); | 
|  | SkDebugf("success; %s", success ? "true" : "false"); | 
|  | if (success) { | 
|  | subset.getBounds(&s); | 
|  | SkDebugf("  subset: %d, %d, %d, %d", s.fLeft, s.fTop, s.fRight, s.fBottom); | 
|  | } | 
|  | SkDebugf("\n"); | 
|  | } | 
|  | } | 
|  | #StdOut | 
|  | bounds: 0, 0, 512, 512 | 
|  | subset: -100,  100,    0,  200  success; false | 
|  | subset: -100,  100,  100,  200  success; true  subset: 0, 0, 100, 100 | 
|  | subset: -100,  100, 1000,  200  success; true  subset: 0, 0, 512, 100 | 
|  | subset:    0,  100,    0,  200  success; false | 
|  | subset:    0,  100,  100,  200  success; true  subset: 0, 0, 100, 100 | 
|  | subset:    0,  100, 1000,  200  success; true  subset: 0, 0, 512, 100 | 
|  | subset:  100,  100,    0,  200  success; false | 
|  | subset:  100,  100,  100,  200  success; false | 
|  | subset:  100,  100, 1000,  200  success; true  subset: 0, 0, 412, 100 | 
|  | subset: 1000,  100,    0,  200  success; false | 
|  | subset: 1000,  100,  100,  200  success; false | 
|  | subset: 1000,  100, 1000,  200  success; false | 
|  | ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso readPixels writePixels SkCanvas::drawBitmap | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method bool readPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstRowBytes, | 
|  | int srcX, int srcY) const | 
|  | #In Pixels | 
|  | #Line # copies and converts pixels ## | 
|  |  | 
|  | Copies a Rect of pixels from Bitmap to dstPixels. Copy starts at (srcX, srcY), | 
|  | and does not exceed Bitmap (width(), height()). | 
|  |  | 
|  | dstInfo specifies width, height, Color_Type, Alpha_Type, and Color_Space of | 
|  | destination. dstRowBytes specifics the gap from one destination row to the next. | 
|  | Returns true if pixels are copied. Returns false if: | 
|  | #List | 
|  | # dstInfo has no address ## | 
|  | # dstRowBytes is less than dstInfo.minRowBytes() ## | 
|  | # Pixel_Ref is nullptr ## | 
|  | ## | 
|  |  | 
|  | Pixels are copied only if pixel conversion is possible. If Bitmap colorType is | 
|  | kGray_8_SkColorType, or kAlpha_8_SkColorType; dstInfo.colorType() must match. | 
|  | If Bitmap colorType is kGray_8_SkColorType, dstInfo.colorSpace() must match. | 
|  | If Bitmap alphaType is kOpaque_SkAlphaType, dstInfo.alphaType() must | 
|  | match. If Bitmap colorSpace is nullptr, dstInfo.colorSpace() must match. Returns | 
|  | false if pixel conversion is not possible. | 
|  |  | 
|  | srcX and srcY may be negative to copy only top or left of source. Returns | 
|  | false if width() or height() is zero or negative. | 
|  | Returns false if #Formula # abs(srcX) >= Bitmap width() ##, or if #Formula # abs(srcY) >= Bitmap height() ##. | 
|  |  | 
|  | #Param dstInfo  destination width, height, Color_Type, Alpha_Type, Color_Space ## | 
|  | #Param dstPixels  destination pixel storage ## | 
|  | #Param dstRowBytes  destination row length ## | 
|  | #Param srcX  column index whose absolute value is less than width() ## | 
|  | #Param srcY  row index whose absolute value is less than height() ## | 
|  |  | 
|  | #Return  true if pixels are copied to dstPixels ## | 
|  |  | 
|  | #Example | 
|  | #Height 128 | 
|  | #Description | 
|  | Transferring the gradient from 8 bits per component to 4 bits per component | 
|  | creates visible banding. | 
|  | ## | 
|  | const int width = 256; | 
|  | const int height = 64; | 
|  | SkImageInfo srcInfo = SkImageInfo::MakeN32Premul(width, height); | 
|  | SkColor  gradColors[] = { 0xFFAA3300, 0x7F881122 }; | 
|  | SkPoint  gradPoints[] = { { 0, 0 }, { 256, 0 } }; | 
|  | SkPaint paint; | 
|  | paint.setShader(SkGradientShader::MakeLinear(gradPoints, gradColors, nullptr, | 
|  | SK_ARRAY_COUNT(gradColors), SkShader::kClamp_TileMode)); | 
|  | SkBitmap bitmap; | 
|  | bitmap.allocPixels(srcInfo); | 
|  | SkCanvas srcCanvas(bitmap); | 
|  | srcCanvas.drawRect(SkRect::MakeWH(width, height), paint); | 
|  | canvas->drawBitmap(bitmap, 0, 0); | 
|  | SkImageInfo dstInfo = srcInfo.makeColorType(kARGB_4444_SkColorType); | 
|  | std::vector<int16_t> dstPixels; | 
|  | dstPixels.resize(height * width); | 
|  | bitmap.readPixels(dstInfo, &dstPixels.front(), width * 2, 0, 0); | 
|  | SkPixmap dstPixmap(dstInfo, &dstPixels.front(), width * 2); | 
|  | bitmap.installPixels(dstPixmap); | 
|  | canvas->drawBitmap(bitmap, 0, 64); | 
|  | ## | 
|  |  | 
|  | #SeeAlso writePixels SkPixmap::readPixels SkCanvas::readPixels SkImage::readPixels SkSurface::readPixels | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method bool readPixels(const SkPixmap& dst, int srcX, int srcY) const | 
|  |  | 
|  | Copies a Rect of pixels from Bitmap to dst. Copy starts at (srcX, srcY), and | 
|  | does not exceed Bitmap (width(), height()). | 
|  |  | 
|  | dst specifies width, height, Color_Type, Alpha_Type, Color_Space, pixel storage, | 
|  | and row bytes of destination. dst.rowBytes() specifics the gap from one destination | 
|  | row to the next. Returns true if pixels are copied. Returns false if: | 
|  | #List | 
|  | # dst pixel storage equals nullptr ## | 
|  | # dst.rowBytes() is less than SkImageInfo::minRowBytes() ## | 
|  | # Pixel_Ref is nullptr ## | 
|  | ## | 
|  |  | 
|  | Pixels are copied only if pixel conversion is possible. If Bitmap colorType is | 
|  | kGray_8_SkColorType, or kAlpha_8_SkColorType; dst Color_Type must match. | 
|  | If Bitmap colorType is kGray_8_SkColorType, dst Color_Space must match. | 
|  | If Bitmap alphaType is kOpaque_SkAlphaType, dst Alpha_Type must | 
|  | match. If Bitmap colorSpace is nullptr, dst Color_Space must match. Returns | 
|  | false if pixel conversion is not possible. | 
|  |  | 
|  | srcX and srcY may be negative to copy only top or left of source. Returns | 
|  | false if width() or height() is zero or negative. | 
|  | Returns false if #Formula # abs(srcX) >= Bitmap width() ##, or if #Formula # abs(srcY) >= Bitmap height() ##. | 
|  |  | 
|  | #Param dst  destination Pixmap: Image_Info, pixels, row bytes ## | 
|  | #Param srcX  column index whose absolute value is less than width() ## | 
|  | #Param srcY  row index whose absolute value is less than height() ## | 
|  |  | 
|  | #Return  true if pixels are copied to dst ## | 
|  |  | 
|  | #Example | 
|  | #Image 3 | 
|  | std::vector<int32_t> srcPixels; | 
|  | srcPixels.resize(source.height() * source.rowBytes()); | 
|  | for (int y = 0; y < 4; ++y) { | 
|  | for (int x = 0; x < 4; ++x) { | 
|  | SkPixmap pixmap(SkImageInfo::MakeN32Premul(source.width() / 4, source.height() / 4), | 
|  | &srcPixels.front() + x * source.height() * source.width() / 4 + | 
|  | y * source.width() / 4, source.rowBytes()); | 
|  | source.readPixels(pixmap, x * source.width() / 4, y * source.height() / 4); | 
|  | } | 
|  | } | 
|  | canvas->scale(.5f, .5f); | 
|  | SkBitmap bitmap; | 
|  | bitmap.installPixels(SkImageInfo::MakeN32Premul(source.width(), source.height()), | 
|  | &srcPixels.front(), source.rowBytes()); | 
|  | canvas->drawBitmap(bitmap, 0, 0); | 
|  | ## | 
|  |  | 
|  | #SeeAlso writePixels SkPixmap::readPixels SkCanvas::readPixels SkImage::readPixels SkSurface::readPixels | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method bool readPixels(const SkPixmap& dst) const | 
|  |  | 
|  | Copies a Rect of pixels from Bitmap to dst. Copy starts at (0, 0), and | 
|  | does not exceed Bitmap (width(), height()). | 
|  |  | 
|  | dst specifies width, height, Color_Type, Alpha_Type, Color_Space, pixel storage, | 
|  | and row bytes of destination. dst.rowBytes() specifics the gap from one destination | 
|  | row to the next. Returns true if pixels are copied. Returns false if: | 
|  | #List | 
|  | # dst pixel storage equals nullptr ## | 
|  | # dst.rowBytes() is less than SkImageInfo::minRowBytes() ## | 
|  | # Pixel_Ref is nullptr ## | 
|  | ## | 
|  |  | 
|  | Pixels are copied only if pixel conversion is possible. If Bitmap colorType is | 
|  | kGray_8_SkColorType, or kAlpha_8_SkColorType; dst Color_Type must match. | 
|  | If Bitmap colorType is kGray_8_SkColorType, dst Color_Space must match. | 
|  | If Bitmap alphaType is kOpaque_SkAlphaType, dst Alpha_Type must | 
|  | match. If Bitmap colorSpace is nullptr, dst Color_Space must match. Returns | 
|  | false if pixel conversion is not possible. | 
|  |  | 
|  | #Param dst  destination Pixmap: Image_Info, pixels, row bytes ## | 
|  |  | 
|  | #Return  true if pixels are copied to dst ## | 
|  |  | 
|  | #Example | 
|  | #Height 128 | 
|  | #Image 3 | 
|  | std::vector<int32_t> srcPixels; | 
|  | srcPixels.resize(source.height() * source.width() * 8); | 
|  | for (int i = 0;  i < 2; ++i) { | 
|  | SkPixmap pixmap(SkImageInfo::Make(source.width() * 2, source.height(), | 
|  | i ? kRGBA_8888_SkColorType : kBGRA_8888_SkColorType, kPremul_SkAlphaType), | 
|  | &srcPixels.front() + i * source.width(), source.rowBytes() * 2); | 
|  | source.readPixels(pixmap); | 
|  | } | 
|  | canvas->scale(.25f, .25f); | 
|  | SkBitmap bitmap; | 
|  | bitmap.installPixels(SkImageInfo::MakeN32Premul(source.width() * 2, source.height()), | 
|  | &srcPixels.front(), source.rowBytes() * 2); | 
|  | canvas->drawBitmap(bitmap, 0, 0); | 
|  | ## | 
|  |  | 
|  | #SeeAlso writePixels SkPixmap::readPixels SkCanvas::readPixels SkImage::readPixels SkSurface::readPixels | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method bool writePixels(const SkPixmap& src, int dstX, int dstY) | 
|  | #In Pixels | 
|  | #Line # copies and converts pixels ## | 
|  | Copies a Rect of pixels from src. Copy starts at (dstX, dstY), and does not exceed | 
|  | (src.width(), src.height()). | 
|  |  | 
|  | src specifies width, height, Color_Type, Alpha_Type, Color_Space, pixel storage, | 
|  | and row bytes of source. src.rowBytes() specifics the gap from one source | 
|  | row to the next. Returns true if pixels are copied. Returns false if: | 
|  | #List | 
|  | # src pixel storage equals nullptr ## | 
|  | # src.rowBytes() is less than SkImageInfo::minRowBytes() ## | 
|  | # Pixel_Ref is nullptr ## | 
|  | ## | 
|  |  | 
|  | Pixels are copied only if pixel conversion is possible. If Bitmap colorType is | 
|  | kGray_8_SkColorType, or kAlpha_8_SkColorType; src Color_Type must match. | 
|  | If Bitmap colorType is kGray_8_SkColorType, src Color_Space must match. | 
|  | If Bitmap alphaType is kOpaque_SkAlphaType, src Alpha_Type must | 
|  | match. If Bitmap colorSpace is nullptr, src Color_Space must match. Returns | 
|  | false if pixel conversion is not possible. | 
|  |  | 
|  | dstX and dstY may be negative to copy only top or left of source. Returns | 
|  | false if width() or height() is zero or negative. | 
|  | Returns false if #Formula # abs(dstX) >= Bitmap width() ##, or if #Formula # abs(dstY) >= Bitmap height() ##. | 
|  |  | 
|  | #Param src  source Pixmap: Image_Info, pixels, row bytes ## | 
|  | #Param dstX  column index whose absolute value is less than width() ## | 
|  | #Param dstY  row index whose absolute value is less than height() ## | 
|  |  | 
|  | #Return  true if src pixels are copied to Bitmap ## | 
|  |  | 
|  | #Example | 
|  | #Image 3 | 
|  | std::vector<int32_t> srcPixels; | 
|  | int width = image->width(); | 
|  | int height = image->height(); | 
|  | srcPixels.resize(height * width  * 4); | 
|  | SkPixmap pixmap(SkImageInfo::MakeN32Premul(width, height), (const void*) &srcPixels.front(), | 
|  | width * 4); | 
|  | image->readPixels(pixmap, 0, 0); | 
|  | canvas->scale(.5f, .5f); | 
|  | width /= 4; | 
|  | height /= 4; | 
|  | for (int y = 0; y < 4; ++y) { | 
|  | for (int x = 0; x < 4; ++x) { | 
|  | SkBitmap bitmap; | 
|  | bitmap.allocPixels(SkImageInfo::MakeN32Premul(width, height)); | 
|  | bitmap.writePixels(pixmap, -y * width, -x * height); | 
|  | canvas->drawBitmap(bitmap, x * width, y * height); | 
|  | } | 
|  | } | 
|  | ## | 
|  |  | 
|  | #SeeAlso readPixels | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method bool writePixels(const SkPixmap& src) | 
|  |  | 
|  | Copies a Rect of pixels from src. Copy starts at (0, 0), and does not exceed | 
|  | (src.width(), src.height()). | 
|  |  | 
|  | src specifies width, height, Color_Type, Alpha_Type, Color_Space, pixel storage, | 
|  | and row bytes of source. src.rowBytes() specifics the gap from one source | 
|  | row to the next. Returns true if pixels are copied. Returns false if: | 
|  | #List | 
|  | # src pixel storage equals nullptr ## | 
|  | # src.rowBytes() is less than SkImageInfo::minRowBytes() ## | 
|  | # Pixel_Ref is nullptr ## | 
|  | ## | 
|  |  | 
|  | Pixels are copied only if pixel conversion is possible. If Bitmap colorType is | 
|  | kGray_8_SkColorType, or kAlpha_8_SkColorType; src Color_Type must match. | 
|  | If Bitmap colorType is kGray_8_SkColorType, src Color_Space must match. | 
|  | If Bitmap alphaType is kOpaque_SkAlphaType, src Alpha_Type must | 
|  | match. If Bitmap colorSpace is nullptr, src Color_Space must match. Returns | 
|  | false if pixel conversion is not possible. | 
|  |  | 
|  | #Param src  source Pixmap: Image_Info, pixels, row bytes ## | 
|  |  | 
|  | #Return  true if src pixels are copied to Bitmap ## | 
|  |  | 
|  | #Example | 
|  | #Height 80 | 
|  | SkBitmap bitmap; | 
|  | bitmap.allocPixels(SkImageInfo::MakeN32Premul(2, 2)); | 
|  | bitmap.eraseColor(SK_ColorGREEN); | 
|  | SkPMColor color = 0xFF5599BB; | 
|  | SkPixmap src(SkImageInfo::MakeN32Premul(1, 1), &color, 4); | 
|  | bitmap.writePixels(src); | 
|  | canvas->scale(40, 40); | 
|  | canvas->drawBitmap(bitmap, 0, 0); | 
|  | ## | 
|  |  | 
|  | #SeeAlso readPixels | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method bool extractAlpha(SkBitmap* dst) const | 
|  | #In Constructors | 
|  | #Line # creates Bitmap containing Alpha of pixels ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Height 100 | 
|  | SkBitmap alpha, bitmap; | 
|  | bitmap.allocN32Pixels(100, 100); | 
|  | SkCanvas offscreen(bitmap); | 
|  | offscreen.clear(0); | 
|  | SkPaint paint; | 
|  | paint.setAntiAlias(true); | 
|  | paint.setColor(SK_ColorBLUE); | 
|  | paint.setStyle(SkPaint::kStroke_Style); | 
|  | paint.setStrokeWidth(20); | 
|  | offscreen.drawCircle(50, 50, 39, paint); | 
|  | offscreen.flush(); | 
|  | bitmap.extractAlpha(&alpha); | 
|  | paint.setColor(SK_ColorRED); | 
|  | canvas->drawBitmap(bitmap, 0, 0, &paint); | 
|  | canvas->drawBitmap(alpha, 100, 0, &paint); | 
|  | ## | 
|  |  | 
|  | #SeeAlso extractSubset | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method bool extractAlpha(SkBitmap* dst, const SkPaint* paint, | 
|  | SkIPoint* offset) const | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Height 160 | 
|  | auto radiusToSigma = [](SkScalar radius) -> SkScalar { | 
|  | static const SkScalar kBLUR_SIGMA_SCALE = 0.57735f; | 
|  | return radius > 0 ? kBLUR_SIGMA_SCALE * radius + 0.5f : 0.0f; | 
|  | }; | 
|  | SkBitmap alpha, bitmap; | 
|  | bitmap.allocN32Pixels(100, 100); | 
|  | SkCanvas offscreen(bitmap); | 
|  | offscreen.clear(0); | 
|  | SkPaint paint; | 
|  | paint.setAntiAlias(true); | 
|  | paint.setColor(SK_ColorBLUE); | 
|  | paint.setStyle(SkPaint::kStroke_Style); | 
|  | paint.setStrokeWidth(20); | 
|  | offscreen.drawCircle(50, 50, 39, paint); | 
|  | offscreen.flush(); | 
|  | paint.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle, radiusToSigma(25))); | 
|  | SkIPoint offset; | 
|  | bitmap.extractAlpha(&alpha, &paint, &offset); | 
|  | paint.setColor(SK_ColorRED); | 
|  | canvas->drawBitmap(bitmap, 0, -offset.fY, &paint); | 
|  | canvas->drawBitmap(alpha, 100 + offset.fX, 0, &paint); | 
|  | ## | 
|  |  | 
|  | #SeeAlso extractSubset | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method bool extractAlpha(SkBitmap* dst, const SkPaint* paint, Allocator* allocator, | 
|  | SkIPoint* offset) const | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | #Height 128 | 
|  | SkBitmap alpha, bitmap; | 
|  | bitmap.allocN32Pixels(100, 100); | 
|  | SkCanvas offscreen(bitmap); | 
|  | offscreen.clear(0); | 
|  | SkPaint paint; | 
|  | paint.setAntiAlias(true); | 
|  | paint.setColor(SK_ColorBLUE); | 
|  | paint.setStyle(SkPaint::kStroke_Style); | 
|  | paint.setStrokeWidth(20); | 
|  | offscreen.drawCircle(50, 50, 39, paint); | 
|  | offscreen.flush(); | 
|  | paint.setMaskFilter(SkMaskFilter::MakeBlur(kOuter_SkBlurStyle, 3)); | 
|  | SkIPoint offset; | 
|  | bitmap.extractAlpha(&alpha, &paint, nullptr, &offset); | 
|  | paint.setColor(SK_ColorRED); | 
|  | canvas->drawBitmap(bitmap, 0, -offset.fY, &paint); | 
|  | canvas->drawBitmap(alpha, 100 + offset.fX, 0, &paint); | 
|  | ## | 
|  |  | 
|  | #SeeAlso extractSubset | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Method bool peekPixels(SkPixmap* pixmap) const | 
|  | #In Pixels | 
|  | #Line # returns Pixmap if possible ## | 
|  | #Populate | 
|  |  | 
|  | #Example | 
|  | SkBitmap bitmap; | 
|  | bitmap.allocPixels(SkImageInfo::MakeN32Premul(6, 11)); | 
|  | SkCanvas offscreen(bitmap); | 
|  | offscreen.clear(SK_ColorWHITE); | 
|  | SkPaint paint; | 
|  | offscreen.drawString("?", 0, 10, paint); | 
|  | SkPixmap pixmap; | 
|  | if (bitmap.peekPixels(&pixmap)) { | 
|  | const SkPMColor* pixels = pixmap.addr32(); | 
|  | SkPMColor pmWhite = pixels[0]; | 
|  | for (int y = 0; y < bitmap.height(); ++y) { | 
|  | for (int x = 0; x < bitmap.width(); ++x) { | 
|  | SkDebugf("%c", *pixels++ == pmWhite ? '-' : 'x'); | 
|  | } | 
|  | SkDebugf("\n"); | 
|  | } | 
|  | } | 
|  | #StdOut | 
|  | ------ | 
|  | -xxx-- | 
|  | x---x- | 
|  | ----x- | 
|  | ---x-- | 
|  | --x--- | 
|  | --x--- | 
|  | ------ | 
|  | --x--- | 
|  | --x--- | 
|  | ------ | 
|  | #StdOut ## | 
|  | ## | 
|  |  | 
|  | #SeeAlso pixmap installPixels readPixels writePixels | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  | #Subtopic Utility | 
|  | #Line # rarely called management functions ## | 
|  | ## | 
|  |  | 
|  | #Method void validate() const; | 
|  | #In Utility | 
|  | #Line # asserts if Bitmap is invalid (debug only) ## | 
|  | #Populate | 
|  |  | 
|  | #NoExample | 
|  | ## | 
|  |  | 
|  | #SeeAlso SkImageInfo::validate | 
|  |  | 
|  | ## | 
|  |  | 
|  | # ------------------------------------------------------------------------------ | 
|  |  | 
|  | #Class SkBitmap ## | 
|  |  | 
|  | #Topic Bitmap ## |