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