| 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
 | 
| 
 |