OSDN Git Service

Revert "Revert "Revert "Make Gallery2 use platform RenderScript"""
[android-x86/packages-apps-Gallery2.git] / src / com / android / gallery3d / filtershow / pipeline / ImagePreset.java
index e28cc35..4765a59 100644 (file)
@@ -24,6 +24,7 @@ import android.util.JsonWriter;
 import android.util.Log;
 
 import com.android.gallery3d.R;
+import com.android.gallery3d.filtershow.cache.BitmapCache;
 import com.android.gallery3d.filtershow.cache.ImageLoader;
 import com.android.gallery3d.filtershow.filters.BaseFiltersManager;
 import com.android.gallery3d.filtershow.filters.FilterCropRepresentation;
@@ -40,7 +41,6 @@ import com.android.gallery3d.filtershow.imageshow.GeometryMathUtils;
 import com.android.gallery3d.filtershow.imageshow.MasterImage;
 import com.android.gallery3d.filtershow.state.State;
 import com.android.gallery3d.filtershow.state.StateAdapter;
-import com.android.gallery3d.util.UsageStatistics;
 
 import java.io.IOException;
 import java.io.StringReader;
@@ -52,6 +52,7 @@ import java.util.Vector;
 public class ImagePreset {
 
     private static final String LOGTAG = "ImagePreset";
+    public static final String JASON_SAVED = "Saved";
 
     private Vector<FilterRepresentation> mFilters = new Vector<FilterRepresentation>();
 
@@ -180,6 +181,16 @@ public class ImagePreset {
         return false;
     }
 
+    public boolean contains(byte type) {
+        for (FilterRepresentation representation : mFilters) {
+            if (representation.getFilterType() == type
+                    && !representation.isNil()) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     public boolean isPanoramaSafe() {
         for (FilterRepresentation representation : mFilters) {
             if (representation.getFilterType() == FilterRepresentation.TYPE_GEOMETRY
@@ -235,6 +246,49 @@ public class ImagePreset {
         return true;
     }
 
+    public boolean equals(ImagePreset preset) {
+        if (preset == null) {
+            return false;
+        }
+
+        if (preset.mFilters.size() != mFilters.size()) {
+            return false;
+        }
+
+        if (mDoApplyGeometry != preset.mDoApplyGeometry) {
+            return false;
+        }
+
+        if (mDoApplyFilters != preset.mDoApplyFilters) {
+            if (mFilters.size() > 0 || preset.mFilters.size() > 0) {
+                return false;
+            }
+        }
+
+        for (int i = 0; i < preset.mFilters.size(); i++) {
+            FilterRepresentation a = preset.mFilters.elementAt(i);
+            FilterRepresentation b = mFilters.elementAt(i);
+            boolean isGeometry = false;
+            if (a instanceof FilterRotateRepresentation
+                    || a instanceof FilterMirrorRepresentation
+                    || a instanceof FilterCropRepresentation
+                    || a instanceof FilterStraightenRepresentation) {
+                isGeometry = true;
+            }
+            boolean evaluate = true;
+            if (!isGeometry && mDoApplyGeometry && !mDoApplyFilters) {
+                evaluate = false;
+            } else if (isGeometry && !mDoApplyGeometry && mDoApplyFilters) {
+                evaluate = false;
+            }
+            if (evaluate && !a.equals(b)) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
     public int similarUpTo(ImagePreset preset) {
         for (int i = 0; i < preset.mFilters.size(); i++) {
             FilterRepresentation a = preset.mFilters.elementAt(i);
@@ -293,12 +347,18 @@ public class ImagePreset {
     public void addFilter(FilterRepresentation representation) {
         if (representation instanceof FilterUserPresetRepresentation) {
             ImagePreset preset = ((FilterUserPresetRepresentation) representation).getImagePreset();
-            // user preset replace everything but geometry
-            mFilters.clear();
-            for (int i = 0; i < preset.nbFilters(); i++) {
-                addFilter(preset.getFilterRepresentation(i));
+            if (preset.nbFilters() == 1
+                && preset.contains(FilterRepresentation.TYPE_FX)) {
+                FilterRepresentation rep = preset.getFilterRepresentationForType(
+                        FilterRepresentation.TYPE_FX);
+                addFilter(rep);
+            } else {
+                // user preset replaces everything
+                mFilters.clear();
+                for (int i = 0; i < preset.nbFilters(); i++) {
+                    addFilter(preset.getFilterRepresentation(i));
+                }
             }
-            mFilters.add(representation);
         } else if (representation.getFilterType() == FilterRepresentation.TYPE_GEOMETRY) {
             // Add geometry filter, removing duplicates and do-nothing operations.
             for (int i = 0; i < mFilters.size(); i++) {
@@ -322,56 +382,38 @@ public class ImagePreset {
                 mFilters.add(representation);
             }
         } else if (representation.getFilterType() == FilterRepresentation.TYPE_FX) {
-            boolean found = false;
+            boolean replaced = false;
             for (int i = 0; i < mFilters.size(); i++) {
                 FilterRepresentation current = mFilters.elementAt(i);
-                int type = current.getFilterType();
-                if (found) {
-                    if (type != FilterRepresentation.TYPE_VIGNETTE) {
-                        mFilters.remove(i);
-                        continue;
-                    }
-                }
-                if (type == FilterRepresentation.TYPE_FX) {
-                    if (current instanceof FilterUserPresetRepresentation) {
-                        ImagePreset preset = ((FilterUserPresetRepresentation) current)
-                                .getImagePreset();
-                        // If we had an existing user preset, let's remove all the presets that
-                        // were added by it
-                        for (int j = 0; j < preset.nbFilters(); j++) {
-                            FilterRepresentation rep = preset.getFilterRepresentation(j);
-                            int pos = getPositionForRepresentation(rep);
-                            if (pos != -1) {
-                                mFilters.remove(pos);
-                            }
-                        }
-                        int pos = getPositionForRepresentation(current);
-                        if (pos != -1) {
-                            mFilters.remove(pos);
-                        } else {
-                            pos = 0;
-                        }
-                        if (!isNoneFxFilter(representation)) {
-                            mFilters.add(pos, representation);
-                        }
-
-                    } else {
-                        mFilters.remove(i);
-                        if (!isNoneFxFilter(representation)) {
-                            mFilters.add(i, representation);
-                        }
+                if (current.getFilterType() == FilterRepresentation.TYPE_FX) {
+                    mFilters.remove(i);
+                    replaced = true;
+                    if (!isNoneFxFilter(representation)) {
+                        mFilters.add(i, representation);
                     }
-                    found = true;
+                    break;
                 }
             }
-            if (!found) {
-                if (!isNoneFxFilter(representation)) {
-                    mFilters.add(representation);
-                }
+            if (!replaced && !isNoneFxFilter(representation)) {
+                mFilters.add(0, representation);
             }
         } else {
             mFilters.add(representation);
         }
+        // Enforces Filter type ordering for borders
+        FilterRepresentation border = null;
+        for (int i = 0; i < mFilters.size();) {
+            FilterRepresentation rep = mFilters.elementAt(i);
+            if (rep.getFilterType() == FilterRepresentation.TYPE_BORDER) {
+                border = rep;
+                mFilters.remove(i);
+                continue;
+            }
+            i++;
+        }
+        if (border != null) {
+            mFilters.add(border);
+        }
     }
 
     private boolean isNoneBorderFilter(FilterRepresentation representation) {
@@ -421,11 +463,20 @@ public class ImagePreset {
         return null;
     }
 
+    public Rect finalGeometryRect(int width, int height) {
+        return GeometryMathUtils.finalGeometryRect(width, height, getGeometryFilters());
+    }
+
     public Bitmap applyGeometry(Bitmap bitmap, FilterEnvironment environment) {
         // Apply any transform -- 90 rotate, flip, straighten, crop
         // Returns a new bitmap.
         if (mDoApplyGeometry) {
-            bitmap = GeometryMathUtils.applyGeometryRepresentations(getGeometryFilters(), bitmap);
+            Bitmap bmp = GeometryMathUtils.applyGeometryRepresentations(
+                    getGeometryFilters(), bitmap);
+            if (bmp != bitmap) {
+                environment.cache(bitmap);
+            }
+            return bmp;
         }
         return bitmap;
     }
@@ -437,8 +488,6 @@ public class ImagePreset {
         if (border != null && mDoApplyGeometry) {
             bitmap = environment.applyRepresentation(border, bitmap);
             if (environment.getQuality() == FilterEnvironment.QUALITY_FINAL) {
-                UsageStatistics.onEvent(UsageStatistics.COMPONENT_EDITOR,
-                        "SaveBorder", border.getSerializationName(), 1);
             }
         }
         return bitmap;
@@ -456,10 +505,6 @@ public class ImagePreset {
             if (to == -1) {
                 to = mFilters.size();
             }
-            if (environment.getQuality() == FilterEnvironment.QUALITY_FINAL) {
-                UsageStatistics.onEvent(UsageStatistics.COMPONENT_EDITOR,
-                        "SaveFilters", "Total", to - from + 1);
-            }
             for (int i = from; i < to; i++) {
                 FilterRepresentation representation = mFilters.elementAt(i);
                 if (representation.getFilterType() == FilterRepresentation.TYPE_GEOMETRY) {
@@ -472,10 +517,10 @@ public class ImagePreset {
                     // TODO: might be worth getting rid of applyBorder.
                     continue;
                 }
+                Bitmap tmp = bitmap;
                 bitmap = environment.applyRepresentation(representation, bitmap);
-                if (environment.getQuality() == FilterEnvironment.QUALITY_FINAL) {
-                    UsageStatistics.onEvent(UsageStatistics.COMPONENT_EDITOR,
-                            "SaveFilter", representation.getSerializationName(), 1);
+                if (tmp != bitmap) {
+                    environment.cache(tmp);
                 }
                 if (environment.needsStop()) {
                     return bitmap;
@@ -636,6 +681,7 @@ public class ImagePreset {
             }
             reader.close();
         } catch (Exception e) {
+            Log.e(LOGTAG, "\""+filterString+"\"");
             Log.e(LOGTAG, "parsing the filter parameters:", e);
             return false;
         }