1f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin/* 2f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Copyright (C) 2010 The Android Open Source Project 3f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 4f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Licensed under the Apache License, Version 2.0 (the "License"); 5f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * you may not use this file except in compliance with the License. 6f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * You may obtain a copy of the License at 7f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 8f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * http://www.apache.org/licenses/LICENSE-2.0 9f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 10f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Unless required by applicable law or agreed to in writing, software 11f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * distributed under the License is distributed on an "AS IS" BASIS, 12f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * See the License for the specific language governing permissions and 14f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * limitations under the License. 15f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin */ 16f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 17f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpackage com.android.gallery3d.ui; 18f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 19f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.graphics.Bitmap; 20f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.graphics.Bitmap.Config; 212b3ee0ea07246b859a5b75d8a6102a7cce7ec838Owen Linimport android.graphics.Canvas; 222b3ee0ea07246b859a5b75d8a6102a7cce7ec838Owen Lin 232b3ee0ea07246b859a5b75d8a6102a7cce7ec838Owen Linimport com.android.gallery3d.common.BitmapUtils; 24f52ceba89962829aa12f5caba131580e8da85880Bobby Georgescuimport com.android.photos.data.GalleryBitmapPool; 25f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 26f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport java.util.ArrayList; 27f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 286dc3866ac10cc6bf38e73f098fe1988d1a6eecd4Your Namepublic class BitmapTileProvider implements TileImageView.TileSource { 2915b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang private final ScreenNail mScreenNail; 30f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private final Bitmap[] mMipmaps; 31f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private final Config mConfig; 32f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private final int mImageWidth; 33f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private final int mImageHeight; 34f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 35f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mRecycled = false; 36f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 37f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public BitmapTileProvider(Bitmap bitmap, int maxBackupSize) { 38f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mImageWidth = bitmap.getWidth(); 39f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mImageHeight = bitmap.getHeight(); 40f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ArrayList<Bitmap> list = new ArrayList<Bitmap>(); 41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin list.add(bitmap); 42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin while (bitmap.getWidth() > maxBackupSize 43f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin || bitmap.getHeight() > maxBackupSize) { 44f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin bitmap = BitmapUtils.resizeBitmapByScale(bitmap, 0.5f, false); 45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin list.add(bitmap); 46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 48c3b2d478f9032a8decf5c6254a238fc49e41b72cChih-Chung Chang mScreenNail = new BitmapScreenNail(list.remove(list.size() - 1)); 49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mMipmaps = list.toArray(new Bitmap[list.size()]); 50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mConfig = Config.ARGB_8888; 51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 53c2c0b01fbbf243eee1a11c33ba6dd1ce918a9ce5Owen Lin @Override 5415b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang public ScreenNail getScreenNail() { 5515b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang return mScreenNail; 56f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 57f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 58c2c0b01fbbf243eee1a11c33ba6dd1ce918a9ce5Owen Lin @Override 59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int getImageHeight() { 60f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mImageHeight; 61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 63c2c0b01fbbf243eee1a11c33ba6dd1ce918a9ce5Owen Lin @Override 64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int getImageWidth() { 65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mImageWidth; 66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 68c2c0b01fbbf243eee1a11c33ba6dd1ce918a9ce5Owen Lin @Override 69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int getLevelCount() { 70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mMipmaps.length; 71f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 73c2c0b01fbbf243eee1a11c33ba6dd1ce918a9ce5Owen Lin @Override 74f52ceba89962829aa12f5caba131580e8da85880Bobby Georgescu public Bitmap getTile(int level, int x, int y, int tileSize) { 75cb4fb7c19f20405fb5e08513e6297dffce824118Chih-Chung Chang x >>= level; 76cb4fb7c19f20405fb5e08513e6297dffce824118Chih-Chung Chang y >>= level; 77c2c0b01fbbf243eee1a11c33ba6dd1ce918a9ce5Owen Lin 78f52ceba89962829aa12f5caba131580e8da85880Bobby Georgescu Bitmap result = GalleryBitmapPool.getInstance().get(tileSize, tileSize); 79c2c0b01fbbf243eee1a11c33ba6dd1ce918a9ce5Owen Lin if (result == null) { 806dc3866ac10cc6bf38e73f098fe1988d1a6eecd4Your Name result = Bitmap.createBitmap(tileSize, tileSize, mConfig); 81c2c0b01fbbf243eee1a11c33ba6dd1ce918a9ce5Owen Lin } else { 82c2c0b01fbbf243eee1a11c33ba6dd1ce918a9ce5Owen Lin result.eraseColor(0); 83c2c0b01fbbf243eee1a11c33ba6dd1ce918a9ce5Owen Lin } 84c2c0b01fbbf243eee1a11c33ba6dd1ce918a9ce5Owen Lin 85cb4fb7c19f20405fb5e08513e6297dffce824118Chih-Chung Chang Bitmap mipmap = mMipmaps[level]; 86f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Canvas canvas = new Canvas(result); 876dc3866ac10cc6bf38e73f098fe1988d1a6eecd4Your Name int offsetX = -x; 886dc3866ac10cc6bf38e73f098fe1988d1a6eecd4Your Name int offsetY = -y; 89cb4fb7c19f20405fb5e08513e6297dffce824118Chih-Chung Chang canvas.drawBitmap(mipmap, offsetX, offsetY, null); 90c2c0b01fbbf243eee1a11c33ba6dd1ce918a9ce5Owen Lin return result; 91f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 92f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 93f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void recycle() { 94f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mRecycled) return; 95f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mRecycled = true; 96f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (Bitmap bitmap : mMipmaps) { 97f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin BitmapUtils.recycleSilently(bitmap); 98f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 9915b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang if (mScreenNail != null) { 100b8be1e0ad76b6abc0da7ead39f7a9811195d001eChih-Chung Chang mScreenNail.recycle(); 10115b351a22d02e89d882fc9fe32b3f4c512080e0aChih-Chung Chang } 102f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 103f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin} 104