11ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk/* 21ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk * Copyright (C) 2013 The Android Open Source Project 31ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk * 41ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk * Licensed under the Apache License, Version 2.0 (the "License"); 51ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk * you may not use this file except in compliance with the License. 61ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk * You may obtain a copy of the License at 71ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk * 81ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk * http://www.apache.org/licenses/LICENSE-2.0 91ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk * 101ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk * Unless required by applicable law or agreed to in writing, software 111ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk * distributed under the License is distributed on an "AS IS" BASIS, 121ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk * See the License for the specific language governing permissions and 141ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk * limitations under the License. 151ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk */ 161ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk 171ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunkpackage com.android.gallery3d.filtershow.tools; 181ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk 191ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunkimport android.graphics.Bitmap; 201ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunkimport android.graphics.Canvas; 211ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunkimport android.graphics.Paint; 221ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunkimport android.graphics.Rect; 231ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunkimport android.graphics.RectF; 241ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk 251ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk/** 261ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk * A factory class for producing bitmaps to use as UI icons. 271ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk */ 281ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunkpublic class IconFactory { 291ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk 301ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk /** 311ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk * Builds an icon with the dimensions iconWidth:iconHeight. If scale is set 321ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk * the source image is stretched to fit within the given dimensions; 331ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk * otherwise, the source image is cropped to the proper aspect ratio. 341ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk * 351ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk * @param sourceImage image to create an icon from. 361ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk * @param iconWidth width of the icon bitmap. 371ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk * @param iconHeight height of the icon bitmap. 381ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk * @param scale if true, stretch sourceImage to fit the icon dimensions. 391ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk * @return an icon bitmap with the dimensions iconWidth:iconHeight. 401ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk */ 411ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk public static Bitmap createIcon(Bitmap sourceImage, int iconWidth, int iconHeight, 421ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk boolean scale) { 431ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk if (sourceImage == null) { 441ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk throw new IllegalArgumentException("Null argument to buildIcon"); 451ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk } 461ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk 471ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk int sourceWidth = sourceImage.getWidth(); 481ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk int sourceHeight = sourceImage.getHeight(); 491ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk 501ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk if (sourceWidth == 0 || sourceHeight == 0 || iconWidth == 0 || iconHeight == 0) { 511ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk throw new IllegalArgumentException("Bitmap with dimension 0 used as input"); 521ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk } 531ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk 541ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk Bitmap icon = Bitmap.createBitmap(iconWidth, iconHeight, 551ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk Bitmap.Config.ARGB_8888); 561ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk drawIcon(icon, sourceImage, scale); 571ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk return icon; 581ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk } 591ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk 601ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk /** 611ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk * Draws an icon in the destination bitmap. If scale is set the source image 621ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk * is stretched to fit within the destination dimensions; otherwise, the 631ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk * source image is cropped to the proper aspect ratio. 641ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk * 651ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk * @param dest bitmap into which to draw the icon. 661ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk * @param sourceImage image to create an icon from. 671ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk * @param scale if true, stretch sourceImage to fit the destination. 681ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk */ 691ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk public static void drawIcon(Bitmap dest, Bitmap sourceImage, boolean scale) { 701ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk if (dest == null || sourceImage == null) { 711ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk throw new IllegalArgumentException("Null argument to buildIcon"); 721ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk } 731ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk 741ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk int sourceWidth = sourceImage.getWidth(); 751ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk int sourceHeight = sourceImage.getHeight(); 761ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk int iconWidth = dest.getWidth(); 771ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk int iconHeight = dest.getHeight(); 781ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk 791ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk if (sourceWidth == 0 || sourceHeight == 0 || iconWidth == 0 || iconHeight == 0) { 801ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk throw new IllegalArgumentException("Bitmap with dimension 0 used as input"); 811ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk } 821ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk 831ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk Rect destRect = new Rect(0, 0, iconWidth, iconHeight); 841ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk Canvas canvas = new Canvas(dest); 851ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk 861ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk Rect srcRect = null; 871ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk if (scale) { 881ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk // scale image to fit in icon (stretches if aspect isn't the same) 891ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk srcRect = new Rect(0, 0, sourceWidth, sourceHeight); 901ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk } else { 911ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk // crop image to aspect ratio iconWidth:iconHeight 921ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk float wScale = sourceWidth / (float) iconWidth; 931ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk float hScale = sourceHeight / (float) iconHeight; 941ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk float s = Math.min(hScale, wScale); 951ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk 961ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk float iw = iconWidth * s; 971ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk float ih = iconHeight * s; 981ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk 991ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk float borderW = (sourceWidth - iw) / 2.0f; 1001ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk float borderH = (sourceHeight - ih) / 2.0f; 1011ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk RectF rec = new RectF(borderW, borderH, borderW + iw, borderH + ih); 1021ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk srcRect = new Rect(); 1031ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk rec.roundOut(srcRect); 1041ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk } 1051ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk 1061ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk canvas.drawBitmap(sourceImage, srcRect, destRect, new Paint()); 1071ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk } 1081ce9b42534da231c85d40be442c455e5b7cbc59eRuben Brunk} 109