Index: include/core/SkImageInfo.h |
diff --git a/include/core/SkImageInfo.h b/include/core/SkImageInfo.h |
index 722ff27437ba622c8c2ec1d2bd31c5a11209c2fa..73b8b8c12cde969beb3825106fb2925c879a4ff5 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) { |
+ return 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 <= kLastEnum_SkColorType; |
+} |
+ |
/////////////////////////////////////////////////////////////////////////////// |
/** |
@@ -159,18 +173,31 @@ struct SkImageInfo { |
return info; |
} |
+ int width() const { return fWidth; } |
+ 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 |