summaryrefslogtreecommitdiffstats
path: root/src/com/android/gallery3d
diff options
context:
space:
mode:
authornicolasroard <nicolasroard@google.com>2013-07-19 22:51:46 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2013-07-19 22:51:46 +0000
commit76d39416cba8f8fe9f09f3387c324895d72b7afc (patch)
tree0e962cbec3bd3a05dad7998689b937115d075051 /src/com/android/gallery3d
parentc19f078c8a65c0b90b1d1b88e6f60f521a54ed1d (diff)
parent58019558c7465a8dce8dfb49d68292a296c6b408 (diff)
downloadandroid_packages_apps_Snap-76d39416cba8f8fe9f09f3387c324895d72b7afc.tar.gz
android_packages_apps_Snap-76d39416cba8f8fe9f09f3387c324895d72b7afc.tar.bz2
android_packages_apps_Snap-76d39416cba8f8fe9f09f3387c324895d72b7afc.zip
Merge "Remove FilteringPipeline" into gb-ub-photos-carlsbad
Diffstat (limited to 'src/com/android/gallery3d')
-rw-r--r--src/com/android/gallery3d/filtershow/FilterShowActivity.java12
-rw-r--r--src/com/android/gallery3d/filtershow/category/Action.java2
-rw-r--r--src/com/android/gallery3d/filtershow/imageshow/MasterImage.java15
-rw-r--r--src/com/android/gallery3d/filtershow/pipeline/FilteringPipeline.java238
-rw-r--r--src/com/android/gallery3d/filtershow/pipeline/HighresRenderingRequestTask.java90
-rw-r--r--src/com/android/gallery3d/filtershow/pipeline/ProcessingService.java63
-rw-r--r--src/com/android/gallery3d/filtershow/pipeline/ProcessingTask.java20
-rw-r--r--src/com/android/gallery3d/filtershow/pipeline/ProcessingTaskController.java1
-rw-r--r--src/com/android/gallery3d/filtershow/pipeline/RenderingRequest.java19
-rw-r--r--src/com/android/gallery3d/filtershow/pipeline/RenderingRequestTask.java81
-rw-r--r--src/com/android/gallery3d/filtershow/pipeline/UpdatePreviewTask.java79
11 files changed, 356 insertions, 264 deletions
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;
+ }
+}