1c93032dc09d7cd4890b584d5f28bd5910f689213Mark Wei/* 2c93032dc09d7cd4890b584d5f28bd5910f689213Mark Wei * Copyright (C) 2013 The Android Open Source Project 3c93032dc09d7cd4890b584d5f28bd5910f689213Mark Wei * 4c93032dc09d7cd4890b584d5f28bd5910f689213Mark Wei * Licensed under the Apache License, Version 2.0 (the "License"); 5c93032dc09d7cd4890b584d5f28bd5910f689213Mark Wei * you may not use this file except in compliance with the License. 6c93032dc09d7cd4890b584d5f28bd5910f689213Mark Wei * You may obtain a copy of the License at 7c93032dc09d7cd4890b584d5f28bd5910f689213Mark Wei * 8c93032dc09d7cd4890b584d5f28bd5910f689213Mark Wei * http://www.apache.org/licenses/LICENSE-2.0 9c93032dc09d7cd4890b584d5f28bd5910f689213Mark Wei * 10c93032dc09d7cd4890b584d5f28bd5910f689213Mark Wei * Unless required by applicable law or agreed to in writing, software 11c93032dc09d7cd4890b584d5f28bd5910f689213Mark Wei * distributed under the License is distributed on an "AS IS" BASIS, 12c93032dc09d7cd4890b584d5f28bd5910f689213Mark Wei * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c93032dc09d7cd4890b584d5f28bd5910f689213Mark Wei * See the License for the specific language governing permissions and 14c93032dc09d7cd4890b584d5f28bd5910f689213Mark Wei * limitations under the License. 15c93032dc09d7cd4890b584d5f28bd5910f689213Mark Wei */ 16c93032dc09d7cd4890b584d5f28bd5910f689213Mark Wei 1779c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huangpackage com.android.bitmap; 1879c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang 1979c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huangimport android.graphics.Bitmap; 2079c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang 2179c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang/** 2279c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang * A simple bitmap wrapper. Currently supports reference counting and logical width/height 2379c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang * (which may differ from a bitmap's reported width/height due to bitmap reuse). 2479c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang */ 250266692a394e5a6888595d154c5120726edadd6fAndy Huangpublic class ReusableBitmap implements Poolable { 2679c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang 2779c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang public final Bitmap bmp; 2879c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang private int mWidth; 2979c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang private int mHeight; 307b1e10093f127dd3fcc00a7d1a3c5d717a0f1deaMark Wei private int mOrientation; 317b1e10093f127dd3fcc00a7d1a3c5d717a0f1deaMark Wei 3279c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang private int mRefCount = 0; 330266692a394e5a6888595d154c5120726edadd6fAndy Huang private final boolean mReusable; 3479c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang 357b1e10093f127dd3fcc00a7d1a3c5d717a0f1deaMark Wei public ReusableBitmap(final Bitmap bitmap) { 360266692a394e5a6888595d154c5120726edadd6fAndy Huang this(bitmap, true /* reusable */); 370266692a394e5a6888595d154c5120726edadd6fAndy Huang } 380266692a394e5a6888595d154c5120726edadd6fAndy Huang 397b1e10093f127dd3fcc00a7d1a3c5d717a0f1deaMark Wei public ReusableBitmap(final Bitmap bitmap, final boolean reusable) { 4079c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang bmp = bitmap; 410266692a394e5a6888595d154c5120726edadd6fAndy Huang mReusable = reusable; 420266692a394e5a6888595d154c5120726edadd6fAndy Huang } 430266692a394e5a6888595d154c5120726edadd6fAndy Huang 440266692a394e5a6888595d154c5120726edadd6fAndy Huang @Override 450266692a394e5a6888595d154c5120726edadd6fAndy Huang public boolean isEligibleForPooling() { 460266692a394e5a6888595d154c5120726edadd6fAndy Huang return mReusable; 4779c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang } 4879c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang 4979c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang public void setLogicalWidth(int w) { 5079c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang mWidth = w; 5179c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang } 5279c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang 5379c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang public void setLogicalHeight(int h) { 5479c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang mHeight = h; 5579c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang } 5679c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang 5779c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang public int getLogicalWidth() { 5879c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang return mWidth; 5979c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang } 6079c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang 6179c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang public int getLogicalHeight() { 6279c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang return mHeight; 6379c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang } 6479c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang 657b1e10093f127dd3fcc00a7d1a3c5d717a0f1deaMark Wei public int getOrientation() { 667b1e10093f127dd3fcc00a7d1a3c5d717a0f1deaMark Wei return mOrientation; 677b1e10093f127dd3fcc00a7d1a3c5d717a0f1deaMark Wei } 687b1e10093f127dd3fcc00a7d1a3c5d717a0f1deaMark Wei 697b1e10093f127dd3fcc00a7d1a3c5d717a0f1deaMark Wei public void setOrientation(final int orientation) { 707b1e10093f127dd3fcc00a7d1a3c5d717a0f1deaMark Wei mOrientation = orientation; 717b1e10093f127dd3fcc00a7d1a3c5d717a0f1deaMark Wei } 727b1e10093f127dd3fcc00a7d1a3c5d717a0f1deaMark Wei 7379c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang public int getByteCount() { 7479c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang return bmp.getByteCount(); 7579c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang } 7679c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang 7779c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang @Override 7879c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang public void acquireReference() { 7979c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang mRefCount++; 8079c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang } 8179c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang 8279c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang @Override 8379c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang public void releaseReference() { 8479c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang if (mRefCount == 0) { 8579c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang throw new IllegalStateException(); 8679c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang } 8779c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang mRefCount--; 8879c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang } 8979c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang 9079c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang @Override 9179c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang public int getRefCount() { 9279c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang return mRefCount; 9379c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang } 9479c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang 9579c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang @Override 9679c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang public String toString() { 9779c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang final StringBuilder sb = new StringBuilder("["); 9879c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang sb.append(super.toString()); 9979c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang sb.append(" refCount="); 10079c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang sb.append(mRefCount); 1010266692a394e5a6888595d154c5120726edadd6fAndy Huang sb.append(" mReusable="); 1020266692a394e5a6888595d154c5120726edadd6fAndy Huang sb.append(mReusable); 10379c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang sb.append(" bmp="); 10479c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang sb.append(bmp); 10579c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang sb.append(" logicalW/H="); 10679c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang sb.append(mWidth); 10779c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang sb.append("/"); 10879c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang sb.append(mHeight); 10979c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang if (bmp != null) { 11079c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang sb.append(" sz="); 11179c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang sb.append(bmp.getByteCount() >> 10); 11279c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang sb.append("KB"); 11379c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang } 11479c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang sb.append("]"); 11579c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang return sb.toString(); 11679c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang } 11779c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang 11879c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang} 119