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