From 9f452e09889199a28a86d9bd8f8fdaa8508ca0c1 Mon Sep 17 00:00:00 2001 From: nicolasroard Date: Fri, 23 Aug 2013 00:10:01 -0700 Subject: Improves UI / size - improves overdraw - filter change anim - better borders - remove unused images bug:9470514 bug:8658176 Change-Id: I764879be415acbfba5a36f239d1905ec54e2d3cb --- .../filtershow/pipeline/CacheProcessing.java | 4 +- .../filtershow/pipeline/CachingPipeline.java | 62 +++++++++++++++++----- .../filtershow/pipeline/FilterEnvironment.java | 3 ++ .../gallery3d/filtershow/pipeline/ImagePreset.java | 36 +++++++++++++ .../filtershow/pipeline/RenderingRequest.java | 10 ++-- .../filtershow/pipeline/RenderingRequestTask.java | 8 ++- 6 files changed, 105 insertions(+), 18 deletions(-) (limited to 'src/com/android/gallery3d/filtershow/pipeline') diff --git a/src/com/android/gallery3d/filtershow/pipeline/CacheProcessing.java b/src/com/android/gallery3d/filtershow/pipeline/CacheProcessing.java index 8f6eda261..2a8321908 100644 --- a/src/com/android/gallery3d/filtershow/pipeline/CacheProcessing.java +++ b/src/com/android/gallery3d/filtershow/pipeline/CacheProcessing.java @@ -170,9 +170,11 @@ public class CacheProcessing { + mSteps.size() + " cacheBitmap: " + cacheBitmap); } + Bitmap originalCopy = null; for (int i = findBaseImageIndex; i < mSteps.size(); i++) { if (i == -1 || cacheBitmap == null) { cacheBitmap = environment.getBitmapCopy(originalBitmap); + originalCopy = cacheBitmap; if (DEBUG) { Log.v(LOGTAG, "i: " + i + " cacheBitmap: " + cacheBitmap + " w: " + cacheBitmap.getWidth() + " h: " + cacheBitmap.getHeight() @@ -189,12 +191,12 @@ public class CacheProcessing { Log.v(LOGTAG, "i: " + i + " get new copy for cacheBitmap " + cacheBitmap + " apply..."); } - environment.cache(step.cache); cacheBitmap = environment.getBitmapCopy(cacheBitmap); cacheBitmap = step.apply(environment, cacheBitmap); step.cache = cacheBitmap; } } + environment.cache(originalCopy); if (DEBUG) { Log.v(LOGTAG, "now let's cleanup the cache..."); diff --git a/src/com/android/gallery3d/filtershow/pipeline/CachingPipeline.java b/src/com/android/gallery3d/filtershow/pipeline/CachingPipeline.java index 0ff8bfbad..823da642a 100644 --- a/src/com/android/gallery3d/filtershow/pipeline/CachingPipeline.java +++ b/src/com/android/gallery3d/filtershow/pipeline/CachingPipeline.java @@ -221,18 +221,64 @@ public class CachingPipeline implements PipelineInterface { Bitmap bmp = preset.apply(bitmap, mEnvironment); if (!mEnvironment.needsStop()) { request.setBitmap(bmp); + } else { + mEnvironment.cache(bmp); + } + mFiltersManager.freeFilterResources(preset); + } + } + + public void renderGeometry(RenderingRequest request) { + synchronized (CachingPipeline.class) { + if (getRenderScriptContext() == null) { + return; + } + ImagePreset preset = request.getImagePreset(); + setupEnvironment(preset, false); + Bitmap bitmap = MasterImage.getImage().getOriginalBitmapHighres(); + if (bitmap == null) { + return; + } + bitmap = mEnvironment.getBitmapCopy(bitmap); + bitmap = preset.applyGeometry(bitmap, mEnvironment); + if (!mEnvironment.needsStop()) { + request.setBitmap(bitmap); + } else { + mEnvironment.cache(bitmap); + } + mFiltersManager.freeFilterResources(preset); + } + } + + public void renderFilters(RenderingRequest request) { + synchronized (CachingPipeline.class) { + if (getRenderScriptContext() == null) { + return; + } + ImagePreset preset = request.getImagePreset(); + setupEnvironment(preset, false); + Bitmap bitmap = MasterImage.getImage().getOriginalBitmapHighres(); + if (bitmap == null) { + return; + } + bitmap = mEnvironment.getBitmapCopy(bitmap); + bitmap = preset.apply(bitmap, mEnvironment); + if (!mEnvironment.needsStop()) { + request.setBitmap(bitmap); + } else { + mEnvironment.cache(bitmap); } mFiltersManager.freeFilterResources(preset); } } public synchronized void render(RenderingRequest request) { + // TODO: cleanup/remove GEOMETRY / FILTERS paths synchronized (CachingPipeline.class) { if (getRenderScriptContext() == null) { return; } - if (((request.getType() != RenderingRequest.PARTIAL_RENDERING - && request.getType() != RenderingRequest.HIGHRES_RENDERING) + if (((request.getType() != RenderingRequest.PARTIAL_RENDERING) && request.getBitmap() == null) || request.getImagePreset() == null) { return; @@ -244,8 +290,7 @@ public class CachingPipeline implements PipelineInterface { Bitmap bitmap = request.getBitmap(); ImagePreset preset = request.getImagePreset(); - setupEnvironment(preset, - request.getType() != RenderingRequest.HIGHRES_RENDERING); + setupEnvironment(preset, true); mFiltersManager.freeFilterResources(preset); if (request.getType() == RenderingRequest.PARTIAL_RENDERING) { @@ -260,13 +305,6 @@ public class CachingPipeline implements PipelineInterface { } } - if (request.getType() == RenderingRequest.HIGHRES_RENDERING) { - bitmap = MasterImage.getImage().getOriginalBitmapHighres(); - if (bitmap != null) { - bitmap = preset.applyGeometry(bitmap, mEnvironment); - } - } - if (request.getType() == RenderingRequest.FULL_RENDERING || request.getType() == RenderingRequest.GEOMETRY_RENDERING || request.getType() == RenderingRequest.FILTERS_RENDERING) { @@ -290,7 +328,6 @@ public class CachingPipeline implements PipelineInterface { || request.getType() == RenderingRequest.FILTERS_RENDERING || request.getType() == RenderingRequest.ICON_RENDERING || request.getType() == RenderingRequest.PARTIAL_RENDERING - || request.getType() == RenderingRequest.HIGHRES_RENDERING || request.getType() == RenderingRequest.STYLE_ICON_RENDERING) { if (request.getType() == RenderingRequest.ICON_RENDERING) { @@ -351,6 +388,7 @@ public class CachingPipeline implements PipelineInterface { Vector filters = preset.getFilters(); Bitmap result = mCachedProcessing.process(mOriginalBitmap, filters, mEnvironment); buffer.setProducer(result); + mEnvironment.cache(result); } public synchronized void computeOld(SharedBuffer buffer, ImagePreset preset, int type) { diff --git a/src/com/android/gallery3d/filtershow/pipeline/FilterEnvironment.java b/src/com/android/gallery3d/filtershow/pipeline/FilterEnvironment.java index b34537668..72c02f32f 100644 --- a/src/com/android/gallery3d/filtershow/pipeline/FilterEnvironment.java +++ b/src/com/android/gallery3d/filtershow/pipeline/FilterEnvironment.java @@ -133,6 +133,9 @@ public class FilterEnvironment { filter.useRepresentation(representation); filter.setEnvironment(this); Bitmap ret = filter.apply(bitmap, mScaleFactor, mQuality); + if (bitmap != ret) { + cache(bitmap); + } filter.setGeneralParameters(); filter.setEnvironment(null); return ret; diff --git a/src/com/android/gallery3d/filtershow/pipeline/ImagePreset.java b/src/com/android/gallery3d/filtershow/pipeline/ImagePreset.java index 88e8d42e8..3f71547dd 100644 --- a/src/com/android/gallery3d/filtershow/pipeline/ImagePreset.java +++ b/src/com/android/gallery3d/filtershow/pipeline/ImagePreset.java @@ -24,6 +24,7 @@ import android.util.JsonWriter; import android.util.Log; import com.android.gallery3d.R; +import com.android.gallery3d.filtershow.cache.BitmapCache; import com.android.gallery3d.filtershow.cache.ImageLoader; import com.android.gallery3d.filtershow.filters.BaseFiltersManager; import com.android.gallery3d.filtershow.filters.FilterCropRepresentation; @@ -235,6 +236,37 @@ public class ImagePreset { return true; } + public boolean equals(ImagePreset preset) { + if (preset == null) { + return false; + } + + if (preset.mFilters.size() != mFilters.size()) { + return false; + } + + if (mDoApplyGeometry != preset.mDoApplyGeometry) { + return false; + } + + if (mDoApplyFilters != preset.mDoApplyFilters) { + if (mFilters.size() > 0 || preset.mFilters.size() > 0) { + return false; + } + } + + for (int i = 0; i < preset.mFilters.size(); i++) { + FilterRepresentation a = preset.mFilters.elementAt(i); + FilterRepresentation b = mFilters.elementAt(i); + + if (!a.equals(b)) { + return false; + } + } + + return true; + } + public int similarUpTo(ImagePreset preset) { for (int i = 0; i < preset.mFilters.size(); i++) { FilterRepresentation a = preset.mFilters.elementAt(i); @@ -476,7 +508,11 @@ public class ImagePreset { // TODO: might be worth getting rid of applyBorder. continue; } + Bitmap tmp = bitmap; bitmap = environment.applyRepresentation(representation, bitmap); + if (tmp != bitmap) { + environment.cache(tmp); + } if (environment.getQuality() == FilterEnvironment.QUALITY_FINAL) { UsageStatistics.onEvent(UsageStatistics.COMPONENT_EDITOR, "SaveFilter", representation.getSerializationName(), 1); diff --git a/src/com/android/gallery3d/filtershow/pipeline/RenderingRequest.java b/src/com/android/gallery3d/filtershow/pipeline/RenderingRequest.java index ef4bb9bc0..463b38d95 100644 --- a/src/com/android/gallery3d/filtershow/pipeline/RenderingRequest.java +++ b/src/com/android/gallery3d/filtershow/pipeline/RenderingRequest.java @@ -52,7 +52,8 @@ public class RenderingRequest { public static void post(Context context, Bitmap source, ImagePreset preset, int type, RenderingRequestCaller caller, Rect bounds, Rect destination) { - if (((type != PARTIAL_RENDERING && type != HIGHRES_RENDERING) && source == null) + if (((type != PARTIAL_RENDERING && type != HIGHRES_RENDERING + && type != GEOMETRY_RENDERING && type != FILTERS_RENDERING) && source == null) || preset == null || caller == null) { Log.v(LOGTAG, "something null: source: " + source + " or preset: " + preset + " or caller: " + caller); @@ -61,14 +62,15 @@ public class RenderingRequest { RenderingRequest request = new RenderingRequest(); Bitmap bitmap = null; if (type == FULL_RENDERING - || type == GEOMETRY_RENDERING || type == ICON_RENDERING || type == STYLE_ICON_RENDERING) { CachingPipeline pipeline = new CachingPipeline( FiltersManager.getManager(), "Icon"); bitmap = pipeline.renderGeometryIcon(source, preset); - } else if (type != PARTIAL_RENDERING && type != HIGHRES_RENDERING) { - bitmap = Bitmap.createBitmap(source.getWidth(), source.getHeight(), mConfig); + } else if (type != PARTIAL_RENDERING && type != HIGHRES_RENDERING + && type != GEOMETRY_RENDERING && type != FILTERS_RENDERING) { + bitmap = MasterImage.getImage().getBitmapCache().getBitmap( + source.getWidth(), source.getHeight()); } request.setBitmap(bitmap); diff --git a/src/com/android/gallery3d/filtershow/pipeline/RenderingRequestTask.java b/src/com/android/gallery3d/filtershow/pipeline/RenderingRequestTask.java index 7a83f7072..c8bc57d38 100644 --- a/src/com/android/gallery3d/filtershow/pipeline/RenderingRequestTask.java +++ b/src/com/android/gallery3d/filtershow/pipeline/RenderingRequestTask.java @@ -63,7 +63,13 @@ public class RenderingRequestTask extends ProcessingTask { public Result doInBackground(Request message) { RenderingRequest request = ((Render) message).request; RenderResult result = null; - mPreviewPipeline.render(request); + if (request.getType() == RenderingRequest.GEOMETRY_RENDERING) { + mPreviewPipeline.renderGeometry(request); + } else if (request.getType() == RenderingRequest.FILTERS_RENDERING) { + mPreviewPipeline.renderFilters(request); + } else { + mPreviewPipeline.render(request); + } result = new RenderResult(); result.request = request; return result; -- cgit v1.2.3