From 8fa78323ff1b14c4eebb2cfa1e67f8259811b76c Mon Sep 17 00:00:00 2001 From: nicolasroard Date: Sat, 20 Oct 2012 12:32:05 -0700 Subject: Shows filtered images in geometry modules and comparison. bug:7279469 bug:7379286 bug:7344214 bug:7379140 Also: - cache multiple version (with/without geometry or filters applied) - doesn't show the original image anymore when waiting for a filtered version (shows nothing instead for now) - fix potential crash in Curves Change-Id: I4eabd42c30f6d370571f177d5efe92550798aed8 --- .../filtershow/cache/DirectPresetCache.java | 1 + .../gallery3d/filtershow/cache/ImageLoader.java | 13 +- .../filtershow/imageshow/ImageGeometry.java | 12 +- .../gallery3d/filtershow/imageshow/ImageShow.java | 139 +++++++++++++++------ .../gallery3d/filtershow/imageshow/ImageSlave.java | 26 ++++ .../filtershow/imageshow/ImageSmallBorder.java | 4 +- .../filtershow/imageshow/ImageSmallFilter.java | 31 +++-- .../gallery3d/filtershow/imageshow/ImageZoom.java | 4 +- .../gallery3d/filtershow/presets/ImagePreset.java | 27 +++- .../gallery3d/filtershow/ui/ImageCurves.java | 10 +- 10 files changed, 189 insertions(+), 78 deletions(-) diff --git a/src/com/android/gallery3d/filtershow/cache/DirectPresetCache.java b/src/com/android/gallery3d/filtershow/cache/DirectPresetCache.java index 25d1db414..7839ea2a3 100644 --- a/src/com/android/gallery3d/filtershow/cache/DirectPresetCache.java +++ b/src/com/android/gallery3d/filtershow/cache/DirectPresetCache.java @@ -49,6 +49,7 @@ public class DirectPresetCache implements Cache { for (int i = 0; i < mObservers.size(); i++) { ImageShow imageShow = mObservers.elementAt(i); imageShow.invalidate(); + imageShow.updateImage(); } } diff --git a/src/com/android/gallery3d/filtershow/cache/ImageLoader.java b/src/com/android/gallery3d/filtershow/cache/ImageLoader.java index 40bffb243..a8ad6800f 100644 --- a/src/com/android/gallery3d/filtershow/cache/ImageLoader.java +++ b/src/com/android/gallery3d/filtershow/cache/ImageLoader.java @@ -87,7 +87,7 @@ public class ImageLoader { mActivity = activity; mContext = context; mCache = new DelayedPresetCache(this, 30); - mHiresCache = new DelayedPresetCache(this, 2); + mHiresCache = new DelayedPresetCache(this, 3); } public void loadBitmap(Uri uri,int size) { @@ -348,9 +348,11 @@ public class ImageLoader { if (filteredImage == null) { if (hiRes) { - cachePreset(imagePreset, mHiresCache, caller); + mHiresCache.prepare(imagePreset); + mHiresCache.addObserver(caller); } else { - cachePreset(imagePreset, mCache, caller); + mCache.prepare(imagePreset); + mCache.addObserver(caller); } } return filteredImage; @@ -384,11 +386,6 @@ public class ImageLoader { return mAdapter; } - private void cachePreset(ImagePreset preset, Cache cache, ImageShow caller) { - cache.prepare(preset); - cache.addObserver(caller); - } - public Object getXmpObject() { try { InputStream is = mContext.getContentResolver().openInputStream(getUri()); diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageGeometry.java b/src/com/android/gallery3d/filtershow/imageshow/ImageGeometry.java index 1cf8d7af5..6bdbeb815 100644 --- a/src/com/android/gallery3d/filtershow/imageshow/ImageGeometry.java +++ b/src/com/android/gallery3d/filtershow/imageshow/ImageGeometry.java @@ -221,12 +221,6 @@ public abstract class ImageGeometry extends ImageSlave { return getLocalRotation() + getLocalStraighten(); } - protected Bitmap getMasterImage() { - if (getMaster() == null) - return null; - return getMaster().mForegroundImage; - } - protected static float[] getCornersFromRect(RectF r) { // Order is: // 0------->1 @@ -375,7 +369,7 @@ public abstract class ImageGeometry extends ImageSlave { ImagePreset lastHistoryItem = getHistory().getLast(); if (lastHistoryItem != null && lastHistoryItem.historyName().equalsIgnoreCase(getName())) { getImagePreset().setGeometry(mLocalGeometry); - mImageLoader.resetImageForPreset(getImagePreset(), this); + resetImageCaches(this); } else { ImagePreset copy = new ImagePreset(getImagePreset()); copy.setGeometry(mLocalGeometry); @@ -535,8 +529,10 @@ public abstract class ImageGeometry extends ImageSlave { syncLocalToMasterGeometry(); clearDirtyGeometryFlag(); } - Bitmap image = getMasterImage(); + requestFilteredImages(); + Bitmap image = getMaster().getFiltersOnlyImage(); if (image == null) { + invalidate(); return; } mHasDrawn = true; diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java b/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java index c009b99dd..5e007b1eb 100644 --- a/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java +++ b/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java @@ -59,6 +59,9 @@ public class ImageShow extends View implements OnGestureListener, protected static int mTextPadding = 20; protected ImagePreset mImagePreset = null; + protected ImagePreset mImageGeometryOnlyPreset = null; + protected ImagePreset mImageFiltersOnlyPreset = null; + protected ImageLoader mImageLoader = null; private ImageFilter mCurrentFilter = null; private boolean mDirtyGeometry = true; @@ -67,9 +70,9 @@ public class ImageShow extends View implements OnGestureListener, private final boolean USE_BACKGROUND_IMAGE = false; private static int mBackgroundColor = Color.RED; - // TODO: remove protected here, it should be private - protected Bitmap mForegroundImage = null; - protected Bitmap mFilteredImage = null; + private Bitmap mGeometryOnlyImage = null; + private Bitmap mFiltersOnlyImage = null; + private Bitmap mFilteredImage = null; private final boolean USE_SLIDER_GESTURE = false; // set to true to have // slider gesture @@ -324,13 +327,6 @@ public class ImageShow extends View implements OnGestureListener, return mImagePreset; } - protected Bitmap getOriginalFrontBitmap() { - if (mImageLoader != null) { - return mImageLoader.getOriginalBitmapLarge(); - } - return null; - } - public void drawToast(Canvas canvas) { if (mShowToast && mToast != null) { Paint paint = new Paint(); @@ -355,12 +351,16 @@ public class ImageShow extends View implements OnGestureListener, } } + public void defaultDrawImage(Canvas canvas) { + drawImage(canvas, getFilteredImage()); + drawPartialImage(canvas, getGeometryOnlyImage()); + } + @Override public void onDraw(Canvas canvas) { drawBackground(canvas); - getFilteredImage(); - drawImage(canvas, mFilteredImage); - drawPartialImage(canvas, mForegroundImage); + requestFilteredImages(); + defaultDrawImage(canvas); if (showTitle() && getImagePreset() != null) { mPaint.setARGB(200, 0, 0, 0); @@ -382,25 +382,78 @@ public class ImageShow extends View implements OnGestureListener, drawToast(canvas); } - public void getFilteredImage() { - Bitmap filteredImage = null; + public void resetImageCaches(ImageShow caller) { + if (mImageLoader == null) { + return; + } + if (getImagePreset() != null) { + mImageLoader.resetImageForPreset(getImagePreset(), caller); + } + mImageGeometryOnlyPreset = null; + mImageFiltersOnlyPreset = null; + invalidate(); + } + + public void updateImagePresets(boolean force) { + ImagePreset preset = getImagePreset(); + if (preset == null) { + return; + } + if (force) { + mImageLoader.resetImageForPreset(getImagePreset(), this); + } + if (force || mImageGeometryOnlyPreset == null) { + mImageGeometryOnlyPreset = new ImagePreset(preset); + mImageGeometryOnlyPreset.setDoApplyFilters(false); + mGeometryOnlyImage = null; + } + if (force || mImageFiltersOnlyPreset == null) { + mImageFiltersOnlyPreset = new ImagePreset(preset); + mImageFiltersOnlyPreset.setDoApplyGeometry(false); + mFiltersOnlyImage = null; + } + } + + public void requestFilteredImages() { if (mImageLoader != null) { - filteredImage = mImageLoader.getImageForPreset(this, + Bitmap bitmap = mImageLoader.getImageForPreset(this, getImagePreset(), showHires()); - } - if (filteredImage == null) { - // if no image for the current preset, use the previous one - filteredImage = mFilteredImage; - } else { - mFilteredImage = filteredImage; + if (bitmap != null) { + if (mFilteredImage == null) { + invalidate(); + } + mFilteredImage = bitmap; + } + + updateImagePresets(false); + if (mImageGeometryOnlyPreset != null) { + mGeometryOnlyImage = mImageLoader.getImageForPreset(this, mImageGeometryOnlyPreset, + showHires()); + } + if (mImageFiltersOnlyPreset != null) { + mFiltersOnlyImage = mImageLoader.getImageForPreset(this, mImageFiltersOnlyPreset, + showHires()); + } } - if (mShowOriginal || mFilteredImage == null) { - mFilteredImage = mForegroundImage; + if (mShowOriginal) { + mFilteredImage = mGeometryOnlyImage; } } + public Bitmap getFiltersOnlyImage() { + return mFiltersOnlyImage; + } + + public Bitmap getGeometryOnlyImage() { + return mGeometryOnlyImage; + } + + public Bitmap getFilteredImage() { + return mFilteredImage; + } + public void drawImage(Canvas canvas, Bitmap image) { if (image != null) { Rect s = new Rect(0, 0, image.getWidth(), @@ -522,15 +575,17 @@ public class ImageShow extends View implements OnGestureListener, } public void setImagePreset(ImagePreset preset, boolean addToHistory) { + if (preset == null) { + return; + } mImagePreset = preset; - if (getImagePreset() != null) { - getImagePreset().setImageLoader(mImageLoader); - if (addToHistory) { - mHistoryAdapter.addHistoryItem(getImagePreset()); - } - getImagePreset().setEndpoint(this); - updateImage(); + getImagePreset().setImageLoader(mImageLoader); + updateImagePresets(true); + if (addToHistory) { + mHistoryAdapter.addHistoryItem(getImagePreset()); } + getImagePreset().setEndpoint(this); + updateImage(); mImagePreset.fillImageStateAdapter(mImageStateAdapter); invalidate(); } @@ -573,10 +628,19 @@ public class ImageShow extends View implements OnGestureListener, setDirtyGeometryFlag(); } + public boolean updateGeometryFlags() { + return true; + } + public void updateImage() { - mForegroundImage = getOriginalFrontBitmap(); - imageSizeChanged(mForegroundImage); // TODO: should change to filtered - setDirtyGeometryFlag(); + if (!updateGeometryFlags()) { + return; + } + Bitmap bitmap = mImageLoader.getOriginalBitmapLarge(); + if (bitmap != null) { + imageSizeChanged(bitmap); + invalidate(); + } } public void updateFilteredImage(Bitmap bitmap) { @@ -609,7 +673,7 @@ public class ImageShow extends View implements OnGestureListener, mTouchY = ey; if (!mActivity.isShowingHistoryPanel() && (System.currentTimeMillis() - mTouchShowOriginalDate - > mTouchShowOriginalDelayMin)) { + > mTouchShowOriginalDelayMin)) { mTouchShowOriginal = true; } } @@ -725,8 +789,8 @@ public class ImageShow extends View implements OnGestureListener, || (mActivity.isShowingHistoryPanel() && endEvent.getX() > startEvent.getX())) { if (!mTouchShowOriginal || (mTouchShowOriginal && - (System.currentTimeMillis() - mTouchShowOriginalDate - < mTouchShowOriginalDelayMax))) { + (System.currentTimeMillis() - mTouchShowOriginalDate + < mTouchShowOriginalDelayMax))) { mActivity.toggleHistoryPanel(); } } @@ -756,4 +820,5 @@ public class ImageShow extends View implements OnGestureListener, // TODO Auto-generated method stub return false; } + } diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageSlave.java b/src/com/android/gallery3d/filtershow/imageshow/ImageSlave.java index ba4da91c9..3d79ae0d7 100644 --- a/src/com/android/gallery3d/filtershow/imageshow/ImageSlave.java +++ b/src/com/android/gallery3d/filtershow/imageshow/ImageSlave.java @@ -17,6 +17,7 @@ package com.android.gallery3d.filtershow.imageshow; import android.content.Context; +import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Rect; import android.util.AttributeSet; @@ -50,6 +51,11 @@ public class ImageSlave extends ImageShow { return mMasterImageShow.getHistory(); } + @Override + public void resetImageCaches(ImageShow caller) { + mMasterImageShow.resetImageCaches(caller); + } + @Override public ImagePreset getImagePreset() { return mMasterImageShow.getImagePreset(); @@ -75,6 +81,26 @@ public class ImageSlave extends ImageShow { return mMasterImageShow.getCurrentFilter(); } + @Override + public Bitmap getFilteredImage() { + return mMasterImageShow.getFilteredImage(); + } + + @Override + public void updateImage() { + mMasterImageShow.updateImage(); + } + + @Override + public void updateImagePresets(boolean force) { + mMasterImageShow.updateImagePresets(force); + } + + @Override + public void requestFilteredImages() { + mMasterImageShow.requestFilteredImages(); + } + @Override public boolean showTitle() { return false; diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageSmallBorder.java b/src/com/android/gallery3d/filtershow/imageshow/ImageSmallBorder.java index 0cf6389ce..a60c33d52 100644 --- a/src/com/android/gallery3d/filtershow/imageshow/ImageSmallBorder.java +++ b/src/com/android/gallery3d/filtershow/imageshow/ImageSmallBorder.java @@ -30,7 +30,7 @@ public class ImageSmallBorder extends ImageSmallFilter { @Override public void onDraw(Canvas canvas) { - getFilteredImage(); + requestFilteredImages(); canvas.drawColor(mBackgroundColor); // TODO: simplify & make faster... RectF border = new RectF(mMargin, 2*mMargin, getWidth() - mMargin - 1, getWidth()); @@ -53,7 +53,7 @@ public class ImageSmallBorder extends ImageSmallFilter { canvas.translate(mMargin + 1, 2*mMargin + 1); canvas.scale(mImageScaleFactor, mImageScaleFactor); Rect d = new Rect(0, 0, getWidth(), getWidth()); - drawImage(canvas, mFilteredImage, d); + drawImage(canvas, getFilteredImage(), d); canvas.restore(); } diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageSmallFilter.java b/src/com/android/gallery3d/filtershow/imageshow/ImageSmallFilter.java index 698c4ea7a..9e8a01118 100644 --- a/src/com/android/gallery3d/filtershow/imageshow/ImageSmallFilter.java +++ b/src/com/android/gallery3d/filtershow/imageshow/ImageSmallFilter.java @@ -18,7 +18,7 @@ public class ImageSmallFilter extends ImageShow implements View.OnClickListener private static final String LOGTAG = "ImageSmallFilter"; private FilterShowActivity mController = null; - private ImageFilter mImageFilter = null; + protected ImageFilter mImageFilter = null; private boolean mShowTitle = true; private boolean mSetBorder = false; protected final Paint mPaint = new Paint(); @@ -93,18 +93,10 @@ public class ImageSmallFilter extends ImageShow implements View.OnClickListener } @Override - public void updateImage() { + public boolean updateGeometryFlags() { // We don't want to warn listeners here that the image size has changed, because // we'll be working with the small image... - mForegroundImage = getOriginalFrontBitmap(); - } - - @Override - protected Bitmap getOriginalFrontBitmap() { - if (mImageLoader == null) { - return null; - } - return mImageLoader.getOriginalBitmapSmall(); + return false; } public void setShowTitle(boolean value) { @@ -127,9 +119,22 @@ public class ImageSmallFilter extends ImageShow implements View.OnClickListener return false; } + @Override + public ImagePreset getImagePreset() { + return mImagePreset; + } + + @Override + public void updateImagePresets(boolean force) { + ImagePreset preset = getImagePreset(); + if (preset == null) { + return; + } + } + @Override public void onDraw(Canvas canvas) { - getFilteredImage(); + requestFilteredImages(); canvas.drawColor(mBackgroundColor); float textWidth = mPaint.measureText(mImageFilter.getName()); int h = mTextSize + 2 * mTextPadding; @@ -140,7 +145,7 @@ public class ImageSmallFilter extends ImageShow implements View.OnClickListener canvas.drawRect(0, mMargin, getWidth(), getWidth() + mMargin, mPaint); } Rect destination = new Rect(mMargin, 2*mMargin, getWidth() - mMargin, getWidth()); - drawImage(canvas, mFilteredImage, destination); + drawImage(canvas, getFilteredImage(), destination); mPaint.setTextSize(mTextSize); mPaint.setColor(mTextColor); canvas.drawText(mImageFilter.getName(), x, y - mTextMargin, mPaint); diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageZoom.java b/src/com/android/gallery3d/filtershow/imageshow/ImageZoom.java index 4e2ccc3eb..4d1df3de3 100644 --- a/src/com/android/gallery3d/filtershow/imageshow/ImageZoom.java +++ b/src/com/android/gallery3d/filtershow/imageshow/ImageZoom.java @@ -58,8 +58,8 @@ public class ImageZoom extends ImageSlave { if ((mZoomedIn ||mTouchDown) && mImageLoader != null) { filteredImage = mImageLoader.getScaleOneImageForPreset(this, getImagePreset(), mZoomBounds, false); } else { - getFilteredImage(); - filteredImage = mFilteredImage; + requestFilteredImages(); + filteredImage = getFilteredImage(); } drawImage(canvas, filteredImage); if (showControls()) { diff --git a/src/com/android/gallery3d/filtershow/presets/ImagePreset.java b/src/com/android/gallery3d/filtershow/presets/ImagePreset.java index cbb14300d..c1eb86f14 100644 --- a/src/com/android/gallery3d/filtershow/presets/ImagePreset.java +++ b/src/com/android/gallery3d/filtershow/presets/ImagePreset.java @@ -27,6 +27,9 @@ public class ImagePreset { private String mHistoryName = "Original"; protected boolean mIsFxPreset = false; + private boolean mDoApplyGeometry = true; + private boolean mDoApplyFilters = true; + public final GeometryMetadata mGeoData = new GeometryMetadata(); enum FullRotate { @@ -70,6 +73,14 @@ public class ImagePreset { mGeoData.set(source.mGeoData); } + public void setDoApplyGeometry(boolean value) { + mDoApplyGeometry = value; + } + + public void setDoApplyFilters(boolean value) { + mDoApplyFilters = value; + } + public boolean hasModifications() { if (mImageBorder != null && !mImageBorder.isNil()) { return true; @@ -102,7 +113,6 @@ public class ImagePreset { return true; } - public void setGeometry(GeometryMetadata m) { mGeoData.set(m); } @@ -238,11 +248,17 @@ public class ImagePreset { public Bitmap apply(Bitmap original) { // First we apply any transform -- 90 rotate, flip, straighten, crop - Bitmap bitmap = mGeoData.apply(original, mScaleFactor, mIsHighQuality); + Bitmap bitmap = original; - for (int i = 0; i < mFilters.size(); i++) { - ImageFilter filter = mFilters.elementAt(i); - bitmap = filter.apply(bitmap, mScaleFactor, mIsHighQuality); + if (mDoApplyGeometry) { + bitmap = mGeoData.apply(original, mScaleFactor, mIsHighQuality); + } + + if (mDoApplyFilters) { + for (int i = 0; i < mFilters.size(); i++) { + ImageFilter filter = mFilters.elementAt(i); + bitmap = filter.apply(bitmap, mScaleFactor, mIsHighQuality); + } } if (mImageBorder != null) { @@ -252,6 +268,7 @@ public class ImagePreset { if (mEndPoint != null) { mEndPoint.updateFilteredImage(bitmap); } + return bitmap; } diff --git a/src/com/android/gallery3d/filtershow/ui/ImageCurves.java b/src/com/android/gallery3d/filtershow/ui/ImageCurves.java index 81da9f80e..8f7560e10 100644 --- a/src/com/android/gallery3d/filtershow/ui/ImageCurves.java +++ b/src/com/android/gallery3d/filtershow/ui/ImageCurves.java @@ -89,8 +89,8 @@ public class ImageCurves extends ImageSlave { gPaint.setAntiAlias(true); - if (getImagePreset() != mLastPreset) { - new ComputeHistogramTask().execute(mFilteredImage); + if (getImagePreset() != mLastPreset && getFilteredImage() != null) { + new ComputeHistogramTask().execute(getFilteredImage()); mLastPreset = getImagePreset(); } @@ -185,6 +185,10 @@ public class ImageCurves extends ImageSlave { return true; } + if (curves() == null) { + return true; + } + Spline spline = getSpline(mCurrentCurveIndex); int pick = pickControlPoint(posX, posY); if (mCurrentControlPoint == null) { @@ -212,7 +216,7 @@ public class ImageCurves extends ImageSlave { public synchronized void updateCachedImage() { // update image if (getImagePreset() != null) { - mImageLoader.resetImageForPreset(getImagePreset(), this); + resetImageCaches(this); invalidate(); } } -- cgit v1.2.3