ImageFilterDownsample.java revision 99baf61387ab1ef15bb9db5fa3b2b55591e87059
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); 446900cad45d240c9a54b92991538b6a33652e766cnicolasroard representation.setTextId(R.string.downsample); 456900cad45d240c9a54b92991538b6a33652e766cnicolasroard representation.setButtonId(R.id.downsampleButton); 4671f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard return representation; 4771f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard } 4871f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard 49b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk @Override 5099baf61387ab1ef15bb9db5fa3b2b55591e87059John Hoford public Bitmap apply(Bitmap bitmap, float scaleFactor, int quality) { 5171f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard if (getParameters() == null) { 5271f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard return bitmap; 5371f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard } 54b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk int w = bitmap.getWidth(); 55b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk int h = bitmap.getHeight(); 5671f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard int p = getParameters().getValue(); 57ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk 58ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk // size of original precached image 59ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk Rect size = mImageLoader.getOriginalBounds(); 60ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk int orig_w = size.width(); 61ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk int orig_h = size.height(); 62ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk 63b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk if (p > 0 && p < 100) { 64ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk // scale preview to same size as the resulting bitmap from a "save" 652e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk int newWidth = orig_w * p / 100; 66ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk int newHeight = orig_h * p / 100; 67ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk 68ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk // only scale preview if preview isn't already scaled enough 69ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk if (newWidth <= 0 || newHeight <= 0 || newWidth >= w || newHeight >= h) { 70b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk return bitmap; 71b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk } 72b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk Bitmap ret = Bitmap.createScaledBitmap(bitmap, newWidth, newHeight, true); 73b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk if (ret != bitmap) { 74b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk bitmap.recycle(); 75b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk } 76b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk return ret; 77b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk } 78b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk return bitmap; 79b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk } 802e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk 812e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk @Override 8299baf61387ab1ef15bb9db5fa3b2b55591e87059John Hoford public Bitmap iconApply(Bitmap bitmap, float scaleFactor, int quality) { 832e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk int w = bitmap.getWidth(); 842e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk int h = bitmap.getHeight(); 852e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk Bitmap ret = Bitmap.createScaledBitmap(bitmap, w / ICON_DOWNSAMPLE_FRACTION, h 862e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk / ICON_DOWNSAMPLE_FRACTION, false); 872e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk Rect dst = new Rect(0, 0, w, h); 882e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk Rect src = new Rect(0, 0, w / ICON_DOWNSAMPLE_FRACTION, h / ICON_DOWNSAMPLE_FRACTION); 892e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk Canvas c = new Canvas(bitmap); 902e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk c.drawBitmap(ret, src, dst, null); 912e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk return bitmap; 922e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk } 93b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk} 94