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