OSDN Git Service

Cleanup in ImagePreset
authornicolasroard <nicolasroard@google.com>
Wed, 26 Jun 2013 21:33:15 +0000 (14:33 -0700)
committernicolasroard <nicolasroard@google.com>
Wed, 26 Jun 2013 22:26:28 +0000 (15:26 -0700)
Move GeometryMetadata to the list of filters

Change-Id: I0bef13ca0d9cb41e68eddd108000ff7bd426b313

src/com/android/gallery3d/filtershow/FilterShowActivity.java
src/com/android/gallery3d/filtershow/filters/ImageFilter.java
src/com/android/gallery3d/filtershow/imageshow/GeometryMetadata.java
src/com/android/gallery3d/filtershow/imageshow/ImageShow.java
src/com/android/gallery3d/filtershow/imageshow/MasterImage.java
src/com/android/gallery3d/filtershow/presets/ImagePreset.java
src/com/android/gallery3d/filtershow/ui/FilterIconButton.java

index 2ac7e98..9512ff0 100644 (file)
@@ -462,7 +462,15 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL
         if (representation == null) {
             return;
         }
-        useFilterRepresentation(representation);
+
+        // TODO: this check is needed because the GeometryMetadata doesn't quite
+        // follow the same pattern as the other filters to update/sync their values.
+        // We thus need to not call useFilterRepresentation() for now, as it
+        // would override the current Geometry. Once GeometryMetadata is fixed,
+        // let's remove the check and call useFilterRepresentation all the time.
+        if (!(representation instanceof GeometryMetadata)) {
+            useFilterRepresentation(representation);
+        }
 
         // show representation
         Editor mCurrentEditor = mEditorPlaceHolder.showEditor(representation.getEditorId());
