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