OSDN Git Service

Move classes to pipeline package
[android-x86/packages-apps-Gallery2.git] / src / com / android / gallery3d / filtershow / imageshow / MasterImage.java
index 7e086b0..ffd69a6 100644 (file)
 
 package com.android.gallery3d.filtershow.imageshow;
 
-import android.graphics.*;
+import android.graphics.Bitmap;
+import android.graphics.Matrix;
+import android.graphics.Point;
+import android.graphics.Rect;
+import android.graphics.RectF;
 import android.os.Handler;
 import android.os.Message;
 
-import android.util.Log;
 import com.android.gallery3d.filtershow.FilterShowActivity;
-import com.android.gallery3d.filtershow.HistoryAdapter;
-import com.android.gallery3d.filtershow.cache.*;
+import com.android.gallery3d.filtershow.history.HistoryManager;
+import com.android.gallery3d.filtershow.history.HistoryItem;
+import com.android.gallery3d.filtershow.pipeline.FilteringPipeline;
+import com.android.gallery3d.filtershow.cache.ImageLoader;
+import com.android.gallery3d.filtershow.pipeline.RenderingRequest;
+import com.android.gallery3d.filtershow.pipeline.RenderingRequestCaller;
 import com.android.gallery3d.filtershow.filters.FilterRepresentation;
 import com.android.gallery3d.filtershow.filters.ImageFilter;
-import com.android.gallery3d.filtershow.presets.ImagePreset;
+import com.android.gallery3d.filtershow.pipeline.Buffer;
+import com.android.gallery3d.filtershow.pipeline.SharedBuffer;
+import com.android.gallery3d.filtershow.pipeline.SharedPreset;
+import com.android.gallery3d.filtershow.pipeline.ImagePreset;
 import com.android.gallery3d.filtershow.state.StateAdapter;
 
 import java.util.Vector;
