From 3e926284099152f14a78910c744d462d13a044e5 Mon Sep 17 00:00:00 2001 From: John Hoford Date: Fri, 8 Feb 2013 17:30:53 -0800 Subject: fix red eye to use the new system Change-Id: If79106dc3144cce374afd410f5f859692e564b83 --- .../gallery3d/filtershow/FilterShowActivity.java | 13 +- .../gallery3d/filtershow/editors/EditorRedEye.java | 61 ++++++++ .../filtershow/editors/EditorTinyPlanet.java | 1 - .../filters/FilterRedEyeRepresentation.java | 103 +++++++++++++ .../filtershow/filters/ImageFilterRedEye.java | 142 +++++++----------- .../filtershow/imageshow/ImageRedEye.java | 160 +++++++++++++++++++++ .../filtershow/imageshow/ImageRedEyes.java | 148 ------------------- .../filtershow/filters/FiltersManager.java | 2 + 8 files changed, 384 insertions(+), 246 deletions(-) create mode 100644 src/com/android/gallery3d/filtershow/editors/EditorRedEye.java create mode 100644 src/com/android/gallery3d/filtershow/filters/FilterRedEyeRepresentation.java create mode 100644 src/com/android/gallery3d/filtershow/imageshow/ImageRedEye.java delete mode 100644 src/com/android/gallery3d/filtershow/imageshow/ImageRedEyes.java diff --git a/src/com/android/gallery3d/filtershow/FilterShowActivity.java b/src/com/android/gallery3d/filtershow/FilterShowActivity.java index f061842cd..51c1c45be 100644 --- a/src/com/android/gallery3d/filtershow/FilterShowActivity.java +++ b/src/com/android/gallery3d/filtershow/FilterShowActivity.java @@ -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 index 000000000..271f16535 --- /dev/null +++ b/src/com/android/gallery3d/filtershow/editors/EditorRedEye.java @@ -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); + } + } +} diff --git a/src/com/android/gallery3d/filtershow/editors/EditorTinyPlanet.java b/src/com/android/gallery3d/filtershow/editors/EditorTinyPlanet.java index 4f30dc1d7..d21950912 100644 --- a/src/com/android/gallery3d/filtershow/editors/EditorTinyPlanet.java +++ b/src/com/android/gallery3d/filtershow/editors/EditorTinyPlanet.java @@ -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 index 000000000..38d3a696f --- /dev/null +++ b/src/com/android/gallery3d/filtershow/filters/FilterRedEyeRepresentation.java @@ -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 mCandidates = new Vector(); + + 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) mCandidates.clone(); + return representation; + } + + public boolean hasCandidates() { + return mCandidates != null; + } + + public Vector getCandidates() { + return mCandidates; + } + + public void setCandidates(Vector 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()); + } + Vector intersects = new Vector(); + 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)); + } + +} diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilterRedEye.java b/src/com/android/gallery3d/filtershow/filters/ImageFilterRedEye.java index 832f644e1..177def7b7 100644 --- a/src/com/android/gallery3d/filtershow/filters/ImageFilterRedEye.java +++ b/src/com/android/gallery3d/filtershow/filters/ImageFilterRedEye.java @@ -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 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(); - 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 getCandidates() { - if (mCandidates == null) { - mCandidates = new Vector(); - } - return mCandidates; - } - - public void addRect(RectF rect, RectF bounds) { - if (mCandidates == null) { - mCandidates = new Vector(); + if (!mParameters.hasCandidates()) { + mParameters.setCandidates(new Vector()); } - Vector intersects = new Vector(); - 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(); + if (!mParameters.hasCandidates()) { + mParameters.setCandidates(new Vector()); } - 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; } } diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageRedEye.java b/src/com/android/gallery3d/filtershow/imageshow/ImageRedEye.java new file mode 100644 index 000000000..2db9227b9 --- /dev/null +++ b/src/com/android/gallery3d/filtershow/imageshow/ImageRedEye.java @@ -0,0 +1,160 @@ + +package com.android.gallery3d.filtershow.imageshow; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Matrix; +import android.graphics.Paint; +import android.graphics.Paint.Style; +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 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 ImageRedEye(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public ImageRedEye(Context context) { + super(context); + } + + @Override + public void resetParameter() { + ImageFilterRedEye filter = (ImageFilterRedEye) getCurrentFilter(); + if (filter != null) { + filter.clear(); + } + mCurrentRect = null; + invalidate(); + } + + @Override + public void updateImage() { + super.updateImage(); + invalidate(); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + super.onTouchEvent(event); + float ex = event.getX(); + float ey = event.getY(); + + // let's transform (ex, ey) to displayed image coordinates + if (event.getAction() == MotionEvent.ACTION_DOWN) { + mCurrentRect = new RectF(); + mCurrentRect.left = ex - mTouchPadding; + mCurrentRect.top = ey - mTouchPadding; + } + if (event.getAction() == MotionEvent.ACTION_MOVE) { + mCurrentRect.right = ex + mTouchPadding; + mCurrentRect.bottom = ey + mTouchPadding; + } + if (event.getAction() == MotionEvent.ACTION_UP) { + if (mCurrentRect != null) { + // transform to original coordinates + GeometryMetadata geo = getImagePreset().mGeoData; + Matrix originalToScreen = geo.getOriginalToScreen(true, + mImageLoader.getOriginalBounds().width(), + mImageLoader.getOriginalBounds().height(), + getWidth(), getHeight()); + Matrix originalNoRotateToScreen = geo.getOriginalToScreen(false, + mImageLoader.getOriginalBounds().width(), + mImageLoader.getOriginalBounds().height(), + getWidth(), getHeight()); + + Matrix invert = new Matrix(); + originalToScreen.invert(invert); + RectF r = new RectF(mCurrentRect); + invert.mapRect(r); + RectF r2 = new RectF(mCurrentRect); + invert.reset(); + originalNoRotateToScreen.invert(invert); + invert.mapRect(r2); + mRedEyeRep.addRect(r, r2); + this.resetImageCaches(this); + } + mCurrentRect = null; + } + mEditorRedEye.commitLocalRepresentation(); + invalidate(); + return true; + } + + @Override + public void onDraw(Canvas canvas) { + super.onDraw(canvas); + Paint paint = new Paint(); + paint.setStyle(Style.STROKE); + paint.setColor(Color.RED); + paint.setStrokeWidth(2); + if (mCurrentRect != null) { + paint.setColor(Color.RED); + RectF drawRect = new RectF(mCurrentRect); + canvas.drawRect(drawRect, paint); + } + + GeometryMetadata geo = getImagePreset().mGeoData; + Matrix originalToScreen = geo.getOriginalToScreen(false, + mImageLoader.getOriginalBounds().width(), + mImageLoader.getOriginalBounds().height(), getWidth(), getHeight()); + Matrix originalRotateToScreen = geo.getOriginalToScreen(true, + mImageLoader.getOriginalBounds().width(), + mImageLoader.getOriginalBounds().height(), getWidth(), getHeight()); + + 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; + } +} diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageRedEyes.java b/src/com/android/gallery3d/filtershow/imageshow/ImageRedEyes.java deleted file mode 100644 index c012ff1cc..000000000 --- a/src/com/android/gallery3d/filtershow/imageshow/ImageRedEyes.java +++ /dev/null @@ -1,148 +0,0 @@ - -package com.android.gallery3d.filtershow.imageshow; - -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Matrix; -import android.graphics.Paint; -import android.graphics.Paint.Style; -import android.graphics.RectF; -import android.util.AttributeSet; -import android.view.MotionEvent; - -import com.android.gallery3d.filtershow.filters.ImageFilterRedEye; -import com.android.gallery3d.filtershow.filters.RedEyeCandidate; - -public class ImageRedEyes extends ImageShow { - - private static final String LOGTAG = "ImageRedEyes"; - private RectF mCurrentRect = null; - private static float mTouchPadding = 80; - - public static void setTouchPadding(float padding) { - mTouchPadding = padding; - } - - public ImageRedEyes(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public ImageRedEyes(Context context) { - super(context); - } - - @Override - public void resetParameter() { - ImageFilterRedEye filter = (ImageFilterRedEye) getCurrentFilter(); - if (filter != null) { - filter.clear(); - } - mCurrentRect = null; - invalidate(); - } - - @Override - public void updateImage() { - super.updateImage(); - invalidate(); - } - - @Override - public boolean onTouchEvent(MotionEvent event) { - super.onTouchEvent(event); - 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(); - mCurrentRect.left = ex - mTouchPadding; - mCurrentRect.top = ey - mTouchPadding; - } - if (event.getAction() == MotionEvent.ACTION_MOVE) { - mCurrentRect.right = ex + mTouchPadding; - mCurrentRect.bottom = ey + mTouchPadding; - } - if (event.getAction() == MotionEvent.ACTION_UP) { - if (mCurrentRect != null) { - // transform to original coordinates - GeometryMetadata geo = getImagePreset().mGeoData; - Matrix originalToScreen = geo.getOriginalToScreen(true, - mImageLoader.getOriginalBounds().width(), - mImageLoader.getOriginalBounds().height(), - getWidth(), getHeight()); - Matrix originalNoRotateToScreen = geo.getOriginalToScreen(false, - mImageLoader.getOriginalBounds().width(), - mImageLoader.getOriginalBounds().height(), - getWidth(), getHeight()); - - Matrix invert = new Matrix(); - originalToScreen.invert(invert); - RectF r = new RectF(mCurrentRect); - invert.mapRect(r); - RectF r2 = new RectF(mCurrentRect); - invert.reset(); - originalNoRotateToScreen.invert(invert); - invert.mapRect(r2); - filter.addRect(r, r2); - this.resetImageCaches(this); - } - mCurrentRect = null; - } - invalidate(); - return true; - } - - @Override - public void onDraw(Canvas canvas) { - super.onDraw(canvas); - Paint paint = new Paint(); - paint.setStyle(Style.STROKE); - paint.setColor(Color.RED); - paint.setStrokeWidth(2); - if (mCurrentRect != null) { - paint.setColor(Color.RED); - RectF drawRect = new RectF(mCurrentRect); - canvas.drawRect(drawRect, paint); - } - - GeometryMetadata geo = getImagePreset().mGeoData; - Matrix originalToScreen = geo.getOriginalToScreen(false, - mImageLoader.getOriginalBounds().width(), - mImageLoader.getOriginalBounds().height(), getWidth(), getHeight()); - Matrix originalRotateToScreen = geo.getOriginalToScreen(true, - 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); - } - } -} diff --git a/src_pd/com/android/gallery3d/filtershow/filters/FiltersManager.java b/src_pd/com/android/gallery3d/filtershow/filters/FiltersManager.java index 5ddabe29f..446d96d4f 100644 --- a/src_pd/com/android/gallery3d/filtershow/filters/FiltersManager.java +++ b/src_pd/com/android/gallery3d/filtershow/filters/FiltersManager.java @@ -67,6 +67,7 @@ public class FiltersManager { public static void addFilterRepresentations(Vector 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 filters) { filters.add(new ImageFilterTinyPlanet()); + filters.add(new ImageFilterRedEye()); filters.add(new ImageFilterWBalance()); filters.add(new ImageFilterExposure()); filters.add(new ImageFilterVignette()); -- cgit v1.2.3