Index: src/gpu/GrAtlasTextContext.cpp |
diff --git a/src/gpu/GrAtlasTextContext.cpp b/src/gpu/GrAtlasTextContext.cpp |
index 8725aa5c1791cfbec1d69372f456b1a762a0afae..d5ffd2be492a11a36e4c0191e54e3e680707da20 100644 |
--- a/src/gpu/GrAtlasTextContext.cpp |
+++ b/src/gpu/GrAtlasTextContext.cpp |
@@ -1463,8 +1463,7 @@ public: |
break; |
} |
batch->fBatch.fNumGlyphs = glyphCount; |
- batch->fInstanceCount = 1; |
- batch->fAllocatedCount = kMinAllocated; |
+ batch->fGeoCount = 1; |
batch->fFilteredColor = 0; |
batch->fFontCache = fontCache; |
batch->fUseBGR = false; |
@@ -1483,8 +1482,7 @@ public: |
batch->fFilteredColor = filteredColor; |
batch->fUseBGR = useBGR; |
batch->fBatch.fNumGlyphs = glyphCount; |
- batch->fInstanceCount = 1; |
- batch->fAllocatedCount = kMinAllocated; |
+ batch->fGeoCount = 1; |
return batch; |
} |
@@ -1578,7 +1576,6 @@ public: |
batchTarget->initDraw(gp, pipeline); |
int glyphCount = this->numGlyphs(); |
- int instanceCount = fInstanceCount; |
const GrVertexBuffer* vertexBuffer; |
void* vertices = batchTarget->makeVertSpace(vertexStride, |
@@ -1601,7 +1598,7 @@ public: |
GrFontScaler* scaler = NULL; |
SkTypeface* typeface = NULL; |
- for (int i = 0; i < instanceCount; i++) { |
+ for (int i = 0; i < fGeoCount; i++) { |
Geometry& args = fGeoData[i]; |
Blob* blob = args.fBlob; |
Run& run = blob->fRuns[args.fRun]; |
@@ -1761,13 +1758,6 @@ public: |
this->flush(batchTarget, &flushInfo); |
} |
- // The minimum number of Geometry we will try to allocate. |
- static const int kMinAllocated = 4; |
- |
- // Total number of Geometry this Batch owns |
- int instanceCount() const { return fInstanceCount; } |
- SkAutoSTMalloc<kMinAllocated, Geometry>* geoData() { return &fGeoData; } |
- |
// to avoid even the initial copy of the struct, we have a getter for the first item which |
// is used to seed the batch with its initial geometry. After seeding, the client should call |
// init() so the Batch can initialize itself |
@@ -1793,7 +1783,7 @@ private: |
TextBatch() {} // initialized in factory functions. |
~TextBatch() { |
- for (int i = 0; i < fInstanceCount; i++) { |
+ for (int i = 0; i < fGeoCount; i++) { |
fGeoData[i].fBlob->unref(); |
} |
} |
@@ -1935,24 +1925,23 @@ private: |
fBatch.fNumGlyphs += that->numGlyphs(); |
- // copy that->geoData(). We do this manually for performance reasons |
- SkAutoSTMalloc<kMinAllocated, Geometry>* otherGeoData = that->geoData(); |
- int otherInstanceCount = that->instanceCount(); |
- int allocSize = otherInstanceCount + fInstanceCount; |
- if (allocSize > fAllocatedCount) { |
- while (allocSize > fAllocatedCount) { |
- fAllocatedCount = fAllocatedCount << 1; |
- } |
- fGeoData.realloc(fAllocatedCount); |
+ // Reallocate space for geo data if necessary and then import that's geo data. |
+ int newGeoCount = that->fGeoCount + fGeoCount; |
+ // We assume (and here enforce) that the allocation size is the smallest power of two that |
+ // is greater than or equal to the number of geometries (and at least |
+ // kMinGeometryAllocated). |
+ int newAllocSize = GrNextPow2(newGeoCount); |
+ int currAllocSize = SkTMax<int>(kMinGeometryAllocated, GrNextPow2(fGeoCount)); |
+ |
+ if (newAllocSize > currAllocSize) { |
+ fGeoData.realloc(newAllocSize); |
} |
- memcpy(&fGeoData[fInstanceCount], otherGeoData->get(), |
- otherInstanceCount * sizeof(Geometry)); |
- int total = fInstanceCount + otherInstanceCount; |
- for (int i = fInstanceCount; i < total; i++) { |
+ memcpy(&fGeoData[fGeoCount], that->fGeoData.get(), that->fGeoCount * sizeof(Geometry)); |
+ for (int i = fGeoCount; i < newGeoCount; ++i) { |
fGeoData[i].fBlob->ref(); |
} |
- fInstanceCount = total; |
+ fGeoCount = newGeoCount; |
this->joinBounds(that->bounds()); |
return true; |
@@ -2027,9 +2016,10 @@ private: |
}; |
BatchTracker fBatch; |
- SkAutoSTMalloc<kMinAllocated, Geometry> fGeoData; |
- int fInstanceCount; |
- int fAllocatedCount; |
+ // The minimum number of Geometry we will try to allocate. |
+ enum { kMinGeometryAllocated = 4 }; |
+ SkAutoSTMalloc<kMinGeometryAllocated, Geometry> fGeoData; |
+ int fGeoCount; |
enum MaskType { |
kGrayscaleCoverageMask_MaskType, |