OSDN Git Service

fix red eye to use the new system
authorJohn Hoford <hoford@google.com>
Sat, 9 Feb 2013 01:30:53 +0000 (17:30 -0800)
committerJohn Hoford <hoford@google.com>
Tue, 12 Feb 2013 00:19:55 +0000 (16:19 -0800)
Change-Id: If79106dc3144cce374afd410f5f859692e564b83

res/layout/filtershow_activity.xml
res/values/filtershow_ids.xml
src/com/android/gallery3d/filtershow/FilterShowActivity.java
src/com/android/gallery3d/filtershow/editors/EditorRedEye.java [new file with mode: 0644]
src/com/android/gallery3d/filtershow/editors/EditorTinyPlanet.java
src/com/android/gallery3d/filtershow/filters/FilterRedEyeRepresentation.java [new file with mode: 0644]
src/com/android/gallery3d/filtershow/filters/ImageFilterRedEye.java
src/com/android/gallery3d/filtershow/imageshow/ImageRedEye.java [moved from src/com/android/gallery3d/filtershow/imageshow/ImageRedEyes.java with 64% similarity]
src_pd/com/android/gallery3d/filtershow/filters/FiltersManager.java

index 4417cf6..e42839b 100644 (file)
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content" />
 
-            <com.android.gallery3d.filtershow.imageshow.ImageRedEyes
+            <com.android.gallery3d.filtershow.imageshow.ImageRedEye
                 android:id="@+id/imageRedEyes"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
index a6d223b..786d7ee 100644 (file)
@@ -38,5 +38,6 @@
     <item type="id" name="imageCurves" />
     <item type="id" name="imageZoom" />
     <item type="id" name="editorDraw" />
+    <item type="id" name="editorRedEye" />
     <item type="id" name="imageOnlyEditor" />
 </resources>
index f061842..51c1c45 100644 (file)
@@ -57,13 +57,14 @@ import com.android.gallery3d.filtershow.cache.ImageLoader;
 import com.android.gallery3d.filtershow.editors.BasicEditor;
 import com.android.gallery3d.filtershow.editors.EditorDraw;
 import com.android.gallery3d.filtershow.editors.EditorManager;
+import com.android.gallery3d.filtershow.editors.EditorRedEye;
 import com.android.gallery3d.filtershow.editors.ImageOnlyEditor;
 import com.android.gallery3d.filtershow.editors.EditorTinyPlanet;
 import com.android.gallery3d.filtershow.filters.*;
 import com.android.gallery3d.filtershow.imageshow.ImageCrop;
 import com.android.gallery3d.filtershow.imageshow.ImageDraw;
 import com.android.gallery3d.filtershow.imageshow.ImageFlip;
-import com.android.gallery3d.filtershow.imageshow.ImageRedEyes;
+import com.android.gallery3d.filtershow.imageshow.ImageRedEye;
 import com.android.gallery3d.filtershow.imageshow.ImageRotate;
 import com.android.gallery3d.filtershow.imageshow.ImageShow;
 import com.android.gallery3d.filtershow.imageshow.ImageStraighten;
@@ -98,7 +99,7 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
     private final PanelController mPanelController = new PanelController();
     private ImageLoader mImageLoader = null;
     private ImageShow mImageShow = null;
-    private ImageRedEyes mImageRedEyes = null;
+    private ImageRedEye mImageRedEye = null;
     private ImageDraw mImageDraw = null;
     private ImageStraighten mImageStraighten = null;
     private ImageCrop mImageCrop = null;
@@ -201,7 +202,7 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
         mImageRotate = (ImageRotate) findViewById(R.id.imageRotate);
         mImageFlip = (ImageFlip) findViewById(R.id.imageFlip);
         mImageTinyPlanet = (ImageTinyPlanet) findViewById(R.id.imageTinyPlanet);
-        mImageRedEyes = (ImageRedEyes) findViewById(R.id.imageRedEyes);
+        mImageRedEye = (ImageRedEye) findViewById(R.id.imageRedEyes);
         mImageDraw = (ImageDraw) findViewById(R.id.imageDraw);
 
         mImageCrop.setAspectTextSize((int) getPixelsFromDip(18));
