| Index: include/core/SkTDArray.h
 | 
| diff --git a/include/core/SkTDArray.h b/include/core/SkTDArray.h
 | 
| index 67254ccc9a88fa93fe6489ea82bccb6efe8959e6..804b84f669df4e3d1e5ae7b645d9c6ea94e582e1 100644
 | 
| --- a/include/core/SkTDArray.h
 | 
| +++ b/include/core/SkTDArray.h
 | 
| @@ -151,25 +151,43 @@ public:
 | 
|          fCount = 0;
 | 
|      }
 | 
|  
 | 
| +    /**
 | 
| +     *  Sets the number of elements in the array.
 | 
| +     *  If the array does not have space for count elements, it will increase
 | 
| +     *  the storage allocated to some amount greater than that required.
 | 
| +     *  It will never shrink the shrink the storage.
 | 
| +     */
 | 
|      void setCount(int count) {
 | 
| +        //  TODO(mtklein): eliminate this method, setCountExact -> setCount
 | 
| +        SkASSERT(count >= 0);
 | 
|          if (count > fReserve) {
 | 
| -            this->growBy(count - fCount);
 | 
| -        } else {
 | 
| -            fCount = count;
 | 
| +            this->resizeStorageToAtLeast(count);
 | 
|          }
 | 
| +        fCount = count;
 | 
| +    }
 | 
| +
 | 
| +    /**
 | 
| +     *  Sets the number of elements in the array.
 | 
| +     *  If the array does not have space for count elements, it will increase
 | 
| +     *  the storage allocated to exactly the amount required, with no remaining
 | 
| +     *  reserved space.
 | 
| +     *  It will never shrink the shrink the storage.
 | 
| +     */
 | 
| +    void setCountExact(int count) {
 | 
| +        if (count > fReserve) {
 | 
| +            this->resizeStorageToExact(count);
 | 
| +        }
 | 
| +        fCount = count;
 | 
|      }
 | 
|  
 | 
|      void setReserve(int reserve) {
 | 
|          if (reserve > fReserve) {
 | 
| -            SkASSERT(reserve > fCount);
 | 
| -            int count = fCount;
 | 
| -            this->growBy(reserve - fCount);
 | 
| -            fCount = count;
 | 
| +            this->resizeStorageToAtLeast(reserve);
 | 
|          }
 | 
|      }
 | 
|  
 | 
|      T* prepend() {
 | 
| -        this->growBy(1);
 | 
| +        this->adjustCount(1);
 | 
|          memmove(fArray + 1, fArray, (fCount - 1) * sizeof(T));
 | 
|          return fArray;
 | 
|      }
 | 
| @@ -183,7 +201,7 @@ public:
 | 
|              SkASSERT(src == NULL || fArray == NULL ||
 | 
|                      src + count <= fArray || fArray + oldCount <= src);
 | 
|  
 | 
| -            this->growBy(count);
 | 
| +            this->adjustCount(count);
 | 
|              if (src) {
 | 
|                  memcpy(fArray + oldCount, src, sizeof(T) * count);
 | 
|              }
 | 
| @@ -204,7 +222,7 @@ public:
 | 
|          SkASSERT(count);
 | 
|          SkASSERT(index <= fCount);
 | 
|          size_t oldCount = fCount;
 | 
| -        this->growBy(count);
 | 
| +        this->adjustCount(count);
 | 
|          T* dst = fArray + index;
 | 
|          memmove(dst + count, dst, sizeof(T) * (oldCount - index));
 | 
|          if (src) {
 | 
| @@ -356,20 +374,43 @@ private:
 | 
|      int     fReserve;
 | 
|      int     fCount;
 | 
|  
 | 
| -    void growBy(int extra) {
 | 
| -        SkASSERT(extra);
 | 
| -
 | 
| -        if (fCount + extra > fReserve) {
 | 
| -            int size = fCount + extra + 4;
 | 
| -            size += size >> 2;
 | 
| +    /**
 | 
| +     *  Adjusts the number of elements in the array.
 | 
| +     *  This is the same as calling setCount(count() + delta).
 | 
| +     */
 | 
| +    void adjustCount(int delta) {
 | 
| +        this->setCount(fCount + delta);
 | 
| +    }
 | 
|  
 | 
| -            fArray = (T*)sk_realloc_throw(fArray, size * sizeof(T));
 | 
| +    /**
 | 
| +     *  This resizes the storage to *exactly* count elements, growing or
 | 
| +     *  shrinking the allocation as needed. It does not ASSERT anything about
 | 
| +     *  the previous allocation size, or about fCount.
 | 
| +     *
 | 
| +     *  note: does NOT modify fCount
 | 
| +     */
 | 
| +    void resizeStorageToExact(int count) {
 | 
| +        SkASSERT(count >= 0);
 | 
| +        fArray = (T*)sk_realloc_throw(fArray, count * sizeof(T));
 | 
|  #ifdef SK_DEBUG
 | 
| -            fData = (ArrayT*)fArray;
 | 
| +        fData = (ArrayT*)fArray;
 | 
|  #endif
 | 
| -            fReserve = size;
 | 
| -        }
 | 
| -        fCount += extra;
 | 
| +        fReserve = count;
 | 
| +    }
 | 
| +
 | 
| +    /**
 | 
| +     *  Increase the storage allocation such that it can hold (fCount + extra)
 | 
| +     *  elements.
 | 
| +     *  It never shrinks the allocation, and it may increase the allocation by
 | 
| +     *  more than is strictly required, based on a private growth heuristic.
 | 
| +     *
 | 
| +     *  note: does NOT modify fCount
 | 
| +     */
 | 
| +    void resizeStorageToAtLeast(int count) {
 | 
| +        SkASSERT(count > fReserve);
 | 
| +        int space = count + 4;
 | 
| +        space += space>>2;
 | 
| +        this->resizeStorageToExact(space);
 | 
|      }
 | 
|  };
 | 
|  
 | 
| 
 |