diff options
Diffstat (limited to 'src/com/android/gallery3d/filtershow/imageshow')
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(); } } |