Chromium Code Reviews| Index: include/core/SkImageInfo.h |
| diff --git a/include/core/SkImageInfo.h b/include/core/SkImageInfo.h |
| index 722ff27437ba622c8c2ec1d2bd31c5a11209c2fa..2de2004aa5b224d73b99f1bb4f9ea4975e932189 100644 |
| --- a/include/core/SkImageInfo.h |
| +++ b/include/core/SkImageInfo.h |
| @@ -8,7 +8,7 @@ |
| #ifndef SkImageInfo_DEFINED |
| #define SkImageInfo_DEFINED |
| -#include "SkTypes.h" |
| +#include "SkMath.h" |
| #include "SkSize.h" |
| class SkWriteBuffer; |
| @@ -59,12 +59,17 @@ static inline bool SkAlphaTypeIsOpaque(SkAlphaType at) { |
| return (unsigned)at <= kOpaque_SkAlphaType; |
| } |
| +static inline bool SkAlphaTypeIsValid(unsigned value) { |
|
scroggo
2014/02/10 21:45:44
Does this need to be unsigned? It seems like all t
reed1
2014/02/10 21:59:51
Yea, I wanted to explicitly not let the compiler m
|
| + return value >= kIgnore_SkAlphaType && value <= kLastEnum_SkAlphaType; |
| +} |
| + |
| /////////////////////////////////////////////////////////////////////////////// |
| /** |
| * Describes how to interpret the components of a pixel. |
| */ |
| enum SkColorType { |
| + kUnknown_SkColorType, |
| kAlpha_8_SkColorType, |
| kRGB_565_SkColorType, |
| kARGB_4444_SkColorType, |
| @@ -85,6 +90,7 @@ enum SkColorType { |
| static int SkColorTypeBytesPerPixel(SkColorType ct) { |
| static const uint8_t gSize[] = { |
| + 0, // Unknown |
| 1, // Alpha_8 |
| 2, // RGB_565 |
| 2, // ARGB_4444 |
| @@ -99,6 +105,14 @@ static int SkColorTypeBytesPerPixel(SkColorType ct) { |
| return gSize[ct]; |
| } |
| +static inline size_t SkColorTypeMinRowBytes(SkColorType ct, int width) { |
| + return width * SkColorTypeBytesPerPixel(ct); |
| +} |
| + |
| +static inline bool SkColorTypeIsValid(unsigned value) { |
| + return value >= kUnknown_SkColorType && value <= kLastEnum_SkColorType; |
| +} |
| + |
| /////////////////////////////////////////////////////////////////////////////// |
| /** |
| @@ -159,18 +173,31 @@ struct SkImageInfo { |
| return info; |
| } |
| + int width() const { return fWidth; } |
|
scroggo
2014/02/10 21:45:44
I find it interesting that we have const accessors
reed1
2014/02/10 21:59:51
Yes, I want to make them private.
|
| + int height() const { return fHeight; } |
| + SkColorType colorType() const { return fColorType; } |
| + SkAlphaType alphaType() const { return fAlphaType; } |
| + |
| + bool isEmpty() const { return fWidth <= 0 || fHeight <= 0; } |
| + |
| bool isOpaque() const { |
| return SkAlphaTypeIsOpaque(fAlphaType); |
| } |
| + SkISize dimensions() const { return SkISize::Make(fWidth, fHeight); } |
| + |
| int bytesPerPixel() const { |
| return SkColorTypeBytesPerPixel(fColorType); |
| } |
| + uint64_t minRowBytes64() const { |
| + return sk_64_mul(fWidth, this->bytesPerPixel()); |
| + } |
| + |
| size_t minRowBytes() const { |
| - return fWidth * this->bytesPerPixel(); |
| + return (size_t)this->minRowBytes64(); |
| } |
| - |
| + |
| bool operator==(const SkImageInfo& other) const { |
| return 0 == memcmp(this, &other, sizeof(other)); |
| } |
| @@ -181,12 +208,23 @@ struct SkImageInfo { |
| void unflatten(SkReadBuffer&); |
| void flatten(SkWriteBuffer&) const; |
| - size_t getSafeSize(size_t rowBytes) const { |
| + int64_t getSafeSize64(size_t rowBytes) const { |
| if (0 == fHeight) { |
| return 0; |
| } |
| - return (fHeight - 1) * rowBytes + fWidth * this->bytesPerPixel(); |
| + return sk_64_mul(fHeight - 1, rowBytes) + fWidth * this->bytesPerPixel(); |
| } |
| + |
| + size_t getSafeSize(size_t rowBytes) const { |
| + return (size_t)this->getSafeSize64(rowBytes); |
| + } |
| + |
| + bool validRowBytes(size_t rowBytes) const { |
| + uint64_t rb = sk_64_mul(fWidth, this->bytesPerPixel()); |
| + return rowBytes >= rb; |
| + } |
| + |
| + SkDEBUGCODE(void validate() const;) |
| }; |
| #endif |