ImageFilterDownsample.java revision 71f04cbaedbb89e313e0b86b531640db2d3f6016
1b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk/* 2b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk * Copyright (C) 2012 The Android Open Source Project 3b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk * 4b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk * Licensed under the Apache License, Version 2.0 (the "License"); 5b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk * you may not use this file except in compliance with the License. 6b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk * You may obtain a copy of the License at 7b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk * 8b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk * http://www.apache.org/licenses/LICENSE-2.0 9b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk * 10b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk * Unless required by applicable law or agreed to in writing, software 11b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk * distributed under the License is distributed on an "AS IS" BASIS, 12b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk * See the License for the specific language governing permissions and 14b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk * limitations under the License. 15b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk */ 16b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk 17b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunkpackage com.android.gallery3d.filtershow.filters; 18b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk 19b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunkimport android.graphics.Bitmap; 202e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunkimport android.graphics.Canvas; 21ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunkimport android.graphics.Rect; 22b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk 23b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunkimport com.android.gallery3d.R; 24ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunkimport com.android.gallery3d.filtershow.cache.ImageLoader; 25b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk 2671f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroardpublic class ImageFilterDownsample extends SimpleImageFilter { 272e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk private static final int ICON_DOWNSAMPLE_FRACTION = 8; 28ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk private ImageLoader mImageLoader; 29b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk 30ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk public ImageFilterDownsample(ImageLoader loader) { 31b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk mName = "Downsample"; 32ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk mImageLoader = loader; 33b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk } 34b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk 3571f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard public FilterRepresentation getDefaultRepresentation() { 3671f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard FilterBasicRepresentation representation = (FilterBasicRepresentation) super.getDefaultRepresentation(); 3771f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard representation.setName("Downsample"); 3871f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard representation.setFilterClass(ImageFilterDownsample.class); 3971f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard representation.setMaximum(100); 4071f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard representation.setMinimum(1); 4171f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard representation.setValue(50); 4271f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard representation.setDefaultValue(50); 4371f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard representation.setPreviewValue(3); 4471f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard return representation; 4571f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard } 4671f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard 47b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk @Override 48b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk public int getButtonId() { 49b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk return R.id.downsampleButton; 50b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk } 51b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk 52b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk @Override 53b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk public int getTextId() { 54b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk return R.string.downsample; 55b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk } 56b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk 57b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk @Override 58b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk public Bitmap apply(Bitmap bitmap, float scaleFactor, boolean highQuality) { 5971f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard if (getParameters() == null) { 6071f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard return bitmap; 6171f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard } 62b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk int w = bitmap.getWidth(); 63b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk int h = bitmap.getHeight(); 6471f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard int p = getParameters().getValue(); 65ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk 66ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk // size of original precached image 67ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk Rect size = mImageLoader.getOriginalBounds(); 68ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk int orig_w = size.width(); 69ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk int orig_h = size.height(); 70ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk 71b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk if (p > 0 && p < 100) { 72ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk // scale preview to same size as the resulting bitmap from a "save" 732e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk int newWidth = orig_w * p / 100; 74ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk int newHeight = orig_h * p / 100; 75ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk 76ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk // only scale preview if preview isn't already scaled enough 77ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk if (newWidth <= 0 || newHeight <= 0 || newWidth >= w || newHeight >= h) { 78b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk return bitmap; 79b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk } 80b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk Bitmap ret = Bitmap.createScaledBitmap(bitmap, newWidth, newHeight, true); 81b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk if (ret != bitmap) { 82b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk bitmap.recycle(); 83b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk } 84b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk return ret; 85b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk } 86b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk return bitmap; 87b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk } 882e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk 892e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk @Override 902e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk public Bitmap iconApply(Bitmap bitmap, float scaleFactor, boolean highQuality) { 912e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk int w = bitmap.getWidth(); 922e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk int h = bitmap.getHeight(); 932e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk Bitmap ret = Bitmap.createScaledBitmap(bitmap, w / ICON_DOWNSAMPLE_FRACTION, h 942e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk / ICON_DOWNSAMPLE_FRACTION, false); 952e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk Rect dst = new Rect(0, 0, w, h); 962e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk Rect src = new Rect(0, 0, w / ICON_DOWNSAMPLE_FRACTION, h / ICON_DOWNSAMPLE_FRACTION); 972e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk Canvas c = new Canvas(bitmap); 982e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk c.drawBitmap(ret, src, dst, null); 992e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk return bitmap; 1002e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk } 101b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk} 102