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