diff options
Diffstat (limited to 'src/com/android/gallery3d/ui/BitmapTileProvider.java')
-rw-r--r-- | src/com/android/gallery3d/ui/BitmapTileProvider.java | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/src/com/android/gallery3d/ui/BitmapTileProvider.java b/src/com/android/gallery3d/ui/BitmapTileProvider.java new file mode 100644 index 000000000..e1a8b7644 --- /dev/null +++ b/src/com/android/gallery3d/ui/BitmapTileProvider.java @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2010 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.gallery3d.ui; + +import android.graphics.Bitmap; +import android.graphics.Bitmap.Config; +import android.graphics.Canvas; + +import com.android.gallery3d.common.BitmapUtils; +import com.android.photos.data.GalleryBitmapPool; + +import java.util.ArrayList; + +public class BitmapTileProvider implements TileImageView.TileSource { + private final ScreenNail mScreenNail; + private final Bitmap[] mMipmaps; + private final Config mConfig; + private final int mImageWidth; + private final int mImageHeight; + + private boolean mRecycled = false; + + public BitmapTileProvider(Bitmap bitmap, int maxBackupSize) { + mImageWidth = bitmap.getWidth(); + mImageHeight = bitmap.getHeight(); + ArrayList<Bitmap> list = new ArrayList<Bitmap>(); + list.add(bitmap); + while (bitmap.getWidth() > maxBackupSize + || bitmap.getHeight() > maxBackupSize) { + bitmap = BitmapUtils.resizeBitmapByScale(bitmap, 0.5f, false); + list.add(bitmap); + } + + mScreenNail = new BitmapScreenNail(list.remove(list.size() - 1)); + mMipmaps = list.toArray(new Bitmap[list.size()]); + mConfig = Config.ARGB_8888; + } + + @Override + public ScreenNail getScreenNail() { + return mScreenNail; + } + + @Override + public int getImageHeight() { + return mImageHeight; + } + + @Override + public int getImageWidth() { + return mImageWidth; + } + + @Override + public int getLevelCount() { + return mMipmaps.length; + } + + @Override + public Bitmap getTile(int level, int x, int y, int tileSize) { + x >>= level; + y >>= level; + + Bitmap result = GalleryBitmapPool.getInstance().get(tileSize, tileSize); + if (result == null) { + result = Bitmap.createBitmap(tileSize, tileSize, mConfig); + } else { + result.eraseColor(0); + } + + Bitmap mipmap = mMipmaps[level]; + Canvas canvas = new Canvas(result); + int offsetX = -x; + int offsetY = -y; + canvas.drawBitmap(mipmap, offsetX, offsetY, null); + return result; + } + + public void recycle() { + if (mRecycled) return; + mRecycled = true; + for (Bitmap bitmap : mMipmaps) { + BitmapUtils.recycleSilently(bitmap); + } + if (mScreenNail != null) { + mScreenNail.recycle(); + } + } +} |