| /* |
| * Copyright (C) 2006 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 android.graphics; |
| |
| /** |
| * LargeBitmap can be used to decode a rectangle region from an image. |
| * LargeBimap is particularly useful when an original image is large and |
| * you only need parts of the image. |
| * |
| * To create a LargeBitmap, call BitmapFactory.createLargeBitmap(). |
| * Given a LargeBitmap, users can call decodeRegion() repeatedly |
| * to get a decoded Bitmap of the specified region. |
| * @hide |
| */ |
| public final class LargeBitmap { |
| private long mNativeLargeBitmap; |
| private boolean mRecycled; |
| |
| /* Private constructor that must received an already allocated native |
| large bitmap int (pointer). |
| |
| This can be called from JNI code. |
| */ |
| private LargeBitmap(long nativeLbm) { |
| mNativeLargeBitmap = nativeLbm; |
| mRecycled = false; |
| } |
| |
| /** |
| * Decodes a rectangle region in the image specified by rect. |
| * |
| * @param rect The rectangle that specified the region to be decode. |
| * @param opts null-ok; Options that control downsampling. |
| * inPurgeable is not supported. |
| * @return The decoded bitmap, or null if the image data could not be |
| * decoded. |
| */ |
| public Bitmap decodeRegion(Rect rect, BitmapFactory.Options options) { |
| checkRecycled("decodeRegion called on recycled large bitmap"); |
| if (rect.left < 0 || rect.top < 0 || rect.right > getWidth() || rect.bottom > getHeight()) |
| throw new IllegalArgumentException("rectangle is not inside the image"); |
| return nativeDecodeRegion(mNativeLargeBitmap, rect.left, rect.top, |
| rect.right - rect.left, rect.bottom - rect.top, options); |
| } |
| |
| /** Returns the original image's width */ |
| public int getWidth() { |
| checkRecycled("getWidth called on recycled large bitmap"); |
| return nativeGetWidth(mNativeLargeBitmap); |
| } |
| |
| /** Returns the original image's height */ |
| public int getHeight() { |
| checkRecycled("getHeight called on recycled large bitmap"); |
| return nativeGetHeight(mNativeLargeBitmap); |
| } |
| |
| /** |
| * Frees up the memory associated with this large bitmap, and mark the |
| * large bitmap as "dead", meaning it will throw an exception if decodeRegion(), |
| * getWidth() or getHeight() is called. |
| * This operation cannot be reversed, so it should only be called if you are |
| * sure there are no further uses for the large bitmap. This is an advanced call, |
| * and normally need not be called, since the normal GC process will free up this |
| * memory when there are no more references to this bitmap. |
| */ |
| public void recycle() { |
| if (!mRecycled) { |
| nativeClean(mNativeLargeBitmap); |
| mRecycled = true; |
| } |
| } |
| |
| /** |
| * Returns true if this large bitmap has been recycled. |
| * If so, then it is an error to try use its method. |
| * |
| * @return true if the large bitmap has been recycled |
| */ |
| public final boolean isRecycled() { |
| return mRecycled; |
| } |
| |
| /** |
| * Called by methods that want to throw an exception if the bitmap |
| * has already been recycled. |
| */ |
| private void checkRecycled(String errorMessage) { |
| if (mRecycled) { |
| throw new IllegalStateException(errorMessage); |
| } |
| } |
| |
| protected void finalize() { |
| recycle(); |
| } |
| |
| private static native Bitmap nativeDecodeRegion(long nativeLbm, |
| int start_x, int start_y, int width, int height, |
| BitmapFactory.Options options); |
| private static native int nativeGetWidth(long nativeLbm); |
| private static native int nativeGetHeight(long nativeLbm); |
| private static native void nativeClean(long nativeLbm); |
| } |