ImageFilterCurves.java revision 1b1a79f1ccb6f847d017a72fa4c288b2195ffd99
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; 20import android.util.Log; 21 22import com.android.gallery3d.R; 23import com.android.gallery3d.filtershow.ui.Spline; 24 25public class ImageFilterCurves extends ImageFilter { 26 27 private static final String LOGTAG = "ImageFilterCurves"; 28 private Spline[] mSplines = new Spline[4]; 29 30 public ImageFilterCurves() { 31 mName = "Curves"; 32 reset(); 33 } 34 35 @Override 36 public int getButtonId() { 37 return R.id.curvesButtonRGB; 38 } 39 40 @Override 41 public int getTextId() { 42 return R.string.curvesRGB; 43 } 44 45 @Override 46 public int getOverlayBitmaps() { 47 return R.drawable.filtershow_button_colors_curve; 48 } 49 50 @Override 51 public int getEditingViewId() { 52 return R.id.imageCurves; 53 } 54 55 @Override 56 public boolean showParameterValue() { 57 return false; 58 } 59 60 @Override 61 public boolean equals(ImageFilter filter) { 62 return same(filter); 63 } 64 65 @Override 66 public ImageFilter clone() throws CloneNotSupportedException { 67 ImageFilterCurves filter = (ImageFilterCurves) super.clone(); 68 filter.mSplines = new Spline[4]; 69 for (int i = 0; i < 4; i++) { 70 if (mSplines[i] != null) { 71 filter.setSpline(mSplines[i], i); 72 } 73 } 74 return filter; 75 } 76 77 @Override 78 public boolean isNil() { 79 for (int i = 0; i < 4; i++) { 80 if (mSplines[i] != null && !mSplines[i].isOriginal()) { 81 return false; 82 } 83 } 84 return true; 85 } 86 87 @Override 88 public boolean same(ImageFilter filter) { 89 boolean isCurveFilter = super.same(filter); 90 if (!isCurveFilter) { 91 return false; 92 } 93 ImageFilterCurves curve = (ImageFilterCurves) filter; 94 for (int i = 0; i < 4; i++) { 95 if (mSplines[i] != curve.mSplines[i]) { 96 return false; 97 } 98 } 99 return true; 100 } 101 102 public void populateArray(int[] array, int curveIndex) { 103 Spline spline = mSplines[curveIndex]; 104 if (spline == null) { 105 return; 106 } 107 float[] curve = spline.getAppliedCurve(); 108 for (int i = 0; i < 256; i++) { 109 array[i] = (int) (curve[i] * 255); 110 } 111 } 112 113 @Override 114 public Bitmap apply(Bitmap bitmap, float scaleFactor, boolean highQuality) { 115 if (!mSplines[Spline.RGB].isOriginal()) { 116 int[] rgbGradient = new int[256]; 117 populateArray(rgbGradient, Spline.RGB); 118 nativeApplyGradientFilter(bitmap, bitmap.getWidth(), bitmap.getHeight(), 119 rgbGradient, rgbGradient, rgbGradient); 120 } 121 122 int[] redGradient = null; 123 if (!mSplines[Spline.RED].isOriginal()) { 124 redGradient = new int[256]; 125 populateArray(redGradient, Spline.RED); 126 } 127 int[] greenGradient = null; 128 if (!mSplines[Spline.GREEN].isOriginal()) { 129 greenGradient = new int[256]; 130 populateArray(greenGradient, Spline.GREEN); 131 } 132 int[] blueGradient = null; 133 if (!mSplines[Spline.BLUE].isOriginal()) { 134 blueGradient = new int[256]; 135 populateArray(blueGradient, Spline.BLUE); 136 } 137 138 nativeApplyGradientFilter(bitmap, bitmap.getWidth(), bitmap.getHeight(), 139 redGradient, greenGradient, blueGradient); 140 return bitmap; 141 } 142 143 public void setSpline(Spline spline, int splineIndex) { 144 mSplines[splineIndex] = new Spline(spline); 145 } 146 147 public Spline getSpline(int splineIndex) { 148 return mSplines[splineIndex]; 149 } 150 151 @Override 152 public void reset() { 153 Spline spline = new Spline(); 154 155 spline.addPoint(0.0f, 1.0f); 156 spline.addPoint(1.0f, 0.0f); 157 158 for (int i = 0; i < 4; i++) { 159 mSplines[i] = new Spline(spline); 160 } 161 } 162 163 @Override 164 public void useFilter(ImageFilter a) { 165 ImageFilterCurves c = (ImageFilterCurves) a; 166 for (int i = 0; i < 4; i++) { 167 if (c.mSplines[i] != null) { 168 setSpline(c.mSplines[i], i); 169 } 170 } 171 } 172} 173