| Index: include/core/SkPathRef.h
|
| ===================================================================
|
| --- include/core/SkPathRef.h (revision 11575)
|
| +++ include/core/SkPathRef.h (working copy)
|
| @@ -283,8 +283,37 @@
|
| /** Resets the path ref with verbCount verbs and pointCount points, all uninitialized. Also
|
| * allocates space for reserveVerb additional verbs and reservePoints additional points.*/
|
| void resetToSize(int verbCount, int pointCount, int conicCount,
|
| - int reserveVerbs = 0, int reservePoints = 0);
|
| + int reserveVerbs = 0, int reservePoints = 0) {
|
| + SkDEBUGCODE(this->validate();)
|
| + fBoundsIsDirty = true; // this also invalidates fIsFinite
|
| + fGenerationID = 0;
|
|
|
| + size_t newSize = sizeof(uint8_t) * verbCount + sizeof(SkPoint) * pointCount;
|
| + size_t newReserve = sizeof(uint8_t) * reserveVerbs + sizeof(SkPoint) * reservePoints;
|
| + size_t minSize = newSize + newReserve;
|
| +
|
| + ptrdiff_t sizeDelta = this->currSize() - minSize;
|
| +
|
| + if (sizeDelta < 0 || static_cast<size_t>(sizeDelta) >= 3 * minSize) {
|
| + sk_free(fPoints);
|
| + fPoints = NULL;
|
| + fVerbs = NULL;
|
| + fFreeSpace = 0;
|
| + fVerbCnt = 0;
|
| + fPointCnt = 0;
|
| + this->makeSpace(minSize);
|
| + fVerbCnt = verbCount;
|
| + fPointCnt = pointCount;
|
| + fFreeSpace -= newSize;
|
| + } else {
|
| + fPointCnt = pointCount;
|
| + fVerbCnt = verbCount;
|
| + fFreeSpace = this->currSize() - minSize;
|
| + }
|
| + fConicWeights.setCount(conicCount);
|
| + SkDEBUGCODE(this->validate();)
|
| + }
|
| +
|
| /**
|
| * Increases the verb count by newVerbs and the point count be newPoints. New verbs and points
|
| * are uninitialized.
|
| @@ -311,7 +340,36 @@
|
| * Ensures that the free space available in the path ref is >= size. The verb and point counts
|
| * are not changed.
|
| */
|
| - void makeSpace(size_t size);
|
| + void makeSpace(size_t size) {
|
| + SkDEBUGCODE(this->validate();)
|
| + ptrdiff_t growSize = size - fFreeSpace;
|
| + if (growSize <= 0) {
|
| + return;
|
| + }
|
| + size_t oldSize = this->currSize();
|
| + // round to next multiple of 8 bytes
|
| + growSize = (growSize + 7) & ~static_cast<size_t>(7);
|
| + // we always at least double the allocation
|
| + if (static_cast<size_t>(growSize) < oldSize) {
|
| + growSize = oldSize;
|
| + }
|
| + if (growSize < kMinSize) {
|
| + growSize = kMinSize;
|
| + }
|
| + size_t newSize = oldSize + growSize;
|
| + // Note that realloc could memcpy more than we need. It seems to be a win anyway. TODO:
|
| + // encapsulate this.
|
| + fPoints = reinterpret_cast<SkPoint*>(sk_realloc_throw(fPoints, newSize));
|
| + size_t oldVerbSize = fVerbCnt * sizeof(uint8_t);
|
| + void* newVerbsDst = reinterpret_cast<void*>(
|
| + reinterpret_cast<intptr_t>(fPoints) + newSize - oldVerbSize);
|
| + void* oldVerbsSrc = reinterpret_cast<void*>(
|
| + reinterpret_cast<intptr_t>(fPoints) + oldSize - oldVerbSize);
|
| + memmove(newVerbsDst, oldVerbsSrc, oldVerbSize);
|
| + fVerbs = reinterpret_cast<uint8_t*>(reinterpret_cast<intptr_t>(fPoints) + newSize);
|
| + fFreeSpace += growSize;
|
| + SkDEBUGCODE(this->validate();)
|
| + }
|
|
|
| /**
|
| * Private, non-const-ptr version of the public function verbsMemBegin().
|
|
|