| /* |
| * Copyright (C) 2012 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.gallery3d.filtershow.filters; |
| |
| import android.graphics.Bitmap; |
| |
| import com.android.gallery3d.filtershow.ui.Spline; |
| |
| public class ImageFilterCurves extends ImageFilter { |
| |
| private static final String LOGTAG = "ImageFilterCurves"; |
| FilterCurvesRepresentation mParameters = new FilterCurvesRepresentation(); |
| |
| @Override |
| public FilterRepresentation getDefaultRepresentation() { |
| return new FilterCurvesRepresentation(); |
| } |
| |
| @Override |
| public void useRepresentation(FilterRepresentation representation) { |
| FilterCurvesRepresentation parameters = (FilterCurvesRepresentation) representation; |
| mParameters = parameters; |
| } |
| |
| public ImageFilterCurves() { |
| mName = "Curves"; |
| reset(); |
| } |
| |
| public void populateArray(int[] array, int curveIndex) { |
| Spline spline = mParameters.getSpline(curveIndex); |
| if (spline == null) { |
| return; |
| } |
| float[] curve = spline.getAppliedCurve(); |
| for (int i = 0; i < 256; i++) { |
| array[i] = (int) (curve[i] * 255); |
| } |
| } |
| |
| @Override |
| public Bitmap apply(Bitmap bitmap, float scaleFactor, int quality) { |
| if (!mParameters.getSpline(Spline.RGB).isOriginal()) { |
| int[] rgbGradient = new int[256]; |
| populateArray(rgbGradient, Spline.RGB); |
| nativeApplyGradientFilter(bitmap, bitmap.getWidth(), bitmap.getHeight(), |
| rgbGradient, rgbGradient, rgbGradient); |
| } |
| |
| int[] redGradient = null; |
| if (!mParameters.getSpline(Spline.RED).isOriginal()) { |
| redGradient = new int[256]; |
| populateArray(redGradient, Spline.RED); |
| } |
| int[] greenGradient = null; |
| if (!mParameters.getSpline(Spline.GREEN).isOriginal()) { |
| greenGradient = new int[256]; |
| populateArray(greenGradient, Spline.GREEN); |
| } |
| int[] blueGradient = null; |
| if (!mParameters.getSpline(Spline.BLUE).isOriginal()) { |
| blueGradient = new int[256]; |
| populateArray(blueGradient, Spline.BLUE); |
| } |
| |
| nativeApplyGradientFilter(bitmap, bitmap.getWidth(), bitmap.getHeight(), |
| redGradient, greenGradient, blueGradient); |
| return bitmap; |
| } |
| |
| public void setSpline(Spline spline, int splineIndex) { |
| mParameters.setSpline(splineIndex, new Spline(spline)); |
| } |
| |
| public Spline getSpline(int splineIndex) { |
| return mParameters.getSpline(splineIndex); |
| } |
| |
| public void reset() { |
| Spline spline = new Spline(); |
| |
| spline.addPoint(0.0f, 1.0f); |
| spline.addPoint(1.0f, 0.0f); |
| |
| for (int i = 0; i < 4; i++) { |
| mParameters.setSpline(i, new Spline(spline)); |
| } |
| } |
| |
| public void useFilter(ImageFilter a) { |
| ImageFilterCurves c = (ImageFilterCurves) a; |
| for (int i = 0; i < 4; i++) { |
| if (c.mParameters.getSpline(i) != null) { |
| setSpline(c.mParameters.getSpline(i), i); |
| } |
| } |
| } |
| } |