Index: src/core/SkWriter32.cpp |
diff --git a/src/core/SkWriter32.cpp b/src/core/SkWriter32.cpp |
index 1e8a10c87caceffa61045fbf1fe0524dfb92ff4e..f1fde893927ab441d9fe9a48a345691620bdd7a4 100644 |
--- a/src/core/SkWriter32.cpp |
+++ b/src/core/SkWriter32.cpp |
@@ -67,20 +67,22 @@ size_t SkWriter32::WriteStringSize(const char* str, size_t len) { |
return SkAlign4(lenBytes + len + 1); |
} |
+const size_t kMinBufferBytes=4096; |
+ |
void SkWriter32::growToAtLeast(size_t size) { |
bool wasExternal = (fExternal != NULL) && (fData == fExternal); |
+ fCapacity = kMinBufferBytes + |
+ SkTMax(size, fCapacity + (fCapacity >> 1)); |
+ |
// cause the buffer to grow |
- fInternal.setCount(size); |
+ fInternal.setCountExact(fCapacity); |
+ SkASSERT(fInternal.count() == (int)fCapacity); |
+ // read back the capacity in case it was already larger than this |
+ fCapacity = fInternal.reserved(); |
fData = fInternal.begin(); |
if (wasExternal) { |
// we were external, so copy in the data |
memcpy(fData, fExternal, fUsed); |
} |
- // Find out the size the buffer grew to, it may be more than we asked for. |
- fCapacity = fInternal.reserved(); |
- // Expand the array so all reserved space is "used", we maintain the |
- // amount we have written manually outside the array |
- fInternal.setCount(fCapacity); |
- SkASSERT(fInternal.count() == (int)fCapacity); |
SkASSERT(fInternal.reserved() == (int)fCapacity); |
} |