diff options
Diffstat (limited to 'src/com/android/gallery3d/filtershow/imageshow/MasterImage.java')
-rw-r--r-- | src/com/android/gallery3d/filtershow/imageshow/MasterImage.java | 104 |
1 files changed, 81 insertions, 23 deletions
diff --git a/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java b/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java index 5e9ec7a7a..3172c79dc 100644 --- a/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java +++ b/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java @@ -19,23 +19,21 @@ package com.android.gallery3d.filtershow.imageshow; import android.graphics.Bitmap; import android.graphics.RectF; -import com.android.gallery3d.app.Log; import com.android.gallery3d.filtershow.FilterShowActivity; import com.android.gallery3d.filtershow.HistoryAdapter; import com.android.gallery3d.filtershow.ImageStateAdapter; -import com.android.gallery3d.filtershow.cache.TripleBufferBitmap; -import com.android.gallery3d.filtershow.cache.FilteringPipeline; -import com.android.gallery3d.filtershow.cache.ImageLoader; +import com.android.gallery3d.filtershow.cache.*; +import com.android.gallery3d.filtershow.filters.FilterRepresentation; import com.android.gallery3d.filtershow.filters.ImageFilter; import com.android.gallery3d.filtershow.presets.ImagePreset; import java.util.Vector; -public class MasterImage { +public class MasterImage implements RenderingRequestCaller { private static final String LOGTAG = "MasterImage"; - private static MasterImage sMasterImage = new MasterImage(); + private static MasterImage sMasterImage = null; private ImageFilter mCurrentFilter = null; private ImagePreset mPreset = null; @@ -43,8 +41,9 @@ public class MasterImage { private ImagePreset mFiltersOnlyPreset = null; private TripleBufferBitmap mFilteredPreview = new TripleBufferBitmap(); - private TripleBufferBitmap mGeometryOnlyPreview = new TripleBufferBitmap(); - private TripleBufferBitmap mFiltersOnlyPreview = new TripleBufferBitmap(); + + private Bitmap mGeometryOnlyBitmap = null; + private Bitmap mFiltersOnlyBitmap = null; private ImageLoader mLoader = null; private HistoryAdapter mHistory = null; @@ -53,14 +52,25 @@ public class MasterImage { private FilterShowActivity mActivity = null; private Vector<ImageShow> mObservers = new Vector<ImageShow>(); + private FilterRepresentation mCurrentFilterRepresentation; + private Vector<GeometryListener> mGeometryListeners = new Vector<GeometryListener>(); + + private GeometryMetadata mPreviousGeometry = null; - private MasterImage() { } + private MasterImage() { + } public static MasterImage getImage() { + if (sMasterImage == null) { + sMasterImage = new MasterImage(); + } return sMasterImage; } public void addObserver(ImageShow observer) { + if (mObservers.contains(observer)) { + return; + } mObservers.add(observer); } @@ -68,6 +78,10 @@ public class MasterImage { mActivity = activity; } + public ImageLoader getLoader() { + return mLoader; + } + public synchronized ImagePreset getPreset() { return mPreset; } @@ -89,6 +103,11 @@ public class MasterImage { mHistory.addHistoryItem(mPreset); } updatePresets(true); + GeometryMetadata geo = mPreset.mGeoData; + if (!geo.equals(mPreviousGeometry)) { + notifyGeometryChange(); + } + mPreviousGeometry = new GeometryMetadata(geo); } private void setGeometry() { @@ -113,6 +132,7 @@ public class MasterImage { // We need a copy from the history mHistory.setCurrentPreset(position); } + public HistoryAdapter getHistory() { return mHistory; } @@ -133,6 +153,10 @@ public class MasterImage { mLoader = loader; } + public ImageLoader getImageLoader() { + return mLoader; + } + public void setCurrentFilter(ImageFilter filter) { mCurrentFilter = filter; } @@ -152,24 +176,16 @@ public class MasterImage { return mFilteredPreview; } - public TripleBufferBitmap getGeometryOnlyBuffer() { - return mGeometryOnlyPreview; - } - - public TripleBufferBitmap getFiltersOnlyBuffer() { - return mFiltersOnlyPreview; - } - public Bitmap getFilteredImage() { return mFilteredPreview.getConsumer(); } public Bitmap getFiltersOnlyImage() { - return mFiltersOnlyPreview.getConsumer(); + return mFiltersOnlyBitmap; } public Bitmap getGeometryOnlyImage() { - return mGeometryOnlyPreview.getConsumer(); + return mGeometryOnlyBitmap; } public void notifyObservers() { @@ -185,6 +201,8 @@ public class MasterImage { if (mGeometryOnlyPreset == null || !newPreset.same(mGeometryOnlyPreset)) { mGeometryOnlyPreset = newPreset; + RenderingRequest.post(mLoader.getOriginalBitmapLarge(), + mGeometryOnlyPreset, RenderingRequest.GEOMETRY_RENDERING, this); } } if (force || mFiltersOnlyPreset == null) { @@ -193,16 +211,56 @@ public class MasterImage { if (mFiltersOnlyPreset == null || !newPreset.same(mFiltersOnlyPreset)) { mFiltersOnlyPreset = newPreset; + RenderingRequest.post(mLoader.getOriginalBitmapLarge(), + mFiltersOnlyPreset, RenderingRequest.FILTERS_RENDERING, this); } } + invalidatePreview(); mActivity.enableSave(hasModifications()); - updateBuffers(); } - public void updateBuffers() { + public FilterRepresentation getCurrentFilterRepresentation() { + return mCurrentFilterRepresentation; + } + + public void setCurrentFilterRepresentation(FilterRepresentation currentFilterRepresentation) { + mCurrentFilterRepresentation = currentFilterRepresentation; + } + + public void invalidateFiltersOnly() { + mFiltersOnlyPreset = null; + updatePresets(false); + } + + public void invalidatePreview() { + mFilteredPreview.invalidate(); FilteringPipeline.getPipeline().updatePreviewBuffer(); - FilteringPipeline.getPipeline().updateGeometryOnlyPreviewBuffer(); - FilteringPipeline.getPipeline().updateFiltersOnlyPreviewBuffer(); } + @Override + public void available(RenderingRequest request) { + if (request.getBitmap() == null) { + return; + } + if (request.getType() == RenderingRequest.GEOMETRY_RENDERING) { + mGeometryOnlyBitmap = request.getBitmap(); + } + if (request.getType() == RenderingRequest.FILTERS_RENDERING) { + mFiltersOnlyBitmap = request.getBitmap(); + } + } + + public static void reset() { + sMasterImage = null; + } + + public void addGeometryListener(GeometryListener listener) { + mGeometryListeners.add(listener); + } + + public void notifyGeometryChange() { + for (GeometryListener listener : mGeometryListeners) { + listener.geometryChanged(); + } + } } |