Chromium Code Reviews| Index: include/core/SkBitmap.h |
| diff --git a/include/core/SkBitmap.h b/include/core/SkBitmap.h |
| index 4951cf19cf7b15ef70dd1a09035f2ef7b95dbcce..164663dbae91ef0282f952a54076f023b299b8f8 100644 |
| --- a/include/core/SkBitmap.h |
| +++ b/include/core/SkBitmap.h |
| @@ -79,9 +79,41 @@ public: |
| // This method is not exported to java. |
| void swap(SkBitmap& other); |
| + /////////////////////////////////////////////////////////////////////////// |
| + |
| + const SkImageInfo& info() const { return fInfo; } |
| + |
| + int width() const { return fInfo.fWidth; } |
|
scroggo
2014/02/10 21:45:44
Why did width and height lose the doc stating that
reed1
2014/02/10 21:59:51
If you think it adds value, I will add it. I didn'
|
| + 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. |
| */ |
| - 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()). |
| @@ -89,41 +121,14 @@ public: |
| bool isNull() const { return NULL == fPixelRef; } |
| /** 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 |
| @@ -143,19 +148,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; } |
|
scroggo
2014/02/10 21:45:44
Is it okay that this will return zero for a new st
reed1
2014/02/10 21:59:51
Who knows what the future will bring.
|
| /** 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); } |
|
scroggo
2014/02/10 21:45:44
Same question.
reed1
2014/02/10 21:59:51
Always in motion is the future.
|
| /** |
| * 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); |
| } |
| /** |
| @@ -164,7 +169,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 |
| @@ -298,11 +303,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 |
| @@ -444,8 +456,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. |
| */ |
| @@ -736,13 +748,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; |
| @@ -854,29 +864,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)]; |
| } |