Merge "Clean up invalidate / redraw loop Move the recopy to the main thread" into gb-ub-photos-bryce
diff --git a/src/com/android/gallery3d/filtershow/FilterShowActivity.java b/src/com/android/gallery3d/filtershow/FilterShowActivity.java
index 6541752..fd4eef0 100644
--- a/src/com/android/gallery3d/filtershow/FilterShowActivity.java
+++ b/src/com/android/gallery3d/filtershow/FilterShowActivity.java
@@ -960,15 +960,13 @@
         }
         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 eda10fc..2dbd1f3 100644
--- a/src/com/android/gallery3d/filtershow/cache/FilteringPipeline.java
+++ b/src/com/android/gallery3d/filtershow/cache/FilteringPipeline.java
@@ -46,11 +46,11 @@
 
     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 void handleMessage(Message msg) {
             switch (msg.what) {
                 case NEW_PRESET: {
+                    TripleBufferBitmap buffer = MasterImage.getImage().getDoubleBuffer();
+                    buffer.swapConsumer();
                     MasterImage.getImage().notifyObservers();
-                    mProcessing = false;
+                    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();
                     break;
                 }
             }
@@ -70,26 +83,29 @@
     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 @@
         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,71 +179,81 @@
         if (mOriginalAllocation == null) {
             return;
         }
-        if (mProcessing) {
-            return;
-        }
-        if (mProcessingHandler.hasMessages(COMPUTE_PRESET)) {
-            return;
-        }
         if (!needsRepaint()) {
             return;
         }
+        if (mProcessingHandler.hasMessages(COMPUTE_PRESET)) {
+            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) {
-            return;
-        }
-        if (mProcessingHandler.hasMessages(COMPUTE_GEOMETRY_PRESET)) {
-            return;
-        }
         if (!needsGeometryRepaint()) {
             return;
         }
+        if (mProcessingHandler.hasMessages(COMPUTE_GEOMETRY_PRESET)) {
+            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) {
-            return;
-        }
-        if (mProcessingHandler.hasMessages(COMPUTE_FILTERS_PRESET)) {
-            return;
-        }
         if (!needsFiltersRepaint()) {
             return;
         }
+        if (mProcessingHandler.hasMessages(COMPUTE_FILTERS_PRESET)) {
+            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 compute(TripleBufferBitmap buffer, ImagePreset preset, int type) {
-        String thread = Thread.currentThread().getName();
-        long time = System.currentTimeMillis();
-        if (updateOriginalAllocation(preset)) {
-            buffer.updateBitmaps(mResizedOriginalBitmap);
-        }
-        Bitmap bitmap = buffer.getProducer();
-        long time2 = System.currentTimeMillis();
-
+    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);
+        }
+        Bitmap bitmap = buffer.getProducer();
+        long time2 = System.currentTimeMillis();
 
         if (type != COMPUTE_FILTERS_PRESET) {
             if (bitmap == null || (bitmap.getWidth() != mResizedOriginalBitmap.getWidth())
@@ -251,22 +280,23 @@
             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 3a15cf6..9e3a0e2 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.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 @@
         }
 
         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 96f98d5..a261031 100644
--- a/src/com/android/gallery3d/filtershow/filters/ImageFilter.java
+++ b/src/com/android/gallery3d/filtershow/filters/ImageFilter.java
@@ -202,4 +202,7 @@
     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 f4b97b7..5e9ec7a 100644
--- a/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java
+++ b/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java
@@ -19,6 +19,7 @@
 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 @@
             mHistory.addHistoryItem(mPreset);
         }
         updatePresets(true);
-        requestImages();
     }
 
     private void setGeometry() {
@@ -161,35 +161,23 @@
     }
 
     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 @@
             }
         }
         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 e6e2953..d6a69af 100644
--- a/src/com/android/gallery3d/filtershow/presets/ImagePreset.java
+++ b/src/com/android/gallery3d/filtershow/presets/ImagePreset.java
@@ -22,6 +22,7 @@
 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 @@
         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;