193a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein/* 293a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * Copyright (C) 2013 The Android Open Source Project 393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * 493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * Licensed under the Apache License, Version 2.0 (the "License"); 593a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * you may not use this file except in compliance with the License. 693a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * You may obtain a copy of the License at 793a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * 893a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * http://www.apache.org/licenses/LICENSE-2.0 993a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * 1093a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * Unless required by applicable law or agreed to in writing, software 1193a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * distributed under the License is distributed on an "AS IS" BASIS, 1293a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * See the License for the specific language governing permissions and 1493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * limitations under the License. 1593a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein */ 1693a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 1793a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzsteinpackage com.android.bitmap; 1893a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 1993a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzsteinimport android.graphics.Bitmap; 2093a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 2193a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein/** 2293a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * A simple bitmap wrapper. Currently supports reference counting and logical width/height 2393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * (which may differ from a bitmap's reported width/height due to bitmap reuse). 2493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein */ 2593a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzsteinpublic class ReusableBitmap implements Poolable { 2693a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 2793a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein public final Bitmap bmp; 2893a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein private int mWidth; 2993a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein private int mHeight; 3093a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein private int mOrientation; 3193a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 3293a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein private int mRefCount = 0; 3393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein private final boolean mReusable; 3493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 3593a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein public ReusableBitmap(final Bitmap bitmap) { 3693a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein this(bitmap, true /* reusable */); 3793a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein } 3893a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 3993a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein public ReusableBitmap(final Bitmap bitmap, final boolean reusable) { 4093a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein bmp = bitmap; 4193a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein mReusable = reusable; 4293a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein } 4393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 4493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein @Override 4593a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein public boolean isEligibleForPooling() { 4693a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein return mReusable; 4793a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein } 4893a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 4993a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein public void setLogicalWidth(int w) { 5093a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein mWidth = w; 5193a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein } 5293a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 5393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein public void setLogicalHeight(int h) { 5493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein mHeight = h; 5593a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein } 5693a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 5793a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein public int getLogicalWidth() { 5893a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein return mWidth; 5993a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein } 6093a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 6193a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein public int getLogicalHeight() { 6293a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein return mHeight; 6393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein } 6493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 6593a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein public int getOrientation() { 6693a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein return mOrientation; 6793a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein } 6893a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 6993a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein public void setOrientation(final int orientation) { 7093a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein mOrientation = orientation; 7193a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein } 7293a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 7393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein public int getByteCount() { 7493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein return bmp.getByteCount(); 7593a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein } 7693a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 7793a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein @Override 7893a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein public void acquireReference() { 7993a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein mRefCount++; 8093a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein } 8193a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 8293a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein @Override 8393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein public void releaseReference() { 8493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein if (mRefCount == 0) { 8593a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein throw new IllegalStateException(); 8693a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein } 8793a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein mRefCount--; 8893a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein } 8993a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 9093a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein @Override 9193a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein public int getRefCount() { 9293a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein return mRefCount; 9393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein } 9493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 9593a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein @Override 9693a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein public String toString() { 9793a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein final StringBuilder sb = new StringBuilder("["); 9893a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein sb.append(super.toString()); 9993a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein sb.append(" refCount="); 10093a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein sb.append(mRefCount); 10193a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein sb.append(" mReusable="); 10293a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein sb.append(mReusable); 10393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein sb.append(" bmp="); 10493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein sb.append(bmp); 10593a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein sb.append(" logicalW/H="); 10693a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein sb.append(mWidth); 10793a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein sb.append("/"); 10893a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein sb.append(mHeight); 10993a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein if (bmp != null) { 11093a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein sb.append(" sz="); 11193a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein sb.append(bmp.getByteCount() >> 10); 11293a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein sb.append("KB"); 11393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein } 11493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein sb.append("]"); 11593a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein return sb.toString(); 11693a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein } 11793a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 11893a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein /** 11993a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * Singleton class to represent a null Bitmap. We don't want to just use a regular 12093a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * ReusableBitmap with a null bmp field because that will render that ReusableBitmap useless 12193a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * and unable to be used by another decode process. 12293a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein */ 12393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein public final static class NullReusableBitmap extends ReusableBitmap { 12493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein private static NullReusableBitmap sInstance; 12593a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 12693a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein /** 12793a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * Get a singleton. 12893a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein */ 12993a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein public static NullReusableBitmap getInstance() { 13093a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein if (sInstance == null) { 13193a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein sInstance = new NullReusableBitmap(); 13293a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein } 13393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein return sInstance; 13493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein } 13593a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 13693a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein private NullReusableBitmap() { 13793a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein super(null /* bmp */, false /* reusable */); 13893a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein } 13993a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 14093a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein @Override 14193a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein public int getByteCount() { 14293a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein return 0; 14393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein } 14493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 14593a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein @Override 14693a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein public void releaseReference() { } 14793a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 14893a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein @Override 14993a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein public void acquireReference() { } 15093a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein } 15193a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein} 152