blob: 89641d103556a6bc63cf91aa1cdfe66abf8e4ba7 [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";
private final Spline[] mSplines = new Spline[4];
public ImageFilterCurves() {
mName = "Curves";
reset();
}
@Override
public ImageFilter clone() throws CloneNotSupportedException {
ImageFilterCurves filter = (ImageFilterCurves) super.clone();
for (int i = 0; i < 4; i++) {
if (mSplines[i] != null) {
filter.setSpline(mSplines[i], i);
}
}
return filter;
}
@Override
public boolean isNil() {
for (int i = 0; i < 4; i++) {
if (mSplines[i] != null && !mSplines[i].isOriginal()) {
return false;
}
}
return true;
}
@Override
public boolean same(ImageFilter filter) {
boolean isCurveFilter = super.same(filter);
if (!isCurveFilter) {
return false;
}
ImageFilterCurves curve = (ImageFilterCurves) filter;
for (int i = 0; i < 4; i++) {
if (mSplines[i] != curve.mSplines[i]) {
return false;
}
}
return true;
}
public void populateArray(int[] array, int curveIndex) {
Spline spline = mSplines[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, boolean highQuality) {
if (!mSplines[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 (!mSplines[Spline.RED].isOriginal()) {
redGradient = new int[256];
populateArray(redGradient, Spline.RED);
}
int[] greenGradient = null;
if (!mSplines[Spline.GREEN].isOriginal()) {
greenGradient = new int[256];
populateArray(greenGradient, Spline.GREEN);
}
int[] blueGradient = null;
if (!mSplines[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) {
mSplines[splineIndex] = new Spline(spline);
}
public Spline getSpline(int splineIndex) {
return mSplines[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++) {
mSplines[i] = new Spline(spline);
}
}
}