summaryrefslogtreecommitdiffstats
path: root/src/com/android/gallery3d/filtershow/filters
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/gallery3d/filtershow/filters')
-rw-r--r--src/com/android/gallery3d/filtershow/filters/BaseFiltersManager.java100
-rw-r--r--src/com/android/gallery3d/filtershow/filters/FilterImageBorderRepresentation.java2
-rw-r--r--src/com/android/gallery3d/filtershow/filters/ImageFilter.java2
-rw-r--r--src/com/android/gallery3d/filtershow/filters/ImageFilterRS.java32
-rw-r--r--src/com/android/gallery3d/filtershow/filters/ImageFilterSharpen.java4
5 files changed, 98 insertions, 42 deletions
diff --git a/src/com/android/gallery3d/filtershow/filters/BaseFiltersManager.java b/src/com/android/gallery3d/filtershow/filters/BaseFiltersManager.java
index 1fe2ac666..215d5d438 100644
--- a/src/com/android/gallery3d/filtershow/filters/BaseFiltersManager.java
+++ b/src/com/android/gallery3d/filtershow/filters/BaseFiltersManager.java
@@ -15,37 +15,30 @@
*/
package com.android.gallery3d.filtershow.filters;
+import com.android.gallery3d.filtershow.presets.ImagePreset;
+
import java.util.HashMap;
-import java.util.Map;
import java.util.Vector;
public abstract class BaseFiltersManager {
protected HashMap<Class, ImageFilter> mFilters = null;
- protected void addFilters(Map<Class, ImageFilter> filters) {
- filters.put(ImageFilterTinyPlanet.class, new ImageFilterTinyPlanet());
- filters.put(ImageFilterRedEye.class, new ImageFilterRedEye());
- filters.put(ImageFilterWBalance.class, new ImageFilterWBalance());
- filters.put(ImageFilterExposure.class, new ImageFilterExposure());
- filters.put(ImageFilterVignette.class, new ImageFilterVignette());
- filters.put(ImageFilterContrast.class, new ImageFilterContrast());
- filters.put(ImageFilterShadows.class, new ImageFilterShadows());
- filters.put(ImageFilterHighlights.class, new ImageFilterHighlights());
- filters.put(ImageFilterVibrance.class, new ImageFilterVibrance());
- filters.put(ImageFilterSharpen.class, new ImageFilterSharpen());
- filters.put(ImageFilterCurves.class, new ImageFilterCurves());
- filters.put(ImageFilterDraw.class, new ImageFilterDraw());
- filters.put(ImageFilterHue.class, new ImageFilterHue());
- filters.put(ImageFilterSaturated.class, new ImageFilterSaturated());
- filters.put(ImageFilterBwFilter.class, new ImageFilterBwFilter());
- filters.put(ImageFilterNegative.class, new ImageFilterNegative());
- filters.put(ImageFilterEdge.class, new ImageFilterEdge());
- filters.put(ImageFilterKMeans.class, new ImageFilterKMeans());
- filters.put(ImageFilterFx.class, new ImageFilterFx());
- filters.put(ImageFilterBorder.class, new ImageFilterBorder());
- filters.put(ImageFilterParametricBorder.class, new ImageFilterParametricBorder());
- filters.put(ImageFilterGeometry.class, new ImageFilterGeometry());
-
+ protected void init() {
+ mFilters = new HashMap<Class, ImageFilter>();
+ Vector<Class> filters = new Vector<Class>();
+ addFilterClasses(filters);
+ for (Class filterClass : filters) {
+ try {
+ Object filterInstance = filterClass.newInstance();
+ if (filterInstance instanceof ImageFilter) {
+ mFilters.put(filterClass, (ImageFilter) filterInstance);
+ }
+ } catch (InstantiationException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ }
}
public ImageFilter getFilter(Class c) {
@@ -68,6 +61,54 @@ public abstract class BaseFiltersManager {
return null;
}
+ public void resetBitmapsRS() {
+ for (Class c : mFilters.keySet()) {
+ ImageFilter filter = mFilters.get(c);
+ if (filter instanceof ImageFilterRS) {
+ ImageFilterRS filterRS = (ImageFilterRS) filter;
+ filterRS.resetBitmap();
+ }
+ }
+ }
+
+ public void freeFilterResources(ImagePreset preset) {
+ if (preset == null) {
+ return;
+ }
+ Vector<ImageFilter> usedFilters = preset.getUsedFilters();
+ for (Class c : mFilters.keySet()) {
+ ImageFilter filter = mFilters.get(c);
+ if (!usedFilters.contains(filter)) {
+ filter.freeResources();
+ }
+ }
+ }
+
+ protected void addFilterClasses(Vector<Class> filters) {
+ filters.add(ImageFilterTinyPlanet.class);
+ filters.add(ImageFilterRedEye.class);
+ filters.add(ImageFilterWBalance.class);
+ filters.add(ImageFilterExposure.class);
+ filters.add(ImageFilterVignette.class);
+ filters.add(ImageFilterContrast.class);
+ filters.add(ImageFilterShadows.class);
+ filters.add(ImageFilterHighlights.class);
+ filters.add(ImageFilterVibrance.class);
+ filters.add(ImageFilterSharpen.class);
+ filters.add(ImageFilterCurves.class);
+ filters.add(ImageFilterDraw.class);
+ filters.add(ImageFilterHue.class);
+ filters.add(ImageFilterSaturated.class);
+ filters.add(ImageFilterBwFilter.class);
+ filters.add(ImageFilterNegative.class);
+ filters.add(ImageFilterEdge.class);
+ filters.add(ImageFilterKMeans.class);
+ filters.add(ImageFilterFx.class);
+ filters.add(ImageFilterBorder.class);
+ filters.add(ImageFilterParametricBorder.class);
+ filters.add(ImageFilterGeometry.class);
+ }
+
public void addLooks(Vector<FilterRepresentation> representations) {
// Override
}
@@ -96,13 +137,4 @@ public abstract class BaseFiltersManager {
representations.add(getRepresentation(ImageFilterDraw.class));
}
- public void resetBitmapsRS() {
- for (Class c : mFilters.keySet()) {
- ImageFilter filter = mFilters.get(c);
- if (filter instanceof ImageFilterRS) {
- ImageFilterRS filterRS = (ImageFilterRS) filter;
- filterRS.resetBitmap();
- }
- }
- }
}
diff --git a/src/com/android/gallery3d/filtershow/filters/FilterImageBorderRepresentation.java b/src/com/android/gallery3d/filtershow/filters/FilterImageBorderRepresentation.java
index 99c809148..086736578 100644
--- a/src/com/android/gallery3d/filtershow/filters/FilterImageBorderRepresentation.java
+++ b/src/com/android/gallery3d/filtershow/filters/FilterImageBorderRepresentation.java
@@ -36,6 +36,8 @@ public class FilterImageBorderRepresentation extends FilterRepresentation {
// (see FilterShowActivity's LoadBordersTask)
ImageFilterBorder filter = (ImageFilterBorder) FiltersManager.getManager().getFilter(getFilterClass());
filter.getDrawable(getDrawableResource());
+ filter = (ImageFilterBorder) FiltersManager.getPreviewManager().getFilter(getFilterClass());
+ filter.getDrawable(getDrawableResource());
}
public String toString() {
diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilter.java b/src/com/android/gallery3d/filtershow/filters/ImageFilter.java
index b4eac0f84..bd9dcafcf 100644
--- a/src/com/android/gallery3d/filtershow/filters/ImageFilter.java
+++ b/src/com/android/gallery3d/filtershow/filters/ImageFilter.java
@@ -44,6 +44,8 @@ public abstract class ImageFilter implements Cloneable {
sActivity = null;
}
+ public void freeResources() {}
+
public void displayLowMemoryToast() {
if (sActivity != null) {
sActivity.runOnUiThread(new Runnable() {
diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilterRS.java b/src/com/android/gallery3d/filtershow/filters/ImageFilterRS.java
index 4373c950a..a06c2e022 100644
--- a/src/com/android/gallery3d/filtershow/filters/ImageFilterRS.java
+++ b/src/com/android/gallery3d/filtershow/filters/ImageFilterRS.java
@@ -32,6 +32,8 @@ public abstract class ImageFilterRS extends ImageFilter {
private static Bitmap sOldBitmap = null;
private Bitmap mOldBitmap = null;
+ private boolean mResourcesLoaded = false;
+
private final Bitmap.Config mBitmapConfig = Bitmap.Config.ARGB_8888;
public void resetBitmap() {
@@ -58,20 +60,18 @@ public abstract class ImageFilterRS extends ImageFilter {
sOldBitmap = bitmap;
}
mInPixelsAllocation.copyFrom(bitmap);
- if (mOldBitmap != sOldBitmap) {
+ if (mOldBitmap != sOldBitmap || !isResourcesLoaded()) {
+ freeResources();
createFilter(mResources, scaleFactor, quality);
mOldBitmap = sOldBitmap;
+ setResourcesLoaded(true);
}
}
- public void createFilter(android.content.res.Resources res,
- float scaleFactor, int quality) {
- // Stub
- }
+ abstract public void createFilter(android.content.res.Resources res,
+ float scaleFactor, int quality);
- public void runFilter() {
- // Stub
- }
+ abstract public void runFilter();
public void update(Bitmap bitmap) {
mOutPixelsAllocation.copyTo(bitmap);
@@ -135,7 +135,23 @@ public abstract class ImageFilterRS extends ImageFilter {
greyConvert.forEach_RGBAtoA(bitmapTemp, bitmapAlloc);
return bitmapAlloc;
+ }
+ public boolean isResourcesLoaded() {
+ return mResourcesLoaded;
}
+ public void setResourcesLoaded(boolean resourcesLoaded) {
+ mResourcesLoaded = resourcesLoaded;
+ }
+
+ abstract protected void resetAllocations();
+
+ public void freeResources() {
+ if (!isResourcesLoaded()) {
+ return;
+ }
+ resetAllocations();
+ setResourcesLoaded(false);
+ }
}
diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilterSharpen.java b/src/com/android/gallery3d/filtershow/filters/ImageFilterSharpen.java
index 8afa47451..9f4c7e54a 100644
--- a/src/com/android/gallery3d/filtershow/filters/ImageFilterSharpen.java
+++ b/src/com/android/gallery3d/filtershow/filters/ImageFilterSharpen.java
@@ -47,6 +47,10 @@ public class ImageFilterSharpen extends ImageFilterRS {
mParameters = parameters;
}
+ protected void resetAllocations() {
+ // nothing to do
+ }
+
@Override
public void createFilter(android.content.res.Resources res, float scaleFactor,
int quality) {