diff options
-rw-r--r-- | src/com/android/gallery3d/filtershow/FilterShowActivity.java | 13 | ||||
-rw-r--r-- | src/com/android/gallery3d/filtershow/editors/EditorRedEye.java | 61 | ||||
-rw-r--r-- | src/com/android/gallery3d/filtershow/editors/EditorTinyPlanet.java | 1 | ||||
-rw-r--r-- | src/com/android/gallery3d/filtershow/filters/FilterRedEyeRepresentation.java | 103 | ||||
-rw-r--r-- | src/com/android/gallery3d/filtershow/filters/ImageFilterRedEye.java | 142 | ||||
-rw-r--r-- | src/com/android/gallery3d/filtershow/imageshow/ImageRedEye.java (renamed from src/com/android/gallery3d/filtershow/imageshow/ImageRedEyes.java) | 76 | ||||
-rw-r--r-- | src_pd/com/android/gallery3d/filtershow/filters/FiltersManager.java | 2 |
7 files changed, 268 insertions, 130 deletions
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<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)); + } + +} 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<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; } } diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageRedEyes.java b/src/com/android/gallery3d/filtershow/imageshow/ImageRedEye.java index c012ff1cc..2db9227b9 100644 --- a/src/com/android/gallery3d/filtershow/imageshow/ImageRedEyes.java +++ b/src/com/android/gallery3d/filtershow/imageshow/ImageRedEye.java @@ -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; + } } 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<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()); |