summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authornicolasroard <nicolasroard@google.com>2013-08-01 16:22:30 -0700
committernicolasroard <nicolasroard@google.com>2013-08-07 14:12:26 -0700
commit430e46b06f8e7ee1ca3e7ecdcef3e0a978637c03 (patch)
tree5c679a659c48c718625d1c5a5049009927a2c617 /src
parent5843ba18bfd1ed81bdfde267af550aec30936a58 (diff)
downloadandroid_packages_apps_Gallery2-430e46b06f8e7ee1ca3e7ecdcef3e0a978637c03.tar.gz
android_packages_apps_Gallery2-430e46b06f8e7ee1ca3e7ecdcef3e0a978637c03.tar.bz2
android_packages_apps_Gallery2-430e46b06f8e7ee1ca3e7ecdcef3e0a978637c03.zip
Fix full res zoom
Also add filters merging in the cache. Change-Id: Ic34c918b732159f3703cd83d30de907fdbbcb451
Diffstat (limited to 'src')
-rw-r--r--src/com/android/gallery3d/filtershow/editors/Editor.java3
-rw-r--r--src/com/android/gallery3d/filtershow/filters/FilterCropRepresentation.java1
-rw-r--r--src/com/android/gallery3d/filtershow/filters/FilterMirrorRepresentation.java1
-rw-r--r--src/com/android/gallery3d/filtershow/filters/FilterRepresentation.java9
-rw-r--r--src/com/android/gallery3d/filtershow/filters/FilterRotateRepresentation.java1
-rw-r--r--src/com/android/gallery3d/filtershow/filters/FilterStraightenRepresentation.java1
-rw-r--r--src/com/android/gallery3d/filtershow/filters/FilterUserPresetRepresentation.java1
-rw-r--r--src/com/android/gallery3d/filtershow/imageshow/GeometryMathUtils.java34
-rw-r--r--src/com/android/gallery3d/filtershow/imageshow/ImageShow.java19
-rw-r--r--src/com/android/gallery3d/filtershow/imageshow/ImageStraighten.java2
-rw-r--r--src/com/android/gallery3d/filtershow/imageshow/MasterImage.java20
-rw-r--r--src/com/android/gallery3d/filtershow/pipeline/CacheProcessing.java199
-rw-r--r--src/com/android/gallery3d/filtershow/pipeline/CachingPipeline.java1
-rw-r--r--src/com/android/gallery3d/filtershow/pipeline/FilterEnvironment.java12
-rw-r--r--src/com/android/gallery3d/filtershow/pipeline/FullresRenderingRequestTask.java67
-rw-r--r--src/com/android/gallery3d/filtershow/pipeline/ImagePreset.java17
-rw-r--r--src/com/android/gallery3d/filtershow/pipeline/ProcessingService.java23
17 files changed, 311 insertions, 100 deletions
diff --git a/src/com/android/gallery3d/filtershow/editors/Editor.java b/src/com/android/gallery3d/filtershow/editors/Editor.java
index a9e56e0c1..51df5b520 100644
--- a/src/com/android/gallery3d/filtershow/editors/Editor.java
+++ b/src/com/android/gallery3d/filtershow/editors/Editor.java
@@ -94,6 +94,7 @@ public class Editor implements OnSeekBarChangeListener, SwapButton.SwapButtonLis
mEditTitle = editTitle;
mFilterTitle = stateButton;
mButton = editTitle;
+ MasterImage.getImage().resetGeometryImages();
setMenuIcon(true);
setUtilityPanelUI(actionButton, editControl);
}
@@ -240,7 +241,7 @@ public class Editor implements OnSeekBarChangeListener, SwapButton.SwapButtonLis
}
if (mChangesGeometry) {
// Regenerate both the filtered and the geometry-only bitmaps
- MasterImage.getImage().updatePresets(true);
+ MasterImage.getImage().resetGeometryImages();
} else {
// Regenerate only the filtered bitmap.
MasterImage.getImage().invalidateFiltersOnly();
diff --git a/src/com/android/gallery3d/filtershow/filters/FilterCropRepresentation.java b/src/com/android/gallery3d/filtershow/filters/FilterCropRepresentation.java
index c1bd7b3bb..ec4b57385 100644
--- a/src/com/android/gallery3d/filtershow/filters/FilterCropRepresentation.java
+++ b/src/com/android/gallery3d/filtershow/filters/FilterCropRepresentation.java
@@ -40,6 +40,7 @@ public class FilterCropRepresentation extends FilterRepresentation {
setShowParameterValue(true);
setFilterClass(FilterCropRepresentation.class);
setFilterType(FilterRepresentation.TYPE_GEOMETRY);
+ setSupportsPartialRendering(true);
setTextId(R.string.crop);
setEditorId(EditorCrop.ID);
setCrop(crop);
diff --git a/src/com/android/gallery3d/filtershow/filters/FilterMirrorRepresentation.java b/src/com/android/gallery3d/filtershow/filters/FilterMirrorRepresentation.java
index 8dcff0d16..d8d0709ed 100644
--- a/src/com/android/gallery3d/filtershow/filters/FilterMirrorRepresentation.java
+++ b/src/com/android/gallery3d/filtershow/filters/FilterMirrorRepresentation.java
@@ -66,6 +66,7 @@ public class FilterMirrorRepresentation extends FilterRepresentation {
setShowParameterValue(true);
setFilterClass(FilterMirrorRepresentation.class);
setFilterType(FilterRepresentation.TYPE_GEOMETRY);
+ setSupportsPartialRendering(true);
setTextId(R.string.mirror);
setEditorId(EditorMirror.ID);
setMirror(mirror);
diff --git a/src/com/android/gallery3d/filtershow/filters/FilterRepresentation.java b/src/com/android/gallery3d/filtershow/filters/FilterRepresentation.java
index 5b33ffba5..cc7ec881e 100644
--- a/src/com/android/gallery3d/filtershow/filters/FilterRepresentation.java
+++ b/src/com/android/gallery3d/filtershow/filters/FilterRepresentation.java
@@ -127,7 +127,7 @@ public class FilterRepresentation {
}
public boolean supportsPartialRendering() {
- return false && mSupportsPartialRendering; // disable for now
+ return mSupportsPartialRendering;
}
public void setSupportsPartialRendering(boolean value) {
@@ -259,4 +259,11 @@ public class FilterRepresentation {
public int getStyle() {
return -1;
}
+
+ public boolean canMergeWith(FilterRepresentation representation) {
+ if (representation.getFilterType() == FilterRepresentation.TYPE_GEOMETRY) {
+ return true;
+ }
+ return false;
+ }
}
diff --git a/src/com/android/gallery3d/filtershow/filters/FilterRotateRepresentation.java b/src/com/android/gallery3d/filtershow/filters/FilterRotateRepresentation.java
index eb89de036..b6f95d843 100644
--- a/src/com/android/gallery3d/filtershow/filters/FilterRotateRepresentation.java
+++ b/src/com/android/gallery3d/filtershow/filters/FilterRotateRepresentation.java
@@ -66,6 +66,7 @@ public class FilterRotateRepresentation extends FilterRepresentation {
setShowParameterValue(true);
setFilterClass(FilterRotateRepresentation.class);
setFilterType(FilterRepresentation.TYPE_GEOMETRY);
+ setSupportsPartialRendering(true);
setTextId(R.string.rotate);
setEditorId(EditorRotate.ID);
setRotation(rotation);
diff --git a/src/com/android/gallery3d/filtershow/filters/FilterStraightenRepresentation.java b/src/com/android/gallery3d/filtershow/filters/FilterStraightenRepresentation.java
index 94c9497fc..4769b36ba 100644
--- a/src/com/android/gallery3d/filtershow/filters/FilterStraightenRepresentation.java
+++ b/src/com/android/gallery3d/filtershow/filters/FilterStraightenRepresentation.java
@@ -40,6 +40,7 @@ public class FilterStraightenRepresentation extends FilterRepresentation {
setShowParameterValue(true);
setFilterClass(FilterStraightenRepresentation.class);
setFilterType(FilterRepresentation.TYPE_GEOMETRY);
+ setSupportsPartialRendering(true);
setTextId(R.string.straighten);
setEditorId(EditorStraighten.ID);
setStraighten(straighten);
diff --git a/src/com/android/gallery3d/filtershow/filters/FilterUserPresetRepresentation.java b/src/com/android/gallery3d/filtershow/filters/FilterUserPresetRepresentation.java
index dfdb6fcf0..9f3fb45fd 100644
--- a/src/com/android/gallery3d/filtershow/filters/FilterUserPresetRepresentation.java
+++ b/src/com/android/gallery3d/filtershow/filters/FilterUserPresetRepresentation.java
@@ -28,6 +28,7 @@ public class FilterUserPresetRepresentation extends FilterRepresentation {
super(name);
setEditorId(ImageOnlyEditor.ID);
setFilterType(FilterRepresentation.TYPE_FX);
+ setSupportsPartialRendering(true);
mPreset = preset;
mId = id;
}
diff --git a/src/com/android/gallery3d/filtershow/imageshow/GeometryMathUtils.java b/src/com/android/gallery3d/filtershow/imageshow/GeometryMathUtils.java
index 81394f142..8358e1a55 100644
--- a/src/com/android/gallery3d/filtershow/imageshow/GeometryMathUtils.java
+++ b/src/com/android/gallery3d/filtershow/imageshow/GeometryMathUtils.java
@@ -307,6 +307,40 @@ public final class GeometryMathUtils {
bmapDimens.height(), viewWidth, viewHeight);
}
+ public static Matrix getPartialToScreenMatrix(Collection<FilterRepresentation> geometry,
+ Rect originalBounds, float w, float h,
+ float pw, float ph) {
+ GeometryHolder holder = unpackGeometry(geometry);
+ RectF rCrop = new RectF(0, 0, originalBounds.width(), originalBounds.height());
+ float angle = holder.straighten;
+ int rotation = holder.rotation.value();
+
+ ImageStraighten.getUntranslatedStraightenCropBounds(rCrop, angle);
+ float dx = (w - pw) / 2f;
+ float dy = (h - ph) / 2f;
+ Matrix compensation = new Matrix();
+ compensation.postTranslate(dx, dy);
+ float cScale = originalBounds.width() / rCrop.width();
+ if (rCrop.width() < rCrop.height()) {
+ cScale = originalBounds.height() / rCrop.height();
+ }
+ float scale = w / pw;
+ if (w < h) {
+ scale = h / ph;
+ }
+ scale = scale * cScale;
+ float cx = w / 2f;
+ float cy = h / 2f;
+
+ compensation.postScale(scale, scale, cx, cy);
+ compensation.postRotate(angle, cx, cy);
+ compensation.postRotate(rotation, cx, cy);
+ compensation.postTranslate(-cx, -cy);
+ concatMirrorMatrix(compensation, holder.mirror);
+ compensation.postTranslate(cx, cy);
+ return compensation;
+ }
+
public static Matrix getOriginalToScreen(GeometryHolder holder, boolean rotate,
float originalWidth,
float originalHeight, float viewWidth, float viewHeight) {
diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java b/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java
index 6278b2ad4..020a8b3d5 100644
--- a/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java
+++ b/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java
@@ -37,11 +37,15 @@ import android.widget.LinearLayout;
import com.android.gallery3d.R;
import com.android.gallery3d.filtershow.FilterShowActivity;
+import com.android.gallery3d.filtershow.filters.FilterRepresentation;
import com.android.gallery3d.filtershow.filters.ImageFilter;
import com.android.gallery3d.filtershow.pipeline.ImagePreset;
import com.android.gallery3d.filtershow.tools.SaveImage;
import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Vector;
public class ImageShow extends View implements OnGestureListener,
ScaleGestureDetector.OnScaleGestureListener,
@@ -226,9 +230,16 @@ public class ImageShow extends View implements OnGestureListener,
Bitmap partialPreview = MasterImage.getImage().getPartialImage();
if (partialPreview != null) {
- Rect src = new Rect(0, 0, partialPreview.getWidth(), partialPreview.getHeight());
- Rect dest = new Rect(0, 0, getWidth(), getHeight());
- canvas.drawBitmap(partialPreview, src, dest, mPaint);
+ canvas.save();
+ Rect originalBounds = MasterImage.getImage().getOriginalBounds();
+ Collection<FilterRepresentation> geo = MasterImage.getImage().getPreset()
+ .getGeometryFilters();
+
+ Matrix compensation = GeometryMathUtils.getPartialToScreenMatrix(geo,
+ originalBounds, getWidth(), getHeight(),
+ partialPreview.getWidth(), partialPreview.getHeight());
+ canvas.drawBitmap(partialPreview, compensation, null);
+ canvas.restore();
}
canvas.save();
@@ -241,7 +252,7 @@ public class ImageShow extends View implements OnGestureListener,
}
public void resetImageCaches(ImageShow caller) {
- MasterImage.getImage().updatePresets(true);
+ MasterImage.getImage().resetGeometryImages();
}
public Bitmap getFiltersOnlyImage() {
diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageStraighten.java b/src/com/android/gallery3d/filtershow/imageshow/ImageStraighten.java
index ff75dcc09..d7fea5f3b 100644
--- a/src/com/android/gallery3d/filtershow/imageshow/ImageStraighten.java
+++ b/src/com/android/gallery3d/filtershow/imageshow/ImageStraighten.java
@@ -152,7 +152,7 @@ public class ImageStraighten extends ImageShow {
mAngle = Math.min(MAX_STRAIGHTEN_ANGLE, mAngle);
}
- private static void getUntranslatedStraightenCropBounds(RectF outRect, float straightenAngle) {
+ public static void getUntranslatedStraightenCropBounds(RectF outRect, float straightenAngle) {
float deg = straightenAngle;
if (deg < 0) {
deg = -deg;
diff --git a/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java b/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java
index 92e57bfc1..c75465ec0 100644
--- a/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java
+++ b/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java
@@ -327,29 +327,32 @@ public class MasterImage implements RenderingRequestCaller {
}
}
- public void updatePresets(boolean force) {
- if (force || mGeometryOnlyPreset == null) {
+ public void resetGeometryImages() {
+ if (mGeometryOnlyPreset == null) {
ImagePreset newPreset = new ImagePreset(mPreset);
newPreset.setDoApplyFilters(false);
newPreset.setDoApplyGeometry(true);
- if (force || mGeometryOnlyPreset == null
+ if (mGeometryOnlyPreset == null
|| !newPreset.same(mGeometryOnlyPreset)) {
mGeometryOnlyPreset = newPreset;
RenderingRequest.post(mActivity, getOriginalBitmapLarge(),
mGeometryOnlyPreset, RenderingRequest.GEOMETRY_RENDERING, this);
}
}
- if (force || mFiltersOnlyPreset == null) {
+ if (mFiltersOnlyPreset == null) {
ImagePreset newPreset = new ImagePreset(mPreset);
newPreset.setDoApplyFilters(true);
newPreset.setDoApplyGeometry(false);
- if (force || mFiltersOnlyPreset == null
+ if (mFiltersOnlyPreset == null
|| !newPreset.same(mFiltersOnlyPreset)) {
mFiltersOnlyPreset = newPreset;
RenderingRequest.post(mActivity, MasterImage.getImage().getOriginalBitmapLarge(),
mFiltersOnlyPreset, RenderingRequest.FILTERS_RENDERING, this);
}
}
+ }
+
+ public void updatePresets(boolean force) {
invalidatePreview();
}
@@ -363,7 +366,7 @@ public class MasterImage implements RenderingRequestCaller {
public void invalidateFiltersOnly() {
mFiltersOnlyPreset = null;
- updatePresets(false);
+ invalidatePreview();
}
public void invalidatePartialPreview() {
@@ -449,8 +452,9 @@ public class MasterImage implements RenderingRequestCaller {
m.mapRect(dest, r);
Rect bounds = new Rect();
dest.roundOut(bounds);
- RenderingRequest.post(mActivity, null, mPreset, RenderingRequest.PARTIAL_RENDERING,
- this, bounds, new Rect(0, 0, mImageShowSize.x, mImageShowSize.y));
+ mActivity.getProcessingService().postFullresRenderingRequest(mPreset,
+ getScaleFactor(), bounds,
+ new Rect(0, 0, mImageShowSize.x, mImageShowSize.y), this);
invalidatePartialPreview();
}
diff --git a/src/com/android/gallery3d/filtershow/pipeline/CacheProcessing.java b/src/com/android/gallery3d/filtershow/pipeline/CacheProcessing.java
index e0269e9bb..7abeee723 100644
--- a/src/com/android/gallery3d/filtershow/pipeline/CacheProcessing.java
+++ b/src/com/android/gallery3d/filtershow/pipeline/CacheProcessing.java
@@ -19,7 +19,9 @@ package com.android.gallery3d.filtershow.pipeline;
import android.graphics.Bitmap;
import android.util.Log;
import com.android.gallery3d.filtershow.filters.FilterRepresentation;
+import com.android.gallery3d.filtershow.imageshow.GeometryMathUtils;
+import java.util.ArrayList;
import java.util.Vector;
public class CacheProcessing {
@@ -28,8 +30,85 @@ public class CacheProcessing {
private Vector<CacheStep> mSteps = new Vector<CacheStep>();
static class CacheStep {
- FilterRepresentation representation;
+ ArrayList<FilterRepresentation> representations;
Bitmap cache;
+
+ public CacheStep() {
+ representations = new ArrayList<FilterRepresentation>();
+ }
+
+ public void add(FilterRepresentation representation) {
+ representations.add(representation);
+ }
+
+ public boolean canMergeWith(FilterRepresentation representation) {
+ for (FilterRepresentation rep : representations) {
+ if (!rep.canMergeWith(representation)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public boolean equals(CacheStep step) {
+ if (representations.size() != step.representations.size()) {
+ return false;
+ }
+ for (int i = 0; i < representations.size(); i++) {
+ FilterRepresentation r1 = representations.get(i);
+ FilterRepresentation r2 = step.representations.get(i);
+ if (!r1.equals(r2)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public static Vector<CacheStep> buildSteps(Vector<FilterRepresentation> filters) {
+ Vector<CacheStep> steps = new Vector<CacheStep>();
+ CacheStep step = new CacheStep();
+ for (int i = 0; i < filters.size(); i++) {
+ FilterRepresentation representation = filters.elementAt(i);
+ if (step.canMergeWith(representation)) {
+ step.add(representation.copy());
+ } else {
+ steps.add(step);
+ step = new CacheStep();
+ step.add(representation.copy());
+ }
+ }
+ steps.add(step);
+ return steps;
+ }
+
+ public String getName() {
+ if (representations.size() > 0) {
+ return representations.get(0).getName();
+ }
+ return "EMPTY";
+ }
+
+ public Bitmap apply(FilterEnvironment environment, Bitmap cacheBitmap) {
+ boolean onlyGeometry = true;
+ for (FilterRepresentation representation : representations) {
+ if (representation.getFilterType() != FilterRepresentation.TYPE_GEOMETRY) {
+ onlyGeometry = false;
+ break;
+ }
+ }
+ if (onlyGeometry) {
+ ArrayList<FilterRepresentation> geometry = new ArrayList<FilterRepresentation>();
+ for (FilterRepresentation representation : representations) {
+ geometry.add(representation);
+ }
+ cacheBitmap = GeometryMathUtils.applyGeometryRepresentations(geometry, cacheBitmap);
+ } else {
+ for (FilterRepresentation representation : representations) {
+ cacheBitmap = environment.applyRepresentation(representation, cacheBitmap);
+ }
+ }
+ return cacheBitmap;
+ }
}
public Bitmap process(Bitmap originalBitmap,
@@ -40,32 +119,34 @@ public class CacheProcessing {
return originalBitmap;
}
+ if (DEBUG) {
+ displayFilters(filters);
+ }
+ Vector<CacheStep> steps = CacheStep.buildSteps(filters);
// New set of filters, let's clear the cache and rebuild it.
- if (filters.size() != mSteps.size()) {
- mSteps.clear();
- for (int i = 0; i < filters.size(); i++) {
- FilterRepresentation representation = filters.elementAt(i);
- CacheStep step = new CacheStep();
- step.representation = representation.copy();
- mSteps.add(step);
- }
+ if (steps.size() != mSteps.size()) {
+ mSteps = steps;
}
if (DEBUG) {
- displayFilters(filters);
+ displaySteps(mSteps);
}
// First, let's find how similar we are in our cache
// compared to the current list of filters
int similarUpToIndex = -1;
- for (int i = 0; i < filters.size(); i++) {
- FilterRepresentation representation = filters.elementAt(i);
- CacheStep step = mSteps.elementAt(i);
- boolean similar = step.representation.equals(representation);
+ boolean similar = true;
+ for (int i = 0; i < steps.size(); i++) {
+ CacheStep newStep = steps.elementAt(i);
+ CacheStep cacheStep = mSteps.elementAt(i);
+ if (similar) {
+ similar = newStep.equals(cacheStep);
+ }
if (similar) {
similarUpToIndex = i;
} else {
- break;
+ mSteps.remove(i);
+ mSteps.insertElementAt(newStep, i);
}
}
if (DEBUG) {
@@ -82,69 +163,25 @@ public class CacheProcessing {
}
cacheBitmap = mSteps.elementAt(findBaseImageIndex).cache;
}
- boolean emptyStack = false;
- if (cacheBitmap == null) {
- emptyStack = true;
- // Damn, it's an empty stack, we have to start from scratch
- // TODO: use a bitmap cache + RS allocation instead of Bitmap.copy()
- cacheBitmap = originalBitmap.copy(Bitmap.Config.ARGB_8888, true);
- if (findBaseImageIndex > -1) {
- FilterRepresentation representation = filters.elementAt(findBaseImageIndex);
- if (representation.getFilterType() != FilterRepresentation.TYPE_GEOMETRY) {
- cacheBitmap = environment.applyRepresentation(representation, cacheBitmap);
- }
- mSteps.elementAt(findBaseImageIndex).representation = representation.copy();
- mSteps.elementAt(findBaseImageIndex).cache = cacheBitmap;
- }
- if (DEBUG) {
- Log.v(LOGTAG, "empty stack");
- }
- }
-
- // Ok, so sadly the earliest cached result is before the index we want.
- // We have to rebuild a new result for this position, and then cache it.
- if (findBaseImageIndex != similarUpToIndex) {
- if (DEBUG) {
- Log.v(LOGTAG, "rebuild cacheBitmap from " + findBaseImageIndex
- + " to " + similarUpToIndex);
- }
- // rebuild the cache image for this step
- if (!emptyStack) {
- cacheBitmap = cacheBitmap.copy(Bitmap.Config.ARGB_8888, true);
- } else {
- // if it was an empty stack, we already applied it
- findBaseImageIndex ++;
- }
- for (int i = findBaseImageIndex; i <= similarUpToIndex; i++) {
- FilterRepresentation representation = filters.elementAt(i);
- if (representation.getFilterType() != FilterRepresentation.TYPE_GEOMETRY) {
- cacheBitmap = environment.applyRepresentation(representation, cacheBitmap);
- }
- if (DEBUG) {
- Log.v(LOGTAG, " - " + i + " => apply " + representation.getName());
- }
- }
- // Let's cache it!
- mSteps.elementAt(similarUpToIndex).cache = cacheBitmap;
- }
if (DEBUG) {
- Log.v(LOGTAG, "process pipeline from " + similarUpToIndex
- + " to " + (filters.size() - 1));
+ Log.v(LOGTAG, "found baseImageIndex: " + findBaseImageIndex + " max is "
+ + mSteps.size() + " cacheBitmap: " + cacheBitmap);
}
- // Now we are good to go, let's use the cacheBitmap as a starting point
- for (int i = similarUpToIndex + 1; i < filters.size(); i++) {
- FilterRepresentation representation = filters.elementAt(i);
- CacheStep currentStep = mSteps.elementAt(i);
- cacheBitmap = cacheBitmap.copy(Bitmap.Config.ARGB_8888, true);
- if (representation.getFilterType() != FilterRepresentation.TYPE_GEOMETRY) {
- cacheBitmap = environment.applyRepresentation(representation, cacheBitmap);
+ for (int i = findBaseImageIndex; i < mSteps.size(); i++) {
+ if (i == -1 || cacheBitmap == null) {
+ cacheBitmap = environment.getBitmapCopy(originalBitmap);
+ if (i == -1) {
+ continue;
+ }
}
- currentStep.representation = representation.copy();
- currentStep.cache = cacheBitmap;
- if (DEBUG) {
- Log.v(LOGTAG, " - " + i + " => apply " + representation.getName());
+ CacheStep step = mSteps.elementAt(i);
+ if (step.cache == null) {
+ cacheBitmap = environment.getBitmapCopy(cacheBitmap);
+ cacheBitmap = step.apply(environment, cacheBitmap);
+ environment.cache(step.cache);
+ step.cache = cacheBitmap;
}
}
@@ -156,6 +193,7 @@ public class CacheProcessing {
// Let's see if we can cleanup the cache for unused bitmaps
for (int i = 0; i < similarUpToIndex; i++) {
CacheStep currentStep = mSteps.elementAt(i);
+ environment.cache(currentStep.cache);
currentStep.cache = null;
}
@@ -167,12 +205,21 @@ public class CacheProcessing {
}
private void displayFilters(Vector<FilterRepresentation> filters) {
+ Log.v(LOGTAG, "------>>> Filters received");
+ for (int i = 0; i < filters.size(); i++) {
+ FilterRepresentation filter = filters.elementAt(i);
+ Log.v(LOGTAG, "[" + i + "] - " + filter.getName());
+ }
+ Log.v(LOGTAG, "<<<------");
+ }
+
+ private void displaySteps(Vector<CacheStep> filters) {
Log.v(LOGTAG, "------>>>");
for (int i = 0; i < filters.size(); i++) {
- FilterRepresentation representation = filters.elementAt(i);
+ CacheStep newStep = filters.elementAt(i);
CacheStep step = mSteps.elementAt(i);
- boolean similar = step.representation.equals(representation);
- Log.v(LOGTAG, "[" + i + "] - " + representation.getName()
+ boolean similar = step.equals(newStep);
+ Log.v(LOGTAG, "[" + i + "] - " + step.getName()
+ " similar rep ? " + (similar ? "YES" : "NO")
+ " -- bitmap: " + step.cache);
}
diff --git a/src/com/android/gallery3d/filtershow/pipeline/CachingPipeline.java b/src/com/android/gallery3d/filtershow/pipeline/CachingPipeline.java
index fc0d6ce49..932e2fc00 100644
--- a/src/com/android/gallery3d/filtershow/pipeline/CachingPipeline.java
+++ b/src/com/android/gallery3d/filtershow/pipeline/CachingPipeline.java
@@ -348,6 +348,7 @@ public class CachingPipeline implements PipelineInterface {
}
setupEnvironment(preset, false);
Vector<FilterRepresentation> filters = preset.getFilters();
+ mEnvironment.cache(buffer.getProducer()); // the producer bitmap isn't needed anymore
Bitmap result = mCachedProcessing.process(mOriginalBitmap, filters, mEnvironment);
buffer.setProducer(result);
}
diff --git a/src/com/android/gallery3d/filtershow/pipeline/FilterEnvironment.java b/src/com/android/gallery3d/filtershow/pipeline/FilterEnvironment.java
index 4fac956be..c5c665360 100644
--- a/src/com/android/gallery3d/filtershow/pipeline/FilterEnvironment.java
+++ b/src/com/android/gallery3d/filtershow/pipeline/FilterEnvironment.java
@@ -17,6 +17,7 @@
package com.android.gallery3d.filtershow.pipeline;
import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
@@ -63,6 +64,10 @@ public class FilterEnvironment {
return;
}
Bitmap bitmap = buffer.getBitmap();
+ cache(bitmap);
+ }
+
+ public void cache(Bitmap bitmap) {
if (bitmap == null) {
return;
}
@@ -84,6 +89,13 @@ public class FilterEnvironment {
return bitmap;
}
+ public Bitmap getBitmapCopy(Bitmap source) {
+ Bitmap bitmap = getBitmap(source.getWidth(), source.getHeight());
+ Canvas canvas = new Canvas(bitmap);
+ canvas.drawBitmap(source, 0, 0, null);
+ return bitmap;
+ }
+
private Long calcKey(long w, long h) {
return (w << 32) | (h << 32);
}
diff --git a/src/com/android/gallery3d/filtershow/pipeline/FullresRenderingRequestTask.java b/src/com/android/gallery3d/filtershow/pipeline/FullresRenderingRequestTask.java
new file mode 100644
index 000000000..ab72c8d2b
--- /dev/null
+++ b/src/com/android/gallery3d/filtershow/pipeline/FullresRenderingRequestTask.java
@@ -0,0 +1,67 @@
+package com.android.gallery3d.filtershow.pipeline;
+
+import android.graphics.Bitmap;
+import com.android.gallery3d.filtershow.filters.FiltersManager;
+
+public class FullresRenderingRequestTask extends ProcessingTask {
+
+ private CachingPipeline mFullresPipeline = null;
+ private boolean mPipelineIsOn = false;
+
+ public void setPreviewScaleFactor(float previewScale) {
+ mFullresPipeline.setPreviewScaleFactor(previewScale);
+ }
+
+ static class Render implements Request {
+ RenderingRequest request;
+ }
+
+ static class RenderResult implements Result {
+ RenderingRequest request;
+ }
+
+ public FullresRenderingRequestTask() {
+ mFullresPipeline = new CachingPipeline(
+ FiltersManager.getHighresManager(), "Fullres");
+ }
+
+ public void setOriginal(Bitmap bitmap) {
+ mFullresPipeline.setOriginal(bitmap);
+ mPipelineIsOn = true;
+ }
+
+ public void stop() {
+ mFullresPipeline.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;
+ mFullresPipeline.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/ImagePreset.java b/src/com/android/gallery3d/filtershow/pipeline/ImagePreset.java
index d34216ad6..e28cc356b 100644
--- a/src/com/android/gallery3d/filtershow/pipeline/ImagePreset.java
+++ b/src/com/android/gallery3d/filtershow/pipeline/ImagePreset.java
@@ -306,8 +306,15 @@ public class ImagePreset {
mFilters.remove(i);
}
}
+ int index = 0;
+ for (; index < mFilters.size(); index++) {
+ FilterRepresentation rep = mFilters.elementAt(index);
+ if (rep.getFilterType() != FilterRepresentation.TYPE_GEOMETRY) {
+ break;
+ }
+ }
if (!representation.isNil()) {
- mFilters.add(representation);
+ mFilters.insertElementAt(representation, index);
}
} else if (representation.getFilterType() == FilterRepresentation.TYPE_BORDER) {
removeFilter(representation);
@@ -524,10 +531,6 @@ public class ImagePreset {
}
for (int i = 0; i < mFilters.size(); i++) {
FilterRepresentation representation = mFilters.elementAt(i);
- if (representation.getFilterType() == FilterRepresentation.TYPE_GEOMETRY
- && !representation.isNil()) {
- return false;
- }
if (!representation.supportsPartialRendering()) {
return false;
}
@@ -541,10 +544,6 @@ public class ImagePreset {
}
Vector<State> states = new Vector<State>();
for (FilterRepresentation filter : mFilters) {
- if (filter.getFilterType() == FilterRepresentation.TYPE_GEOMETRY) {
- // TODO: supports Geometry representations in the state panel.
- continue;
- }
if (filter instanceof FilterUserPresetRepresentation) {
// do not show the user preset itself in the state panel
continue;
diff --git a/src/com/android/gallery3d/filtershow/pipeline/ProcessingService.java b/src/com/android/gallery3d/filtershow/pipeline/ProcessingService.java
index d0504d11f..4f736f868 100644
--- a/src/com/android/gallery3d/filtershow/pipeline/ProcessingService.java
+++ b/src/com/android/gallery3d/filtershow/pipeline/ProcessingService.java
@@ -23,6 +23,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Bitmap;
+import android.graphics.Rect;
import android.net.Uri;
import android.os.Binder;
import android.os.IBinder;
@@ -55,6 +56,7 @@ public class ProcessingService extends Service {
private ImageSavingTask mImageSavingTask;
private UpdatePreviewTask mUpdatePreviewTask;
private HighresRenderingRequestTask mHighresRenderingRequestTask;
+ private FullresRenderingRequestTask mFullresRenderingRequestTask;
private RenderingRequestTask mRenderingRequestTask;
private final IBinder mBinder = new LocalBinder();
@@ -73,11 +75,13 @@ public class ProcessingService extends Service {
}
mUpdatePreviewTask.setOriginal(originalBitmap);
mHighresRenderingRequestTask.setOriginal(originalBitmap);
+ mFullresRenderingRequestTask.setOriginal(originalBitmap);
mRenderingRequestTask.setOriginal(originalBitmap);
}
public void updatePreviewBuffer() {
mHighresRenderingRequestTask.stop();
+ mFullresRenderingRequestTask.stop();
mUpdatePreviewTask.updatePreview();
}
@@ -98,12 +102,29 @@ public class ProcessingService extends Service {
mHighresRenderingRequestTask.postRenderingRequest(request);
}
+ public void postFullresRenderingRequest(ImagePreset preset, float scaleFactor,
+ Rect bounds, Rect destination,
+ RenderingRequestCaller caller) {
+ RenderingRequest request = new RenderingRequest();
+ ImagePreset passedPreset = new ImagePreset(preset);
+ request.setOriginalImagePreset(preset);
+ request.setScaleFactor(scaleFactor);
+ request.setImagePreset(passedPreset);
+ request.setType(RenderingRequest.PARTIAL_RENDERING);
+ request.setCaller(caller);
+ request.setBounds(bounds);
+ request.setDestination(destination);
+ passedPreset.setPartialRendering(true, bounds);
+ mFullresRenderingRequestTask.postRenderingRequest(request);
+ }
+
public void setHighresPreviewScaleFactor(float highResPreviewScale) {
mHighresRenderingRequestTask.setHighresPreviewScaleFactor(highResPreviewScale);
}
public void setPreviewScaleFactor(float previewScale) {
mHighresRenderingRequestTask.setPreviewScaleFactor(previewScale);
+ mFullresRenderingRequestTask.setPreviewScaleFactor(previewScale);
mRenderingRequestTask.setPreviewScaleFactor(previewScale);
}
@@ -144,10 +165,12 @@ public class ProcessingService extends Service {
mImageSavingTask = new ImageSavingTask(this);
mUpdatePreviewTask = new UpdatePreviewTask();
mHighresRenderingRequestTask = new HighresRenderingRequestTask();
+ mFullresRenderingRequestTask = new FullresRenderingRequestTask();
mRenderingRequestTask = new RenderingRequestTask();
mProcessingTaskController.add(mImageSavingTask);
mProcessingTaskController.add(mUpdatePreviewTask);
mProcessingTaskController.add(mHighresRenderingRequestTask);
+ mProcessingTaskController.add(mFullresRenderingRequestTask);
mProcessingTaskController.add(mRenderingRequestTask);
setupPipeline();
}