2 * Copyright (C) 2013 The Android Open Source Project
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
16 package com.android.gallery3d.filtershow.filters;
18 import android.content.Context;
19 import android.content.res.Resources;
20 import android.util.Log;
22 import com.android.gallery3d.R;
23 import com.android.gallery3d.filtershow.imageshow.GeometryMetadata;
24 import com.android.gallery3d.filtershow.pipeline.ImagePreset;
26 import java.util.ArrayList;
27 import java.util.HashMap;
28 import java.util.Vector;
30 public abstract class BaseFiltersManager implements FiltersManagerInterface {
31 protected HashMap<Class, ImageFilter> mFilters = null;
32 protected HashMap<String, FilterRepresentation> mRepresentationLookup = null;
33 private static final String LOGTAG = "BaseFiltersManager";
35 protected ArrayList<FilterRepresentation> mLooks = new ArrayList<FilterRepresentation>();
36 protected ArrayList<FilterRepresentation> mBorders = new ArrayList<FilterRepresentation>();
37 protected ArrayList<FilterRepresentation> mTools = new ArrayList<FilterRepresentation>();
38 protected ArrayList<FilterRepresentation> mEffects = new ArrayList<FilterRepresentation>();
40 protected void init() {
41 mFilters = new HashMap<Class, ImageFilter>();
42 mRepresentationLookup = new HashMap<String, FilterRepresentation>();
43 Vector<Class> filters = new Vector<Class>();
44 addFilterClasses(filters);
45 for (Class filterClass : filters) {
47 Object filterInstance = filterClass.newInstance();
48 if (filterInstance instanceof ImageFilter) {
49 mFilters.put(filterClass, (ImageFilter) filterInstance);
51 FilterRepresentation rep =
52 ((ImageFilter) filterInstance).getDefaultRepresentation();
54 addRepresentation(rep);
57 } catch (InstantiationException e) {
59 } catch (IllegalAccessException e) {
65 public void addRepresentation(FilterRepresentation rep) {
66 mRepresentationLookup.put(rep.getSerializationName(), rep);
69 public FilterRepresentation createFilterFromName(String name) {
71 return mRepresentationLookup.get(name).clone();
72 } catch (Exception e) {
73 Log.v(LOGTAG, "unable to generate a filter representation for \"" + name + "\"");
79 public ImageFilter getFilter(Class c) {
80 return mFilters.get(c);
84 public ImageFilter getFilterForRepresentation(FilterRepresentation representation) {
85 return mFilters.get(representation.getFilterClass());
88 public FilterRepresentation getRepresentation(Class c) {
89 ImageFilter filter = mFilters.get(c);
91 return filter.getDefaultRepresentation();
96 public void freeFilterResources(ImagePreset preset) {
100 Vector<ImageFilter> usedFilters = preset.getUsedFilters(this);
101 for (Class c : mFilters.keySet()) {
102 ImageFilter filter = mFilters.get(c);
103 if (!usedFilters.contains(filter)) {
104 filter.freeResources();
109 public void freeRSFilterScripts() {
110 for (Class c : mFilters.keySet()) {
111 ImageFilter filter = mFilters.get(c);
112 if (filter != null && filter instanceof ImageFilterRS) {
113 ((ImageFilterRS) filter).resetScripts();
118 protected void addFilterClasses(Vector<Class> filters) {
119 filters.add(ImageFilterTinyPlanet.class);
120 filters.add(ImageFilterRedEye.class);
121 filters.add(ImageFilterWBalance.class);
122 filters.add(ImageFilterExposure.class);
123 filters.add(ImageFilterVignette.class);
124 filters.add(ImageFilterContrast.class);
125 filters.add(ImageFilterShadows.class);
126 filters.add(ImageFilterHighlights.class);
127 filters.add(ImageFilterVibrance.class);
128 filters.add(ImageFilterSharpen.class);
129 filters.add(ImageFilterCurves.class);
130 filters.add(ImageFilterDraw.class);
131 filters.add(ImageFilterHue.class);
132 filters.add(ImageFilterSaturated.class);
133 filters.add(ImageFilterBwFilter.class);
134 filters.add(ImageFilterNegative.class);
135 filters.add(ImageFilterEdge.class);
136 filters.add(ImageFilterKMeans.class);
137 filters.add(ImageFilterFx.class);
138 filters.add(ImageFilterBorder.class);
139 filters.add(ImageFilterParametricBorder.class);
140 filters.add(ImageFilterGeometry.class);
143 public ArrayList<FilterRepresentation> getLooks() {
147 public ArrayList<FilterRepresentation> getBorders() {
151 public ArrayList<FilterRepresentation> getTools() {
155 public ArrayList<FilterRepresentation> getEffects() {
159 public void addBorders(Context context) {
163 public void addLooks(Context context) {
165 R.drawable.filtershow_fx_0005_punch,
166 R.drawable.filtershow_fx_0000_vintage,
167 R.drawable.filtershow_fx_0004_bw_contrast,
168 R.drawable.filtershow_fx_0002_bleach,
169 R.drawable.filtershow_fx_0001_instant,
170 R.drawable.filtershow_fx_0007_washout,
171 R.drawable.filtershow_fx_0003_blue_crush,
172 R.drawable.filtershow_fx_0008_washout_color,
173 R.drawable.filtershow_fx_0006_x_process
178 R.string.ffx_vintage,
179 R.string.ffx_bw_contrast,
181 R.string.ffx_instant,
182 R.string.ffx_washout,
183 R.string.ffx_blue_crush,
184 R.string.ffx_washout_color,
185 R.string.ffx_x_process
189 String[] serializationNames = {
201 FilterFxRepresentation nullFx =
202 new FilterFxRepresentation(context.getString(R.string.none),
206 for (int i = 0; i < drawid.length; i++) {
207 FilterFxRepresentation fx = new FilterFxRepresentation(
208 context.getString(fxNameid[i]), drawid[i], fxNameid[i]);
209 fx.setSerializationName(serializationNames[i]);
211 addRepresentation(fx);
215 public void addEffects() {
216 mEffects.add(getRepresentation(ImageFilterTinyPlanet.class));
217 mEffects.add(getRepresentation(ImageFilterWBalance.class));
218 mEffects.add(getRepresentation(ImageFilterExposure.class));
219 mEffects.add(getRepresentation(ImageFilterVignette.class));
220 mEffects.add(getRepresentation(ImageFilterContrast.class));
221 mEffects.add(getRepresentation(ImageFilterShadows.class));
222 mEffects.add(getRepresentation(ImageFilterHighlights.class));
223 mEffects.add(getRepresentation(ImageFilterVibrance.class));
224 mEffects.add(getRepresentation(ImageFilterSharpen.class));
225 mEffects.add(getRepresentation(ImageFilterCurves.class));
226 mEffects.add(getRepresentation(ImageFilterHue.class));
227 mEffects.add(getRepresentation(ImageFilterSaturated.class));
228 mEffects.add(getRepresentation(ImageFilterBwFilter.class));
229 mEffects.add(getRepresentation(ImageFilterNegative.class));
230 mEffects.add(getRepresentation(ImageFilterEdge.class));
231 mEffects.add(getRepresentation(ImageFilterKMeans.class));
234 public void addTools(Context context) {
235 GeometryMetadata geo = new GeometryMetadata();
236 int[] editorsId = geo.getEditorIds();
246 R.drawable.filtershow_button_geometry_crop,
247 R.drawable.filtershow_button_geometry_straighten,
248 R.drawable.filtershow_button_geometry_rotate,
249 R.drawable.filtershow_button_geometry_flip
252 for (int i = 0; i < editorsId.length; i++) {
253 int editorId = editorsId[i];
254 GeometryMetadata geometry = new GeometryMetadata(geo);
255 geometry.setEditorId(editorId);
256 geometry.setTextId(textId[i]);
257 geometry.setOverlayId(overlayId[i]);
258 geometry.setOverlayOnly(true);
259 if (geometry.getTextId() != 0) {
260 geometry.setName(context.getString(geometry.getTextId()));
262 mTools.add(geometry);
265 mTools.add(getRepresentation(ImageFilterRedEye.class));
266 mTools.add(getRepresentation(ImageFilterDraw.class));
269 public void setFilterResources(Resources resources) {
270 ImageFilterBorder filterBorder = (ImageFilterBorder) getFilter(ImageFilterBorder.class);
271 filterBorder.setResources(resources);
272 ImageFilterFx filterFx = (ImageFilterFx) getFilter(ImageFilterFx.class);
273 filterFx.setResources(resources);