summaryrefslogtreecommitdiffstats
path: root/src/com/android/gallery3d/filtershow/imageshow
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/gallery3d/filtershow/imageshow')
-rw-r--r--src/com/android/gallery3d/filtershow/imageshow/ImageShow.java17
-rw-r--r--src/com/android/gallery3d/filtershow/imageshow/ImageZoom.java2
-rw-r--r--src/com/android/gallery3d/filtershow/imageshow/MasterImage.java78
3 files changed, 90 insertions, 7 deletions
diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java b/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java
index b91ebd195..39e0cc82b 100644
--- a/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java
+++ b/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java
@@ -21,15 +21,16 @@ import android.graphics.*;
import android.net.Uri;
import android.os.Handler;
import android.util.AttributeSet;
+import android.util.Log;
import android.view.*;
import android.view.GestureDetector.OnDoubleTapListener;
import android.view.GestureDetector.OnGestureListener;
import android.widget.LinearLayout;
-import com.android.gallery3d.app.Log;
import com.android.gallery3d.filtershow.FilterShowActivity;
import com.android.gallery3d.filtershow.PanelController;
import com.android.gallery3d.filtershow.cache.ImageLoader;
+import com.android.gallery3d.filtershow.cache.RenderingRequestCaller;
import com.android.gallery3d.filtershow.filters.ImageFilter;
import com.android.gallery3d.filtershow.presets.ImagePreset;
@@ -229,6 +230,10 @@ public class ImageShow extends View implements OnGestureListener,
*/
protected Matrix getImageToScreenMatrix(boolean reflectRotation) {
GeometryMetadata geo = getImagePreset().mGeoData;
+ if (geo == null || mImageLoader == null
+ || mImageLoader.getOriginalBounds() == null) {
+ return new Matrix();
+ }
Matrix m = geo.getOriginalToScreen(reflectRotation,
mImageLoader.getOriginalBounds().width(),
mImageLoader.getOriginalBounds().height(), getWidth(), getHeight());
@@ -291,7 +296,7 @@ public class ImageShow extends View implements OnGestureListener,
@Override
public void onDraw(Canvas canvas) {
-
+ MasterImage.getImage().setImageShowSize(getWidth(), getHeight());
canvas.save();
// TODO: center scale on gesture
float cx = canvas.getWidth()/2.0f;
@@ -315,6 +320,12 @@ public class ImageShow extends View implements OnGestureListener,
1.5f * mTextPadding, mPaint);
}
+ 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);
+ }
drawToast(canvas);
}
@@ -547,6 +558,7 @@ public class ImageShow extends View implements OnGestureListener,
Point translation = MasterImage.getImage().getTranslation();
translation.x = (int) (originalTranslation.x + translateX);
translation.y = (int) (originalTranslation.y + translateY);
+ MasterImage.getImage().setTranslation(translation);
}
} else if (!mOriginalDisabled && !mActivity.isShowingHistoryPanel()
&& (System.currentTimeMillis() - mTouchShowOriginalDate
@@ -682,4 +694,5 @@ public class ImageShow extends View implements OnGestureListener,
}
return false;
}
+
}
diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageZoom.java b/src/com/android/gallery3d/filtershow/imageshow/ImageZoom.java
index 0e32dc1e1..eb568c303 100644
--- a/src/com/android/gallery3d/filtershow/imageshow/ImageZoom.java
+++ b/src/com/android/gallery3d/filtershow/imageshow/ImageZoom.java
@@ -90,7 +90,7 @@ public class ImageZoom extends ImageShow {
Bitmap filteredImage = null;
if ((mZoomedIn || mTouchDown) && mImageLoader != null) {
filteredImage = mImageLoader.getScaleOneImageForPreset(this, getImagePreset(),
- mZoomBounds, false);
+ mZoomBounds, null, false);
} else {
filteredImage = getFilteredImage();
}
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();
}
}