Add procedural borders

bug:7233980
Change-Id: I81008efa3d256061ec27d1ca2333debfb0ab6dd5
diff --git a/src/com/android/gallery3d/filtershow/presets/ImagePreset.java b/src/com/android/gallery3d/filtershow/presets/ImagePreset.java
index 830f3cb..a7b4b40 100644
--- a/src/com/android/gallery3d/filtershow/presets/ImagePreset.java
+++ b/src/com/android/gallery3d/filtershow/presets/ImagePreset.java
@@ -2,12 +2,10 @@
 package com.android.gallery3d.filtershow.presets;
 
 import android.graphics.Bitmap;
-import android.graphics.RectF;
 import android.util.Log;
 
 import com.android.gallery3d.filtershow.ImageStateAdapter;
 import com.android.gallery3d.filtershow.filters.ImageFilter;
-import com.android.gallery3d.filtershow.filters.ImageFilterStraighten;
 import com.android.gallery3d.filtershow.imageshow.GeometryMetadata;
 import com.android.gallery3d.filtershow.imageshow.ImageShow;
 
@@ -16,32 +14,32 @@
 public class ImagePreset {
 
     private static final String LOGTAG = "ImagePreset";
-    ImageShow mEndPoint = null;
+
+    private ImageShow mEndPoint = null;
+    private ImageFilter mImageBorder = null;
+    private float mScaleFactor = 1.0f;
+    private boolean mIsHighQuality = false;
+
     protected Vector<ImageFilter> mFilters = new Vector<ImageFilter>();
     protected String mName = "Original";
     protected String mHistoryName = "Original";
     protected boolean mIsFxPreset = false;
 
+    public final GeometryMetadata mGeoData = new GeometryMetadata();
+
     enum FullRotate {
         ZERO, NINETY, HUNDRED_EIGHTY, TWO_HUNDRED_SEVENTY
     }
 
-    // This is where the geometry metadata lives now.
-    public final GeometryMetadata mGeoData = new GeometryMetadata();
-
-    public void setGeometry(GeometryMetadata m) {
-        mGeoData.set(m);
-    }
-
-    private float mScaleFactor = 1.0f;
-    private boolean mIsHighQuality = false;
-
     public ImagePreset() {
         setup();
     }
 
     public ImagePreset(ImagePreset source) {
         try {
+            if (source.mImageBorder != null) {
+                mImageBorder = source.mImageBorder.clone();
+            }
             for (int i = 0; i < source.mFilters.size(); i++) {
                 add(source.mFilters.elementAt(i).clone());
             }
@@ -55,6 +53,14 @@
         mGeoData.set(source.mGeoData);
     }
 
+    public void setGeometry(GeometryMetadata m) {
+        mGeoData.set(m);
+    }
+
+    public void setBorder(ImageFilter filter) {
+        mImageBorder = filter;
+    }
+
     public boolean isFx() {
         return mIsFxPreset;
     }
@@ -83,6 +89,15 @@
         if (!mGeoData.equals(preset.mGeoData)) {
             return false;
         }
+
+        if (mImageBorder != preset.mImageBorder) {
+            return false;
+        }
+
+        if (mImageBorder != null && !mImageBorder.same(preset.mImageBorder)) {
+            return false;
+        }
+
         for (int i = 0; i < preset.mFilters.size(); i++) {
             ImageFilter a = preset.mFilters.elementAt(i);
             ImageFilter b = mFilters.elementAt(i);
@@ -138,20 +153,15 @@
         // First we apply any transform -- 90 rotate, flip, straighten, crop
         Bitmap bitmap = mGeoData.apply(original, mScaleFactor, mIsHighQuality);
 
-        // TODO -- apply borders separately
-        ImageFilter borderFilter = null;
+        if (mImageBorder != null) {
+            bitmap = mImageBorder.apply(bitmap, mScaleFactor, mIsHighQuality);
+        }
+
         for (int i = 0; i < mFilters.size(); i++) {
             ImageFilter filter = mFilters.elementAt(i);
-            if (filter.getName().equalsIgnoreCase("Border")) {
-                // TODO don't use the name as an id
-                borderFilter = filter;
-            } else {
-                bitmap = filter.apply(bitmap, mScaleFactor, mIsHighQuality);
-            }
+            bitmap = filter.apply(bitmap, mScaleFactor, mIsHighQuality);
         }
-        if (borderFilter != null) {
-            bitmap = borderFilter.apply(bitmap, mScaleFactor, mIsHighQuality);
-        }
+
         if (mEndPoint != null) {
             mEndPoint.updateFilteredImage(bitmap);
         }