From 518d1193692fadaf91a2f5b174735d45bda2c4ab Mon Sep 17 00:00:00 2001 From: nicolasroard Date: Tue, 29 Jan 2013 13:57:42 -0800 Subject: Clean up invalidate / redraw loop Move the recopy to the main thread Change-Id: I8c94179e292f5679b7c817b6bd5000ee384b83ce --- .../gallery3d/filtershow/FilterShowActivity.java | 10 +- .../filtershow/cache/FilteringPipeline.java | 112 +++++++++++++-------- .../gallery3d/filtershow/editors/BasicEditor.java | 2 + .../gallery3d/filtershow/filters/ImageFilter.java | 3 + .../filtershow/imageshow/MasterImage.java | 23 +---- .../gallery3d/filtershow/presets/ImagePreset.java | 9 ++ 6 files changed, 93 insertions(+), 66 deletions(-) (limited to 'src/com/android') diff --git a/src/com/android/gallery3d/filtershow/FilterShowActivity.java b/src/com/android/gallery3d/filtershow/FilterShowActivity.java index 654175210..fd4eef01c 100644 --- a/src/com/android/gallery3d/filtershow/FilterShowActivity.java +++ b/src/com/android/gallery3d/filtershow/FilterShowActivity.java @@ -960,15 +960,13 @@ public class FilterShowActivity extends Activity implements OnItemClickListener, } ImagePreset oldPreset = mMasterImage.getPreset(); ImagePreset copy = new ImagePreset(oldPreset); - mMasterImage.setPreset(copy, true); - // TODO: use a numerical constant instead. - ImagePreset current = mMasterImage.getPreset(); - ImageFilter existingFilter = current.getFilter(filter.getName()); + ImageFilter existingFilter = copy.getFilter(filter.getName()); if (existingFilter == null) { - current.add(filter); + copy.add(filter); } - existingFilter = current.getFilter(filter.getName()); + existingFilter = copy.getFilter(filter.getName()); + mMasterImage.setPreset(copy, true); mMasterImage.setCurrentFilter(existingFilter); invalidateViews(); } diff --git a/src/com/android/gallery3d/filtershow/cache/FilteringPipeline.java b/src/com/android/gallery3d/filtershow/cache/FilteringPipeline.java index eda10fc58..2dbd1f374 100644 --- a/src/com/android/gallery3d/filtershow/cache/FilteringPipeline.java +++ b/src/com/android/gallery3d/filtershow/cache/FilteringPipeline.java @@ -46,11 +46,11 @@ public class FilteringPipeline implements Handler.Callback { private HandlerThread mHandlerThread = null; private final static int NEW_PRESET = 0; - private final static int COMPUTE_PRESET = 1; - private final static int COMPUTE_GEOMETRY_PRESET = 2; - private final static int COMPUTE_FILTERS_PRESET = 3; - - private boolean mProcessing = false; + private final static int NEW_GEOMETRY_PRESET = 1; + private final static int NEW_FILTERS_PRESET = 2; + private final static int COMPUTE_PRESET = 3; + private final static int COMPUTE_GEOMETRY_PRESET = 4; + private final static int COMPUTE_FILTERS_PRESET = 5; private Handler mProcessingHandler = null; private final Handler mUIHandler = new Handler() { @@ -58,8 +58,21 @@ public class FilteringPipeline implements Handler.Callback { public void handleMessage(Message msg) { switch (msg.what) { case NEW_PRESET: { + TripleBufferBitmap buffer = MasterImage.getImage().getDoubleBuffer(); + buffer.swapConsumer(); + MasterImage.getImage().notifyObservers(); + break; + } + case NEW_GEOMETRY_PRESET: { + TripleBufferBitmap buffer = MasterImage.getImage().getGeometryOnlyBuffer(); + buffer.swapConsumer(); + MasterImage.getImage().notifyObservers(); + break; + } + case NEW_FILTERS_PRESET: { + TripleBufferBitmap buffer = MasterImage.getImage().getFiltersOnlyBuffer(); + buffer.swapConsumer(); MasterImage.getImage().notifyObservers(); - mProcessing = false; break; } } @@ -70,26 +83,29 @@ public class FilteringPipeline implements Handler.Callback { public boolean handleMessage(Message msg) { switch (msg.what) { case COMPUTE_PRESET: { - ImagePreset preset = MasterImage.getImage().getPreset(); + ImagePreset preset = (ImagePreset) msg.obj; TripleBufferBitmap buffer = MasterImage.getImage().getDoubleBuffer(); compute(buffer, preset, COMPUTE_PRESET); + buffer.swapProducer(); Message uimsg = mUIHandler.obtainMessage(NEW_PRESET); mUIHandler.sendMessage(uimsg); break; } case COMPUTE_GEOMETRY_PRESET: { - ImagePreset preset = MasterImage.getImage().getGeometryPreset(); + ImagePreset preset = (ImagePreset) msg.obj; TripleBufferBitmap buffer = MasterImage.getImage().getGeometryOnlyBuffer(); compute(buffer, preset, COMPUTE_GEOMETRY_PRESET); - Message uimsg = mUIHandler.obtainMessage(NEW_PRESET); + buffer.swapProducer(); + Message uimsg = mUIHandler.obtainMessage(NEW_GEOMETRY_PRESET); mUIHandler.sendMessage(uimsg); break; } case COMPUTE_FILTERS_PRESET: { - ImagePreset preset = MasterImage.getImage().getFiltersOnlyPreset(); + ImagePreset preset = (ImagePreset) msg.obj; TripleBufferBitmap buffer = MasterImage.getImage().getFiltersOnlyBuffer(); compute(buffer, preset, COMPUTE_FILTERS_PRESET); - Message uimsg = mUIHandler.obtainMessage(NEW_PRESET); + buffer.swapProducer(); + Message uimsg = mUIHandler.obtainMessage(NEW_FILTERS_PRESET); mUIHandler.sendMessage(uimsg); break; } @@ -121,6 +137,9 @@ public class FilteringPipeline implements Handler.Callback { mOriginalBitmap = bitmap; Log.v(LOGTAG,"setOriginal, size " + bitmap.getWidth() + " x " + bitmap.getHeight()); updateOriginalAllocation(MasterImage.getImage().getPreset()); + updatePreviewBuffer(); + updateFiltersOnlyPreviewBuffer(); + updateGeometryOnlyPreviewBuffer(); } public synchronized boolean updateOriginalAllocation(ImagePreset preset) { @@ -160,58 +179,75 @@ public class FilteringPipeline implements Handler.Callback { if (mOriginalAllocation == null) { return; } - if (mProcessing) { + if (!needsRepaint()) { return; } if (mProcessingHandler.hasMessages(COMPUTE_PRESET)) { - return; - } - if (!needsRepaint()) { - return; + mProcessingHandler.removeMessages(COMPUTE_PRESET); } Message msg = mProcessingHandler.obtainMessage(COMPUTE_PRESET); + ImagePreset preset = new ImagePreset(MasterImage.getImage().getPreset()); + setPresetParameters(preset); + msg.obj = preset; mProcessingHandler.sendMessage(msg); - mProcessing = true; } public void updateGeometryOnlyPreviewBuffer() { if (mOriginalAllocation == null) { return; } - if (mProcessing) { + if (!needsGeometryRepaint()) { return; } if (mProcessingHandler.hasMessages(COMPUTE_GEOMETRY_PRESET)) { - return; - } - if (!needsGeometryRepaint()) { - return; + mProcessingHandler.removeMessages(COMPUTE_GEOMETRY_PRESET); } Message msg = mProcessingHandler.obtainMessage(COMPUTE_GEOMETRY_PRESET); + ImagePreset preset = new ImagePreset(MasterImage.getImage().getGeometryPreset()); + setPresetParameters(preset); + msg.obj = preset; mProcessingHandler.sendMessage(msg); - mProcessing = true; } public void updateFiltersOnlyPreviewBuffer() { if (mOriginalAllocation == null) { return; } - if (mProcessing) { + if (!needsFiltersRepaint()) { return; } if (mProcessingHandler.hasMessages(COMPUTE_FILTERS_PRESET)) { - return; - } - if (!needsFiltersRepaint()) { - return; + mProcessingHandler.removeMessages(COMPUTE_FILTERS_PRESET); } Message msg = mProcessingHandler.obtainMessage(COMPUTE_FILTERS_PRESET); + ImagePreset preset = new ImagePreset(MasterImage.getImage().getFiltersOnlyPreset()); + setPresetParameters(preset); + + msg.obj = preset; mProcessingHandler.sendMessage(msg); - mProcessing = true; + } + + private void setPresetParameters(ImagePreset preset) { + preset.setScaleFactor(mPreviewScaleFactor); + if (mPreviewScaleFactor < 1.0f) { + preset.setIsHighQuality(false); + } else { + preset.setIsHighQuality(true); + } } private void compute(TripleBufferBitmap buffer, ImagePreset preset, int type) { String thread = Thread.currentThread().getName(); + if (type == COMPUTE_PRESET && preset.same(mPreviousPreset)) { + mPreviousPreset.usePreset(preset); + preset = mPreviousPreset; + } else if (type == COMPUTE_GEOMETRY_PRESET && preset.same(mPreviousGeometryPreset)) { + mPreviousGeometryPreset.usePreset(preset); + preset = mPreviousGeometryPreset; + } else if (type == COMPUTE_FILTERS_PRESET && preset.same(mPreviousFiltersPreset)) { + mPreviousFiltersPreset.usePreset(preset); + preset = mPreviousFiltersPreset; + } long time = System.currentTimeMillis(); if (updateOriginalAllocation(preset)) { buffer.updateBitmaps(mResizedOriginalBitmap); @@ -219,13 +255,6 @@ public class FilteringPipeline implements Handler.Callback { Bitmap bitmap = buffer.getProducer(); long time2 = System.currentTimeMillis(); - preset.setScaleFactor(mPreviewScaleFactor); - if (mPreviewScaleFactor < 1.0f) { - preset.setIsHighQuality(false); - } else { - preset.setIsHighQuality(true); - } - if (type != COMPUTE_FILTERS_PRESET) { if (bitmap == null || (bitmap.getWidth() != mResizedOriginalBitmap.getWidth()) || (bitmap.getHeight() != mResizedOriginalBitmap.getHeight())) { @@ -251,22 +280,23 @@ public class FilteringPipeline implements Handler.Callback { bitmap = preset.apply(bitmap); } - buffer.swapProducer(); time = System.currentTimeMillis() - time; time2 = System.currentTimeMillis() - time2; if (DEBUG) { - Log.v(LOGTAG, "Applying " + type + " filters to bitmap " + bitmap + " took " + time + " ms, " + time2 + " ms for the filter, on thread " + thread); + Log.v(LOGTAG, "Applying " + type + " filters to bitmap " + + bitmap + " (" + bitmap.getWidth() + " x " + bitmap.getHeight() + + ") took " + time + " ms, " + time2 + " ms for the filter, on thread " + thread); } if (type == COMPUTE_PRESET) { - mPreviousPreset = new ImagePreset(preset); + mPreviousPreset = preset; if (mResizeFactor > 0.6 && time > MAX_PROCESS_TIME && (System.currentTimeMillis() + 1000 > mResizeTime)) { mResizeTime = System.currentTimeMillis(); mResizeFactor *= RESIZE_FACTOR; } } else if (type == COMPUTE_GEOMETRY_PRESET) { - mPreviousGeometryPreset = new ImagePreset(preset); + mPreviousGeometryPreset = preset; } else if (type == COMPUTE_FILTERS_PRESET) { - mPreviousFiltersPreset = new ImagePreset(preset); + mPreviousFiltersPreset = preset; } } diff --git a/src/com/android/gallery3d/filtershow/editors/BasicEditor.java b/src/com/android/gallery3d/filtershow/editors/BasicEditor.java index 3a15cf68d..9e3a0e252 100644 --- a/src/com/android/gallery3d/filtershow/editors/BasicEditor.java +++ b/src/com/android/gallery3d/filtershow/editors/BasicEditor.java @@ -25,6 +25,7 @@ import android.view.View; import android.widget.FrameLayout; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; +import com.android.gallery3d.filtershow.imageshow.MasterImage; /** * The basic editor that all the one parameter filters @@ -76,6 +77,7 @@ public class BasicEditor extends Editor implements OnSeekBarChangeListener { } Log.v(LOGTAG, " #### progress=" + value); + MasterImage.getImage().updateBuffers(); } @Override diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilter.java b/src/com/android/gallery3d/filtershow/filters/ImageFilter.java index 96f98d5b1..a261031c3 100644 --- a/src/com/android/gallery3d/filtershow/filters/ImageFilter.java +++ b/src/com/android/gallery3d/filtershow/filters/ImageFilter.java @@ -202,4 +202,7 @@ public class ImageFilter implements Cloneable { native protected void nativeApplyGradientFilter(Bitmap bitmap, int w, int h, int[] redGradient, int[] greenGradient, int[] blueGradient); + public void useFilter(ImageFilter a) { + setParameter(a.getParameter()); + } } diff --git a/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java b/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java index f4b97b710..5e9ec7a7a 100644 --- a/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java +++ b/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java @@ -19,6 +19,7 @@ package com.android.gallery3d.filtershow.imageshow; import android.graphics.Bitmap; import android.graphics.RectF; +import com.android.gallery3d.app.Log; import com.android.gallery3d.filtershow.FilterShowActivity; import com.android.gallery3d.filtershow.HistoryAdapter; import com.android.gallery3d.filtershow.ImageStateAdapter; @@ -88,7 +89,6 @@ public class MasterImage { mHistory.addHistoryItem(mPreset); } updatePresets(true); - requestImages(); } private void setGeometry() { @@ -161,35 +161,23 @@ public class MasterImage { } public Bitmap getFilteredImage() { - requestImages(); - mFilteredPreview.swapConsumer(); return mFilteredPreview.getConsumer(); } public Bitmap getFiltersOnlyImage() { - requestImages(); - mFiltersOnlyPreview.swapConsumer(); return mFiltersOnlyPreview.getConsumer(); } public Bitmap getGeometryOnlyImage() { - requestImages(); - mGeometryOnlyPreview.swapConsumer(); return mGeometryOnlyPreview.getConsumer(); } public void notifyObservers() { - requestImages(); for (ImageShow observer : mObservers) { observer.invalidate(); } } - public void updatedCache() { - requestImages(); - notifyObservers(); - } - public void updatePresets(boolean force) { if (force || mGeometryOnlyPreset == null) { ImagePreset newPreset = new ImagePreset(mPreset); @@ -208,16 +196,13 @@ public class MasterImage { } } mActivity.enableSave(hasModifications()); + updateBuffers(); } - public void requestImages() { - if (mLoader == null) { - return; - } - - updatePresets(false); + public void updateBuffers() { FilteringPipeline.getPipeline().updatePreviewBuffer(); FilteringPipeline.getPipeline().updateGeometryOnlyPreviewBuffer(); FilteringPipeline.getPipeline().updateFiltersOnlyPreviewBuffer(); } + } diff --git a/src/com/android/gallery3d/filtershow/presets/ImagePreset.java b/src/com/android/gallery3d/filtershow/presets/ImagePreset.java index e6e29533d..d6a69af3e 100644 --- a/src/com/android/gallery3d/filtershow/presets/ImagePreset.java +++ b/src/com/android/gallery3d/filtershow/presets/ImagePreset.java @@ -22,6 +22,7 @@ import android.util.Log; import com.android.gallery3d.filtershow.ImageStateAdapter; import com.android.gallery3d.filtershow.cache.ImageLoader; import com.android.gallery3d.filtershow.filters.ImageFilter; +import com.android.gallery3d.filtershow.filters.ImageFilterRS; import com.android.gallery3d.filtershow.imageshow.GeometryMetadata; import com.android.gallery3d.filtershow.imageshow.ImageShow; @@ -189,6 +190,14 @@ public class ImagePreset { return true; } + public void usePreset(ImagePreset preset) { + for (int i = 0; i < preset.mFilters.size(); i++) { + ImageFilter a = preset.mFilters.elementAt(i); + ImageFilter b = mFilters.elementAt(i); + b.useFilter(a); + } + } + public boolean same(ImagePreset preset) { if (preset == null) { return false; -- cgit v1.2.3