blob: f11b7c60cbd88d62857863e27847d9132c8219a8 [file] [log] [blame]
/*
* Copyright 2015 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "GrTextBlobCache.h"
static const int kVerticesPerGlyph = 4;
GrTextBlobCache::~GrTextBlobCache() {
this->freeAll();
}
GrAtlasTextBlob* GrTextBlobCache::createBlob(int glyphCount, int runCount, size_t maxVASize) {
// We allocate size for the GrAtlasTextBlob itself, plus size for the vertices array,
// and size for the glyphIds array.
size_t verticesCount = glyphCount * kVerticesPerGlyph * maxVASize;
size_t size = sizeof(GrAtlasTextBlob) +
verticesCount +
glyphCount * sizeof(GrGlyph**) +
sizeof(GrAtlasTextBlob::Run) * runCount;
void* allocation = fPool.allocate(size);
#ifdef CACHE_SANITY_CHECK
sk_bzero(allocation, size);
#endif
GrAtlasTextBlob* cacheBlob = new (allocation) GrAtlasTextBlob;
#ifdef CACHE_SANITY_CHECK
cacheBlob->fSize = size;
#endif
// setup offsets for vertices / glyphs
cacheBlob->fVertices = sizeof(GrAtlasTextBlob) + reinterpret_cast<unsigned char*>(cacheBlob);
cacheBlob->fGlyphs = reinterpret_cast<GrGlyph**>(cacheBlob->fVertices + verticesCount);
cacheBlob->fRuns = reinterpret_cast<GrAtlasTextBlob::Run*>(cacheBlob->fGlyphs + glyphCount);
// Initialize runs
for (int i = 0; i < runCount; i++) {
new (&cacheBlob->fRuns[i]) GrAtlasTextBlob::Run;
}
cacheBlob->fRunCount = runCount;
cacheBlob->fPool = &fPool;
return cacheBlob;
}
void GrTextBlobCache::freeAll() {
SkTDynamicHash<GrAtlasTextBlob, GrAtlasTextBlob::Key>::Iter iter(&fCache);
while (!iter.done()) {
GrAtlasTextBlob* blob = &(*iter);
fBlobList.remove(blob);
blob->unref();
++iter;
}
fCache.rewind();
}