1 /* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.wallpaperpicker; 18 19 import android.content.Context; 20 import android.graphics.Bitmap; 21 import android.graphics.Canvas; 22 import android.graphics.Rect; 23 import android.graphics.drawable.Drawable; 24 25 import com.android.gallery3d.glrenderer.BasicTexture; 26 import com.android.gallery3d.glrenderer.BitmapTexture; 27 import com.android.photos.views.TiledImageRenderer; 28 29 public class DrawableTileSource implements TiledImageRenderer.TileSource { 30 private static final int GL_SIZE_LIMIT = 2048; 31 // This must be no larger than half the size of the GL_SIZE_LIMIT 32 // due to decodePreview being allowed to be up to 2x the size of the target 33 public static final int MAX_PREVIEW_SIZE = GL_SIZE_LIMIT / 2; 34 35 private int mTileSize; 36 private int mPreviewSize; 37 private Drawable mDrawable; 38 private BitmapTexture mPreview; 39 DrawableTileSource(Context context, Drawable d, int previewSize)40 public DrawableTileSource(Context context, Drawable d, int previewSize) { 41 mTileSize = TiledImageRenderer.suggestedTileSize(context); 42 mDrawable = d; 43 mPreviewSize = Math.min(previewSize, MAX_PREVIEW_SIZE); 44 } 45 46 @Override getTileSize()47 public int getTileSize() { 48 return mTileSize; 49 } 50 51 @Override getImageWidth()52 public int getImageWidth() { 53 return mDrawable.getIntrinsicWidth(); 54 } 55 56 @Override getImageHeight()57 public int getImageHeight() { 58 return mDrawable.getIntrinsicHeight(); 59 } 60 61 @Override getRotation()62 public int getRotation() { 63 return 0; 64 } 65 66 @Override getPreview()67 public BasicTexture getPreview() { 68 if (mPreviewSize == 0) { 69 return null; 70 } 71 if (mPreview == null){ 72 float width = getImageWidth(); 73 float height = getImageHeight(); 74 while (width > MAX_PREVIEW_SIZE || height > MAX_PREVIEW_SIZE) { 75 width /= 2; 76 height /= 2; 77 } 78 Bitmap b = Bitmap.createBitmap((int) width, (int) height, Bitmap.Config.ARGB_8888); 79 Canvas c = new Canvas(b); 80 mDrawable.setBounds(new Rect(0, 0, (int) width, (int) height)); 81 mDrawable.draw(c); 82 c.setBitmap(null); 83 mPreview = new BitmapTexture(b); 84 } 85 return mPreview; 86 } 87 88 @Override getTile(int level, int x, int y, Bitmap bitmap)89 public Bitmap getTile(int level, int x, int y, Bitmap bitmap) { 90 int tileSize = getTileSize(); 91 if (bitmap == null) { 92 bitmap = Bitmap.createBitmap(tileSize, tileSize, Bitmap.Config.ARGB_8888); 93 } 94 Canvas c = new Canvas(bitmap); 95 Rect bounds = new Rect(0, 0, getImageWidth(), getImageHeight()); 96 bounds.offset(-x, -y); 97 mDrawable.setBounds(bounds); 98 mDrawable.draw(c); 99 c.setBitmap(null); 100 return bitmap; 101 } 102 } 103