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