const Patch* PatchCache::get(const AssetAtlas::Entry* entry, const uint32_t bitmapWidth, const uint32_t bitmapHeight, const float pixelWidth, const float pixelHeight, const Res_png_9patch* patch) { const PatchDescription description(bitmapWidth, bitmapHeight, pixelWidth, pixelHeight, patch); const Patch* mesh = mCache.get(description); if (!mesh) { Patch* newMesh = new Patch(); TextureVertex* vertices; if (entry) { // An atlas entry has a UV mapper vertices = newMesh->createMesh(bitmapWidth, bitmapHeight, pixelWidth, pixelHeight, entry->uvMapper, patch); } else { vertices = newMesh->createMesh(bitmapWidth, bitmapHeight, pixelWidth, pixelHeight, patch); } if (vertices) { setupMesh(newMesh, vertices); } #if DEBUG_PATCHES if (g_HWUI_debug_patches) dumpFreeBlocks("Adding patch"); #endif mCache.put(description, newMesh); return newMesh; } return mesh; }
void PatchCache::clearGarbage() { Vector<patch_pair_t> patchesToRemove; { // scope for the mutex Mutex::Autolock _l(mLock); size_t count = mGarbage.size(); for (size_t i = 0; i < count; i++) { remove(patchesToRemove, mGarbage[i]); } mGarbage.clear(); } // TODO: We could sort patchesToRemove by offset to merge // adjacent free blocks for (size_t i = 0; i < patchesToRemove.size(); i++) { const patch_pair_t& pair = patchesToRemove[i]; // Add a new free block to the list const Patch* patch = pair.getSecond(); BufferBlock* block = new BufferBlock(patch->offset, patch->getSize()); block->next = mFreeBlocks; mFreeBlocks = block; mSize -= patch->getSize(); mCache.remove(*pair.getFirst()); } #if DEBUG_PATCHES if (patchesToRemove.size() > 0) { dumpFreeBlocks("Removed garbage"); } #endif }
void PatchCache::clearGarbage() { Vector<patch_pair_t> patchesToRemove; { // scope for the mutex Mutex::Autolock _l(mLock); size_t count = mGarbage.size(); for (size_t i = 0; i < count; i++) { Res_png_9patch* patch = mGarbage[i]; remove(patchesToRemove, patch); // A Res_png_9patch is actually an array of byte that's larger // than sizeof(Res_png_9patch). It must be freed as an array. delete[] (int8_t*) patch; } mGarbage.clear(); } // TODO: We could sort patchesToRemove by offset to merge // adjacent free blocks for (size_t i = 0; i < patchesToRemove.size(); i++) { const patch_pair_t& pair = patchesToRemove[i]; // Release the patch and mark the space in the free list Patch* patch = pair.getSecond(); BufferBlock* block = new BufferBlock(patch->offset, patch->getSize()); block->next = mFreeBlocks; mFreeBlocks = block; mSize -= patch->getSize(); mCache.remove(*pair.getFirst()); delete patch; } #if DEBUG_PATCHES if (g_HWUI_debug_patches && patchesToRemove.size() > 0) { dumpFreeBlocks("Removed garbage"); } #endif }