summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornicolasroard <nicolasroard@google.com>2013-01-29 13:57:42 -0800
committernicolasroard <nicolasroard@google.com>2013-01-30 15:43:01 -0800
commit518d1193692fadaf91a2f5b174735d45bda2c4ab (patch)
treef89f3859c880f8dddb164a5e1db5caaed0397b70
parent45e42d25b8fa11f9b9615244a8f0bc68de2e4a8c (diff)
downloadandroid_packages_apps_Snap-518d1193692fadaf91a2f5b174735d45bda2c4ab.tar.gz
android_packages_apps_Snap-518d1193692fadaf91a2f5b174735d45bda2c4ab.tar.bz2
android_packages_apps_Snap-518d1193692fadaf91a2f5b174735d45bda2c4ab.zip
Clean up invalidate / redraw loop
Move the recopy to the main thread Change-Id: I8c94179e292f5679b7c817b6bd5000ee384b83ce
-rw-r--r--src/com/android/gallery3d/filtershow/FilterShowActivity.java10
-rw-r--r--src/com/android/gallery3d/filtershow/cache/FilteringPipeline.java112
-rw-r--r--src/com/android/gallery3d/filtershow/editors/BasicEditor.java2
-rw-r--r--src/com/android/gallery3d/filtershow/filters/ImageFilter.java3
-rw-r--r--src/com/android/gallery3d/filtershow/imageshow/MasterImage.java23
-rw-r--r--src/com/android/gallery3d/filtershow/presets/ImagePreset.java9
6 files changed, 93 insertions, 66 deletions
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;