| Index: src/core/SkMipMap.cpp
 | 
| diff --git a/src/core/SkMipMap.cpp b/src/core/SkMipMap.cpp
 | 
| index fdfb660ccc66a2aa06deca8a052350b30ead8aaa..cb88eb4596be618e9eab7519f889b2fb6a64d3e0 100644
 | 
| --- a/src/core/SkMipMap.cpp
 | 
| +++ b/src/core/SkMipMap.cpp
 | 
| @@ -109,18 +109,18 @@ static void downsampleby2_proc4444(SkBitmap* dst, int x, int y,
 | 
|      *dst->getAddr16(x >> 1, y >> 1) = (uint16_t)collaps4444(c >> 2);
 | 
|  }
 | 
|  
 | 
| -size_t SkMipMap::AllocLevelsSize(int levelCount, size_t pixelSize) {
 | 
| +SkMipMap::Level* SkMipMap::AllocLevels(int levelCount, size_t pixelSize) {
 | 
|      if (levelCount < 0) {
 | 
| -        return 0;
 | 
| +        return NULL;
 | 
|      }
 | 
|      int64_t size = sk_64_mul(levelCount + 1, sizeof(Level)) + pixelSize;
 | 
|      if (!sk_64_isS32(size)) {
 | 
| -        return 0;
 | 
| +        return NULL;
 | 
|      }
 | 
| -    return sk_64_asS32(size);
 | 
| +    return (Level*)sk_malloc_throw(sk_64_asS32(size));
 | 
|  }
 | 
|  
 | 
| -SkMipMap* SkMipMap::Build(const SkBitmap& src, SkDiscardableFactoryProc fact) {
 | 
| +SkMipMap* SkMipMap::Build(const SkBitmap& src) {
 | 
|      void (*proc)(SkBitmap* dst, int x, int y, const SkBitmap& src);
 | 
|  
 | 
|      const SkColorType ct = src.colorType();
 | 
| @@ -165,27 +165,11 @@ SkMipMap* SkMipMap::Build(const SkBitmap& src, SkDiscardableFactoryProc fact) {
 | 
|          return NULL;
 | 
|      }
 | 
|  
 | 
| -    size_t storageSize = SkMipMap::AllocLevelsSize(countLevels, size);
 | 
| -    if (0 == storageSize) {
 | 
| +    Level* levels = SkMipMap::AllocLevels(countLevels, size);
 | 
| +    if (NULL == levels) {
 | 
|          return NULL;
 | 
|      }
 | 
|  
 | 
| -    SkMipMap* mipmap;
 | 
| -    if (fact) {
 | 
| -        SkDiscardableMemory* dm = fact(storageSize);
 | 
| -        if (NULL == dm) {
 | 
| -            return NULL;
 | 
| -        }
 | 
| -        mipmap = SkNEW_ARGS(SkMipMap, (storageSize, dm));
 | 
| -    } else {
 | 
| -        mipmap = SkNEW_ARGS(SkMipMap, (sk_malloc_throw(storageSize), storageSize));
 | 
| -    }
 | 
| -
 | 
| -    // init
 | 
| -    mipmap->fCount = countLevels;
 | 
| -    mipmap->fLevels = (Level*)mipmap->writable_data();
 | 
| -
 | 
| -    Level* levels = mipmap->fLevels;
 | 
|      uint8_t*    baseAddr = (uint8_t*)&levels[countLevels];
 | 
|      uint8_t*    addr = baseAddr;
 | 
|      int         width = src.width();
 | 
| @@ -220,13 +204,25 @@ SkMipMap* SkMipMap::Build(const SkBitmap& src, SkDiscardableFactoryProc fact) {
 | 
|      }
 | 
|      SkASSERT(addr == baseAddr + size);
 | 
|  
 | 
| -    return mipmap;
 | 
| +    return SkNEW_ARGS(SkMipMap, (levels, countLevels, size));
 | 
|  }
 | 
|  
 | 
|  ///////////////////////////////////////////////////////////////////////////////
 | 
|  
 | 
|  //static int gCounter;
 | 
|  
 | 
| +SkMipMap::SkMipMap(Level* levels, int count, size_t size)
 | 
| +    : fSize(size), fLevels(levels), fCount(count) {
 | 
| +    SkASSERT(levels);
 | 
| +    SkASSERT(count > 0);
 | 
| +//    SkDebugf("mips %d\n", ++gCounter);
 | 
| +}
 | 
| +
 | 
| +SkMipMap::~SkMipMap() {
 | 
| +    sk_free(fLevels);
 | 
| +//    SkDebugf("mips %d\n", --gCounter);
 | 
| +}
 | 
| +
 | 
|  static SkFixed compute_level(SkScalar scale) {
 | 
|      SkFixed s = SkAbs32(SkScalarToFixed(SkScalarInvert(scale)));
 | 
|  
 | 
| @@ -239,10 +235,6 @@ static SkFixed compute_level(SkScalar scale) {
 | 
|  }
 | 
|  
 | 
|  bool SkMipMap::extractLevel(SkScalar scale, Level* levelPtr) const {
 | 
| -    if (NULL == fLevels) {
 | 
| -        return false;
 | 
| -    }
 | 
| -
 | 
|      if (scale >= SK_Scalar1) {
 | 
|          return false;
 | 
|      }
 | 
| 
 |