diff options
Diffstat (limited to 'include/core/SkBitmap.h')
-rw-r--r-- | include/core/SkBitmap.h | 114 |
1 files changed, 62 insertions, 52 deletions
diff --git a/include/core/SkBitmap.h b/include/core/SkBitmap.h index 87d4649228..ad47dfadf4 100644 --- a/include/core/SkBitmap.h +++ b/include/core/SkBitmap.h @@ -79,10 +79,42 @@ public: // This method is not exported to java. void swap(SkBitmap& other); + /////////////////////////////////////////////////////////////////////////// + + const SkImageInfo& info() const { return fInfo; } + + int width() const { return fInfo.fWidth; } + int height() const { return fInfo.fHeight; } + SkColorType colorType() const { return fInfo.fColorType; } + SkAlphaType alphaType() const { return fInfo.fAlphaType; } + + /** Return the number of bytes per pixel based on the config. If the config + does not have at least 1 byte per (e.g. kA1_Config) then 0 is returned. + */ + int bytesPerPixel() const { return fInfo.bytesPerPixel(); } + + /** Return the rowbytes expressed as a number of pixels (like width and + height). Note, for 1-byte per pixel configs like kA8_Config, this will + return the same as rowBytes(). Is undefined for configs that are less + than 1-byte per pixel (e.g. kA1_Config) + */ + int rowBytesAsPixels() const { + return fRowBytes >> this->shiftPerPixel(); + } + + /** Return the shift amount per pixel (i.e. 0 for 1-byte per pixel, 1 for + 2-bytes per pixel configs, 2 for 4-bytes per pixel configs). Return 0 + for configs that are not at least 1-byte per pixel (e.g. kA1_Config + or kNo_Config) + */ + int shiftPerPixel() const { return this->bytesPerPixel() >> 1; } + + /////////////////////////////////////////////////////////////////////////// + /** Return true iff the bitmap has empty dimensions. * Hey! Before you use this, see if you really want to know drawsNothing() instead. */ - bool empty() const { return 0 == fWidth || 0 == fHeight; } + bool empty() const { return fInfo.isEmpty(); } /** Return true iff the bitmap has no pixelref. Note: this can return true even if the * dimensions of the bitmap are > 0 (see empty()). @@ -95,41 +127,14 @@ public: bool drawsNothing() const { return this->empty() || this->isNull(); } /** Return the config for the bitmap. */ - Config config() const { return (Config)fConfig; } + Config config() const; SK_ATTR_DEPRECATED("use config()") Config getConfig() const { return this->config(); } - /** Return the bitmap's width, in pixels. */ - int width() const { return fWidth; } - - /** Return the bitmap's height, in pixels. */ - int height() const { return fHeight; } - /** Return the number of bytes between subsequent rows of the bitmap. */ size_t rowBytes() const { return fRowBytes; } - /** Return the shift amount per pixel (i.e. 0 for 1-byte per pixel, 1 for - 2-bytes per pixel configs, 2 for 4-bytes per pixel configs). Return 0 - for configs that are not at least 1-byte per pixel (e.g. kA1_Config - or kNo_Config) - */ - int shiftPerPixel() const { return fBytesPerPixel >> 1; } - - /** Return the number of bytes per pixel based on the config. If the config - does not have at least 1 byte per (e.g. kA1_Config) then 0 is returned. - */ - int bytesPerPixel() const { return fBytesPerPixel; } - - /** Return the rowbytes expressed as a number of pixels (like width and - height). Note, for 1-byte per pixel configs like kA8_Config, this will - return the same as rowBytes(). Is undefined for configs that are less - than 1-byte per pixel (e.g. kA1_Config) - */ - int rowBytesAsPixels() const { return fRowBytes >> (fBytesPerPixel >> 1); } - - SkAlphaType alphaType() const { return (SkAlphaType)fAlphaType; } - /** * Set the bitmap's alphaType, returning true on success. If false is * returned, then the specified new alphaType is incompatible with the @@ -149,19 +154,19 @@ public: Note this truncates the result to 32bits. Call getSize64() to detect if the real size exceeds 32bits. */ - size_t getSize() const { return fHeight * fRowBytes; } + size_t getSize() const { return fInfo.fHeight * fRowBytes; } /** Return the number of bytes from the pointer returned by getPixels() to the end of the allocated space in the buffer. Required in cases where extractSubset has been called. */ - size_t getSafeSize() const ; + size_t getSafeSize() const { return fInfo.getSafeSize(fRowBytes); } /** * Return the full size of the bitmap, in bytes. */ int64_t computeSize64() const { - return sk_64_mul(fHeight, fRowBytes); + return sk_64_mul(fInfo.fHeight, fRowBytes); } /** @@ -170,7 +175,7 @@ public: * than computeSize64() if there is any rowbytes padding beyond the width. */ int64_t computeSafeSize64() const { - return ComputeSafeSize64((Config)fConfig, fWidth, fHeight, fRowBytes); + return fInfo.getSafeSize64(fRowBytes); } /** Returns true if this bitmap is marked as immutable, meaning that the @@ -304,11 +309,18 @@ public: void* context); /** - * If the bitmap's config can be represented as SkImageInfo, return true, - * and if info is not-null, set it to the bitmap's info. If it cannot be - * represented as SkImageInfo, return false and ignore the info parameter. + * DEPRECATED: call info(). */ - bool asImageInfo(SkImageInfo* info) const; + bool asImageInfo(SkImageInfo* info) const { + // compatibility: return false for kUnknown + if (kUnknown_SkColorType == this->colorType()) { + return false; + } + if (info) { + *info = this->info(); + } + return true; + } /** Use this to assign a new pixel address for an existing bitmap. This will automatically release any pixelref previously installed. Only call @@ -450,8 +462,8 @@ public: */ GrTexture* getTexture() const; - /** Return the bitmap's colortable, if it uses one (i.e. fConfig is - kIndex8_Config) and the pixels are locked. + /** Return the bitmap's colortable, if it uses one (i.e. colorType is + Index_8) and the pixels are locked. Otherwise returns NULL. Does not affect the colortable's reference count. */ @@ -742,13 +754,11 @@ private: #endif }; + SkImageInfo fInfo; + uint32_t fRowBytes; - uint32_t fWidth; - uint32_t fHeight; - uint8_t fConfig; - uint8_t fAlphaType; + uint8_t fFlags; - uint8_t fBytesPerPixel; // based on config void internalErase(const SkIRect&, U8CPU a, U8CPU r, U8CPU g, U8CPU b)const; @@ -860,29 +870,29 @@ private: inline uint32_t* SkBitmap::getAddr32(int x, int y) const { SkASSERT(fPixels); - SkASSERT(fConfig == kARGB_8888_Config); - SkASSERT((unsigned)x < fWidth && (unsigned)y < fHeight); + SkASSERT(this->config() == kARGB_8888_Config); + SkASSERT((unsigned)x < (unsigned)this->width() && (unsigned)y < (unsigned)this->height()); return (uint32_t*)((char*)fPixels + y * fRowBytes + (x << 2)); } inline uint16_t* SkBitmap::getAddr16(int x, int y) const { SkASSERT(fPixels); - SkASSERT(fConfig == kRGB_565_Config || fConfig == kARGB_4444_Config); - SkASSERT((unsigned)x < fWidth && (unsigned)y < fHeight); + SkASSERT(this->config() == kRGB_565_Config || this->config() == kARGB_4444_Config); + SkASSERT((unsigned)x < (unsigned)this->width() && (unsigned)y < (unsigned)this->height()); return (uint16_t*)((char*)fPixels + y * fRowBytes + (x << 1)); } inline uint8_t* SkBitmap::getAddr8(int x, int y) const { SkASSERT(fPixels); - SkASSERT(fConfig == kA8_Config || fConfig == kIndex8_Config); - SkASSERT((unsigned)x < fWidth && (unsigned)y < fHeight); + SkASSERT(this->config() == kA8_Config || this->config() == kIndex8_Config); + SkASSERT((unsigned)x < (unsigned)this->width() && (unsigned)y < (unsigned)this->height()); return (uint8_t*)fPixels + y * fRowBytes + x; } inline SkPMColor SkBitmap::getIndex8Color(int x, int y) const { SkASSERT(fPixels); - SkASSERT(fConfig == kIndex8_Config); - SkASSERT((unsigned)x < fWidth && (unsigned)y < fHeight); + SkASSERT(this->config() == kIndex8_Config); + SkASSERT((unsigned)x < (unsigned)this->width() && (unsigned)y < (unsigned)this->height()); SkASSERT(fColorTable); return (*fColorTable)[*((const uint8_t*)fPixels + y * fRowBytes + x)]; } |