OSDN Git Service

Clean up invalidate / redraw loop
authornicolasroard <nicolasroard@google.com>
Tue, 29 Jan 2013 21:57:42 +0000 (13:57 -0800)
committernicolasroard <nicolasroard@google.com>
Wed, 30 Jan 2013 23:43:01 +0000 (15:43 -0800)
Move the recopy to the main thread

Change-Id: I8c94179e292f5679b7c817b6bd5000ee384b83ce

src/com/android/gallery3d/filtershow/FilterShowActivity.java
src/com/android/gallery3d/filtershow/cache/FilteringPipeline.java
src/com/android/gallery3d/filtershow/editors/BasicEditor.java
src/com/android/gallery3d/filtershow/filters/ImageFilter.java
src/com/android/gallery3d/filtershow/imageshow/MasterImage.java
src/com/android/gallery3d/filtershow/presets/ImagePreset.java

index 6541752..fd4eef0 100644 (file)
@@ -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();
     }
index eda10fc..2dbd1f3 100644 (file)
@@ -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;
         }
     }
 
index 3a15cf6..9e3a0e2 100644 (file)
@@ -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
index 96f98d5..a261031 100644 (file)
@@ -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());
+    }
 }
index f4b97b7..5e9ec7a 100644 (file)
@@ -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();
     }
+
 }
index e6e2953..d6a69af 100644 (file)
@@ -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;