183699e56be0767bb080b5461896a99f266e7b85eMichael Jurka/* 283699e56be0767bb080b5461896a99f266e7b85eMichael Jurka * Copyright (C) 2013 The Android Open Source Project 383699e56be0767bb080b5461896a99f266e7b85eMichael Jurka * 483699e56be0767bb080b5461896a99f266e7b85eMichael Jurka * Licensed under the Apache License, Version 2.0 (the "License"); 583699e56be0767bb080b5461896a99f266e7b85eMichael Jurka * you may not use this file except in compliance with the License. 683699e56be0767bb080b5461896a99f266e7b85eMichael Jurka * You may obtain a copy of the License at 783699e56be0767bb080b5461896a99f266e7b85eMichael Jurka * 883699e56be0767bb080b5461896a99f266e7b85eMichael Jurka * http://www.apache.org/licenses/LICENSE-2.0 983699e56be0767bb080b5461896a99f266e7b85eMichael Jurka * 1083699e56be0767bb080b5461896a99f266e7b85eMichael Jurka * Unless required by applicable law or agreed to in writing, software 1183699e56be0767bb080b5461896a99f266e7b85eMichael Jurka * distributed under the License is distributed on an "AS IS" BASIS, 1283699e56be0767bb080b5461896a99f266e7b85eMichael Jurka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1383699e56be0767bb080b5461896a99f266e7b85eMichael Jurka * See the License for the specific language governing permissions and 1483699e56be0767bb080b5461896a99f266e7b85eMichael Jurka * limitations under the License. 1583699e56be0767bb080b5461896a99f266e7b85eMichael Jurka */ 1683699e56be0767bb080b5461896a99f266e7b85eMichael Jurka 1783699e56be0767bb080b5461896a99f266e7b85eMichael Jurkapackage com.android.launcher3; 1883699e56be0767bb080b5461896a99f266e7b85eMichael Jurka 1983699e56be0767bb080b5461896a99f266e7b85eMichael Jurkaimport android.content.Context; 2083699e56be0767bb080b5461896a99f266e7b85eMichael Jurkaimport android.graphics.Bitmap; 2183699e56be0767bb080b5461896a99f266e7b85eMichael Jurkaimport android.graphics.Canvas; 2283699e56be0767bb080b5461896a99f266e7b85eMichael Jurkaimport android.graphics.Rect; 2383699e56be0767bb080b5461896a99f266e7b85eMichael Jurkaimport android.graphics.drawable.Drawable; 2483699e56be0767bb080b5461896a99f266e7b85eMichael Jurka 2583699e56be0767bb080b5461896a99f266e7b85eMichael Jurkaimport com.android.gallery3d.glrenderer.BasicTexture; 2683699e56be0767bb080b5461896a99f266e7b85eMichael Jurkaimport com.android.gallery3d.glrenderer.BitmapTexture; 2783699e56be0767bb080b5461896a99f266e7b85eMichael Jurkaimport com.android.photos.views.TiledImageRenderer; 2883699e56be0767bb080b5461896a99f266e7b85eMichael Jurka 2983699e56be0767bb080b5461896a99f266e7b85eMichael Jurkapublic class DrawableTileSource implements TiledImageRenderer.TileSource { 3083699e56be0767bb080b5461896a99f266e7b85eMichael Jurka private static final int GL_SIZE_LIMIT = 2048; 3183699e56be0767bb080b5461896a99f266e7b85eMichael Jurka // This must be no larger than half the size of the GL_SIZE_LIMIT 3283699e56be0767bb080b5461896a99f266e7b85eMichael Jurka // due to decodePreview being allowed to be up to 2x the size of the target 3383699e56be0767bb080b5461896a99f266e7b85eMichael Jurka public static final int MAX_PREVIEW_SIZE = GL_SIZE_LIMIT / 2; 3483699e56be0767bb080b5461896a99f266e7b85eMichael Jurka 3583699e56be0767bb080b5461896a99f266e7b85eMichael Jurka private int mTileSize; 3683699e56be0767bb080b5461896a99f266e7b85eMichael Jurka private int mPreviewSize; 3783699e56be0767bb080b5461896a99f266e7b85eMichael Jurka private Drawable mDrawable; 3883699e56be0767bb080b5461896a99f266e7b85eMichael Jurka private BitmapTexture mPreview; 3983699e56be0767bb080b5461896a99f266e7b85eMichael Jurka 4083699e56be0767bb080b5461896a99f266e7b85eMichael Jurka public DrawableTileSource(Context context, Drawable d, int previewSize) { 4183699e56be0767bb080b5461896a99f266e7b85eMichael Jurka mTileSize = TiledImageRenderer.suggestedTileSize(context); 4283699e56be0767bb080b5461896a99f266e7b85eMichael Jurka mDrawable = d; 4383699e56be0767bb080b5461896a99f266e7b85eMichael Jurka mPreviewSize = Math.min(previewSize, MAX_PREVIEW_SIZE); 4483699e56be0767bb080b5461896a99f266e7b85eMichael Jurka } 4583699e56be0767bb080b5461896a99f266e7b85eMichael Jurka 4683699e56be0767bb080b5461896a99f266e7b85eMichael Jurka @Override 4783699e56be0767bb080b5461896a99f266e7b85eMichael Jurka public int getTileSize() { 4883699e56be0767bb080b5461896a99f266e7b85eMichael Jurka return mTileSize; 4983699e56be0767bb080b5461896a99f266e7b85eMichael Jurka } 5083699e56be0767bb080b5461896a99f266e7b85eMichael Jurka 5183699e56be0767bb080b5461896a99f266e7b85eMichael Jurka @Override 5283699e56be0767bb080b5461896a99f266e7b85eMichael Jurka public int getImageWidth() { 5383699e56be0767bb080b5461896a99f266e7b85eMichael Jurka return mDrawable.getIntrinsicWidth(); 5483699e56be0767bb080b5461896a99f266e7b85eMichael Jurka } 5583699e56be0767bb080b5461896a99f266e7b85eMichael Jurka 5683699e56be0767bb080b5461896a99f266e7b85eMichael Jurka @Override 5783699e56be0767bb080b5461896a99f266e7b85eMichael Jurka public int getImageHeight() { 5883699e56be0767bb080b5461896a99f266e7b85eMichael Jurka return mDrawable.getIntrinsicHeight(); 5983699e56be0767bb080b5461896a99f266e7b85eMichael Jurka } 6083699e56be0767bb080b5461896a99f266e7b85eMichael Jurka 6183699e56be0767bb080b5461896a99f266e7b85eMichael Jurka @Override 6283699e56be0767bb080b5461896a99f266e7b85eMichael Jurka public int getRotation() { 6383699e56be0767bb080b5461896a99f266e7b85eMichael Jurka return 0; 6483699e56be0767bb080b5461896a99f266e7b85eMichael Jurka } 6583699e56be0767bb080b5461896a99f266e7b85eMichael Jurka 6683699e56be0767bb080b5461896a99f266e7b85eMichael Jurka @Override 6783699e56be0767bb080b5461896a99f266e7b85eMichael Jurka public BasicTexture getPreview() { 6883699e56be0767bb080b5461896a99f266e7b85eMichael Jurka if (mPreviewSize == 0) { 6983699e56be0767bb080b5461896a99f266e7b85eMichael Jurka return null; 7083699e56be0767bb080b5461896a99f266e7b85eMichael Jurka } 7183699e56be0767bb080b5461896a99f266e7b85eMichael Jurka if (mPreview == null){ 7283699e56be0767bb080b5461896a99f266e7b85eMichael Jurka float width = getImageWidth(); 7383699e56be0767bb080b5461896a99f266e7b85eMichael Jurka float height = getImageHeight(); 7483699e56be0767bb080b5461896a99f266e7b85eMichael Jurka while (width > MAX_PREVIEW_SIZE || height > MAX_PREVIEW_SIZE) { 7583699e56be0767bb080b5461896a99f266e7b85eMichael Jurka width /= 2; 7683699e56be0767bb080b5461896a99f266e7b85eMichael Jurka height /= 2; 7783699e56be0767bb080b5461896a99f266e7b85eMichael Jurka } 7883699e56be0767bb080b5461896a99f266e7b85eMichael Jurka Bitmap b = Bitmap.createBitmap((int) width, (int) height, Bitmap.Config.ARGB_8888); 7983699e56be0767bb080b5461896a99f266e7b85eMichael Jurka Canvas c = new Canvas(b); 8083699e56be0767bb080b5461896a99f266e7b85eMichael Jurka mDrawable.setBounds(new Rect(0, 0, (int) width, (int) height)); 8183699e56be0767bb080b5461896a99f266e7b85eMichael Jurka mDrawable.draw(c); 8283699e56be0767bb080b5461896a99f266e7b85eMichael Jurka c.setBitmap(null); 8383699e56be0767bb080b5461896a99f266e7b85eMichael Jurka mPreview = new BitmapTexture(b); 8483699e56be0767bb080b5461896a99f266e7b85eMichael Jurka } 8583699e56be0767bb080b5461896a99f266e7b85eMichael Jurka return mPreview; 8683699e56be0767bb080b5461896a99f266e7b85eMichael Jurka } 8783699e56be0767bb080b5461896a99f266e7b85eMichael Jurka 8883699e56be0767bb080b5461896a99f266e7b85eMichael Jurka @Override 8983699e56be0767bb080b5461896a99f266e7b85eMichael Jurka public Bitmap getTile(int level, int x, int y, Bitmap bitmap) { 9083699e56be0767bb080b5461896a99f266e7b85eMichael Jurka int tileSize = getTileSize(); 9183699e56be0767bb080b5461896a99f266e7b85eMichael Jurka if (bitmap == null) { 9283699e56be0767bb080b5461896a99f266e7b85eMichael Jurka bitmap = Bitmap.createBitmap(tileSize, tileSize, Bitmap.Config.ARGB_8888); 9383699e56be0767bb080b5461896a99f266e7b85eMichael Jurka } 9483699e56be0767bb080b5461896a99f266e7b85eMichael Jurka Canvas c = new Canvas(bitmap); 9583699e56be0767bb080b5461896a99f266e7b85eMichael Jurka Rect bounds = new Rect(0, 0, getImageWidth(), getImageHeight()); 9683699e56be0767bb080b5461896a99f266e7b85eMichael Jurka bounds.offset(-x, -y); 9783699e56be0767bb080b5461896a99f266e7b85eMichael Jurka mDrawable.setBounds(bounds); 9883699e56be0767bb080b5461896a99f266e7b85eMichael Jurka mDrawable.draw(c); 9983699e56be0767bb080b5461896a99f266e7b85eMichael Jurka c.setBitmap(null); 10083699e56be0767bb080b5461896a99f266e7b85eMichael Jurka return bitmap; 10183699e56be0767bb080b5461896a99f266e7b85eMichael Jurka } 10283699e56be0767bb080b5461896a99f266e7b85eMichael Jurka} 103