package master.flame.danmaku.danmaku.model.android; import master.flame.danmaku.danmaku.model.IDrawingCache; import master.flame.danmaku.danmaku.model.objectpool.Poolable; public class DrawingCache implements IDrawingCache<DrawingCacheHolder>, Poolable<DrawingCache> { private DrawingCacheHolder mHolder; private int mSize = 0; private DrawingCache mNextElement; private boolean mIsPooled; private int referenceCount = 0; public DrawingCache() { mHolder = new DrawingCacheHolder(); } @Override public void build(int w, int h, int density, boolean checkSizeEquals) { DrawingCacheHolder holder = mHolder; if (holder == null) { holder = new DrawingCacheHolder(w, h, density); } else { holder.buildCache(w, h, density, checkSizeEquals); } mHolder = holder; mSize = mHolder.bitmap.getRowBytes() * mHolder.bitmap.getHeight(); } @Override public void erase() { final DrawingCacheHolder holder = mHolder; if (holder == null) { return; } holder.erase(); } @Override public DrawingCacheHolder get() { if (mHolder == null || mHolder.bitmap == null) { return null; } return mHolder; } @Override public void destroy() { if (mHolder != null) { mHolder.recycle(); } mSize = 0; referenceCount = 0; } @Override public int size() { if (mHolder != null) { return mSize; } return 0; } @Override public void setNextPoolable(DrawingCache element) { mNextElement = element; } @Override public DrawingCache getNextPoolable() { return mNextElement; } @Override public boolean isPooled() { return mIsPooled; } @Override public void setPooled(boolean isPooled) { mIsPooled = isPooled; } @Override public boolean hasReferences() { return referenceCount > 0; } @Override public void increaseReference() { referenceCount++; } @Override public void decreaseReference() { referenceCount--; } @Override public int width() { if (mHolder != null) { return mHolder.width; } return 0; } @Override public int height() { if (mHolder != null) { return mHolder.height; } return 0; } }