summaryrefslogtreecommitdiffstats
path: root/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java
diff options
context:
space:
mode:
authornicolasroard <nicolasroard@google.com>2013-02-21 15:52:49 -0800
committernicolasroard <nicolasroard@google.com>2013-02-21 17:43:58 -0800
commita5fadcfd9faca04fed5c41669fe3895d1ac9c283 (patch)
tree591523332cdd4c67911f63c195def8ac0d7083ae /src/com/android/gallery3d/filtershow/imageshow/MasterImage.java
parentc619b9510f048f5aab7ae3b2a1482e695dc6cfd7 (diff)
downloadandroid_packages_apps_Snap-a5fadcfd9faca04fed5c41669fe3895d1ac9c283.tar.gz
android_packages_apps_Snap-a5fadcfd9faca04fed5c41669fe3895d1ac9c283.tar.bz2
android_packages_apps_Snap-a5fadcfd9faca04fed5c41669fe3895d1ac9c283.zip
Pinch to zoom refine
Change-Id: I538defa55a4ed898dd7c936ec813f052ac1b9e0a
Diffstat (limited to 'src/com/android/gallery3d/filtershow/imageshow/MasterImage.java')
-rw-r--r--src/com/android/gallery3d/filtershow/imageshow/MasterImage.java78
1 files changed, 74 insertions, 4 deletions
diff --git a/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java b/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java
index 905d2c390..9eafe2236 100644
--- a/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java
+++ b/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java
@@ -16,9 +16,7 @@
package com.android.gallery3d.filtershow.imageshow;
-import android.graphics.Bitmap;
-import android.graphics.Point;
-import android.graphics.RectF;
+import android.graphics.*;
import com.android.gallery3d.filtershow.FilterShowActivity;
import com.android.gallery3d.filtershow.HistoryAdapter;
@@ -45,6 +43,7 @@ public class MasterImage implements RenderingRequestCaller {
private Bitmap mGeometryOnlyBitmap = null;
private Bitmap mFiltersOnlyBitmap = null;
+ private Bitmap mPartialBitmap = null;
private ImageLoader mLoader = null;
private HistoryAdapter mHistory = null;
@@ -62,6 +61,8 @@ public class MasterImage implements RenderingRequestCaller {
private Point mTranslation = new Point();
private Point mOriginalTranslation = new Point();
+ private Point mImageShowSize = new Point();
+
private MasterImage() {
}
@@ -193,6 +194,10 @@ public class MasterImage implements RenderingRequestCaller {
return mGeometryOnlyBitmap;
}
+ public Bitmap getPartialImage() {
+ return mPartialBitmap;
+ }
+
public void notifyObservers() {
for (ImageShow observer : mObservers) {
observer.invalidate();
@@ -221,6 +226,7 @@ public class MasterImage implements RenderingRequestCaller {
}
}
invalidatePreview();
+ needsUpdateFullResPreview();
mActivity.enableSave(hasModifications());
}
@@ -237,11 +243,67 @@ public class MasterImage implements RenderingRequestCaller {
updatePresets(false);
}
+ public void invalidatePartialPreview() {
+ if (mPartialBitmap != null) {
+ mPartialBitmap = null;
+ notifyObservers();
+ }
+ }
+
public void invalidatePreview() {
mFilteredPreview.invalidate();
+ invalidatePartialPreview();
+ needsUpdateFullResPreview();
FilteringPipeline.getPipeline().updatePreviewBuffer();
}
+ public void setImageShowSize(int w, int h) {
+ if (mImageShowSize.x != w || mImageShowSize.y != h) {
+ mImageShowSize.set(w, h);
+ needsUpdateFullResPreview();
+ }
+ }
+
+ private Matrix getImageToScreenMatrix(boolean reflectRotation) {
+ GeometryMetadata geo = mPreset.mGeoData;
+ if (geo == null || mLoader == null
+ || mLoader.getOriginalBounds() == null
+ || mImageShowSize.x == 0) {
+ return new Matrix();
+ }
+ Matrix m = geo.getOriginalToScreen(reflectRotation,
+ mLoader.getOriginalBounds().width(),
+ mLoader.getOriginalBounds().height(), mImageShowSize.x, mImageShowSize.y);
+ Point translate = getTranslation();
+ float scaleFactor = getScaleFactor();
+ m.postTranslate(translate.x, translate.y);
+ m.postScale(scaleFactor, scaleFactor, mImageShowSize.x/2.0f, mImageShowSize.y/2.0f);
+ return m;
+ }
+
+ private Matrix getScreenToImageMatrix(boolean reflectRotation) {
+ Matrix m = getImageToScreenMatrix(reflectRotation);
+ Matrix invert = new Matrix();
+ m.invert(invert);
+ return invert;
+ }
+
+ public void needsUpdateFullResPreview() {
+ if (!mPreset.canDoPartialRendering()) {
+ invalidatePartialPreview();
+ return;
+ }
+ Matrix m = getScreenToImageMatrix(true);
+ RectF r = new RectF(0, 0, mImageShowSize.x, mImageShowSize.y);
+ RectF dest = new RectF();
+ m.mapRect(dest, r);
+ Rect bounds = new Rect();
+ dest.roundOut(bounds);
+ RenderingRequest.post(null, mPreset, RenderingRequest.PARTIAL_RENDERING,
+ this, bounds, new Rect(0, 0, mImageShowSize.x, mImageShowSize.y));
+ invalidatePartialPreview();
+ }
+
@Override
public void available(RenderingRequest request) {
if (request.getBitmap() == null) {
@@ -253,6 +315,10 @@ public class MasterImage implements RenderingRequestCaller {
if (request.getType() == RenderingRequest.FILTERS_RENDERING) {
mFiltersOnlyBitmap = request.getBitmap();
}
+ if (request.getType() == RenderingRequest.PARTIAL_RENDERING) {
+ mPartialBitmap = request.getBitmap();
+ notifyObservers();
+ }
}
public static void reset() {
@@ -275,6 +341,7 @@ public class MasterImage implements RenderingRequestCaller {
public void setScaleFactor(float scaleFactor) {
mScaleFactor = scaleFactor;
+ needsUpdateFullResPreview();
}
public Point getTranslation() {
@@ -282,7 +349,9 @@ public class MasterImage implements RenderingRequestCaller {
}
public void setTranslation(Point translation) {
- mTranslation = translation;
+ mTranslation.x = translation.x;
+ mTranslation.y = translation.y;
+ needsUpdateFullResPreview();
}
public Point getOriginalTranslation() {
@@ -297,5 +366,6 @@ public class MasterImage implements RenderingRequestCaller {
public void resetTranslation() {
mTranslation.x = 0;
mTranslation.y = 0;
+ needsUpdateFullResPreview();
}
}