void DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing) { DISPLAY_LIST_LOGD("init displaylist %s <%p>", getName(), this); if (reusing) { // re-using display list - clear out previous allocations clearResources(); } init(); mDisplayListData = recorder.getDisplayListData(); mSize = mDisplayListData->allocator.usedSize(); if (mSize == 0) { return; } // allocate reusable ops for state-deferral LinearAllocator& alloc = mDisplayListData->allocator; mClipRectOp = new (alloc) ClipRectOp(); mSaveLayerOp = new (alloc) SaveLayerOp(); mSaveOp = new (alloc) SaveOp(); mRestoreToCountOp = new (alloc) RestoreToCountOp(); if (CC_UNLIKELY(!mSaveOp)) { // temporary debug logging ALOGW("Error: %s's SaveOp not allocated, size %d", getName(), mSize); CRASH(); } mFunctorCount = recorder.getFunctorCount(); Caches& caches = Caches::getInstance(); caches.registerFunctors(mFunctorCount); caches.resourceCache.lock(); const Vector<SkBitmap*>& bitmapResources = recorder.getBitmapResources(); for (size_t i = 0; i < bitmapResources.size(); i++) { SkBitmap* resource = bitmapResources.itemAt(i); mBitmapResources.add(resource); caches.resourceCache.incrementRefcountLocked(resource); } const Vector<SkBitmap*> &ownedBitmapResources = recorder.getOwnedBitmapResources(); for (size_t i = 0; i < ownedBitmapResources.size(); i++) { SkBitmap* resource = ownedBitmapResources.itemAt(i); mOwnedBitmapResources.add(resource); caches.resourceCache.incrementRefcountLocked(resource); } const Vector<SkiaColorFilter*>& filterResources = recorder.getFilterResources(); for (size_t i = 0; i < filterResources.size(); i++) { SkiaColorFilter* resource = filterResources.itemAt(i); mFilterResources.add(resource); caches.resourceCache.incrementRefcountLocked(resource); } const Vector<Res_png_9patch*>& patchResources = recorder.getPatchResources(); for (size_t i = 0; i < patchResources.size(); i++) { Res_png_9patch* resource = patchResources.itemAt(i); mPatchResources.add(resource); caches.resourceCache.incrementRefcountLocked(resource); } const Vector<SkiaShader*>& shaders = recorder.getShaders(); for (size_t i = 0; i < shaders.size(); i++) { SkiaShader* resource = shaders.itemAt(i); mShaders.add(resource); caches.resourceCache.incrementRefcountLocked(resource); } const SortedVector<SkPath*>& sourcePaths = recorder.getSourcePaths(); for (size_t i = 0; i < sourcePaths.size(); i++) { mSourcePaths.add(sourcePaths.itemAt(i)); caches.resourceCache.incrementRefcountLocked(sourcePaths.itemAt(i)); } const Vector<Layer*>& layers = recorder.getLayers(); for (size_t i = 0; i < layers.size(); i++) { mLayers.add(layers.itemAt(i)); caches.resourceCache.incrementRefcountLocked(layers.itemAt(i)); } caches.resourceCache.unlock(); mPaints.appendVector(recorder.getPaints()); mRegions.appendVector(recorder.getRegions()); mPaths.appendVector(recorder.getPaths()); mMatrices.appendVector(recorder.getMatrices()); }