diff options
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() { |