e5eb1a5904
These are no longer used by Android. Change-Id: Ie3b9aa60af681f9e076a0d0680fc716ae51f9cd8 Reviewed-on: https://skia-review.googlesource.com/c/168486 Reviewed-by: Cary Clark <caryclark@google.com> Reviewed-by: Derek Sollenberger <djsollen@google.com> Auto-Submit: Leon Scroggins <scroggo@google.com> Commit-Queue: Leon Scroggins <scroggo@google.com>
2675 lines
78 KiB
Plaintext
2675 lines
78 KiB
Plaintext
#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
|
|
|
|
##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Method bool installMaskPixels(const SkMask& mask)
|
|
#Deprecated soon
|
|
##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
#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 void eraseArea(const SkIRect& area, SkColor c) const
|
|
#Deprecated
|
|
##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#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 efficent
|
|
(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 ##
|