summaryrefslogtreecommitdiffstats
path: root/src/com/android/gallery3d/filtershow/cache/FilteringPipeline.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/gallery3d/filtershow/cache/FilteringPipeline.java')
-rw-r--r--src/com/android/gallery3d/filtershow/cache/FilteringPipeline.java242
1 files changed, 104 insertions, 138 deletions
diff --git a/src/com/android/gallery3d/filtershow/cache/FilteringPipeline.java b/src/com/android/gallery3d/filtershow/cache/FilteringPipeline.java
index d415250a4..419abe85d 100644
--- a/src/com/android/gallery3d/filtershow/cache/FilteringPipeline.java
+++ b/src/com/android/gallery3d/filtershow/cache/FilteringPipeline.java
@@ -22,6 +22,8 @@ import android.os.Process;
import android.support.v8.renderscript.*;
import android.util.Log;
+import com.android.gallery3d.filtershow.filters.BaseFiltersManager;
+import com.android.gallery3d.filtershow.filters.FiltersManager;
import com.android.gallery3d.filtershow.filters.ImageFilterRS;
import com.android.gallery3d.filtershow.imageshow.GeometryMetadata;
import com.android.gallery3d.filtershow.imageshow.MasterImage;
@@ -31,7 +33,6 @@ public class FilteringPipeline implements Handler.Callback {
private final static FilteringPipeline gPipeline = new FilteringPipeline();
private static final String LOGTAG = "FilteringPipeline";
- private ImagePreset mPreviousPreset = null;
private ImagePreset mPreviousGeometryPreset = null;
private ImagePreset mPreviousFiltersPreset = null;
private GeometryMetadata mPreviousGeometry = null;
@@ -44,11 +45,9 @@ public class FilteringPipeline implements Handler.Callback {
private HandlerThread mHandlerThread = null;
private final static int NEW_PRESET = 0;
- 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 final static int NEW_RENDERING_REQUEST = 1;
+ private final static int COMPUTE_PRESET = 2;
+ private final static int COMPUTE_RENDERING_REQUEST = 3;
private Handler mProcessingHandler = null;
private final Handler mUIHandler = new Handler() {
@@ -61,16 +60,9 @@ public class FilteringPipeline implements Handler.Callback {
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();
+ case NEW_RENDERING_REQUEST: {
+ RenderingRequest request = (RenderingRequest) msg.obj;
+ request.markAvailable();
break;
}
}
@@ -89,21 +81,11 @@ public class FilteringPipeline implements Handler.Callback {
mUIHandler.sendMessage(uimsg);
break;
}
- case COMPUTE_GEOMETRY_PRESET: {
- ImagePreset preset = (ImagePreset) msg.obj;
- TripleBufferBitmap buffer = MasterImage.getImage().getGeometryOnlyBuffer();
- compute(buffer, preset, COMPUTE_GEOMETRY_PRESET);
- buffer.swapProducer();
- Message uimsg = mUIHandler.obtainMessage(NEW_GEOMETRY_PRESET);
- mUIHandler.sendMessage(uimsg);
- break;
- }
- case COMPUTE_FILTERS_PRESET: {
- ImagePreset preset = (ImagePreset) msg.obj;
- TripleBufferBitmap buffer = MasterImage.getImage().getFiltersOnlyBuffer();
- compute(buffer, preset, COMPUTE_FILTERS_PRESET);
- buffer.swapProducer();
- Message uimsg = mUIHandler.obtainMessage(NEW_FILTERS_PRESET);
+ case COMPUTE_RENDERING_REQUEST: {
+ RenderingRequest request = (RenderingRequest) msg.obj;
+ render(request);
+ Message uimsg = mUIHandler.obtainMessage(NEW_RENDERING_REQUEST);
+ uimsg.obj = request;
mUIHandler.sendMessage(uimsg);
break;
}
@@ -116,7 +98,6 @@ public class FilteringPipeline implements Handler.Callback {
private float mResizeFactor = 1.0f;
private long mResizeTime = 0;
- private Allocation mOriginalBitmapAllocation = null;
private Allocation mOriginalAllocation = null;
private Allocation mFiltersOnlyOriginalAllocation = null;
@@ -136,8 +117,6 @@ public class FilteringPipeline implements Handler.Callback {
Log.v(LOGTAG,"setOriginal, size " + bitmap.getWidth() + " x " + bitmap.getHeight());
updateOriginalAllocation(MasterImage.getImage().getPreset());
updatePreviewBuffer();
- updateFiltersOnlyPreviewBuffer();
- updateGeometryOnlyPreviewBuffer();
}
public synchronized boolean updateOriginalAllocation(ImagePreset preset) {
@@ -153,10 +132,16 @@ public class FilteringPipeline implements Handler.Callback {
}
mResizedOriginalBitmap = Bitmap.createScaledBitmap(mOriginalBitmap, w, h, true);
*/
+
GeometryMetadata geometry = preset.getGeometry();
if (mPreviousGeometry != null && geometry.equals(mPreviousGeometry)) {
return false;
}
+
+ if (DEBUG) {
+ Log.v(LOGTAG, "geometry has changed");
+ }
+
RenderScript RS = ImageFilterRS.getRenderScriptContext();
if (mFiltersOnlyOriginalAllocation != null) {
mFiltersOnlyOriginalAllocation.destroy();
@@ -169,83 +154,113 @@ public class FilteringPipeline implements Handler.Callback {
mResizedOriginalBitmap = preset.applyGeometry(mOriginalBitmap);
mOriginalAllocation = Allocation.createFromBitmap(RS, mResizedOriginalBitmap,
Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT);
+
mPreviousGeometry = new GeometryMetadata(geometry);
+
+ FiltersManager.getManager().resetBitmapsRS();
return true;
}
- public synchronized void updatePreviewBuffer() {
+ public void postRenderingRequest(RenderingRequest request) {
if (mOriginalAllocation == null) {
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;
+ Message msg = mProcessingHandler.obtainMessage(COMPUTE_RENDERING_REQUEST);
+ msg.obj = request;
mProcessingHandler.sendMessage(msg);
}
- public void updateGeometryOnlyPreviewBuffer() {
+ public synchronized void updatePreviewBuffer() {
if (mOriginalAllocation == null) {
return;
}
- if (!needsGeometryRepaint()) {
+ if (mProcessingHandler.hasMessages(COMPUTE_PRESET)) {
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);
- }
-
- public void updateFiltersOnlyPreviewBuffer() {
- if (mOriginalAllocation == null) {
+ if (!needsRepaint()) {
return;
}
- if (!needsFiltersRepaint()) {
+ if (MasterImage.getImage().getPreset() == null) {
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;
+ Message msg = mProcessingHandler.obtainMessage(COMPUTE_PRESET);
+ msg.obj = MasterImage.getImage().getPreset();
mProcessingHandler.sendMessage(msg);
}
private void setPresetParameters(ImagePreset preset) {
preset.setScaleFactor(mPreviewScaleFactor);
if (mPreviewScaleFactor < 1.0f) {
- preset.setIsHighQuality(false);
+ preset.setQuality(ImagePreset.QUALITY_PREVIEW);
} else {
- preset.setIsHighQuality(true);
+ preset.setQuality(ImagePreset.QUALITY_PREVIEW);
+ }
+ }
+
+ private String getType(RenderingRequest request) {
+ if (request.getType() == RenderingRequest.ICON_RENDERING) {
+ return "ICON_RENDERING";
+ }
+ if (request.getType() == RenderingRequest.FILTERS_RENDERING) {
+ return "FILTERS_RENDERING";
+ }
+ if (request.getType() == RenderingRequest.FULL_RENDERING) {
+ return "FULL_RENDERING";
+ }
+ if (request.getType() == RenderingRequest.GEOMETRY_RENDERING) {
+ return "GEOMETRY_RENDERING";
+ }
+ return "UNKNOWN TYPE!";
+ }
+
+ private void render(RenderingRequest request) {
+ if (request.getBitmap() == null
+ || request.getImagePreset() == null) {
+ return;
+ }
+ if (DEBUG) {
+ Log.v(LOGTAG, "render image of type " + getType(request));
+ }
+
+ Bitmap bitmap = request.getBitmap();
+ ImagePreset preset = request.getImagePreset();
+ setPresetParameters(preset);
+ if (request.getType() == RenderingRequest.FILTERS_RENDERING) {
+ FiltersManager.getManager().resetBitmapsRS();
+ }
+
+ if (request.getType() != RenderingRequest.ICON_RENDERING) {
+ updateOriginalAllocation(preset);
+ }
+ if (DEBUG) {
+ Log.v(LOGTAG, "after update, req bitmap (" + bitmap.getWidth() + "x" + bitmap.getHeight()
+ +" ? resizeOriginal (" + mResizedOriginalBitmap.getWidth() + "x"
+ + mResizedOriginalBitmap.getHeight());
+ }
+ if (request.getType() == RenderingRequest.FULL_RENDERING
+ || request.getType() == RenderingRequest.GEOMETRY_RENDERING) {
+ mOriginalAllocation.copyTo(bitmap);
+ } else if (request.getType() == RenderingRequest.FILTERS_RENDERING) {
+ mFiltersOnlyOriginalAllocation.copyTo(bitmap);
+ }
+ if (request.getType() == RenderingRequest.FULL_RENDERING
+ || request.getType() == RenderingRequest.FILTERS_RENDERING
+ || request.getType() == RenderingRequest.ICON_RENDERING) {
+ Bitmap bmp = preset.apply(bitmap);
+ request.setBitmap(bmp);
+ }
+ if (request.getType() == RenderingRequest.FILTERS_RENDERING) {
+ FiltersManager.getManager().resetBitmapsRS();
}
}
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;
+ if (DEBUG) {
+ Log.v(LOGTAG, "compute preset " + preset);
+ preset.showFilters();
}
+
+ String thread = Thread.currentThread().getName();
long time = System.currentTimeMillis();
if (updateOriginalAllocation(preset)) {
buffer.updateBitmaps(mResizedOriginalBitmap);
@@ -253,30 +268,15 @@ public class FilteringPipeline implements Handler.Callback {
Bitmap bitmap = buffer.getProducer();
long time2 = System.currentTimeMillis();
- if (type != COMPUTE_FILTERS_PRESET) {
- if (bitmap == null || (bitmap.getWidth() != mResizedOriginalBitmap.getWidth())
- || (bitmap.getHeight() != mResizedOriginalBitmap.getHeight())) {
- buffer.updateBitmaps(mResizedOriginalBitmap);
- bitmap = buffer.getProducer();
- }
- mOriginalAllocation.copyTo(bitmap);
- } else {
- if (bitmap == null || (bitmap.getWidth() != mOriginalBitmap.getWidth())
- || (bitmap.getHeight() != mOriginalBitmap.getHeight())) {
- buffer.updateBitmaps(mOriginalBitmap);
- bitmap = buffer.getProducer();
- }
- mFiltersOnlyOriginalAllocation.copyTo(bitmap);
- }
-
- if (mOriginalAllocation == null || bitmap == null) {
- Log.v(LOGTAG, "exiting compute because mOriginalAllocation: " + mOriginalAllocation + " or bitmap: " + bitmap);
- return;
+ if (bitmap == null || (bitmap.getWidth() != mResizedOriginalBitmap.getWidth())
+ || (bitmap.getHeight() != mResizedOriginalBitmap.getHeight())) {
+ buffer.updateBitmaps(mResizedOriginalBitmap);
+ bitmap = buffer.getProducer();
}
+ mOriginalAllocation.copyTo(bitmap);
- if (type != COMPUTE_GEOMETRY_PRESET) {
- bitmap = preset.apply(bitmap);
- }
+ setPresetParameters(preset);
+ bitmap = preset.apply(bitmap);
time = System.currentTimeMillis() - time;
time2 = System.currentTimeMillis() - time2;
@@ -286,50 +286,16 @@ public class FilteringPipeline implements Handler.Callback {
+ ") took " + time + " ms, " + time2 + " ms for the filter, on thread " + thread);
}
if (type == COMPUTE_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 = preset;
- } else if (type == COMPUTE_FILTERS_PRESET) {
- mPreviousFiltersPreset = preset;
}
}
private synchronized boolean needsRepaint() {
- ImagePreset preset = MasterImage.getImage().getPreset();
- if (preset == null || mPreviousPreset == null) {
- return true;
- }
- if (preset.equals(mPreviousPreset)) {
- return false;
- }
- return true;
- }
-
- private synchronized boolean needsGeometryRepaint() {
- ImagePreset preset = MasterImage.getImage().getPreset();
- if (preset == null || mPreviousGeometry == null || mPreviousGeometryPreset == null) {
- return true;
- }
- GeometryMetadata geometry = preset.getGeometry();
- if (geometry.equals(mPreviousGeometryPreset.getGeometry())) {
- return false;
- }
- return true;
- }
-
- private synchronized boolean needsFiltersRepaint() {
- ImagePreset preset = MasterImage.getImage().getPreset();
- if (preset == null || mPreviousFiltersPreset == null) {
- return true;
- }
- if (preset.equals(mPreviousFiltersPreset)) {
- return false;
- }
- return true;
+ TripleBufferBitmap buffer = MasterImage.getImage().getDoubleBuffer();
+ return buffer.checkRepaintNeeded();
}
public void setPreviewScaleFactor(float previewScaleFactor) {