blob: daa1cd3474027fb0d2d41e692e06e497c81d8290 [file] [log] [blame]
/*
* 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);
}
}
}
}