From db5d060e8077f70d650e1ce56618f953114551e0 Mon Sep 17 00:00:00 2001 From: nicolasroard Date: Fri, 19 Jul 2013 14:45:32 -0700 Subject: Remove FilteringPipeline Reorganize things around the filtering service. - add HighresRenderingTask - add RenderingRequestTask - add UpdatePreviewTask Change-Id: I3da34fee8c624fb55311c3e1639857fc1bcdadad --- .../gallery3d/filtershow/FilterShowActivity.java | 12 +- .../gallery3d/filtershow/category/Action.java | 2 +- .../filtershow/imageshow/MasterImage.java | 15 +- .../filtershow/pipeline/FilteringPipeline.java | 238 --------------------- .../pipeline/HighresRenderingRequestTask.java | 90 ++++++++ .../filtershow/pipeline/ProcessingService.java | 63 +++++- .../filtershow/pipeline/ProcessingTask.java | 20 +- .../pipeline/ProcessingTaskController.java | 1 - .../filtershow/pipeline/RenderingRequest.java | 19 +- .../filtershow/pipeline/RenderingRequestTask.java | 81 +++++++ .../filtershow/pipeline/UpdatePreviewTask.java | 79 +++++++ 11 files changed, 356 insertions(+), 264 deletions(-) delete mode 100644 src/com/android/gallery3d/filtershow/pipeline/FilteringPipeline.java create mode 100644 src/com/android/gallery3d/filtershow/pipeline/HighresRenderingRequestTask.java create mode 100644 src/com/android/gallery3d/filtershow/pipeline/RenderingRequestTask.java create mode 100644 src/com/android/gallery3d/filtershow/pipeline/UpdatePreviewTask.java (limited to 'src/com/android') diff --git a/src/com/android/gallery3d/filtershow/FilterShowActivity.java b/src/com/android/gallery3d/filtershow/FilterShowActivity.java index 41d178411..9508bdc21 100644 --- a/src/com/android/gallery3d/filtershow/FilterShowActivity.java +++ b/src/com/android/gallery3d/filtershow/FilterShowActivity.java @@ -59,7 +59,6 @@ import com.android.gallery3d.R; import com.android.gallery3d.app.PhotoPage; import com.android.gallery3d.data.LocalAlbum; import com.android.gallery3d.filtershow.pipeline.CachingPipeline; -import com.android.gallery3d.filtershow.pipeline.FilteringPipeline; import com.android.gallery3d.filtershow.cache.ImageLoader; import com.android.gallery3d.filtershow.category.Action; import com.android.gallery3d.filtershow.category.CategoryAdapter; @@ -546,6 +545,7 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL master.getOrientation(), bounds); master.setOriginalBounds(bounds); master.setOriginalBitmapHighres(originalHires); + mBoundService.setOriginalBitmapHighres(originalHires); master.warnListeners(); } return true; @@ -555,10 +555,9 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL protected void onPostExecute(Boolean result) { Bitmap highresBitmap = MasterImage.getImage().getOriginalBitmapHighres(); if (highresBitmap != null) { - FilteringPipeline pipeline = FilteringPipeline.getPipeline(); float highResPreviewScale = (float) highresBitmap.getWidth() / (float) MasterImage.getImage().getOriginalBounds().width(); - pipeline.setHighResPreviewScaleFactor(highResPreviewScale); + mBoundService.setHighresPreviewScaleFactor(highResPreviewScale); } } } @@ -611,15 +610,14 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL imageShow.setVisibility(View.VISIBLE); Bitmap largeBitmap = MasterImage.getImage().getOriginalBitmapLarge(); - FilteringPipeline pipeline = FilteringPipeline.getPipeline(); - pipeline.setOriginal(largeBitmap); + mBoundService.setOriginalBitmap(largeBitmap); + float previewScale = (float) largeBitmap.getWidth() / (float) MasterImage.getImage().getOriginalBounds().width(); - pipeline.setPreviewScaleFactor(previewScale); + mBoundService.setPreviewScaleFactor(previewScale); if (!mShowingTinyPlanet) { mCategoryFiltersAdapter.removeTinyPlanet(); } - pipeline.turnOnPipeline(true); MasterImage.getImage().setOriginalGeometry(largeBitmap); mCategoryLooksAdapter.imageLoaded(); mCategoryBordersAdapter.imageLoaded(); diff --git a/src/com/android/gallery3d/filtershow/category/Action.java b/src/com/android/gallery3d/filtershow/category/Action.java index 71d6415b8..de282cc28 100644 --- a/src/com/android/gallery3d/filtershow/category/Action.java +++ b/src/com/android/gallery3d/filtershow/category/Action.java @@ -112,7 +112,7 @@ public class Action implements RenderingRequestCaller { if (bitmap != null && mRepresentation != null) { ImagePreset preset = new ImagePreset(); preset.addFilter(mRepresentation); - RenderingRequest.post(bitmap, + RenderingRequest.post(mContext, bitmap, preset, RenderingRequest.ICON_RENDERING, this); } } diff --git a/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java b/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java index 01fe3c159..45ee5d7a4 100644 --- a/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java +++ b/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java @@ -32,7 +32,6 @@ import com.android.gallery3d.filtershow.filters.ImageFilter; import com.android.gallery3d.filtershow.history.HistoryItem; import com.android.gallery3d.filtershow.history.HistoryManager; import com.android.gallery3d.filtershow.pipeline.Buffer; -import com.android.gallery3d.filtershow.pipeline.FilteringPipeline; import com.android.gallery3d.filtershow.pipeline.ImagePreset; import com.android.gallery3d.filtershow.pipeline.RenderingRequest; import com.android.gallery3d.filtershow.pipeline.RenderingRequestCaller; @@ -387,7 +386,7 @@ public class MasterImage implements RenderingRequestCaller { if (force || mGeometryOnlyPreset == null || !newPreset.same(mGeometryOnlyPreset)) { mGeometryOnlyPreset = newPreset; - RenderingRequest.post(getOriginalBitmapLarge(), + RenderingRequest.post(mActivity, getOriginalBitmapLarge(), mGeometryOnlyPreset, RenderingRequest.GEOMETRY_RENDERING, this); } } @@ -398,7 +397,7 @@ public class MasterImage implements RenderingRequestCaller { if (force || mFiltersOnlyPreset == null || !newPreset.same(mFiltersOnlyPreset)) { mFiltersOnlyPreset = newPreset; - RenderingRequest.post(MasterImage.getImage().getOriginalBitmapLarge(), + RenderingRequest.post(mActivity, MasterImage.getImage().getOriginalBitmapLarge(), mFiltersOnlyPreset, RenderingRequest.FILTERS_RENDERING, this); } } @@ -439,7 +438,7 @@ public class MasterImage implements RenderingRequestCaller { invalidateHighresPreview(); needsUpdatePartialPreview(); needsUpdateHighResPreview(); - FilteringPipeline.getPipeline().updatePreviewBuffer(); + mActivity.getProcessingService().updatePreviewBuffer(); } public void setImageShowSize(int w, int h) { @@ -477,7 +476,11 @@ public class MasterImage implements RenderingRequestCaller { if (!mSupportsHighRes) { return; } - RenderingRequest.post(null, mPreset, RenderingRequest.HIGHRES_RENDERING, this); + if (mActivity.getProcessingService() == null) { + return; + } + mActivity.getProcessingService().postHighresRenderingRequest(mPreset, + getScaleFactor(), this); invalidateHighresPreview(); } @@ -495,7 +498,7 @@ public class MasterImage implements RenderingRequestCaller { m.mapRect(dest, r); Rect bounds = new Rect(); dest.roundOut(bounds); - RenderingRequest.post(null, mPreset, RenderingRequest.PARTIAL_RENDERING, + RenderingRequest.post(mActivity, null, mPreset, RenderingRequest.PARTIAL_RENDERING, this, bounds, new Rect(0, 0, mImageShowSize.x, mImageShowSize.y)); invalidatePartialPreview(); } diff --git a/src/com/android/gallery3d/filtershow/pipeline/FilteringPipeline.java b/src/com/android/gallery3d/filtershow/pipeline/FilteringPipeline.java deleted file mode 100644 index 0e9b83d7f..000000000 --- a/src/com/android/gallery3d/filtershow/pipeline/FilteringPipeline.java +++ /dev/null @@ -1,238 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.gallery3d.filtershow.pipeline; - -import android.graphics.Bitmap; -import android.os.*; -import android.os.Process; -import android.util.Log; - -import com.android.gallery3d.filtershow.filters.FiltersManager; -import com.android.gallery3d.filtershow.imageshow.MasterImage; - -public class FilteringPipeline implements Handler.Callback { - - private static volatile FilteringPipeline sPipeline = null; - private static final String LOGTAG = "FilteringPipeline"; - private boolean DEBUG = false; - - private static long HIRES_DELAY = 300; // in ms - - private volatile boolean mPipelineIsOn = false; - - private CachingPipeline mAccessoryPipeline = null; - private CachingPipeline mPreviewPipeline = null; - private CachingPipeline mHighresPreviewPipeline = null; - - private HandlerThread mHandlerThread = null; - private final static int NEW_PRESET = 0; - private final static int NEW_RENDERING_REQUEST = 1; - private final static int COMPUTE_PRESET = 2; - private final static int COMPUTE_RENDERING_REQUEST = 3; - private final static int COMPUTE_PARTIAL_RENDERING_REQUEST = 4; - private final static int COMPUTE_HIGHRES_RENDERING_REQUEST = 5; - - private volatile boolean mHasUnhandledPreviewRequest = false; - - private String getType(int value) { - if (value == COMPUTE_RENDERING_REQUEST) { - return "COMPUTE_RENDERING_REQUEST"; - } - if (value == COMPUTE_PARTIAL_RENDERING_REQUEST) { - return "COMPUTE_PARTIAL_RENDERING_REQUEST"; - } - if (value == COMPUTE_HIGHRES_RENDERING_REQUEST) { - return "COMPUTE_HIGHRES_RENDERING_REQUEST"; - } - return "UNKNOWN TYPE"; - } - - private Handler mProcessingHandler = null; - private final Handler mUIHandler = new Handler() { - @Override - public void handleMessage(Message msg) { - switch (msg.what) { - case NEW_PRESET: { - MasterImage.getImage().notifyObservers(); - if (mHasUnhandledPreviewRequest) { - updatePreviewBuffer(); - } - break; - } - case NEW_RENDERING_REQUEST: { - RenderingRequest request = (RenderingRequest) msg.obj; - request.markAvailable(); - break; - } - } - } - }; - - @Override - public boolean handleMessage(Message msg) { - if (!mPipelineIsOn) { - return false; - } - switch (msg.what) { - case COMPUTE_PRESET: { - SharedBuffer buffer = MasterImage.getImage().getPreviewBuffer(); - SharedPreset preset = MasterImage.getImage().getPreviewPreset(); - ImagePreset renderingPreset = preset.dequeuePreset(); - if (renderingPreset != null) { - mPreviewPipeline.compute(buffer, renderingPreset, COMPUTE_PRESET); - // set the preset we used in the buffer for later inspection UI-side - buffer.getProducer().setPreset(renderingPreset); - buffer.getProducer().sync(); - buffer.swapProducer(); // push back the result - Message uimsg = mUIHandler.obtainMessage(NEW_PRESET); - mUIHandler.sendMessage(uimsg); - } - break; - } - case COMPUTE_RENDERING_REQUEST: - case COMPUTE_PARTIAL_RENDERING_REQUEST: - case COMPUTE_HIGHRES_RENDERING_REQUEST: { - - if (DEBUG) { - Log.v(LOGTAG, "Compute Request: " + getType(msg.what)); - } - - RenderingRequest request = (RenderingRequest) msg.obj; - if (msg.what == COMPUTE_HIGHRES_RENDERING_REQUEST) { - mHighresPreviewPipeline.render(request); - } else { - mAccessoryPipeline.render(request); - } - if (request.getBitmap() != null) { - Message uimsg = mUIHandler.obtainMessage(NEW_RENDERING_REQUEST); - uimsg.obj = request; - mUIHandler.sendMessage(uimsg); - } - break; - } - } - return false; - } - - private FilteringPipeline() { - mHandlerThread = new HandlerThread("FilteringPipeline", - Process.THREAD_PRIORITY_FOREGROUND); - mHandlerThread.start(); - mProcessingHandler = new Handler(mHandlerThread.getLooper(), this); - mAccessoryPipeline = new CachingPipeline( - FiltersManager.getManager(), "Accessory"); - mPreviewPipeline = new CachingPipeline( - FiltersManager.getPreviewManager(), "Preview"); - mHighresPreviewPipeline = new CachingPipeline( - FiltersManager.getHighresManager(), "Highres"); - } - - public synchronized static FilteringPipeline getPipeline() { - if (sPipeline == null) { - sPipeline = new FilteringPipeline(); - } - return sPipeline; - } - - public void setOriginal(Bitmap bitmap) { - if (mPipelineIsOn) { - Log.e(LOGTAG, "setOriginal called after pipeline initialization!"); - return; - } - mAccessoryPipeline.setOriginal(bitmap); - mPreviewPipeline.setOriginal(bitmap); - mHighresPreviewPipeline.setOriginal(bitmap); - } - - public void postRenderingRequest(RenderingRequest request) { - if (!mPipelineIsOn) { - return; - } - int type = COMPUTE_RENDERING_REQUEST; - if (request.getType() == RenderingRequest.PARTIAL_RENDERING) { - type = COMPUTE_PARTIAL_RENDERING_REQUEST; - } - if (request.getType() == RenderingRequest.HIGHRES_RENDERING) { - type = COMPUTE_HIGHRES_RENDERING_REQUEST; - if (MasterImage.getImage().getOriginalBitmapHighres() == null) { - return; - } - } - Message msg = mProcessingHandler.obtainMessage(type); - msg.obj = request; - if (type == COMPUTE_PARTIAL_RENDERING_REQUEST - || type == COMPUTE_HIGHRES_RENDERING_REQUEST) { - if (mProcessingHandler.hasMessages(msg.what)) { - mProcessingHandler.removeMessages(msg.what); - } - mProcessingHandler.sendMessageDelayed(msg, HIRES_DELAY); - } else { - mProcessingHandler.sendMessage(msg); - } - } - - public void updatePreviewBuffer() { - if (!mPipelineIsOn) { - return; - } - mHasUnhandledPreviewRequest = true; - mHighresPreviewPipeline.stop(); - if (mProcessingHandler.hasMessages(COMPUTE_PRESET)) { - return; - } - if (!mPreviewPipeline.needsRepaint()) { - return; - } - if (MasterImage.getImage().getPreset() == null) { - return; - } - Message msg = mProcessingHandler.obtainMessage(COMPUTE_PRESET); - msg.obj = MasterImage.getImage().getPreset(); - mHasUnhandledPreviewRequest = false; - mProcessingHandler.sendMessageAtFrontOfQueue(msg); - } - - public void setPreviewScaleFactor(float previewScaleFactor) { - mAccessoryPipeline.setPreviewScaleFactor(previewScaleFactor); - mPreviewPipeline.setPreviewScaleFactor(previewScaleFactor); - mHighresPreviewPipeline.setPreviewScaleFactor(previewScaleFactor); - } - - public void setHighResPreviewScaleFactor(float highResPreviewScaleFactor) { - mAccessoryPipeline.setHighResPreviewScaleFactor(highResPreviewScaleFactor); - mPreviewPipeline.setHighResPreviewScaleFactor(highResPreviewScaleFactor); - mHighresPreviewPipeline.setHighResPreviewScaleFactor(highResPreviewScaleFactor); - } - - public static synchronized void reset() { - sPipeline.mAccessoryPipeline.reset(); - sPipeline.mPreviewPipeline.reset(); - sPipeline.mHighresPreviewPipeline.reset(); - sPipeline.mHandlerThread.quit(); - sPipeline = null; - } - - public void turnOnPipeline(boolean t) { - mPipelineIsOn = t; - if (mPipelineIsOn) { - assert(mPreviewPipeline.isInitialized()); - assert(mAccessoryPipeline.isInitialized()); - assert(mHighresPreviewPipeline.isInitialized()); - updatePreviewBuffer(); - } - } -} diff --git a/src/com/android/gallery3d/filtershow/pipeline/HighresRenderingRequestTask.java b/src/com/android/gallery3d/filtershow/pipeline/HighresRenderingRequestTask.java new file mode 100644 index 000000000..af9f79ce3 --- /dev/null +++ b/src/com/android/gallery3d/filtershow/pipeline/HighresRenderingRequestTask.java @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.gallery3d.filtershow.pipeline; + +import android.graphics.Bitmap; +import com.android.gallery3d.filtershow.filters.FiltersManager; + +public class HighresRenderingRequestTask extends ProcessingTask { + + private CachingPipeline mHighresPreviewPipeline = null; + private boolean mPipelineIsOn = false; + + public void setHighresPreviewScaleFactor(float highResPreviewScale) { + mHighresPreviewPipeline.setHighResPreviewScaleFactor(highResPreviewScale); + } + + public void setPreviewScaleFactor(float previewScale) { + mHighresPreviewPipeline.setPreviewScaleFactor(previewScale); + } + + static class Render implements Request { + RenderingRequest request; + } + + static class RenderResult implements Result { + RenderingRequest request; + } + + public HighresRenderingRequestTask() { + mHighresPreviewPipeline = new CachingPipeline( + FiltersManager.getHighresManager(), "Highres"); + } + + public void setOriginal(Bitmap bitmap) { + mHighresPreviewPipeline.setOriginal(bitmap); + } + + public void setOriginalBitmapHighres(Bitmap originalHires) { + mPipelineIsOn = true; + } + + public void stop() { + mHighresPreviewPipeline.stop(); + } + + public void postRenderingRequest(RenderingRequest request) { + if (!mPipelineIsOn) { + return; + } + Render render = new Render(); + render.request = request; + postRequest(render); + } + + @Override + public Result doInBackground(Request message) { + RenderingRequest request = ((Render) message).request; + RenderResult result = null; + mHighresPreviewPipeline.render(request); + result = new RenderResult(); + result.request = request; + return result; + } + + @Override + public void onResult(Result message) { + if (message == null) { + return; + } + RenderingRequest request = ((RenderResult) message).request; + request.markAvailable(); + } + + @Override + public boolean isDelayedTask() { return true; } +} diff --git a/src/com/android/gallery3d/filtershow/pipeline/ProcessingService.java b/src/com/android/gallery3d/filtershow/pipeline/ProcessingService.java index 032024746..8f1b2a266 100644 --- a/src/com/android/gallery3d/filtershow/pipeline/ProcessingService.java +++ b/src/com/android/gallery3d/filtershow/pipeline/ProcessingService.java @@ -21,7 +21,6 @@ import android.app.NotificationManager; import android.app.Service; import android.content.Context; import android.content.Intent; -import android.content.ServiceConnection; import android.content.res.Resources; import android.graphics.Bitmap; import android.net.Uri; @@ -32,6 +31,7 @@ import com.android.gallery3d.R; import com.android.gallery3d.filtershow.FilterShowActivity; import com.android.gallery3d.filtershow.filters.FiltersManager; import com.android.gallery3d.filtershow.filters.ImageFilter; +import com.android.gallery3d.filtershow.imageshow.MasterImage; import com.android.gallery3d.filtershow.tools.SaveImage; import java.io.File; @@ -51,6 +51,9 @@ public class ProcessingService extends Service { private ProcessingTaskController mProcessingTaskController; private ImageSavingTask mImageSavingTask; + private UpdatePreviewTask mUpdatePreviewTask; + private HighresRenderingRequestTask mHighresRenderingRequestTask; + private RenderingRequestTask mRenderingRequestTask; private final IBinder mBinder = new LocalBinder(); private FilterShowActivity mFiltershowActivity; @@ -62,6 +65,50 @@ public class ProcessingService extends Service { mFiltershowActivity = filtershowActivity; } + public void setOriginalBitmap(Bitmap originalBitmap) { + if (mUpdatePreviewTask == null) { + return; + } + mUpdatePreviewTask.setOriginal(originalBitmap); + mHighresRenderingRequestTask.setOriginal(originalBitmap); + mRenderingRequestTask.setOriginal(originalBitmap); + } + + public void updatePreviewBuffer() { + mHighresRenderingRequestTask.stop(); + mUpdatePreviewTask.updatePreview(); + } + + public void postRenderingRequest(RenderingRequest request) { + mRenderingRequestTask.postRenderingRequest(request); + } + + public void postHighresRenderingRequest(ImagePreset preset, float scaleFactor, + RenderingRequestCaller caller) { + RenderingRequest request = new RenderingRequest(); + // TODO: use the triple buffer preset as UpdatePreviewTask does instead of creating a copy + ImagePreset passedPreset = new ImagePreset(preset); + request.setOriginalImagePreset(preset); + request.setScaleFactor(scaleFactor); + request.setImagePreset(passedPreset); + request.setType(RenderingRequest.HIGHRES_RENDERING); + request.setCaller(caller); + mHighresRenderingRequestTask.postRenderingRequest(request); + } + + public void setHighresPreviewScaleFactor(float highResPreviewScale) { + mHighresRenderingRequestTask.setHighresPreviewScaleFactor(highResPreviewScale); + } + + public void setPreviewScaleFactor(float previewScale) { + mHighresRenderingRequestTask.setPreviewScaleFactor(previewScale); + mRenderingRequestTask.setPreviewScaleFactor(previewScale); + } + + public void setOriginalBitmapHighres(Bitmap originalHires) { + mHighresRenderingRequestTask.setOriginalBitmapHighres(originalHires); + } + public class LocalBinder extends Binder { public ProcessingService getService() { return ProcessingService.this; @@ -89,7 +136,13 @@ public class ProcessingService extends Service { public void onCreate() { mProcessingTaskController = new ProcessingTaskController(this); mImageSavingTask = new ImageSavingTask(this); + mUpdatePreviewTask = new UpdatePreviewTask(); + mHighresRenderingRequestTask = new HighresRenderingRequestTask(); + mRenderingRequestTask = new RenderingRequestTask(); mProcessingTaskController.add(mImageSavingTask); + mProcessingTaskController.add(mUpdatePreviewTask); + mProcessingTaskController.add(mHighresRenderingRequestTask); + mProcessingTaskController.add(mRenderingRequestTask); setupPipeline(); } @@ -198,11 +251,15 @@ public class ProcessingService extends Service { filtersManager.addBorders(this); filtersManager.addTools(this); filtersManager.addEffects(); + + FiltersManager highresFiltersManager = FiltersManager.getHighresManager(); + highresFiltersManager.addLooks(this); + highresFiltersManager.addBorders(this); + highresFiltersManager.addTools(this); + highresFiltersManager.addEffects(); } private void tearDownPipeline() { - FilteringPipeline.getPipeline().turnOnPipeline(false); - FilteringPipeline.reset(); ImageFilter.resetStatics(); FiltersManager.getPreviewManager().freeRSFilterScripts(); FiltersManager.getManager().freeRSFilterScripts(); diff --git a/src/com/android/gallery3d/filtershow/pipeline/ProcessingTask.java b/src/com/android/gallery3d/filtershow/pipeline/ProcessingTask.java index c3687ee6a..8d3e8110f 100644 --- a/src/com/android/gallery3d/filtershow/pipeline/ProcessingTask.java +++ b/src/com/android/gallery3d/filtershow/pipeline/ProcessingTask.java @@ -25,15 +25,29 @@ public abstract class ProcessingTask { private Handler mProcessingHandler; private Handler mResultHandler; private int mType; + private static final int DELAY = 300; static interface Request {} static interface Update {} static interface Result {} - public void postRequest(Request message) { + public boolean postRequest(Request message) { Message msg = mProcessingHandler.obtainMessage(mType); msg.obj = message; - mProcessingHandler.sendMessage(msg); + if (isPriorityTask()) { + if (mProcessingHandler.hasMessages(getType())) { + return false; + } + mProcessingHandler.sendMessageAtFrontOfQueue(msg); + } else if (isDelayedTask()) { + if (mProcessingHandler.hasMessages(getType())) { + mProcessingHandler.removeMessages(getType()); + } + mProcessingHandler.sendMessageDelayed(msg, DELAY); + } else { + mProcessingHandler.sendMessage(msg); + } + return true; } public void postUpdate(Update message) { @@ -69,4 +83,6 @@ public abstract class ProcessingTask { public abstract Result doInBackground(Request message); public abstract void onResult(Result message); public void onUpdate(Update message) {} + public boolean isPriorityTask() { return false; } + public boolean isDelayedTask() { return false; } } diff --git a/src/com/android/gallery3d/filtershow/pipeline/ProcessingTaskController.java b/src/com/android/gallery3d/filtershow/pipeline/ProcessingTaskController.java index 218ea630a..b54bbb044 100644 --- a/src/com/android/gallery3d/filtershow/pipeline/ProcessingTaskController.java +++ b/src/com/android/gallery3d/filtershow/pipeline/ProcessingTaskController.java @@ -37,7 +37,6 @@ public class ProcessingTaskController implements Handler.Callback { public final static int UPDATE = 2; private final Handler mResultHandler = new Handler() { - @Override public void handleMessage(Message msg) { ProcessingTask task = mTasks.get(msg.what); diff --git a/src/com/android/gallery3d/filtershow/pipeline/RenderingRequest.java b/src/com/android/gallery3d/filtershow/pipeline/RenderingRequest.java index c2d3f1b50..ef4bb9bc0 100644 --- a/src/com/android/gallery3d/filtershow/pipeline/RenderingRequest.java +++ b/src/com/android/gallery3d/filtershow/pipeline/RenderingRequest.java @@ -16,9 +16,11 @@ package com.android.gallery3d.filtershow.pipeline; +import android.content.Context; import android.graphics.Bitmap; import android.graphics.Rect; import com.android.gallery3d.app.Log; +import com.android.gallery3d.filtershow.FilterShowActivity; import com.android.gallery3d.filtershow.filters.FiltersManager; import com.android.gallery3d.filtershow.imageshow.MasterImage; @@ -43,11 +45,12 @@ public class RenderingRequest { private static final Bitmap.Config mConfig = Bitmap.Config.ARGB_8888; - public static void post(Bitmap source, ImagePreset preset, int type, RenderingRequestCaller caller) { - RenderingRequest.post(source, preset, type, caller, null, null); + public static void post(Context context, Bitmap source, ImagePreset preset, + int type, RenderingRequestCaller caller) { + RenderingRequest.post(context, source, preset, type, caller, null, null); } - public static void post(Bitmap source, ImagePreset preset, int type, + public static void post(Context context, Bitmap source, ImagePreset preset, int type, RenderingRequestCaller caller, Rect bounds, Rect destination) { if (((type != PARTIAL_RENDERING && type != HIGHRES_RENDERING) && source == null) || preset == null || caller == null) { @@ -82,11 +85,15 @@ public class RenderingRequest { request.setImagePreset(passedPreset); request.setType(type); request.setCaller(caller); - request.post(); + request.post(context); } - public void post() { - FilteringPipeline.getPipeline().postRenderingRequest(this); + public void post(Context context) { + if (context instanceof FilterShowActivity) { + FilterShowActivity activity = (FilterShowActivity) context; + ProcessingService service = activity.getProcessingService(); + service.postRenderingRequest(this); + } } public void markAvailable() { diff --git a/src/com/android/gallery3d/filtershow/pipeline/RenderingRequestTask.java b/src/com/android/gallery3d/filtershow/pipeline/RenderingRequestTask.java new file mode 100644 index 000000000..7a83f7072 --- /dev/null +++ b/src/com/android/gallery3d/filtershow/pipeline/RenderingRequestTask.java @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.gallery3d.filtershow.pipeline; + +import android.graphics.Bitmap; +import com.android.gallery3d.filtershow.filters.FiltersManager; + +public class RenderingRequestTask extends ProcessingTask { + + private CachingPipeline mPreviewPipeline = null; + private boolean mPipelineIsOn = false; + + public void setPreviewScaleFactor(float previewScale) { + mPreviewPipeline.setPreviewScaleFactor(previewScale); + } + + static class Render implements Request { + RenderingRequest request; + } + + static class RenderResult implements Result { + RenderingRequest request; + } + + public RenderingRequestTask() { + mPreviewPipeline = new CachingPipeline( + FiltersManager.getManager(), "Normal"); + } + + public void setOriginal(Bitmap bitmap) { + mPreviewPipeline.setOriginal(bitmap); + mPipelineIsOn = true; + } + + public void stop() { + mPreviewPipeline.stop(); + } + + public void postRenderingRequest(RenderingRequest request) { + if (!mPipelineIsOn) { + return; + } + Render render = new Render(); + render.request = request; + postRequest(render); + } + + @Override + public Result doInBackground(Request message) { + RenderingRequest request = ((Render) message).request; + RenderResult result = null; + mPreviewPipeline.render(request); + result = new RenderResult(); + result.request = request; + return result; + } + + @Override + public void onResult(Result message) { + if (message == null) { + return; + } + RenderingRequest request = ((RenderResult) message).request; + request.markAvailable(); + } + +} diff --git a/src/com/android/gallery3d/filtershow/pipeline/UpdatePreviewTask.java b/src/com/android/gallery3d/filtershow/pipeline/UpdatePreviewTask.java new file mode 100644 index 000000000..406cc9bf5 --- /dev/null +++ b/src/com/android/gallery3d/filtershow/pipeline/UpdatePreviewTask.java @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.gallery3d.filtershow.pipeline; + +import android.graphics.Bitmap; +import com.android.gallery3d.filtershow.filters.FiltersManager; +import com.android.gallery3d.filtershow.imageshow.MasterImage; + +public class UpdatePreviewTask extends ProcessingTask { + private CachingPipeline mPreviewPipeline = null; + private boolean mHasUnhandledPreviewRequest = false; + private boolean mPipelineIsOn = false; + + public UpdatePreviewTask() { + mPreviewPipeline = new CachingPipeline( + FiltersManager.getPreviewManager(), "Preview"); + } + + public void setOriginal(Bitmap bitmap) { + mPreviewPipeline.setOriginal(bitmap); + mPipelineIsOn = true; + } + + public void updatePreview() { + if (!mPipelineIsOn) { + return; + } + mHasUnhandledPreviewRequest = true; + if (postRequest(null)) { + mHasUnhandledPreviewRequest = false; + } + } + + @Override + public boolean isPriorityTask() { + return true; + } + + @Override + public Result doInBackground(Request message) { + SharedBuffer buffer = MasterImage.getImage().getPreviewBuffer(); + SharedPreset preset = MasterImage.getImage().getPreviewPreset(); + ImagePreset renderingPreset = preset.dequeuePreset(); + if (renderingPreset != null) { + mPreviewPipeline.compute(buffer, renderingPreset, 0); + // set the preset we used in the buffer for later inspection UI-side + buffer.getProducer().setPreset(renderingPreset); + buffer.getProducer().sync(); + buffer.swapProducer(); // push back the result + } + return null; + } + + @Override + public void onResult(Result message) { + MasterImage.getImage().notifyObservers(); + if (mHasUnhandledPreviewRequest) { + updatePreview(); + } + } + + public void setPipelineIsOn(boolean pipelineIsOn) { + mPipelineIsOn = pipelineIsOn; + } +} -- cgit v1.2.3