ImageFilterCurves.java revision 116fc29a3f893813b95d7f55799d2947e09e512a
1/* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.gallery3d.filtershow.filters; 18 19import android.graphics.Bitmap; 20 21import com.android.gallery3d.R; 22import com.android.gallery3d.filtershow.ui.Spline; 23 24public class ImageFilterCurves extends ImageFilter { 25 26 private static final String LOGTAG = "ImageFilterCurves"; 27 private final Spline[] mSplines = new Spline[4]; 28 29 public ImageFilterCurves() { 30 mName = "Curves"; 31 reset(); 32 } 33 34 @Override 35 public int getButtonId() { 36 return R.id.curvesButtonRGB; 37 } 38 39 @Override 40 public int getTextId() { 41 return R.string.curvesRGB; 42 } 43 44 @Override 45 public int getOverlayBitmaps() { 46 return R.drawable.filtershow_button_colors_curve; 47 } 48 49 @Override 50 public ImageFilter clone() throws CloneNotSupportedException { 51 ImageFilterCurves filter = (ImageFilterCurves) super.clone(); 52 for (int i = 0; i < 4; i++) { 53 if (mSplines[i] != null) { 54 filter.setSpline(mSplines[i], i); 55 } 56 } 57 return filter; 58 } 59 60 @Override 61 public boolean isNil() { 62 for (int i = 0; i < 4; i++) { 63 if (mSplines[i] != null && !mSplines[i].isOriginal()) { 64 return false; 65 } 66 } 67 return true; 68 } 69 70 @Override 71 public boolean same(ImageFilter filter) { 72 boolean isCurveFilter = super.same(filter); 73 if (!isCurveFilter) { 74 return false; 75 } 76 ImageFilterCurves curve = (ImageFilterCurves) filter; 77 for (int i = 0; i < 4; i++) { 78 if (mSplines[i] != curve.mSplines[i]) { 79 return false; 80 } 81 } 82 return true; 83 } 84 85 public void populateArray(int[] array, int curveIndex) { 86 Spline spline = mSplines[curveIndex]; 87 if (spline == null) { 88 return; 89 } 90 float[] curve = spline.getAppliedCurve(); 91 for (int i = 0; i < 256; i++) { 92 array[i] = (int) (curve[i] * 255); 93 } 94 } 95 96 @Override 97 public Bitmap apply(Bitmap bitmap, float scaleFactor, boolean highQuality) { 98 if (!mSplines[Spline.RGB].isOriginal()) { 99 int[] rgbGradient = new int[256]; 100 populateArray(rgbGradient, Spline.RGB); 101 nativeApplyGradientFilter(bitmap, bitmap.getWidth(), bitmap.getHeight(), 102 rgbGradient, rgbGradient, rgbGradient); 103 } 104 105 int[] redGradient = null; 106 if (!mSplines[Spline.RED].isOriginal()) { 107 redGradient = new int[256]; 108 populateArray(redGradient, Spline.RED); 109 } 110 int[] greenGradient = null; 111 if (!mSplines[Spline.GREEN].isOriginal()) { 112 greenGradient = new int[256]; 113 populateArray(greenGradient, Spline.GREEN); 114 } 115 int[] blueGradient = null; 116 if (!mSplines[Spline.BLUE].isOriginal()) { 117 blueGradient = new int[256]; 118 populateArray(blueGradient, Spline.BLUE); 119 } 120 121 nativeApplyGradientFilter(bitmap, bitmap.getWidth(), bitmap.getHeight(), 122 redGradient, greenGradient, blueGradient); 123 return bitmap; 124 } 125 126 public void setSpline(Spline spline, int splineIndex) { 127 mSplines[splineIndex] = new Spline(spline); 128 } 129 130 public Spline getSpline(int splineIndex) { 131 return mSplines[splineIndex]; 132 } 133 134 public void reset() { 135 Spline spline = new Spline(); 136 137 spline.addPoint(0.0f, 1.0f); 138 spline.addPoint(1.0f, 0.0f); 139 140 for (int i = 0; i < 4; i++) { 141 mSplines[i] = new Spline(spline); 142 } 143 } 144} 145