1a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard/*
2a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * Copyright (C) 2012 The Android Open Source Project
3a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard *
4a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * Licensed under the Apache License, Version 2.0 (the "License");
5a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * you may not use this file except in compliance with the License.
6a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * You may obtain a copy of the License at
7a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard *
8a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard *      http://www.apache.org/licenses/LICENSE-2.0
9a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard *
10a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * Unless required by applicable law or agreed to in writing, software
11a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * distributed under the License is distributed on an "AS IS" BASIS,
12a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * See the License for the specific language governing permissions and
14a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * limitations under the License.
15a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard */
160d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
170d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardpackage com.android.gallery3d.filtershow.filters;
180d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
190d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.graphics.Bitmap;
2081eb9976f967d9b3faa1749a8ab29d1743cf347dnicolasroard
21368ae73ad0627dac41709b925fc02a12548ab80dnicolasroardimport com.android.gallery3d.filtershow.imageshow.Spline;
220d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
230d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardpublic class ImageFilterCurves extends ImageFilter {
240d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
250d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    private static final String LOGTAG = "ImageFilterCurves";
2619161944e0efb1ffe23274d7cf5315ce047e9dacJohn Hoford    FilterCurvesRepresentation mParameters = new FilterCurvesRepresentation();
2719161944e0efb1ffe23274d7cf5315ce047e9dacJohn Hoford
2819161944e0efb1ffe23274d7cf5315ce047e9dacJohn Hoford    @Override
2919161944e0efb1ffe23274d7cf5315ce047e9dacJohn Hoford    public FilterRepresentation getDefaultRepresentation() {
306900cad45d240c9a54b92991538b6a33652e766cnicolasroard        return new FilterCurvesRepresentation();
3119161944e0efb1ffe23274d7cf5315ce047e9dacJohn Hoford    }
3219161944e0efb1ffe23274d7cf5315ce047e9dacJohn Hoford
3319161944e0efb1ffe23274d7cf5315ce047e9dacJohn Hoford    @Override
3419161944e0efb1ffe23274d7cf5315ce047e9dacJohn Hoford    public void useRepresentation(FilterRepresentation representation) {
3519161944e0efb1ffe23274d7cf5315ce047e9dacJohn Hoford        FilterCurvesRepresentation parameters = (FilterCurvesRepresentation) representation;
3619161944e0efb1ffe23274d7cf5315ce047e9dacJohn Hoford        mParameters = parameters;
3719161944e0efb1ffe23274d7cf5315ce047e9dacJohn Hoford    }
380d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
39bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    public ImageFilterCurves() {
40bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        mName = "Curves";
41d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard        reset();
420d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
430d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
443992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard    public void populateArray(int[] array, int curveIndex) {
4519161944e0efb1ffe23274d7cf5315ce047e9dacJohn Hoford        Spline spline = mParameters.getSpline(curveIndex);
463992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard        if (spline == null) {
473992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard            return;
483992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard        }
493992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard        float[] curve = spline.getAppliedCurve();
500d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        for (int i = 0; i < 256; i++) {
513992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard            array[i] = (int) (curve[i] * 255);
520d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
530d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
540d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
5581eb9976f967d9b3faa1749a8ab29d1743cf347dnicolasroard    @Override
5699baf61387ab1ef15bb9db5fa3b2b55591e87059John Hoford    public Bitmap apply(Bitmap bitmap, float scaleFactor, int quality) {
5719161944e0efb1ffe23274d7cf5315ce047e9dacJohn Hoford        if (!mParameters.getSpline(Spline.RGB).isOriginal()) {
583992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard            int[] rgbGradient = new int[256];
593992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard            populateArray(rgbGradient, Spline.RGB);
603992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard            nativeApplyGradientFilter(bitmap, bitmap.getWidth(), bitmap.getHeight(),
613992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard                    rgbGradient, rgbGradient, rgbGradient);
623992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard        }
633992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard
640d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        int[] redGradient = null;
6519161944e0efb1ffe23274d7cf5315ce047e9dacJohn Hoford        if (!mParameters.getSpline(Spline.RED).isOriginal()) {
660d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            redGradient = new int[256];
673992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard            populateArray(redGradient, Spline.RED);
680d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
690d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        int[] greenGradient = null;
7019161944e0efb1ffe23274d7cf5315ce047e9dacJohn Hoford        if (!mParameters.getSpline(Spline.GREEN).isOriginal()) {
710d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            greenGradient = new int[256];
723992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard            populateArray(greenGradient, Spline.GREEN);
730d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
740d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        int[] blueGradient = null;
7519161944e0efb1ffe23274d7cf5315ce047e9dacJohn Hoford        if (!mParameters.getSpline(Spline.BLUE).isOriginal()) {
760d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            blueGradient = new int[256];
773992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard            populateArray(blueGradient, Spline.BLUE);
780d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
790d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
800d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        nativeApplyGradientFilter(bitmap, bitmap.getWidth(), bitmap.getHeight(),
810d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard                redGradient, greenGradient, blueGradient);
8281eb9976f967d9b3faa1749a8ab29d1743cf347dnicolasroard        return bitmap;
830d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
840d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
853992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard    public void setSpline(Spline spline, int splineIndex) {
8619161944e0efb1ffe23274d7cf5315ce047e9dacJohn Hoford        mParameters.setSpline(splineIndex, new Spline(spline));
870d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
880d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
893992ae6cf1cbb7b57a22d8287c40451558408335nicolasroard    public Spline getSpline(int splineIndex) {
9019161944e0efb1ffe23274d7cf5315ce047e9dacJohn Hoford        return mParameters.getSpline(splineIndex);
910d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
92d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard
93d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard    public void reset() {
94d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard        Spline spline = new Spline();
95d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard
96d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard        spline.addPoint(0.0f, 1.0f);
97d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard        spline.addPoint(1.0f, 0.0f);
98d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard
99d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard        for (int i = 0; i < 4; i++) {
10019161944e0efb1ffe23274d7cf5315ce047e9dacJohn Hoford            mParameters.setSpline(i, new Spline(spline));
101d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard        }
102d7899c56b8df278dfd6720ae11eadc2f89fe8094nicolasroard    }
1031b1a79f1ccb6f847d017a72fa4c288b2195ffd99John Hoford
1041b1a79f1ccb6f847d017a72fa4c288b2195ffd99John Hoford    public void useFilter(ImageFilter a) {
1051b1a79f1ccb6f847d017a72fa4c288b2195ffd99John Hoford        ImageFilterCurves c = (ImageFilterCurves) a;
1061b1a79f1ccb6f847d017a72fa4c288b2195ffd99John Hoford        for (int i = 0; i < 4; i++) {
10719161944e0efb1ffe23274d7cf5315ce047e9dacJohn Hoford            if (c.mParameters.getSpline(i) != null) {
10819161944e0efb1ffe23274d7cf5315ce047e9dacJohn Hoford                setSpline(c.mParameters.getSpline(i), i);
1091b1a79f1ccb6f847d017a72fa4c288b2195ffd99John Hoford            }
1101b1a79f1ccb6f847d017a72fa4c288b2195ffd99John Hoford        }
1111b1a79f1ccb6f847d017a72fa4c288b2195ffd99John Hoford    }
1120d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard}
113