@@ -35,7 +45,7 @@ public class MasterImage implements RenderingRequestCaller {
 
     private static final String LOGTAG = "MasterImage";
     private boolean DEBUG  = false;
-
+    private static final boolean DISABLEZOOM = false;
     private static MasterImage sMasterImage = null;
     private static int sIconSeedSize = 128;
     private static float sHistoryPreviewSize = 128.0f;
@@ -44,10 +54,12 @@ public class MasterImage implements RenderingRequestCaller {
 
     private ImageFilter mCurrentFilter = null;
     private ImagePreset mPreset = null;
+    private ImagePreset mLoadedPreset = null;
     private ImagePreset mGeometryOnlyPreset = null;
     private ImagePreset mFiltersOnlyPreset = null;
 
-    private TripleBufferBitmap mFilteredPreview = new TripleBufferBitmap();
+    private SharedBuffer mPreviewBuffer = new SharedBuffer();
+    private SharedPreset mPreviewPreset = new SharedPreset();
 
     private Bitmap mGeometryOnlyBitmap = null;
     private Bitmap mFiltersOnlyBitmap = null;
@@ -55,7 +67,7 @@ public class MasterImage implements RenderingRequestCaller {
     private Bitmap mHighresBitmap = null;
 
     private ImageLoader mLoader = null;
-    private HistoryAdapter mHistory = null;
+    private HistoryManager mHistory = null;
     private StateAdapter mState = null;
 
     private FilterShowActivity mActivity = null;
@@ -139,38 +151,27 @@ public class MasterImage implements RenderingRequestCaller {
         return mFiltersOnlyPreset;
     }
 
-    public synchronized void setPreset(ImagePreset preset, boolean addToHistory) {
-        preset.showFilters();
+    public synchronized void setPreset(ImagePreset preset,
+                                       FilterRepresentation change,
+                                       boolean addToHistory) {
+        if (DEBUG) {
+            preset.showFilters();
+        }
         mPreset = preset;
         mPreset.setImageLoader(mLoader);
         setGeometry();
         mPreset.fillImageStateAdapter(mState);
         if (addToHistory) {
-            mHistory.addHistoryItem(mPreset);
+            HistoryItem historyItem = new HistoryItem(mPreset, change);
+            mHistory.addHistoryItem(historyItem);
         }
         updatePresets(true);
-        GeometryMetadata geo = mPreset.mGeoData;
+        GeometryMetadata geo = mPreset.getGeometry();
         if (!geo.equals(mPreviousGeometry)) {
             notifyGeometryChange();
         }
         mPreviousGeometry = new GeometryMetadata(geo);
-    }
-
-    private void renderHistoryPreview() {
-        ImagePreset historyPreset = mPreset;
-        if (historyPreset != null) {
-            Bitmap preview = mLoader.getOriginalBitmapSmall();
-            if (preview != null) {
-                float s = Math.min(preview.getWidth(), preview.getHeight());
-                float f = sHistoryPreviewSize / s;
-                int w = (int) (preview.getWidth() * f);
-                int h = (int) (preview.getHeight() * f);
-                Bitmap historyPreview = Bitmap.createScaledBitmap(preview, w, h, true);
-                historyPreset.setPreviewImage(historyPreview);
-                RenderingRequest.post(historyPreview,
-                        historyPreset, RenderingRequest.ICON_RENDERING, this);
-            }
-        }
+        mActivity.updateCategories();
     }
 
     private void setGeometry() {
@@ -180,7 +181,7 @@ public class MasterImage implements RenderingRequestCaller {
         }
         float w = image.getWidth();
         float h = image.getHeight();
-        GeometryMetadata geo = mPreset.mGeoData;
+        GeometryMetadata geo = mPreset.getGeometry();
         RectF pb = geo.getPhotoBounds();
         if (w == pb.width() && h == pb.height()) {
             return;
@@ -188,15 +189,19 @@ public class MasterImage implements RenderingRequestCaller {
         RectF r = new RectF(0, 0, w, h);
         geo.setPhotoBounds(r);
         geo.setCropBounds(r);
+        mPreset.setGeometry(geo);
     }
 
     public void onHistoryItemClick(int position) {
-        setPreset(new ImagePreset(mHistory.getItem(position)), false);
+        HistoryItem historyItem = mHistory.getItem(position);
         // We need a copy from the history
+        ImagePreset newPreset = new ImagePreset(historyItem.getImagePreset());
+        // don't need to add it to the history
+        setPreset(newPreset, historyItem.getFilterRepresentation(), false);
         mHistory.setCurrentPreset(position);
     }
 
-    public HistoryAdapter getHistory() {
+    public HistoryManager getHistory() {
         return mHistory;
     }
 
@@ -204,7 +209,7 @@ public class MasterImage implements RenderingRequestCaller {
         return mState;
     }
 
-    public void setHistoryAdapter(HistoryAdapter adapter) {
+    public void setHistoryManager(HistoryManager adapter) {
         mHistory = adapter;
     }
 
@@ -229,18 +234,35 @@ public class MasterImage implements RenderingRequestCaller {
     }
 
     public synchronized boolean hasModifications() {
+        // TODO: We need to have a better same effects check to see if two
+        // presets are functionally the same. Right now, we are relying on a
+        // stricter check as equals().
+        ImagePreset loadedPreset = getLoadedPreset();
         if (mPreset == null) {
-            return false;
+            if (loadedPreset == null) {
+                return false;
+            } else {
+                return loadedPreset.hasModifications();
+            }
+        } else {
+            if (loadedPreset == null) {
+                return mPreset.hasModifications();
+            } else {
+                return !mPreset.equals(getLoadedPreset());
+            }
         }
-        return mPreset.hasModifications();
     }
 
-    public TripleBufferBitmap getDoubleBuffer() {
-        return mFilteredPreview;
+    public SharedBuffer getPreviewBuffer() {
+        return mPreviewBuffer;
+    }
+
+    public SharedPreset getPreviewPreset() {
+        return mPreviewPreset;
     }
 
     public void setOriginalGeometry(Bitmap originalBitmapLarge) {
-        GeometryMetadata geo = getPreset().mGeoData;
+        GeometryMetadata geo = getPreset().getGeometry();
         float w = originalBitmapLarge.getWidth();
         float h = originalBitmapLarge.getHeight();
         RectF r = new RectF(0, 0, w, h);
@@ -250,7 +272,12 @@ public class MasterImage implements RenderingRequestCaller {
     }
 
     public Bitmap getFilteredImage() {
-        return mFilteredPreview.getConsumer();
+        mPreviewBuffer.swapConsumerIfNeeded(); // get latest bitmap
+        Buffer consumer = mPreviewBuffer.getConsumer();
+        if (consumer != null) {
+            return consumer.getBitmap();
+        }
+        return null;
     }
 
     public Bitmap getFiltersOnlyImage() {
@@ -299,7 +326,6 @@ public class MasterImage implements RenderingRequestCaller {
             }
         }
         invalidatePreview();
-        mActivity.enableSave(hasModifications());
     }
 
     public FilterRepresentation getCurrentFilterRepresentation() {
@@ -330,7 +356,8 @@ public class MasterImage implements RenderingRequestCaller {
     }
 
     public void invalidatePreview() {
-        mFilteredPreview.invalidate();
+        mPreviewPreset.enqueuePreset(mPreset);
+        mPreviewBuffer.invalidate();
         invalidatePartialPreview();
         invalidateHighresPreview();
         needsUpdatePartialPreview();
@@ -347,7 +374,7 @@ public class MasterImage implements RenderingRequestCaller {
     }
 
     private Matrix getImageToScreenMatrix(boolean reflectRotation) {
-        GeometryMetadata geo = mPreset.mGeoData;
+        GeometryMetadata geo = mPreset.getGeometry();
         if (geo == null || mLoader == null
                 || mLoader.getOriginalBounds() == null
                 || mImageShowSize.x == 0) {
@@ -359,7 +386,7 @@ public class MasterImage implements RenderingRequestCaller {
         Point translate = getTranslation();
         float scaleFactor = getScaleFactor();
         m.postTranslate(translate.x, translate.y);
-        m.postScale(scaleFactor, scaleFactor, mImageShowSize.x/2.0f, mImageShowSize.y/2.0f);
+        m.postScale(scaleFactor, scaleFactor, mImageShowSize.x / 2.0f, mImageShowSize.y / 2.0f);
         return m;
     }
 
@@ -399,27 +426,29 @@ public class MasterImage implements RenderingRequestCaller {
         if (request.getBitmap() == null) {
             return;
         }
+
+        boolean needsCheckModification = false;
         if (request.getType() == RenderingRequest.GEOMETRY_RENDERING) {
             mGeometryOnlyBitmap = request.getBitmap();
+            needsCheckModification = true;
         }
         if (request.getType() == RenderingRequest.FILTERS_RENDERING) {
             mFiltersOnlyBitmap = request.getBitmap();
+            needsCheckModification = true;
         }
         if (request.getType() == RenderingRequest.PARTIAL_RENDERING
                 && request.getScaleFactor() == getScaleFactor()) {
             mPartialBitmap = request.getBitmap();
             notifyObservers();
+            needsCheckModification = true;
         }
         if (request.getType() == RenderingRequest.HIGHRES_RENDERING) {
             mHighresBitmap = request.getBitmap();
             notifyObservers();
+            needsCheckModification = true;
         }
-
-        if (request.getType() == RenderingRequest.ICON_RENDERING) {
-            // History preview images
-            ImagePreset preset = request.getOriginalImagePreset();
-            preset.setPreviewImage(request.getBitmap());
-            mHistory.notifyDataSetChanged();
+        if (needsCheckModification) {
+            mActivity.enableSave(hasModifications());
         }
     }
 
@@ -451,6 +480,9 @@ public class MasterImage implements RenderingRequestCaller {
     }
 
     public void setScaleFactor(float scaleFactor) {
+        if (DISABLEZOOM) {
+            return;
+        }
         if (scaleFactor == mScaleFactor) {
             return;
         }
@@ -463,6 +495,11 @@ public class MasterImage implements RenderingRequestCaller {
     }
 
     public void setTranslation(Point translation) {
+        if (DISABLEZOOM) {
+            mTranslation.x = 0;
+            mTranslation.y = 0;
+            return;
+        }
         mTranslation.x = translation.x;
         mTranslation.y = translation.y;
         needsUpdatePartialPreview();
@@ -473,6 +510,9 @@ public class MasterImage implements RenderingRequestCaller {
     }
 
     public void setOriginalTranslation(Point originalTranslation) {
+        if (DISABLEZOOM) {
+            return;
+        }
         mOriginalTranslation.x = originalTranslation.x;
         mOriginalTranslation.y = originalTranslation.y;
     }
@@ -492,6 +532,9 @@ public class MasterImage implements RenderingRequestCaller {
     }
 
     public float getMaxScaleFactor() {
+        if (DISABLEZOOM) {
+            return 1;
+        }
         return mMaxScaleFactor;
     }
 
@@ -511,4 +554,13 @@ public class MasterImage implements RenderingRequestCaller {
     public boolean showsOriginal() {
         return mShowsOriginal;
     }
+
+    public void setLoadedPreset(ImagePreset preset) {
+        mLoadedPreset = preset;
+    }
+
+    public ImagePreset getLoadedPreset() {
+        return mLoadedPreset;
+    }
+
 }