diff options
author | Sam Blitzstein <sblitz@google.com> | 2013-10-09 14:11:27 -0700 |
---|---|---|
committer | Sam Blitzstein <sblitz@google.com> | 2013-10-15 17:34:58 -0700 |
commit | 93a35b93dc582e38ff8ee5979754a16b4bf4da0c (patch) | |
tree | 9034ab3155e8781b0cd77fb70882f911080f6f89 /src/com/android/bitmap/ReusableBitmap.java | |
parent | ce2b0fdc1e9c9d083faab75b6bdfbea27bf574e2 (diff) | |
download | bitmap-93a35b93dc582e38ff8ee5979754a16b4bf4da0c.tar.gz |
Initial commit from Gmail's Cache system.
Change-Id: I14168ab3bc02b77399a1812f62bd77ac797232c5
Diffstat (limited to 'src/com/android/bitmap/ReusableBitmap.java')
-rw-r--r-- | src/com/android/bitmap/ReusableBitmap.java | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/src/com/android/bitmap/ReusableBitmap.java b/src/com/android/bitmap/ReusableBitmap.java new file mode 100644 index 0000000..dde9bd1 --- /dev/null +++ b/src/com/android/bitmap/ReusableBitmap.java @@ -0,0 +1,151 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.bitmap; + +import android.graphics.Bitmap; + +/** + * A simple bitmap wrapper. Currently supports reference counting and logical width/height + * (which may differ from a bitmap's reported width/height due to bitmap reuse). + */ +public class ReusableBitmap implements Poolable { + + public final Bitmap bmp; + private int mWidth; + private int mHeight; + private int mOrientation; + + private int mRefCount = 0; + private final boolean mReusable; + + public ReusableBitmap(final Bitmap bitmap) { + this(bitmap, true /* reusable */); + } + + public ReusableBitmap(final Bitmap bitmap, final boolean reusable) { + bmp = bitmap; + mReusable = reusable; + } + + @Override + public boolean isEligibleForPooling() { + return mReusable; + } + + public void setLogicalWidth(int w) { + mWidth = w; + } + + public void setLogicalHeight(int h) { + mHeight = h; + } + + public int getLogicalWidth() { + return mWidth; + } + + public int getLogicalHeight() { + return mHeight; + } + + public int getOrientation() { + return mOrientation; + } + + public void setOrientation(final int orientation) { + mOrientation = orientation; + } + + public int getByteCount() { + return bmp.getByteCount(); + } + + @Override + public void acquireReference() { + mRefCount++; + } + + @Override + public void releaseReference() { + if (mRefCount == 0) { + throw new IllegalStateException(); + } + mRefCount--; + } + + @Override + public int getRefCount() { + return mRefCount; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("["); + sb.append(super.toString()); + sb.append(" refCount="); + sb.append(mRefCount); + sb.append(" mReusable="); + sb.append(mReusable); + sb.append(" bmp="); + sb.append(bmp); + sb.append(" logicalW/H="); + sb.append(mWidth); + sb.append("/"); + sb.append(mHeight); + if (bmp != null) { + sb.append(" sz="); + sb.append(bmp.getByteCount() >> 10); + sb.append("KB"); + } + sb.append("]"); + return sb.toString(); + } + + /** + * Singleton class to represent a null Bitmap. We don't want to just use a regular + * ReusableBitmap with a null bmp field because that will render that ReusableBitmap useless + * and unable to be used by another decode process. + */ + public final static class NullReusableBitmap extends ReusableBitmap { + private static NullReusableBitmap sInstance; + + /** + * Get a singleton. + */ + public static NullReusableBitmap getInstance() { + if (sInstance == null) { + sInstance = new NullReusableBitmap(); + } + return sInstance; + } + + private NullReusableBitmap() { + super(null /* bmp */, false /* reusable */); + } + + @Override + public int getByteCount() { + return 0; + } + + @Override + public void releaseReference() { } + + @Override + public void acquireReference() { } + } +} |