index 6481e10..5ac87c6 100644 (file)
@@ -89,7 +89,7 @@ public abstract class ImageFilter implements Cloneable {
 
     protected Matrix getOriginalToScreenMatrix(int w, int h) {
         ImagePreset preset = getEnvironment().getImagePreset();
-        GeometryMetadata geo = getEnvironment().getImagePreset().mGeoData;
+        GeometryMetadata geo = getEnvironment().getImagePreset().getGeometry();
         Matrix originalToScreen = geo.getOriginalToScreen(true,
                 preset.getImageLoader().getOriginalBounds().width(),
                 preset.getImageLoader().getOriginalBounds().height(),
index 77dbd5e..af18372 100644 (file)
@@ -38,7 +38,7 @@ import java.util.LinkedHashSet;
 import java.util.List;
 
 public class GeometryMetadata extends FilterRepresentation {
-    private static final String SERIALIZATION_NAME = "GEOM";
+    public static final String SERIALIZATION_NAME = "GEOM";
     private static final String LOGTAG = "GeometryMetadata";
     private float mScaleFactor = 1.0f;
     private float mRotation = 0;
index 1b93983..13f18dc 100644 (file)
@@ -89,7 +89,7 @@ public class ImageShow extends View implements OnGestureListener,
     InteractionMode mInteractionMode = InteractionMode.NONE;
 
     protected GeometryMetadata getGeometry() {
-        return new GeometryMetadata(getImagePreset().mGeoData);
+        return new GeometryMetadata(getImagePreset().getGeometry());
     }
 
     private FilterShowActivity mActivity = null;
@@ -161,12 +161,12 @@ public class ImageShow extends View implements OnGestureListener,
 
     public Rect getImageBounds() {
         Rect dst = new Rect();
-        getImagePreset().mGeoData.getPhotoBounds().roundOut(dst);
+        getImagePreset().getGeometry().getPhotoBounds().roundOut(dst);
         return dst;
     }
 
     public Rect getImageCropBounds() {
-        return GeometryMath.roundNearest(getImagePreset().mGeoData.getPreviewCropBounds());
+        return GeometryMath.roundNearest(getImagePreset().getGeometry().getPreviewCropBounds());
     }
 
     /* consider moving the following 2 methods into a subclass */
@@ -177,7 +177,7 @@ public class ImageShow extends View implements OnGestureListener,
      * @return Image to Screen transformation matrix
      */
     protected Matrix getImageToScreenMatrix(boolean reflectRotation) {
-        GeometryMetadata geo = getImagePreset().mGeoData;
+        GeometryMetadata geo = getImagePreset().getGeometry();
         if (geo == null || mImageLoader == null
                 || mImageLoader.getOriginalBounds() == null) {
             return new Matrix();
@@ -377,15 +377,15 @@ public class ImageShow extends View implements OnGestureListener,
             return;
         float w = image.getWidth();
         float h = image.getHeight();
-        GeometryMetadata geo = getImagePreset().mGeoData;
+        GeometryMetadata geo = getImagePreset().getGeometry();
         RectF pb = geo.getPhotoBounds();
         if (w == pb.width() && h == pb.height()) {
             return;
         }
         RectF r = new RectF(0, 0, w, h);
-        getImagePreset().mGeoData.setPhotoBounds(r);
-        getImagePreset().mGeoData.setCropBounds(r);
-
+        geo.setPhotoBounds(r);
+        geo.setCropBounds(r);
+        getImagePreset().setGeometry(geo);
     }
 
     public void updateImage() {
index 4ea944b..839f638 100644 (file)
@@ -151,7 +151,7 @@ public class MasterImage implements RenderingRequestCaller {
             mHistory.addHistoryItem(mPreset);
         }
         updatePresets(true);
-        GeometryMetadata geo = mPreset.mGeoData;
+        GeometryMetadata geo = mPreset.getGeometry();
         if (!geo.equals(mPreviousGeometry)) {
             notifyGeometryChange();
         }
@@ -182,7 +182,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;
@@ -190,6 +190,7 @@ 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) {
@@ -242,7 +243,7 @@ public class MasterImage implements RenderingRequestCaller {
     }
 
     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);
@@ -349,7 +350,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) {
index 7b22609..11502af 100644 (file)
@@ -63,19 +63,16 @@ public class ImagePreset {
     private boolean mDoApplyGeometry = true;
     private boolean mDoApplyFilters = true;
 
-    public final GeometryMetadata mGeoData = new GeometryMetadata();
     private boolean mPartialRendering = false;
     private Rect mPartialRenderingBounds;
 
     private Bitmap mPreviewImage;
 
     public ImagePreset() {
-        setup();
     }
 
     public ImagePreset(String historyName) {
         setHistoryName(historyName);
-        setup();
     }
 
     public ImagePreset(ImagePreset source, String historyName) {
@@ -88,7 +85,17 @@ public class ImagePreset {
     public ImagePreset(ImagePreset source) {
         try {
             for (int i = 0; i < source.mFilters.size(); i++) {
-                FilterRepresentation representation = source.mFilters.elementAt(i).clone();
+                FilterRepresentation representation = null;
+                FilterRepresentation sourceRepresentation = source.mFilters.elementAt(i);
+                if (sourceRepresentation instanceof GeometryMetadata) {
+                    GeometryMetadata geoData = new GeometryMetadata();
+                    GeometryMetadata srcGeo = (GeometryMetadata) sourceRepresentation;
+                    geoData.set(srcGeo);
+                    representation = geoData;
+                } else {
+                    // TODO: get rid of clone()...
+                    representation = sourceRepresentation.clone();
+                }
                 addFilter(representation);
             }
         } catch (java.lang.CloneNotSupportedException e) {
@@ -99,8 +106,6 @@ public class ImagePreset {
         mIsFxPreset = source.isFx();
         mImageLoader = source.getImageLoader();
         mPreviewImage = source.getPreviewImage();
-
-        mGeoData.set(source.mGeoData);
     }
 
     public FilterRepresentation getFilterRepresentation(int position) {
@@ -184,15 +189,24 @@ public class ImagePreset {
     }
 
     public synchronized GeometryMetadata getGeometry() {
-        return mGeoData;
+        for (FilterRepresentation representation : mFilters) {
+            if (representation instanceof GeometryMetadata) {
+                return (GeometryMetadata) representation;
+            }
+        }
+        GeometryMetadata geo = new GeometryMetadata();
+        mFilters.add(0, geo); // Hard Requirement for now -- Geometry ought to be first.
+        return geo;
     }
 
     public boolean hasModifications() {
-        if (mGeoData.hasModifications()) {
-            return true;
-        }
         for (int i = 0; i < mFilters.size(); i++) {
             FilterRepresentation filter = mFilters.elementAt(i);
+            if (filter instanceof GeometryMetadata) {
+                if (((GeometryMetadata) filter).hasModifications()) {
+                    return true;
+                }
+            }
             if (!filter.isNil() && !filter.getName().equalsIgnoreCase("none")) {
                 return true;
             }
@@ -201,10 +215,12 @@ public class ImagePreset {
     }
 
     public boolean isPanoramaSafe() {
-        if (mGeoData.hasModifications()) {
-            return false;
-        }
         for (FilterRepresentation representation : mFilters) {
+            if (representation instanceof GeometryMetadata) {
+                if (((GeometryMetadata) representation).hasModifications()) {
+                    return false;
+                }
+            }
             if (representation.getFilterType() == FilterRepresentation.TYPE_BORDER
                     && !representation.isNil()) {
                 return false;
@@ -221,8 +237,11 @@ public class ImagePreset {
         return true;
     }
 
-    public synchronized void setGeometry(GeometryMetadata m) {
-        mGeoData.set(m);
+    public synchronized void setGeometry(GeometryMetadata representation) {
+        GeometryMetadata geoData = getGeometry();
+        if (geoData != representation) {
+            geoData.set(representation);
+        }
         MasterImage.getImage().notifyGeometryChange();
     }
 
@@ -284,7 +303,7 @@ public class ImagePreset {
             return false;
         }
 
-        if (mDoApplyGeometry && !mGeoData.equals(preset.mGeoData)) {
+        if (mDoApplyGeometry && !getGeometry().equals(preset.getGeometry())) {
             return false;
         }
 
@@ -298,6 +317,10 @@ public class ImagePreset {
             for (int i = 0; i < preset.mFilters.size(); i++) {
                 FilterRepresentation a = preset.mFilters.elementAt(i);
                 FilterRepresentation b = mFilters.elementAt(i);
+                if (a instanceof GeometryMetadata) {
+                    // Note: Geometry will always be at the same place
+                    continue;
+                }
                 if (!a.same(b)) {
                     return false;
                 }
@@ -308,7 +331,7 @@ public class ImagePreset {
     }
 
     public int similarUpTo(ImagePreset preset) {
-        if (!mGeoData.equals(preset.mGeoData)) {
+        if (!getGeometry().equals(preset.getGeometry())) {
             return -1;
         }
 
@@ -412,9 +435,6 @@ public class ImagePreset {
     }
 
     public FilterRepresentation getRepresentation(FilterRepresentation filterRepresentation) {
-        if (filterRepresentation instanceof GeometryMetadata) {
-            return mGeoData;
-        }
         for (int i = 0; i < mFilters.size(); i++) {
             FilterRepresentation representation = mFilters.elementAt(i);
             if (representation.getFilterClass() == filterRepresentation.getFilterClass()) {
@@ -424,10 +444,6 @@ public class ImagePreset {
         return null;
     }
 
-    public void setup() {
-        // do nothing here
-    }
-
     public Bitmap apply(Bitmap original, FilterEnvironment environment) {
         Bitmap bitmap = original;
         bitmap = applyFilters(bitmap, -1, -1, environment);
@@ -438,8 +454,9 @@ public class ImagePreset {
         // Apply any transform -- 90 rotate, flip, straighten, crop
         // Returns a new bitmap.
         if (mDoApplyGeometry) {
-            mGeoData.synchronizeRepresentation();
-            bitmap = environment.applyRepresentation(mGeoData, bitmap);
+            GeometryMetadata geoData = getGeometry();
+            geoData.synchronizeRepresentation();
+            bitmap = environment.applyRepresentation(geoData, bitmap);
         }
         return bitmap;
     }
@@ -481,6 +498,10 @@ public class ImagePreset {
                     representation = mFilters.elementAt(i);
                     representation.synchronizeRepresentation();
                 }
+                if (representation instanceof GeometryMetadata) {
+                    // skip the geometry as it's already applied.
+                    continue;
+                }
                 if (representation.getFilterType() == FilterRepresentation.TYPE_BORDER) {
                     // for now, let's skip the border as it will be applied in applyBorder()
                     // TODO: might be worth getting rid of applyBorder.
@@ -532,6 +553,10 @@ public class ImagePreset {
                     representation = mFilters.elementAt(i);
                     representation.synchronizeRepresentation();
                 }
+                if (representation instanceof GeometryMetadata) {
+                    // skip the geometry as it's already applied.
+                    continue;
+                }
                 if (representation.getFilterType() == FilterRepresentation.TYPE_BORDER) {
                     // for now, let's skip the border as it will be applied in applyBorder()
                     continue;
@@ -545,9 +570,6 @@ public class ImagePreset {
     }
 
     public boolean canDoPartialRendering() {
-        if (mGeoData.hasModifications()) {
-            return false;
-        }
         if (ImageLoader.getZoomOrientation() != ImageLoader.ORI_NORMAL) {
             return false;
         }
@@ -556,6 +578,10 @@ public class ImagePreset {
             synchronized (mFilters) {
                 representation = mFilters.elementAt(i);
             }
+            if (representation instanceof GeometryMetadata
+                && ((GeometryMetadata) representation).hasModifications()) {
+                return false;
+            }
             if (!representation.supportsPartialRendering()) {
                 return false;
             }
@@ -568,13 +594,11 @@ public class ImagePreset {
             return;
         }
         Vector<State> states = new Vector<State>();
-        // TODO: supports Geometry representations in the state panel.
-        if (false && mGeoData != null && mGeoData.hasModifications()) {
-            State geo = new State("Geometry");
-            geo.setFilterRepresentation(mGeoData);
-            states.add(geo);
-        }
         for (FilterRepresentation filter : mFilters) {
+            if (filter instanceof GeometryMetadata) {
+                // TODO: supports Geometry representations in the state panel.
+                continue;
+            }
             State state = new State(filter.getName());
             state.setFilterRepresentation(filter);
             states.add(state);
@@ -631,10 +655,11 @@ public class ImagePreset {
         try {
             writer.beginObject();
             writer.name(PRESET_NAME).value(name);
-            writer.name(mGeoData.getSerializationName());
+            GeometryMetadata geoData = getGeometry();
+            writer.name(geoData.getSerializationName());
             writer.beginObject();
             {
-                String[][] rep = mGeoData.serializeRepresentation();
+                String[][] rep = geoData.serializeRepresentation();
                 for (int i = 0; i < rep.length; i++) {
                     writer.name(rep[i][0]);
                     writer.value(rep[i][1]);
@@ -644,6 +669,9 @@ public class ImagePreset {
 
             for (int i = 0; i < numFilters; i++) {
                 FilterRepresentation filter = mFilters.get(i);
+                if (filter instanceof GeometryMetadata) {
+                    continue;
+                }
                 String sname = filter.getSerializationName();
                 writer.name(sname);
                 writer.beginObject();
@@ -685,22 +713,21 @@ public class ImagePreset {
 
         while (sreader.hasNext()) {
             String name = sreader.nextName();
-
-            if (mGeoData.getSerializationName().equals(name)) {
-                mGeoData.deSerializeRepresentation(read(sreader));
-            } else {
-                FilterRepresentation filter = creatFilterFromName(name);
-                if (filter == null)
-                    return false;
-                filter.deSerializeRepresentation(read(sreader));
-                addFilter(filter);
+            FilterRepresentation filter = creatFilterFromName(name);
+            if (filter == null) {
+                return false;
             }
+            filter.deSerializeRepresentation(read(sreader));
+            addFilter(filter);
         }
         sreader.endObject();
         return true;
     }
 
     FilterRepresentation creatFilterFromName(String name) {
+        if (GeometryMetadata.SERIALIZATION_NAME.equalsIgnoreCase(name)) {
+            return new GeometryMetadata();
+        }
         FiltersManager filtersManager = FiltersManager.getManager();
         return filtersManager.createFilterFromName(name);
     }
index 96126c5..bc41e0e 100644 (file)
@@ -182,11 +182,11 @@ public class FilterIconButton extends IconButton implements View.OnClickListener
             ImagePreset mPreset = new ImagePreset();
             mPreset.addFilter(mFilterRepresentation);
 
-            GeometryMetadata geometry = mPreset.mGeoData;
+            GeometryMetadata geometry = mPreset.getGeometry();
             RectF bound = new RectF(0, 0, dst.getWidth(), dst.getHeight());
             geometry.setCropBounds(bound);
             geometry.setPhotoBounds(bound);
-
+            mPreset.setGeometry(geometry);
             RenderingRequest.post(dst.copy(Bitmap.Config.ARGB_8888, true),
                     mPreset, RenderingRequest.ICON_RENDERING, this);
         }