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