@@ -213,13 +214,14 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
         mImageViews.add(mImageRotate);
         mImageViews.add(mImageFlip);
         mImageViews.add(mImageTinyPlanet);
-        mImageViews.add(mImageRedEyes);
+        mImageViews.add(mImageRedEye);
 
         mEditorPlaceHolder.setContainer((FrameLayout) findViewById(R.id.editorContainer));
         mEditorPlaceHolder.addEditor(new EditorDraw());
         mEditorPlaceHolder.addEditor(new BasicEditor());
         mEditorPlaceHolder.addEditor(new ImageOnlyEditor());
         mEditorPlaceHolder.addEditor(new EditorTinyPlanet());
+        mEditorPlaceHolder.addEditor(new EditorRedEye());
         EditorManager.addEditors(mEditorPlaceHolder);
         mEditorPlaceHolder.setOldViews(mImageViews);
         mEditorPlaceHolder.setImageLoader(mImageLoader);
@@ -253,7 +255,7 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
         mImageRotate.setImageLoader(mImageLoader);
         mImageFlip.setImageLoader(mImageLoader);
         mImageTinyPlanet.setImageLoader(mImageLoader);
-        mImageRedEyes.setImageLoader(mImageLoader);
+        mImageRedEye.setImageLoader(mImageLoader);
         mImageDraw.setImageLoader(mImageLoader);
 
         mPanelController.setActivity(this);
@@ -286,7 +288,6 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
             setupFilterRepresentationButton(representation, listColors, mColorsButton);
         }
 
