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.util.JsonReader;
20import android.util.JsonWriter;
21
22import com.android.gallery3d.R;
23import com.android.gallery3d.filtershow.controller.BasicParameterInt;
24import com.android.gallery3d.filtershow.controller.Parameter;
25import com.android.gallery3d.filtershow.editors.EditorVignette;
26import com.android.gallery3d.filtershow.imageshow.Oval;
27
28import java.io.IOException;
29
30public class FilterVignetteRepresentation extends FilterRepresentation implements Oval {
31    private static final String LOGTAG = "FilterVignetteRepresentation";
32
33    private float mCenterX = .5f;
34    private float mCenterY = .5f;
35    private float mRadiusX = .5f;
36    private float mRadiusY = .5f;
37    public static final int MODE_VIGNETTE = 0;
38    public static final int MODE_EXPOSURE = 1;
39    public static final int MODE_SATURATION = 2;
40    public static final int MODE_CONTRAST = 3;
41    public static final int MODE_FALLOFF = 4;
42    private static int MIN = -100;
43    private static int MAX = 100;
44    private static int MAXFALLOF = 200;
45
46    private BasicParameterInt mParamVignette = new BasicParameterInt(MODE_VIGNETTE, 50, MIN, MAX);
47    private BasicParameterInt mParamExposure = new BasicParameterInt(MODE_EXPOSURE, 0, MIN, MAX);
48    private BasicParameterInt mParamSaturation = new BasicParameterInt(MODE_SATURATION, 0, MIN, MAX);
49    private BasicParameterInt mParamContrast = new BasicParameterInt(MODE_CONTRAST, 0, MIN, MAX);
50    private BasicParameterInt mParamFalloff = new BasicParameterInt(MODE_FALLOFF, 40, 0, MAXFALLOF);
51    private BasicParameterInt[] mAllParam = {
52            mParamVignette,
53            mParamExposure,
54            mParamSaturation,
55            mParamContrast,
56            mParamFalloff};
57    private int mParameterMode;
58
59    public FilterVignetteRepresentation() {
60        super("Vignette");
61        setSerializationName("VIGNETTE");
62        setShowParameterValue(true);
63        setFilterType(FilterRepresentation.TYPE_VIGNETTE);
64        setTextId(R.string.vignette);
65        setEditorId(EditorVignette.ID);
66        setName("Vignette");
67        setFilterClass(ImageFilterVignette.class);
68    }
69
70    @Override
71    public void useParametersFrom(FilterRepresentation a) {
72        super.useParametersFrom(a);
73        FilterVignetteRepresentation rep = (FilterVignetteRepresentation) a;
74        mCenterX = rep.mCenterX;
75        mCenterY = rep.mCenterY;
76        mRadiusX = rep.mRadiusX;
77        mRadiusY = rep.mRadiusY;
78        mParamVignette.setValue(rep.mParamVignette.getValue());
79        mParamExposure.setValue(rep.mParamExposure.getValue());
80        mParamSaturation.setValue(rep.mParamSaturation.getValue());
81        mParamContrast.setValue(rep.mParamContrast.getValue());
82        mParamFalloff.setValue(rep.mParamFalloff.getValue());
83    }
84
85    public int getValue(int mode) {
86        return mAllParam[mode].getValue();
87    }
88
89    public void setValue(int mode, int value) {
90        mAllParam[mode].setValue(value);
91    }
92
93    @Override
94    public String toString() {
95        return getName() + " : " + mCenterX + ", " + mCenterY + " radius: " + mRadiusX;
96    }
97
98    @Override
99    public FilterRepresentation copy() {
100        FilterVignetteRepresentation representation = new FilterVignetteRepresentation();
101        copyAllParameters(representation);
102        return representation;
103    }
104
105    @Override
106    protected void copyAllParameters(FilterRepresentation representation) {
107        super.copyAllParameters(representation);
108        representation.useParametersFrom(this);
109    }
110
111    @Override
112    public void setCenter(float centerX, float centerY) {
113        mCenterX = centerX;
114        mCenterY = centerY;
115    }
116
117    @Override
118    public float getCenterX() {
119        return mCenterX;
120    }
121
122    @Override
123    public float getCenterY() {
124        return mCenterY;
125    }
126
127    @Override
128    public void setRadius(float radiusX, float radiusY) {
129        mRadiusX = radiusX;
130        mRadiusY = radiusY;
131    }
132
133    @Override
134    public void setRadiusX(float radiusX) {
135        mRadiusX = radiusX;
136    }
137
138    @Override
139    public void setRadiusY(float radiusY) {
140        mRadiusY = radiusY;
141    }
142
143    @Override
144    public float getRadiusX() {
145        return mRadiusX;
146    }
147
148    @Override
149    public float getRadiusY() {
150        return mRadiusY;
151    }
152
153    public boolean isCenterSet() {
154        return mCenterX != Float.NaN;
155    }
156
157    @Override
158    public boolean isNil() {
159        return false;
160    }
161
162    @Override
163    public boolean equals(FilterRepresentation representation) {
164        if (!super.equals(representation)) {
165            return false;
166        }
167        if (representation instanceof FilterVignetteRepresentation) {
168            FilterVignetteRepresentation rep = (FilterVignetteRepresentation) representation;
169            for (int i = 0; i < mAllParam.length; i++) {
170                if (mAllParam[i].getValue() != rep.mAllParam[i].getValue())
171                    return false;
172            }
173            if (rep.getCenterX() == getCenterX()
174                    && rep.getCenterY() == getCenterY()
175                    && rep.getRadiusX() == getRadiusX()
176                    && rep.getRadiusY() == getRadiusY()) {
177                return true;
178            }
179        }
180        return false;
181    }
182
183    private static final String ELLIPSE = "ellipse";
184    private static final String ARGS = "adjust";
185    @Override
186    public void serializeRepresentation(JsonWriter writer) throws IOException {
187        writer.beginObject();
188        writer.name(ELLIPSE);
189        writer.beginArray();
190        writer.value(mCenterX);
191        writer.value(mCenterY);
192        writer.value(mRadiusX);
193        writer.value(mRadiusY);
194        writer.endArray();
195
196        writer.name(ARGS);
197        writer.beginArray();
198        writer.value(mParamVignette.getValue());
199        writer.value(mParamExposure.getValue());
200        writer.value(mParamSaturation.getValue());
201        writer.value(mParamContrast.getValue());
202        writer.value(mParamFalloff.getValue());
203        writer.endArray();
204        writer.endObject();
205    }
206
207
208    @Override
209    public void deSerializeRepresentation(JsonReader sreader) throws IOException {
210        sreader.beginObject();
211
212        while (sreader.hasNext()) {
213            String name = sreader.nextName();
214            if (name.startsWith(ELLIPSE)) {
215                sreader.beginArray();
216                sreader.hasNext();
217                mCenterX = (float) sreader.nextDouble();
218                sreader.hasNext();
219                mCenterY = (float) sreader.nextDouble();
220                sreader.hasNext();
221                mRadiusX = (float) sreader.nextDouble();
222                sreader.hasNext();
223                mRadiusY = (float) sreader.nextDouble();
224                sreader.hasNext();
225                sreader.endArray();
226            } else if (name.startsWith(ARGS)) {
227                sreader.beginArray();
228                sreader.hasNext();
229                mParamVignette.setValue(sreader.nextInt());
230                sreader.hasNext();
231                mParamExposure.setValue(sreader.nextInt());
232                sreader.hasNext();
233                mParamSaturation.setValue(sreader.nextInt());
234                sreader.hasNext();
235                mParamContrast.setValue(sreader.nextInt());
236                sreader.hasNext();
237                mParamFalloff.setValue(sreader.nextInt());
238                sreader.hasNext();
239                sreader.endArray();
240            } else  {
241                sreader.skipValue();
242            }
243        }
244        sreader.endObject();
245    }
246    public int getParameterMode() {
247        return mParameterMode;
248    }
249
250    public void setParameterMode(int parameterMode) {
251        mParameterMode = parameterMode;
252    }
253
254    public int getCurrentParameter() {
255        return getValue(mParameterMode);
256    }
257
258    public void setCurrentParameter(int value) {
259        setValue(mParameterMode, value);
260    }
261
262    public BasicParameterInt getFilterParameter(int index) {
263        return mAllParam[index];
264    }
265
266}
267