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; 250c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunkimport com.android.gallery3d.filtershow.imageshow.MasterImage; 26b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk 2771f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroardpublic class ImageFilterDownsample extends SimpleImageFilter { 28afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford private static final String SERIALIZATION_NAME = "DOWNSAMPLE"; 292e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk private static final int ICON_DOWNSAMPLE_FRACTION = 8; 30ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk private ImageLoader mImageLoader; 31b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk 32ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk public ImageFilterDownsample(ImageLoader loader) { 33b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk mName = "Downsample"; 34ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk mImageLoader = loader; 35b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk } 36b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk 3771f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard public FilterRepresentation getDefaultRepresentation() { 3871f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard FilterBasicRepresentation representation = (FilterBasicRepresentation) super.getDefaultRepresentation(); 3971f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard representation.setName("Downsample"); 40afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford representation.setSerializationName(SERIALIZATION_NAME); 41afa8ed9d46e760d4b0c0331cfcb4bb49ef6ba280John Hoford 4271f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard representation.setFilterClass(ImageFilterDownsample.class); 4371f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard representation.setMaximum(100); 4471f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard representation.setMinimum(1); 4571f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard representation.setValue(50); 4671f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard representation.setDefaultValue(50); 4771f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard representation.setPreviewValue(3); 486900cad45d240c9a54b92991538b6a33652e766cnicolasroard representation.setTextId(R.string.downsample); 4971f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard return representation; 5071f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard } 5171f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard 52b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk @Override 5399baf61387ab1ef15bb9db5fa3b2b55591e87059John Hoford public Bitmap apply(Bitmap bitmap, float scaleFactor, int quality) { 5471f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard if (getParameters() == null) { 5571f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard return bitmap; 5671f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard } 57b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk int w = bitmap.getWidth(); 58b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk int h = bitmap.getHeight(); 5971f04cbaedbb89e313e0b86b531640db2d3f6016nicolasroard int p = getParameters().getValue(); 60ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk 61ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk // size of original precached image 620c1b4c6422a4d2d9b81cc0946d1c9675440a94e2Ruben Brunk Rect size = MasterImage.getImage().getOriginalBounds(); 63ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk int orig_w = size.width(); 64ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk int orig_h = size.height(); 65ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk 66b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk if (p > 0 && p < 100) { 67ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk // scale preview to same size as the resulting bitmap from a "save" 682e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk int newWidth = orig_w * p / 100; 69ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk int newHeight = orig_h * p / 100; 70ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk 71ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk // only scale preview if preview isn't already scaled enough 72ff6b23e655883f8f42bcf5c806f594512beaa322Ruben Brunk if (newWidth <= 0 || newHeight <= 0 || newWidth >= w || newHeight >= h) { 73b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk return bitmap; 74b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk } 75b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk Bitmap ret = Bitmap.createScaledBitmap(bitmap, newWidth, newHeight, true); 76b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk if (ret != bitmap) { 77b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk bitmap.recycle(); 78b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk } 79b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk return ret; 80b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk } 81b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk return bitmap; 82b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk } 83b5abda28145e68e68a74a5aa2004361cf62edcc2Ruben Brunk} 84