-        mPanelController.addFilter(new ImageFilterRedEye());
 
         mPanelController.addView(findViewById(R.id.applyEffect));
         findViewById(R.id.resetOperationsButton).setOnClickListener(
diff --git a/src/com/android/gallery3d/filtershow/editors/EditorRedEye.java b/src/com/android/gallery3d/filtershow/editors/EditorRedEye.java
new file mode 100644 (file)
index 0000000..271f165
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.gallery3d.filtershow.editors;
+
+import android.content.Context;
+import android.util.Log;
+import android.widget.FrameLayout;
+
+import com.android.gallery3d.R;
+import com.android.gallery3d.filtershow.filters.FilterRedEyeRepresentation;
+import com.android.gallery3d.filtershow.filters.FilterRepresentation;
+import com.android.gallery3d.filtershow.imageshow.ImageRedEye;
+
+/**
+ * The editor with no slider for filters without UI
+ */
+public class EditorRedEye extends Editor {
+    public static int ID = R.id.editorRedEye;
+    private final String LOGTAG = "EditorRedEye";
+    ImageRedEye mImageRedEyes;
+
+    public EditorRedEye() {
+        super(ID);
+    }
+
+    protected EditorRedEye(int id) {
+        super(id);
+    }
+
+    @Override
+    public void createEditor(Context context, FrameLayout frameLayout) {
+        super.createEditor(context, frameLayout);
+        mView = mImageShow = mImageRedEyes=  new ImageRedEye(context);
+        mImageRedEyes.setEditor(this);
+    }
+
+    @Override
+    public void reflectCurrentFilter() {
+        super.reflectCurrentFilter();
+
+        FilterRepresentation rep = getLocalRepresentation();
+        if (rep != null && getLocalRepresentation() instanceof FilterRedEyeRepresentation) {
+            FilterRedEyeRepresentation redEyeRep = (FilterRedEyeRepresentation) rep;
+            mImageRedEyes.setRepresentation(redEyeRep);
+        }
+    }
+}
index 4f30dc1..d219509 100644 (file)
@@ -48,7 +48,6 @@ public class EditorTinyPlanet extends BasicEditor {
         FilterRepresentation rep = getLocalRepresentation();
         if (rep != null && getLocalRepresentation() instanceof FilterTinyPlanetRepresentation) {
             FilterTinyPlanetRepresentation drawRep = (FilterTinyPlanetRepresentation) rep;
-
             mImageTinyPlanet.setRepresentation(drawRep);
         }
     }
diff --git a/src/com/android/gallery3d/filtershow/filters/FilterRedEyeRepresentation.java b/src/com/android/gallery3d/filtershow/filters/FilterRedEyeRepresentation.java
new file mode 100644 (file)
index 0000000..38d3a69
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.gallery3d.filtershow.filters;
+
+import android.graphics.RectF;
+import android.util.Log;
+
+import com.android.gallery3d.R;
+import com.android.gallery3d.filtershow.editors.EditorRedEye;
+
+import java.util.Vector;
+
+public class FilterRedEyeRepresentation extends FilterRepresentation {
+    private static final String LOGTAG = "FilterRedEyeRepresentation";
+    private Vector<RedEyeCandidate> mCandidates = new Vector<RedEyeCandidate>();
+
+    public FilterRedEyeRepresentation() {
+        super("RedEye");
+        setFilterClass(ImageFilterRedEye.class);
+        setFilterType(FilterRepresentation.TYPE_NORMAL);
+        setButtonId(R.id.redEyeButton);
+        setTextId(R.string.redeye);
+        setEditorId(EditorRedEye.ID);
+    }
+
+    @Override
+    public FilterRepresentation clone() throws CloneNotSupportedException {
+        FilterRedEyeRepresentation representation = (FilterRedEyeRepresentation) super
+                .clone();
+        representation.mCandidates = (Vector<RedEyeCandidate>) mCandidates.clone();
+        return representation;
+    }
+
+    public boolean hasCandidates() {
+        return mCandidates != null;
+    }
+
+    public Vector<RedEyeCandidate> getCandidates() {
+        return mCandidates;
+    }
+
+    public void setCandidates(Vector<RedEyeCandidate> mCandidates) {
+        this.mCandidates = mCandidates;
+    }
+
+    public RedEyeCandidate getCandidate(int index) {
+        return this.mCandidates.get(index);
+    }
+
+    public void addCandidate(RedEyeCandidate c) {
+        this.mCandidates.add(c);
+    }
+
+    public void removeCandidate(RedEyeCandidate c) {
+        this.mCandidates.remove(c);
+    }
+
+    public void clearCandidates() {
+        this.mCandidates.clear();
+    }
+
+    public int getNumberOfCandidates() {
+        if (mCandidates == null) {
+            return 0;
+        }
+        return mCandidates.size();
+    }
+
+    public void addRect(RectF rect, RectF bounds) {
+        if (!hasCandidates()) {
+            setCandidates(new Vector<RedEyeCandidate>());
+        }
+        Vector<RedEyeCandidate> intersects = new Vector<RedEyeCandidate>();
+        for (int i = 0; i < getCandidates().size(); i++) {
+            RedEyeCandidate r = getCandidate(i);
+            if (r.intersect(rect)) {
+                intersects.add(r);
+            }
+        }
+        for (int i = 0; i < intersects.size(); i++) {
+            RedEyeCandidate r = intersects.elementAt(i);
+            rect.union(r.mRect);
+            bounds.union(r.mBounds);
+            removeCandidate(r);
+        }
+        addCandidate(new RedEyeCandidate(rect, bounds));
+    }
+
+}
index 832f644..177def7 100644 (file)
@@ -20,84 +20,44 @@ import android.graphics.Bitmap;
 import android.graphics.Matrix;
 import android.graphics.RectF;
 
-import com.android.gallery3d.R;
 import com.android.gallery3d.filtershow.imageshow.GeometryMetadata;
 
 import java.util.Vector;
 
 public class ImageFilterRedEye extends ImageFilter {
     private static final String LOGTAG = "ImageFilterRedEye";
-    private Vector<RedEyeCandidate> mCandidates = null;
+    FilterRedEyeRepresentation mParameters = new FilterRedEyeRepresentation();
 
     public ImageFilterRedEye() {
         mName = "Red Eye";
     }
 
-    public int getButtonId() {
-        return R.id.redEyeButton;
-    }
-
-    public int getTextId() {
-        return R.string.redeye;
-    }
-
-    public int getEditingViewId() {
-            return R.id.imageRedEyes;
-    }
-
     @Override
-    public ImageFilter clone() throws CloneNotSupportedException {
-        // FIXME: clone() should not be needed. Remove when we fix red eyes.
-        ImageFilterRedEye filter = (ImageFilterRedEye) super.clone();
-        if (mCandidates != null) {
-            int size = mCandidates.size();
-            filter.mCandidates = new Vector<RedEyeCandidate>();
-            for (int i = 0; i < size; i++) {
-                filter.mCandidates.add(new RedEyeCandidate(mCandidates.elementAt(i)));
-            }
-        }
-        return filter;
+    public FilterRepresentation getDefaultRepresentation() {
+        FilterRedEyeRepresentation representation = new FilterRedEyeRepresentation();
+
+        return representation;
     }
 
     public boolean isNil() {
-        if (mCandidates != null && mCandidates.size() > 0) {
+        if (mParameters.getCandidates() != null && mParameters.getCandidates().size() > 0) {
             return false;
         }
         return true;
     }
 
     public Vector<RedEyeCandidate> getCandidates() {
-        if (mCandidates == null) {
-            mCandidates = new Vector<RedEyeCandidate>();
-        }
-        return mCandidates;
-    }
-
-    public void addRect(RectF rect, RectF bounds) {
-        if (mCandidates == null) {
-            mCandidates = new Vector<RedEyeCandidate>();
+        if (!mParameters.hasCandidates()) {
+            mParameters.setCandidates(new Vector<RedEyeCandidate>());
         }
-        Vector<RedEyeCandidate> intersects = new Vector<RedEyeCandidate>();
-        for (int i = 0; i < mCandidates.size(); i++) {
-            RedEyeCandidate r = mCandidates.elementAt(i);
-            if (r.intersect(rect)) {
-                intersects.add(r);
-            }
-        }
-        for (int i = 0; i < intersects.size(); i++) {
-            RedEyeCandidate r = intersects.elementAt(i);
-            rect.union(r.mRect);
-            bounds.union(r.mBounds);
-            mCandidates.remove(r);
-        }
-        mCandidates.add(new RedEyeCandidate(rect, bounds));
+        return mParameters.getCandidates();
     }
 
     public void clear() {
-        if (mCandidates == null) {
-            mCandidates = new Vector<RedEyeCandidate>();
+        if (!mParameters.hasCandidates()) {
+            mParameters.setCandidates(new Vector<RedEyeCandidate>());
         }
-        mCandidates.clear();
+        mParameters.clearCandidates();
     }
 
     native protected void nativeApplyFilter(Bitmap bitmap, int w, int h, short[] matrix);
@@ -107,47 +67,47 @@ public class ImageFilterRedEye extends ImageFilter {
         int w = bitmap.getWidth();
         int h = bitmap.getHeight();
         short[] rect = new short[4];
-
-        if (mCandidates != null && mCandidates.size() > 0) {
-            for (int i = 0; i < mCandidates.size(); i++) {
-                RectF r = new RectF(mCandidates.elementAt(i).mRect);
-                GeometryMetadata geo = getImagePreset().mGeoData;
-                Matrix originalToScreen = geo.getOriginalToScreen(true,
-                        getImagePreset().getImageLoader().getOriginalBounds().width(),
-                        getImagePreset().getImageLoader().getOriginalBounds().height(),
-                        w, h);
-                originalToScreen.mapRect(r);
-                if (r.left < 0) {
-                    r.left = 0;
-                }
-                if (r.left > w) {
-                    r.left = w;
-                }
-                if (r.top < 0) {
-                    r.top = 0;
-                }
-                if (r.top > h) {
-                    r.top = h;
-                }
-                if (r.right < 0) {
-                    r.right = 0;
-                }
-                if (r.right > w) {
-                    r.right = w;
-                }
-                if (r.bottom < 0) {
-                    r.bottom = 0;
-                }
-                if (r.bottom > h) {
-                    r.bottom = h;
-                }
-                rect[0] = (short) r.left;
-                rect[1] = (short) r.top;
-                rect[2] = (short) r.width();
-                rect[3] = (short) r.height();
-                nativeApplyFilter(bitmap, w, h, rect);
+        int size = mParameters.getNumberOfCandidates();
+
+        for (int i = 0; i < size; i++) {
+            RectF r = new RectF(mParameters.getCandidate(i).mRect);
+            GeometryMetadata geo = getImagePreset().mGeoData;
+            Matrix originalToScreen = geo.getOriginalToScreen(true,
+                    getImagePreset().getImageLoader().getOriginalBounds().width(),
+                    getImagePreset().getImageLoader().getOriginalBounds().height(),
+                    w, h);
+            originalToScreen.mapRect(r);
+            if (r.left < 0) {
+                r.left = 0;
+            }
+            if (r.left > w) {
+                r.left = w;
+            }
+            if (r.top < 0) {
+                r.top = 0;
             }
+            if (r.top > h) {
+                r.top = h;
+            }
+            if (r.right < 0) {
+                r.right = 0;
+            }
+            if (r.right > w) {
+                r.right = w;
+            }
+            if (r.bottom < 0) {
+                r.bottom = 0;
+            }
+            if (r.bottom > h) {
+                r.bottom = h;
+            }
+            rect[0] = (short) r.left;
+            rect[1] = (short) r.top;
+            rect[2] = (short) r.width();
+            rect[3] = (short) r.height();
+            nativeApplyFilter(bitmap, w, h, rect);
         }
+
         return bitmap;
     }
 }
@@ -11,24 +11,28 @@ import android.graphics.RectF;
 import android.util.AttributeSet;
 import android.view.MotionEvent;
 
+import com.android.gallery3d.filtershow.editors.EditorRedEye;
+import com.android.gallery3d.filtershow.filters.FilterRedEyeRepresentation;
 import com.android.gallery3d.filtershow.filters.ImageFilterRedEye;
 import com.android.gallery3d.filtershow.filters.RedEyeCandidate;
 
-public class ImageRedEyes extends ImageShow {
+public class ImageRedEye extends ImageShow {
 
     private static final String LOGTAG = "ImageRedEyes";
     private RectF mCurrentRect = null;
+    private EditorRedEye mEditorRedEye;
+    private FilterRedEyeRepresentation mRedEyeRep;
     private static float mTouchPadding = 80;
 
     public static void setTouchPadding(float padding) {
         mTouchPadding = padding;
     }
 
-    public ImageRedEyes(Context context, AttributeSet attrs) {
+    public ImageRedEye(Context context, AttributeSet attrs) {
         super(context, attrs);
     }
 
-    public ImageRedEyes(Context context) {
+    public ImageRedEye(Context context) {
         super(context);
     }
 
@@ -54,8 +58,6 @@ public class ImageRedEyes extends ImageShow {
         float ex = event.getX();
         float ey = event.getY();
 
-        ImageFilterRedEye filter = (ImageFilterRedEye) getCurrentFilter();
-
         // let's transform (ex, ey) to displayed image coordinates
         if (event.getAction() == MotionEvent.ACTION_DOWN) {
             mCurrentRect = new RectF();
@@ -87,11 +89,12 @@ public class ImageRedEyes extends ImageShow {
                 invert.reset();
                 originalNoRotateToScreen.invert(invert);
                 invert.mapRect(r2);
-                filter.addRect(r, r2);
+                mRedEyeRep.addRect(r, r2);
                 this.resetImageCaches(this);
             }
             mCurrentRect = null;
         }
+        mEditorRedEye.commitLocalRepresentation();
         invalidate();
         return true;
     }
@@ -117,32 +120,41 @@ public class ImageRedEyes extends ImageShow {
                 mImageLoader.getOriginalBounds().width(),
                 mImageLoader.getOriginalBounds().height(), getWidth(), getHeight());
 
-        ImageFilterRedEye filter = (ImageFilterRedEye) getCurrentFilter();
-        for (RedEyeCandidate candidate : filter.getCandidates()) {
-            RectF rect = candidate.getRect();
-            RectF drawRect = new RectF();
-            originalToScreen.mapRect(drawRect, rect);
-            RectF fullRect = new RectF();
-            originalRotateToScreen.mapRect(fullRect, rect);
-            paint.setColor(Color.BLUE);
-            canvas.drawRect(fullRect, paint);
-            canvas.drawLine(fullRect.centerX(), fullRect.top,
-                    fullRect.centerX(), fullRect.bottom, paint);
-            canvas.drawLine(fullRect.left, fullRect.centerY(),
-                    fullRect.right, fullRect.centerY(), paint);
-            paint.setColor(Color.GREEN);
-            float dw = drawRect.width();
-            float dh = drawRect.height();
-            float dx = fullRect.centerX() - dw/2;
-            float dy = fullRect.centerY() - dh/2;
-            drawRect.set(dx, dy, dx + dw, dy + dh);
-            canvas.drawRect(drawRect, paint);
-            canvas.drawLine(drawRect.centerX(), drawRect.top,
-                    drawRect.centerX(), drawRect.bottom, paint);
-            canvas.drawLine(drawRect.left, drawRect.centerY(),
-                    drawRect.right, drawRect.centerY(), paint);
-            canvas.drawCircle(drawRect.centerX(), drawRect.centerY(),
-                    mTouchPadding, paint);
+        if (mRedEyeRep != null) {
+            for (RedEyeCandidate candidate : mRedEyeRep.getCandidates()) {
+                RectF rect = candidate.getRect();
+                RectF drawRect = new RectF();
+                originalToScreen.mapRect(drawRect, rect);
+                RectF fullRect = new RectF();
+                originalRotateToScreen.mapRect(fullRect, rect);
+                paint.setColor(Color.BLUE);
+                canvas.drawRect(fullRect, paint);
+                canvas.drawLine(fullRect.centerX(), fullRect.top,
+                        fullRect.centerX(), fullRect.bottom, paint);
+                canvas.drawLine(fullRect.left, fullRect.centerY(),
+                        fullRect.right, fullRect.centerY(), paint);
+                paint.setColor(Color.GREEN);
+                float dw = drawRect.width();
+                float dh = drawRect.height();
+                float dx = fullRect.centerX() - dw / 2;
+                float dy = fullRect.centerY() - dh / 2;
+                drawRect.set(dx, dy, dx + dw, dy + dh);
+                canvas.drawRect(drawRect, paint);
+                canvas.drawLine(drawRect.centerX(), drawRect.top,
+                        drawRect.centerX(), drawRect.bottom, paint);
+                canvas.drawLine(drawRect.left, drawRect.centerY(),
+                        drawRect.right, drawRect.centerY(), paint);
+                canvas.drawCircle(drawRect.centerX(), drawRect.centerY(),
+                        mTouchPadding, paint);
+            }
         }
     }
+
+    public void setEditor(EditorRedEye editorRedEye) {
+        mEditorRedEye = editorRedEye;
+    }
+
+    public void setRepresentation(FilterRedEyeRepresentation redEyeRep) {
+        mRedEyeRep = redEyeRep;
+    }
 }
index 5ddabe2..446d96d 100644 (file)
@@ -67,6 +67,7 @@ public class FiltersManager {
 
     public static void addFilterRepresentations(Vector<FilterRepresentation> representations) {
         representations.add(getRepresentation(ImageFilterTinyPlanet.class));
+        representations.add(getRepresentation(ImageFilterRedEye.class));
         representations.add(getRepresentation(ImageFilterWBalance.class));
         representations.add(getRepresentation(ImageFilterExposure.class));
         representations.add(getRepresentation(ImageFilterVignette.class));
@@ -86,6 +87,7 @@ public class FiltersManager {
 
     public static void addFilters(Vector<ImageFilter> filters) {
         filters.add(new ImageFilterTinyPlanet());
+        filters.add(new ImageFilterRedEye());
         filters.add(new ImageFilterWBalance());
         filters.add(new ImageFilterExposure());
         filters.add(new ImageFilterVignette());