diff options
Diffstat (limited to 'src/com/android/gallery3d/filtershow/cache/FilteringPipeline.java')
-rw-r--r-- | src/com/android/gallery3d/filtershow/cache/FilteringPipeline.java | 242 |
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) { |