/* * 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(); } GrAtlasTextContext::BitmapTextBlob* GrTextBlobCache::createBlob(int glyphCount, int runCount, size_t maxVASize) { // We allocate size for the BitmapTextBlob itself, plus size for the vertices array, // and size for the glyphIds array. size_t verticesCount = glyphCount * kVerticesPerGlyph * maxVASize; size_t size = sizeof(BitmapTextBlob) + verticesCount + glyphCount * sizeof(GrGlyph**) + sizeof(BitmapTextBlob::Run) * runCount; BitmapTextBlob* cacheBlob = SkNEW_PLACEMENT(fPool.allocate(size), BitmapTextBlob); // setup offsets for vertices / glyphs cacheBlob->fVertices = sizeof(BitmapTextBlob) + reinterpret_cast(cacheBlob); cacheBlob->fGlyphs = reinterpret_cast(cacheBlob->fVertices + verticesCount); cacheBlob->fRuns = reinterpret_cast(cacheBlob->fGlyphs + glyphCount); // Initialize runs for (int i = 0; i < runCount; i++) { SkNEW_PLACEMENT(&cacheBlob->fRuns[i], BitmapTextBlob::Run); } cacheBlob->fRunCount = runCount; cacheBlob->fPool = &fPool; return cacheBlob; } void GrTextBlobCache::freeAll() { SkTDynamicHash::Iter iter(&fCache); while (!iter.done()) { BitmapTextBlob* blob = &(*iter); fBlobList.remove(blob); blob->unref(); ++iter; } fCache.rewind(); }