summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornicolasroard <nicolasroard@google.com>2013-03-07 15:16:59 -0800
committernicolasroard <nicolasroard@google.com>2013-03-08 17:18:32 -0800
commit7706e506dc74fa634a69b9ce8c7e5e2c457f01fc (patch)
tree397a00637373d330e696ad6ab90de34ed1b0133a
parent0f1d09c93b961369a0e6aef7b6ec708052099e21 (diff)
downloadandroid_packages_apps_Gallery2-7706e506dc74fa634a69b9ce8c7e5e2c457f01fc.tar.gz
android_packages_apps_Gallery2-7706e506dc74fa634a69b9ce8c7e5e2c457f01fc.tar.bz2
android_packages_apps_Gallery2-7706e506dc74fa634a69b9ce8c7e5e2c457f01fc.zip
Memory usage improvements, speed improvement
- free filters resources agressively - implements multiple rendering pipelines - some cleanup Change-Id: Ib9ed268b0b2662d0bf5c049adcf046b556954c37
-rw-r--r--src/com/android/gallery3d/filtershow/cache/BitmapCache.java128
-rw-r--r--src/com/android/gallery3d/filtershow/cache/Cache.java34
-rw-r--r--src/com/android/gallery3d/filtershow/cache/FilteringPipeline.java15
-rw-r--r--src/com/android/gallery3d/filtershow/cache/ImageLoader.java2
-rw-r--r--src/com/android/gallery3d/filtershow/cache/RenderingRequest.java1
-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
-rw-r--r--src/com/android/gallery3d/filtershow/imageshow/MasterImage.java5
-rw-r--r--src/com/android/gallery3d/filtershow/presets/FilterEnvironment.java68
-rw-r--r--src/com/android/gallery3d/filtershow/presets/ImagePreset.java43
-rw-r--r--src/com/android/gallery3d/filtershow/tools/SaveCopyTask.java1
-rw-r--r--src_pd/com/android/gallery3d/filtershow/filters/FiltersManager.java13
15 files changed, 225 insertions, 225 deletions
diff --git a/src/com/android/gallery3d/filtershow/cache/BitmapCache.java b/src/com/android/gallery3d/filtershow/cache/BitmapCache.java
deleted file mode 100644
index ba623c39a..000000000
--- a/src/com/android/gallery3d/filtershow/cache/BitmapCache.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.gallery3d.filtershow.cache;
-
-import android.graphics.Bitmap;
-
-import com.android.gallery3d.filtershow.presets.ImagePreset;
-
-import java.nio.ByteBuffer;
-
-public class BitmapCache {
-
- private static final String LOGTAG = "BitmapCache";
- static int mNbItems = 20;
- private final Bitmap[] mBitmaps = new Bitmap[mNbItems];
- private final Object[] mKeys = new Object[mNbItems];
- private final long[] mIndices = new long[mNbItems];
- private final boolean[] mBusyStatus = new boolean[mNbItems];
-
- private Bitmap mOriginalBitmap = null;
- private ByteBuffer mBuffer = null;
- private final Bitmap.Config mConfig = Bitmap.Config.ARGB_8888;
- private long mIndex = 0;
-
- public void setOriginalBitmap(Bitmap original) {
- if (original == null) {
- return;
- }
- mOriginalBitmap = original.copy(mConfig, true);
- int size = 4 * original.getWidth() * original.getHeight();
- mBuffer = ByteBuffer.allocate(size);
- mOriginalBitmap.copyPixelsToBuffer(mBuffer);
- mBuffer.rewind();
- mOriginalBitmap.copyPixelsFromBuffer(mBuffer);
- for (int i = 0; i < mNbItems; i++) {
- mBitmaps[i] = mOriginalBitmap.copy(mConfig, true);
- }
- }
-
- private int getOldestPosition() {
- long minIndex = mIndices[0];
- int current = 0;
- for (int i = 1; i < mNbItems; i++) {
- if (!mBusyStatus[i] && minIndex > mIndices[i]) {
- minIndex = mIndices[i];
- current = i;
- }
- }
- return current;
- }
-
- public Bitmap put(ImagePreset preset) {
- int pos = getOldestPosition();
- return put(preset, pos);
- }
-
- public Bitmap put(ImagePreset preset, int pos) {
- mBitmaps[pos] = mOriginalBitmap.copy(mConfig, true);
- Bitmap bitmap = mBitmaps[pos];
- bitmap = preset.apply(bitmap);
- mKeys[pos] = preset;
- mIndices[pos] = mIndex++;
- return bitmap;
- }
-
- public int reservePosition(ImagePreset preset) {
- for (int i = 1; i < mNbItems; i++) {
- if (mKeys[i] == preset && mBusyStatus[i]) {
- return -1;
- }
- }
- int pos = getOldestPosition();
- mBusyStatus[pos] = true;
- mKeys[pos] = preset;
- return pos;
- }
-
- public void processPosition(int pos) {
- ImagePreset preset = (ImagePreset) mKeys[pos];
- mBitmaps[pos] = mOriginalBitmap.copy(mConfig, true);
- Bitmap bitmap = mBitmaps[pos];
- bitmap = preset.apply(bitmap);
- mIndices[pos] = mIndex++;
- }
-
- public void unlockPosition(int pos) {
- mBusyStatus[pos] = false;
- }
-
- public Bitmap get(ImagePreset preset) {
- int foundPosition = -1;
- int currentIndice = 0;
- for (int i = 0; i < mNbItems; i++) {
- if (mKeys[i] == preset && mBitmaps[i] != null) {
- if (mIndices[i] > currentIndice) {
- foundPosition = i;
- }
- }
- }
- if (foundPosition != -1) {
- mIndices[foundPosition] = mIndex++;
- return mBitmaps[foundPosition];
- }
- return null;
- }
-
- public void reset(ImagePreset preset) {
- for (int i = 0; i < mNbItems; i++) {
- if (mKeys[i] == preset && !mBusyStatus[i]) {
- mBitmaps[i] = null;
- }
- }
- }
-}
diff --git a/src/com/android/gallery3d/filtershow/cache/Cache.java b/src/com/android/gallery3d/filtershow/cache/Cache.java
deleted file mode 100644
index 7a3ce9d98..000000000
--- a/src/com/android/gallery3d/filtershow/cache/Cache.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.gallery3d.filtershow.cache;
-
-import android.graphics.Bitmap;
-
-import com.android.gallery3d.filtershow.imageshow.ImageShow;
-import com.android.gallery3d.filtershow.presets.ImagePreset;
-
-public interface Cache {
- public void setOriginalBitmap(Bitmap bitmap);
-
- public void reset(ImagePreset preset);
-
- public void prepare(ImagePreset preset);
-
- public Bitmap get(ImagePreset preset);
-
- public void addObserver(ImageShow observer);
-}
diff --git a/src/com/android/gallery3d/filtershow/cache/FilteringPipeline.java b/src/com/android/gallery3d/filtershow/cache/FilteringPipeline.java
index 17c19ebe0..39b39695c 100644
--- a/src/com/android/gallery3d/filtershow/cache/FilteringPipeline.java
+++ b/src/com/android/gallery3d/filtershow/cache/FilteringPipeline.java
@@ -125,7 +125,9 @@ public class FilteringPipeline implements Handler.Callback {
public synchronized void setOriginal(Bitmap bitmap) {
mOriginalBitmap = bitmap;
Log.v(LOGTAG,"setOriginal, size " + bitmap.getWidth() + " x " + bitmap.getHeight());
- updateOriginalAllocation(MasterImage.getImage().getPreset());
+ ImagePreset preset = MasterImage.getImage().getPreset();
+ preset.setupEnvironment();
+ updateOriginalAllocation(preset);
updatePreviewBuffer();
}
@@ -203,7 +205,7 @@ public class FilteringPipeline implements Handler.Callback {
}
Message msg = mProcessingHandler.obtainMessage(COMPUTE_PRESET);
msg.obj = MasterImage.getImage().getPreset();
- mProcessingHandler.sendMessage(msg);
+ mProcessingHandler.sendMessageAtFrontOfQueue(msg);
}
private void setPresetParameters(ImagePreset preset) {
@@ -247,6 +249,7 @@ public class FilteringPipeline implements Handler.Callback {
Bitmap bitmap = request.getBitmap();
ImagePreset preset = request.getImagePreset();
setPresetParameters(preset);
+ preset.setupEnvironment();
if (request.getType() == RenderingRequest.PARTIAL_RENDERING) {
bitmap = MasterImage.getImage().getImageLoader().getScaleOneImageForPreset(null, preset,
@@ -282,7 +285,10 @@ public class FilteringPipeline implements Handler.Callback {
|| request.getType() == RenderingRequest.PARTIAL_RENDERING) {
Bitmap bmp = preset.apply(bitmap);
request.setBitmap(bmp);
+
+ FiltersManager.getManager().freeFilterResources(preset);
}
+
if (request.getType() == RenderingRequest.FILTERS_RENDERING) {
FiltersManager.getManager().resetBitmapsRS();
}
@@ -296,6 +302,9 @@ public class FilteringPipeline implements Handler.Callback {
String thread = Thread.currentThread().getName();
long time = System.currentTimeMillis();
+ setPresetParameters(preset);
+ preset.setupEnvironment(FiltersManager.getPreviewManager());
+
if (updateOriginalAllocation(preset)) {
buffer.updateBitmaps(mResizedOriginalBitmap);
}
@@ -309,8 +318,8 @@ public class FilteringPipeline implements Handler.Callback {
}
mOriginalAllocation.copyTo(bitmap);
- setPresetParameters(preset);
bitmap = preset.apply(bitmap);
+ FiltersManager.getPreviewManager().freeFilterResources(preset);
time = System.currentTimeMillis() - time;
time2 = System.currentTimeMillis() - time2;
diff --git a/src/com/android/gallery3d/filtershow/cache/ImageLoader.java b/src/com/android/gallery3d/filtershow/cache/ImageLoader.java
index a8191cfd8..6cf462269 100644
--- a/src/com/android/gallery3d/filtershow/cache/ImageLoader.java
+++ b/src/com/android/gallery3d/filtershow/cache/ImageLoader.java
@@ -394,6 +394,7 @@ public class ImageLoader {
float scaleFactor = imagePreset.getScaleFactor();
float scale = (float) bmp.getWidth() / (float) getOriginalBounds().width();
imagePreset.setScaleFactor(scale);
+ imagePreset.setupEnvironment();
bmp = imagePreset.apply(bmp);
imagePreset.setScaleFactor(scaleFactor);
mZoomCache.setImage(imagePreset, bounds, bmp);
@@ -551,6 +552,7 @@ public class ImageLoader {
Log.w(LOGTAG, "Failed to save image!");
return null;
}
+ param.setupEnvironment();
bitmap = param.applyGeometry(bitmap);
bitmap = param.apply(bitmap);
noBitmap = false;
diff --git a/src/com/android/gallery3d/filtershow/cache/RenderingRequest.java b/src/com/android/gallery3d/filtershow/cache/RenderingRequest.java
index e81f47fe1..3cc61f9f0 100644
--- a/src/com/android/gallery3d/filtershow/cache/RenderingRequest.java
+++ b/src/com/android/gallery3d/filtershow/cache/RenderingRequest.java
@@ -54,6 +54,7 @@ public class RenderingRequest {
if (type == FULL_RENDERING
|| type == GEOMETRY_RENDERING
|| type == ICON_RENDERING) {
+ preset.setupEnvironment();
bitmap = preset.applyGeometry(source);
} else if (type != PARTIAL_RENDERING) {
bitmap = Bitmap.createBitmap(source.getWidth(), source.getHeight(), mConfig);
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) {
diff --git a/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java b/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java
index 6d47c9176..4f9c450de 100644
--- a/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java
+++ b/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java
@@ -27,6 +27,7 @@ import com.android.gallery3d.filtershow.HistoryAdapter;
import com.android.gallery3d.filtershow.ImageStateAdapter;
import com.android.gallery3d.filtershow.cache.*;
import com.android.gallery3d.filtershow.filters.FilterRepresentation;
+import com.android.gallery3d.filtershow.filters.FiltersManager;
import com.android.gallery3d.filtershow.filters.ImageFilter;
import com.android.gallery3d.filtershow.presets.ImagePreset;
@@ -40,7 +41,6 @@ public class MasterImage implements RenderingRequestCaller {
private static MasterImage sMasterImage = null;
private static int sIconSeedSize = 128;
private static float sHistoryPreviewSize = 128.0f;
- private Bitmap mThumbnailBitmap;
private ImageFilter mCurrentFilter = null;
private ImagePreset mPreset = null;
@@ -52,6 +52,7 @@ public class MasterImage implements RenderingRequestCaller {
private Bitmap mGeometryOnlyBitmap = null;
private Bitmap mFiltersOnlyBitmap = null;
private Bitmap mPartialBitmap = null;
+ private Bitmap mThumbnailBitmap = null;
private ImageLoader mLoader = null;
private HistoryAdapter mHistory = null;
@@ -312,7 +313,6 @@ public class MasterImage implements RenderingRequestCaller {
invalidatePartialPreview();
needsUpdateFullResPreview();
FilteringPipeline.getPipeline().updatePreviewBuffer();
- renderHistoryPreview();
}
public void setImageShowSize(int w, int h) {
@@ -438,6 +438,7 @@ public class MasterImage implements RenderingRequestCaller {
return;
}
ImagePreset geoPreset = new ImagePreset(MasterImage.getImage().getGeometryPreset());
+ geoPreset.setupEnvironment();
bmap = geoPreset.applyGeometry(bmap);
float w = bmap.getWidth();
float h = bmap.getHeight();
diff --git a/src/com/android/gallery3d/filtershow/presets/FilterEnvironment.java b/src/com/android/gallery3d/filtershow/presets/FilterEnvironment.java
new file mode 100644
index 000000000..c20502290
--- /dev/null
+++ b/src/com/android/gallery3d/filtershow/presets/FilterEnvironment.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.gallery3d.filtershow.presets;
+
+import android.graphics.Bitmap;
+import com.android.gallery3d.filtershow.filters.FilterRepresentation;
+import com.android.gallery3d.filtershow.filters.FiltersManager;
+import com.android.gallery3d.filtershow.filters.ImageFilter;
+
+public class FilterEnvironment {
+ private ImagePreset mImagePreset;
+ private float mScaleFactor;
+ private int mQuality;
+ private FiltersManager mFiltersManager;
+
+ public void setImagePreset(ImagePreset imagePreset) {
+ mImagePreset = imagePreset;
+ }
+
+ public ImagePreset getImagePreset() {
+ return mImagePreset;
+ }
+
+ public void setScaleFactor(float scaleFactor) {
+ mScaleFactor = scaleFactor;
+ }
+
+ public float getScaleFactor() {
+ return mScaleFactor;
+ }
+
+ public void setQuality(int quality) {
+ mQuality = quality;
+ }
+
+ public int getQuality() {
+ return mQuality;
+ }
+
+ public void setFiltersManager(FiltersManager filtersManager) {
+ mFiltersManager = filtersManager;
+ }
+
+ public FiltersManager getFiltersManager() {
+ return mFiltersManager;
+ }
+
+ public Bitmap applyRepresentation(FilterRepresentation representation, Bitmap bitmap) {
+ ImageFilter filter = mFiltersManager.getFilterForRepresentation(representation);
+ filter.useRepresentation(representation);
+ filter.setImagePreset(mImagePreset);
+ return filter.apply(bitmap, mScaleFactor, mQuality);
+ }
+}
diff --git a/src/com/android/gallery3d/filtershow/presets/ImagePreset.java b/src/com/android/gallery3d/filtershow/presets/ImagePreset.java
index ca74a8729..87d9c8183 100644
--- a/src/com/android/gallery3d/filtershow/presets/ImagePreset.java
+++ b/src/com/android/gallery3d/filtershow/presets/ImagePreset.java
@@ -56,6 +56,8 @@ public class ImagePreset {
private Rect mPartialRenderingBounds;
private Bitmap mPreviewImage;
+ private FilterEnvironment mEnvironment = new FilterEnvironment();
+
public ImagePreset() {
setup();
}
@@ -407,6 +409,17 @@ public class ImagePreset {
// do nothing here
}
+ public void setupEnvironment() {
+ setupEnvironment(FiltersManager.getManager());
+ }
+
+ public void setupEnvironment(FiltersManager filtersManager) {
+ getEnvironment().setImagePreset(this);
+ getEnvironment().setScaleFactor(mScaleFactor);
+ getEnvironment().setQuality(mQuality);
+ getEnvironment().setFiltersManager(filtersManager);
+ }
+
public Bitmap apply(Bitmap original) {
Bitmap bitmap = original;
bitmap = applyFilters(bitmap, -1, -1);
@@ -417,28 +430,21 @@ public class ImagePreset {
// Apply any transform -- 90 rotate, flip, straighten, crop
// Returns a new bitmap.
if (mDoApplyGeometry) {
- ImageFilter filter = FiltersManager.getManager().getFilterForRepresentation(mGeoData);
mGeoData.synchronizeRepresentation();
- filter.useRepresentation(mGeoData);
- filter.setImagePreset(this);
- bitmap = filter.apply(bitmap, mScaleFactor, mQuality);
+ bitmap = mEnvironment.applyRepresentation(mGeoData, bitmap);
}
return bitmap;
}
public Bitmap applyBorder(Bitmap bitmap) {
if (mBorder != null && mDoApplyGeometry) {
- ImageFilter filter = FiltersManager.getManager().getFilterForRepresentation(mBorder);
mBorder.synchronizeRepresentation();
- filter.useRepresentation(mBorder);
- filter.setImagePreset(this);
- bitmap = filter.apply(bitmap, mScaleFactor, mQuality);
+ bitmap = mEnvironment.applyRepresentation(mBorder, bitmap);
}
return bitmap;
}
public Bitmap applyFilters(Bitmap bitmap, int from, int to) {
-
if (mDoApplyFilters) {
if (from < 0) {
from = 0;
@@ -452,10 +458,7 @@ public class ImagePreset {
representation = mFilters.elementAt(i);
representation.synchronizeRepresentation();
}
- ImageFilter filter = FiltersManager.getManager().getFilterForRepresentation(representation);
- filter.useRepresentation(representation);
- filter.setImagePreset(this);
- bitmap = filter.apply(bitmap, mScaleFactor, mQuality);
+ bitmap = mEnvironment.applyRepresentation(representation, bitmap);
}
}
@@ -531,4 +534,18 @@ public class ImagePreset {
mPreviewImage = previewImage;
}
+ public Vector<ImageFilter> getUsedFilters() {
+ Vector<ImageFilter> usedFilters = new Vector<ImageFilter>();
+ for (int i = 0; i < mFilters.size(); i++) {
+ FilterRepresentation representation = mFilters.elementAt(i);
+ FiltersManager filtersManager = getEnvironment().getFiltersManager();
+ ImageFilter filter = filtersManager.getFilterForRepresentation(representation);
+ usedFilters.add(filter);
+ }
+ return usedFilters;
+ }
+
+ public FilterEnvironment getEnvironment() {
+ return mEnvironment;
+ }
}
diff --git a/src/com/android/gallery3d/filtershow/tools/SaveCopyTask.java b/src/com/android/gallery3d/filtershow/tools/SaveCopyTask.java
index 89cfa6bdf..b88dbbc47 100644
--- a/src/com/android/gallery3d/filtershow/tools/SaveCopyTask.java
+++ b/src/com/android/gallery3d/filtershow/tools/SaveCopyTask.java
@@ -185,6 +185,7 @@ public class SaveCopyTask extends AsyncTask<ImagePreset, Void, Uri> {
if (bitmap == null) {
return null;
}
+ preset.setupEnvironment();
bitmap = preset.applyGeometry(bitmap);
bitmap = preset.apply(bitmap);
diff --git a/src_pd/com/android/gallery3d/filtershow/filters/FiltersManager.java b/src_pd/com/android/gallery3d/filtershow/filters/FiltersManager.java
index d6b871899..246e3f540 100644
--- a/src_pd/com/android/gallery3d/filtershow/filters/FiltersManager.java
+++ b/src_pd/com/android/gallery3d/filtershow/filters/FiltersManager.java
@@ -21,10 +21,17 @@ import java.util.Vector;
public class FiltersManager extends BaseFiltersManager {
private static FiltersManager sInstance = null;
+ private static FiltersManager sPreviewInstance = null;
- protected FiltersManager() {
- mFilters = new HashMap<Class, ImageFilter>();
- addFilters(mFilters);
+ public FiltersManager() {
+ init();
+ }
+
+ public static FiltersManager getPreviewManager() {
+ if (sPreviewInstance == null) {
+ sPreviewInstance = new FiltersManager();
+ }
+ return sPreviewInstance;
}
public static FiltersManager getManager() {