diff options
author | nicolasroard <nicolasroard@google.com> | 2012-10-17 17:46:47 -0700 |
---|---|---|
committer | nicolasroard <nicolasroard@google.com> | 2012-10-18 17:05:58 -0700 |
commit | d7899c56b8df278dfd6720ae11eadc2f89fe8094 (patch) | |
tree | 181da9205017c8f8045443aa8159c8405d16cc8f | |
parent | 0745eba4898419aad2b6e79be137a2a1edf4d0fc (diff) | |
download | android_packages_apps_Gallery2-d7899c56b8df278dfd6720ae11eadc2f89fe8094.tar.gz android_packages_apps_Gallery2-d7899c56b8df278dfd6720ae11eadc2f89fe8094.tar.bz2 android_packages_apps_Gallery2-d7899c56b8df278dfd6720ae11eadc2f89fe8094.zip |
Fix undo/redo/back button behaviour with effects and enable history
bug:7332980
bug:7357734
bug:7325872
Change-Id: Ie952a410c218c91ac927095ddcf542209fe7b90c
18 files changed, 253 insertions, 120 deletions
diff --git a/res/drawable-hdpi/camera_crop.png b/res/drawable-hdpi/camera_crop.png Binary files differnew file mode 100644 index 000000000..97b1b989e --- /dev/null +++ b/res/drawable-hdpi/camera_crop.png diff --git a/res/drawable-mdpi/camera_crop.png b/res/drawable-mdpi/camera_crop.png Binary files differnew file mode 100644 index 000000000..cf385641c --- /dev/null +++ b/res/drawable-mdpi/camera_crop.png diff --git a/res/drawable-xhdpi/camera_crop.png b/res/drawable-xhdpi/camera_crop.png Binary files differnew file mode 100644 index 000000000..e0a53bcc9 --- /dev/null +++ b/res/drawable-xhdpi/camera_crop.png diff --git a/res/layout/filtershow_history_operation_row.xml b/res/layout/filtershow_history_operation_row.xml index 6f9ea1b8f..dd9b66e93 100644 --- a/res/layout/filtershow_history_operation_row.xml +++ b/res/layout/filtershow_history_operation_row.xml @@ -23,7 +23,7 @@ <ImageView android:id="@+id/selectedMark" - android:src="@drawable/filtershow_button_current" + android:src="@drawable/camera_crop" android:background="@android:color/transparent" android:layout_width="32dip" android:layout_height="match_parent" diff --git a/res/menu/filtershow_activity_menu.xml b/res/menu/filtershow_activity_menu.xml index 34d5c7bcb..efb8747f9 100644 --- a/res/menu/filtershow_activity_menu.xml +++ b/res/menu/filtershow_activity_menu.xml @@ -22,7 +22,7 @@ android:id="@+id/operationsButton" android:icon="@drawable/filtershow_button_operations" android:showAsAction="never" - android:visible="false" + android:visible="true" android:title="@string/show_history_panel"/> <item android:id="@+id/showImageStateButton" diff --git a/src/com/android/gallery3d/filtershow/FilterShowActivity.java b/src/com/android/gallery3d/filtershow/FilterShowActivity.java index 98f977dd7..277859fdd 100644 --- a/src/com/android/gallery3d/filtershow/FilterShowActivity.java +++ b/src/com/android/gallery3d/filtershow/FilterShowActivity.java @@ -308,17 +308,6 @@ public class FilterShowActivity extends Activity implements OnItemClickListener, listColors.addView(fView, pos); } - mPanelController.addComponent(mColorsButton, findViewById(R.id.tinyplanetButton)); - mPanelController.addComponent(mColorsButton, findViewById(R.id.curvesButtonRGB)); - mPanelController.addComponent(mColorsButton, findViewById(R.id.sharpenButton)); - mPanelController.addComponent(mColorsButton, findViewById(R.id.vibranceButton)); - mPanelController.addComponent(mColorsButton, findViewById(R.id.contrastButton)); - mPanelController.addComponent(mColorsButton, findViewById(R.id.saturationButton)); - mPanelController.addComponent(mColorsButton, findViewById(R.id.wbalanceButton)); - mPanelController.addComponent(mColorsButton, findViewById(R.id.hueButton)); - mPanelController.addComponent(mColorsButton, findViewById(R.id.exposureButton)); - mPanelController.addComponent(mColorsButton, findViewById(R.id.shadowRecoveryButton)); - mPanelController.addView(findViewById(R.id.applyEffect)); mPanelController.addView(findViewById(R.id.pickCurvesChannel)); mPanelController.addView(findViewById(R.id.aspect)); @@ -326,11 +315,11 @@ public class FilterShowActivity extends Activity implements OnItemClickListener, createOnClickResetOperationsButton()); ListView operationsList = (ListView) findViewById(R.id.operationsList); - operationsList.setAdapter(mImageShow.getHistoryAdapter()); + operationsList.setAdapter(mImageShow.getHistory()); operationsList.setOnItemClickListener(this); ListView imageStateList = (ListView) findViewById(R.id.imageStateList); imageStateList.setAdapter(mImageShow.getImageStateAdapter()); - mImageLoader.setAdapter((HistoryAdapter) mImageShow.getHistoryAdapter()); + mImageLoader.setAdapter(mImageShow.getHistory()); fillListImages(listFilters); fillListBorders(listBorders); @@ -485,8 +474,7 @@ public class FilterShowActivity extends Activity implements OnItemClickListener, public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.undoButton: { - HistoryAdapter adapter = (HistoryAdapter) mImageShow - .getHistoryAdapter(); + HistoryAdapter adapter = mImageShow.getHistory(); int position = adapter.undo(); mImageShow.onItemClick(position); mImageShow.showToast("Undo"); @@ -494,8 +482,7 @@ public class FilterShowActivity extends Activity implements OnItemClickListener, return true; } case R.id.redoButton: { - HistoryAdapter adapter = (HistoryAdapter) mImageShow - .getHistoryAdapter(); + HistoryAdapter adapter = mImageShow.getHistory(); int position = adapter.redo(); mImageShow.onItemClick(position); mImageShow.showToast("Redo"); @@ -663,6 +650,10 @@ public class FilterShowActivity extends Activity implements OnItemClickListener, // ////////////////////////////////////////////////////////////////////////////// // imageState panel... + public boolean isShowingHistoryPanel() { + return mShowingHistoryPanel; + } + private void toggleImageStatePanel() { final View view = findViewById(R.id.mainPanel); final View viewList = findViewById(R.id.imageStatePanel); @@ -696,7 +687,7 @@ public class FilterShowActivity extends Activity implements OnItemClickListener, // ////////////////////////////////////////////////////////////////////////////// // history panel... - private void toggleHistoryPanel() { + public void toggleHistoryPanel() { final View view = findViewById(R.id.mainPanel); final View viewList = findViewById(R.id.historyPanel); @@ -727,8 +718,7 @@ public class FilterShowActivity extends Activity implements OnItemClickListener, } private void resetHistory() { - HistoryAdapter adapter = (HistoryAdapter) mImageShow - .getHistoryAdapter(); + HistoryAdapter adapter = mImageShow.getHistory(); adapter.reset(); ImagePreset original = new ImagePreset(adapter.getItem(0)); mImageShow.setImagePreset(original); diff --git a/src/com/android/gallery3d/filtershow/HistoryAdapter.java b/src/com/android/gallery3d/filtershow/HistoryAdapter.java index 803c45fc0..475f44313 100644 --- a/src/com/android/gallery3d/filtershow/HistoryAdapter.java +++ b/src/com/android/gallery3d/filtershow/HistoryAdapter.java @@ -1,21 +1,19 @@ package com.android.gallery3d.filtershow; -import java.util.Vector; - -import com.android.gallery3d.filtershow.presets.ImagePreset; -import com.android.gallery3d.R; - import android.content.Context; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; -import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; +import com.android.gallery3d.R; +import com.android.gallery3d.filtershow.presets.ImagePreset; + +import java.util.Vector; + public class HistoryAdapter extends ArrayAdapter<ImagePreset> { private static final String LOGTAG = "HistoryAdapter"; private int mCurrentPresetPosition = 0; @@ -35,13 +33,35 @@ public class HistoryAdapter extends ArrayAdapter<ImagePreset> { } ImagePreset first = getItem(getCount() - 1); clear(); - insert(first, 0); + addHistoryItem(first); } - public void insert(ImagePreset preset, int position) { - if (getCount() > position && getItem(position).same(preset)) { - return; + public ImagePreset getLast() { + if (getCount() == 0) { + return null; } + return getItem(0); + } + + public void addHistoryItem(ImagePreset preset) { + if (canAddHistoryItem(preset)) { + insert(preset, 0); + } + } + + public boolean canAddHistoryItem(ImagePreset preset) { + if (getCount() > 0 && getLast().same(preset)) { + // we may still want to insert if the previous + // history element isn't the same + if (getLast().historyName().equalsIgnoreCase(preset.historyName())) { + return false; + } + } + return true; + } + + @Override + public void insert(ImagePreset preset, int position) { if (mCurrentPresetPosition != 0) { // in this case, let's discount the presets before the current one Vector<ImagePreset> oldItems = new Vector<ImagePreset>(); @@ -54,9 +74,9 @@ public class HistoryAdapter extends ArrayAdapter<ImagePreset> { } mCurrentPresetPosition = position; this.notifyDataSetChanged(); - } - if (getCount() > position && getItem(position).same(preset)) { - return; + if (!canAddHistoryItem(preset)) { + return; + } } super.insert(preset, position); mCurrentPresetPosition = position; @@ -81,6 +101,7 @@ public class HistoryAdapter extends ArrayAdapter<ImagePreset> { return mCurrentPresetPosition; } + @Override public View getView(int position, View convertView, ViewGroup parent) { View view = convertView; if (view == null) { @@ -102,17 +123,27 @@ public class HistoryAdapter extends ArrayAdapter<ImagePreset> { markView.setVisibility(View.INVISIBLE); } ImageView typeView = (ImageView) view.findViewById(R.id.typeMark); + // TODO: use type of last filter, not a string, to discriminate. if (position == getCount() - 1) { - typeView.setImageResource(R.drawable.filtershow_button_origin); + typeView.setImageResource(R.drawable.ic_photoeditor_effects); } else if (item.historyName().equalsIgnoreCase("Border")) { - typeView.setImageResource(R.drawable.filtershow_button_border); - } else if (item.isFx()) { - typeView.setImageResource(R.drawable.filtershow_button_fx); + typeView.setImageResource(R.drawable.ic_photoeditor_border); + } else if (item.historyName().equalsIgnoreCase("Straighten")) { + typeView.setImageResource(R.drawable.ic_photoeditor_fix); + } else if (item.historyName().equalsIgnoreCase("Crop")) { + typeView.setImageResource(R.drawable.ic_photoeditor_fix); + } else if (item.historyName().equalsIgnoreCase("Rotation")) { + typeView.setImageResource(R.drawable.ic_photoeditor_fix); + } else if (item.historyName().equalsIgnoreCase("Mirror")) { + typeView.setImageResource(R.drawable.ic_photoeditor_fix); + } else if (item.isFx()) { + typeView.setImageResource(R.drawable.ic_photoeditor_effects); } else { - typeView.setImageResource(R.drawable.filtershow_button_settings); + typeView.setImageResource(R.drawable.ic_photoeditor_color); } } return view; } + } diff --git a/src/com/android/gallery3d/filtershow/PanelController.java b/src/com/android/gallery3d/filtershow/PanelController.java index 03319b074..1dbaca218 100644 --- a/src/com/android/gallery3d/filtershow/PanelController.java +++ b/src/com/android/gallery3d/filtershow/PanelController.java @@ -11,6 +11,7 @@ import android.widget.TextView; import com.android.gallery3d.R; import com.android.gallery3d.filtershow.filters.ImageFilter; import com.android.gallery3d.filtershow.filters.ImageFilterContrast; +import com.android.gallery3d.filtershow.filters.ImageFilterCurves; import com.android.gallery3d.filtershow.filters.ImageFilterExposure; import com.android.gallery3d.filtershow.filters.ImageFilterHue; import com.android.gallery3d.filtershow.filters.ImageFilterRedEye; @@ -36,6 +37,7 @@ public class PanelController implements OnClickListener { private static int VERTICAL_MOVE = 0; private static int HORIZONTAL_MOVE = 1; private static final int ANIM_DURATION = 200; + private static final String LOGTAG = "PanelController"; class Panel { private final View mView; @@ -338,7 +340,9 @@ public class PanelController implements OnClickListener { if (mUtilityPanel == null || !mUtilityPanel.selected()) { return true; } - resetParameters(); + HistoryAdapter adapter = mMasterImage.getHistory(); + int position = adapter.undo(); + mMasterImage.onItemClick(position); return false; } @@ -450,6 +454,18 @@ public class PanelController implements OnClickListener { public void ensureFilter(String name) { ImagePreset preset = getImagePreset(); ImageFilter filter = preset.getFilter(name); + if (filter != null) { + // If we already have a filter, we might still want + // to push it onto the history stack. + ImagePreset copy = new ImagePreset(getImagePreset()); + copy.setHistoryName(name); + mMasterImage.setImagePreset(copy); + filter = copy.getFilter(name); + } + if (filter == null && name.equalsIgnoreCase( + mCurrentImage.getContext().getString(R.string.curvesRGB))) { + filter = setImagePreset(new ImageFilterCurves(), name); + } if (filter == null && name.equalsIgnoreCase( mCurrentImage.getContext().getString(R.string.tinyplanet))) { filter = setImagePreset(new ImageFilterTinyPlanet(), name); @@ -570,7 +586,7 @@ public class PanelController implements OnClickListener { mUtilityPanel.setEffectName(ename); mUtilityPanel.setShowParameter(false); mUtilityPanel.showCurvesButtons(); - curves.reloadCurve(); + ensureFilter("Curves"); mCurrentImage = curves; break; } diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilterCurves.java b/src/com/android/gallery3d/filtershow/filters/ImageFilterCurves.java index 0f05a1c83..8c5bda04d 100644 --- a/src/com/android/gallery3d/filtershow/filters/ImageFilterCurves.java +++ b/src/com/android/gallery3d/filtershow/filters/ImageFilterCurves.java @@ -8,11 +8,11 @@ import com.android.gallery3d.filtershow.ui.Spline; public class ImageFilterCurves extends ImageFilter { private static final String LOGTAG = "ImageFilterCurves"; - private final Spline[] mSplines = new Spline[4]; public ImageFilterCurves() { mName = "Curves"; + reset(); } @Override @@ -20,7 +20,7 @@ public class ImageFilterCurves extends ImageFilter { ImageFilterCurves filter = (ImageFilterCurves) super.clone(); for (int i = 0; i < 4; i++) { if (mSplines[i] != null) { - filter.setSpline(new Spline(mSplines[i]), i); + filter.setSpline(mSplines[i], i); } } return filter; @@ -93,10 +93,21 @@ public class ImageFilterCurves extends ImageFilter { } public void setSpline(Spline spline, int splineIndex) { - mSplines[splineIndex] = spline; + mSplines[splineIndex] = new Spline(spline); } public Spline getSpline(int splineIndex) { return mSplines[splineIndex]; } + + public void reset() { + Spline spline = new Spline(); + + spline.addPoint(0.0f, 1.0f); + spline.addPoint(1.0f, 0.0f); + + for (int i = 0; i < 4; i++) { + mSplines[i] = new Spline(spline); + } + } } diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageCrop.java b/src/com/android/gallery3d/filtershow/imageshow/ImageCrop.java index e34e3a249..2a570aa29 100644 --- a/src/com/android/gallery3d/filtershow/imageshow/ImageCrop.java +++ b/src/com/android/gallery3d/filtershow/imageshow/ImageCrop.java @@ -84,6 +84,11 @@ public class ImageCrop extends ImageGeometry { borderPaint.setStrokeWidth(2f); } + @Override + public String getName() { + return "Crop"; + } + private boolean switchCropBounds(int moving_corner, RectF dst) { RectF crop = getCropBoundsDisplayed(); float dx1 = 0; diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageFlip.java b/src/com/android/gallery3d/filtershow/imageshow/ImageFlip.java index 00b9aed16..a75ce4d0c 100644 --- a/src/com/android/gallery3d/filtershow/imageshow/ImageFlip.java +++ b/src/com/android/gallery3d/filtershow/imageshow/ImageFlip.java @@ -41,13 +41,18 @@ public class ImageFlip extends ImageGeometry { } @Override + public String getName() { + return "Mirror"; + } + + @Override protected void setActionDown(float x, float y) { super.setActionDown(x, y); } boolean hasRotated90(){ int rot = constrainedRotation(getLocalRotation()); - return ((int) (rot / 90)) % 2 != 0; + return (rot / 90) % 2 != 0; } @Override diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageGeometry.java b/src/com/android/gallery3d/filtershow/imageshow/ImageGeometry.java index d5a7ada69..1cf8d7af5 100644 --- a/src/com/android/gallery3d/filtershow/imageshow/ImageGeometry.java +++ b/src/com/android/gallery3d/filtershow/imageshow/ImageGeometry.java @@ -31,7 +31,6 @@ import android.view.View; import com.android.gallery3d.filtershow.imageshow.GeometryMetadata.FLIP; import com.android.gallery3d.filtershow.presets.ImagePreset; -import com.android.gallery3d.filtershow.imageshow.GeometryMath; public abstract class ImageGeometry extends ImageSlave { private boolean mVisibilityGained = false; @@ -368,12 +367,23 @@ public abstract class ImageGeometry extends ImageSlave { return false; } + public String getName() { + return "Geometry"; + } + protected void saveAndSetPreset() { - ImagePreset copy = new ImagePreset(getImagePreset()); - copy.setGeometry(mLocalGeometry); - copy.setHistoryName("Geometry"); - copy.setIsFx(false); - setImagePreset(copy); + ImagePreset lastHistoryItem = getHistory().getLast(); + if (lastHistoryItem != null && lastHistoryItem.historyName().equalsIgnoreCase(getName())) { + getImagePreset().setGeometry(mLocalGeometry); + mImageLoader.resetImageForPreset(getImagePreset(), this); + } else { + ImagePreset copy = new ImagePreset(getImagePreset()); + copy.setGeometry(mLocalGeometry); + copy.setHistoryName(getName()); + copy.setIsFx(false); + setImagePreset(copy, true); + } + invalidate(); } public static RectF getUntranslatedStraightenCropBounds(RectF imageRect, float straightenAngle) { diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageRotate.java b/src/com/android/gallery3d/filtershow/imageshow/ImageRotate.java index 775aa716b..c88e51d76 100644 --- a/src/com/android/gallery3d/filtershow/imageshow/ImageRotate.java +++ b/src/com/android/gallery3d/filtershow/imageshow/ImageRotate.java @@ -38,6 +38,11 @@ public class ImageRotate extends ImageGeometry { super(context); } + @Override + public String getName() { + return "Rotation"; + } + private static final Paint gPaint = new Paint(); private void computeValue() { diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java b/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java index 0c51f1270..58f72e1df 100644 --- a/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java +++ b/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java @@ -25,6 +25,9 @@ import android.graphics.Rect; import android.graphics.RectF; import android.os.Handler; import android.util.AttributeSet; +import android.view.GestureDetector; +import android.view.GestureDetector.OnDoubleTapListener; +import android.view.GestureDetector.OnGestureListener; import android.view.MotionEvent; import android.view.View; import android.widget.ArrayAdapter; @@ -44,7 +47,10 @@ import com.android.gallery3d.filtershow.ui.SliderListener; import java.io.File; -public class ImageShow extends View implements SliderListener, OnSeekBarChangeListener { +public class ImageShow extends View implements OnGestureListener, + OnDoubleTapListener, + SliderListener, + OnSeekBarChangeListener { private static final String LOGTAG = "ImageShow"; @@ -69,6 +75,8 @@ public class ImageShow extends View implements SliderListener, OnSeekBarChangeLi // slider gesture protected SliderController mSliderController = new SliderController(); + private GestureDetector mGestureDetector = null; + private HistoryAdapter mHistoryAdapter = null; private ImageStateAdapter mImageStateAdapter = null; @@ -92,6 +100,8 @@ public class ImageShow extends View implements SliderListener, OnSeekBarChangeLi private SeekBar mSeekBar = null; private PanelController mController = null; + private FilterShowActivity mActivity = null; + public static void setDefaultBackgroundColor(int value) { mBackgroundColor = value; } @@ -206,6 +216,8 @@ public class ImageShow extends View implements SliderListener, OnSeekBarChangeLi R.id.rowTextView); mImageStateAdapter = new ImageStateAdapter(context, R.layout.filtershow_imagestate_row); + setupGestureDetector(context); + mActivity = (FilterShowActivity) context; } public ImageShow(Context context) { @@ -215,6 +227,12 @@ public class ImageShow extends View implements SliderListener, OnSeekBarChangeLi } mHistoryAdapter = new HistoryAdapter(context, R.layout.filtershow_history_operation_row, R.id.rowTextView); + setupGestureDetector(context); + mActivity = (FilterShowActivity) context; + } + + public void setupGestureDetector(Context context) { + mGestureDetector = new GestureDetector(context, this); } @Override @@ -422,7 +440,7 @@ public class ImageShow extends View implements SliderListener, OnSeekBarChangeLi mImagePreset = preset; if (getImagePreset() != null) { if (addToHistory) { - mHistoryAdapter.insert(getImagePreset(), 0); + mHistoryAdapter.addHistoryItem(getImagePreset()); } getImagePreset().setEndpoint(this); updateImage(); @@ -486,13 +504,14 @@ public class ImageShow extends View implements SliderListener, OnSeekBarChangeLi if (USE_SLIDER_GESTURE) { mSliderController.onTouchEvent(event); } + mGestureDetector.onTouchEvent(event); invalidate(); return true; } // listview stuff - public ArrayAdapter getHistoryAdapter() { + public HistoryAdapter getHistory() { return mHistoryAdapter; } @@ -560,4 +579,61 @@ public class ImageShow extends View implements SliderListener, OnSeekBarChangeLi // TODO Auto-generated method stub } + + @Override + public boolean onDoubleTap(MotionEvent arg0) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean onDoubleTapEvent(MotionEvent arg0) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean onSingleTapConfirmed(MotionEvent arg0) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean onDown(MotionEvent arg0) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean onFling(MotionEvent startEvent, MotionEvent endEvent, float arg2, float arg3) { + if ((!mActivity.isShowingHistoryPanel() && startEvent.getX() > endEvent.getX()) + || (mActivity.isShowingHistoryPanel() && endEvent.getX() > startEvent.getX())){ + mActivity.toggleHistoryPanel(); + } + return true; + } + + @Override + public void onLongPress(MotionEvent arg0) { + // TODO Auto-generated method stub + + } + + @Override + public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2, float arg3) { + // TODO Auto-generated method stub + return false; + } + + @Override + public void onShowPress(MotionEvent arg0) { + // TODO Auto-generated method stub + + } + + @Override + public boolean onSingleTapUp(MotionEvent arg0) { + // TODO Auto-generated method stub + return false; + } } diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageSlave.java b/src/com/android/gallery3d/filtershow/imageshow/ImageSlave.java index f320a0341..c1fb0e471 100644 --- a/src/com/android/gallery3d/filtershow/imageshow/ImageSlave.java +++ b/src/com/android/gallery3d/filtershow/imageshow/ImageSlave.java @@ -20,6 +20,7 @@ import android.content.Context; import android.graphics.Canvas; import android.util.AttributeSet; +import com.android.gallery3d.filtershow.HistoryAdapter; import com.android.gallery3d.filtershow.PanelController; import com.android.gallery3d.filtershow.filters.ImageFilter; import com.android.gallery3d.filtershow.presets.ImagePreset; @@ -44,6 +45,11 @@ public class ImageSlave extends ImageShow { } @Override + public HistoryAdapter getHistory() { + return mMasterImageShow.getHistory(); + } + + @Override public ImagePreset getImagePreset() { return mMasterImageShow.getImagePreset(); } diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageStraighten.java b/src/com/android/gallery3d/filtershow/imageshow/ImageStraighten.java index 26c9671bb..4f29c0f81 100644 --- a/src/com/android/gallery3d/filtershow/imageshow/ImageStraighten.java +++ b/src/com/android/gallery3d/filtershow/imageshow/ImageStraighten.java @@ -41,6 +41,11 @@ public class ImageStraighten extends ImageGeometry { } @Override + public String getName() { + return "Straighten"; + } + + @Override protected void setActionDown(float x, float y) { super.setActionDown(x, y); mBaseAngle = mAngle = getLocalStraighten(); diff --git a/src/com/android/gallery3d/filtershow/ui/ImageCurves.java b/src/com/android/gallery3d/filtershow/ui/ImageCurves.java index a8445b830..84edf234a 100644 --- a/src/com/android/gallery3d/filtershow/ui/ImageCurves.java +++ b/src/com/android/gallery3d/filtershow/ui/ImageCurves.java @@ -21,7 +21,6 @@ public class ImageCurves extends ImageSlave { private static final String LOGTAG = "ImageCurves"; Paint gPaint = new Paint(); - Spline[] mSplines = new Spline[4]; Path gPathSpline = new Path(); private int mCurrentCurveIndex = 0; @@ -54,23 +53,16 @@ public class ImageCurves extends ImageSlave { return false; } - public void reloadCurve() { + private ImageFilterCurves curves() { if (getMaster() != null) { String filterName = getFilterName(); - ImageFilterCurves filter = (ImageFilterCurves) getImagePreset() - .getFilter(filterName); - if (filter == null) { - resetCurve(); - return; - } - for (int i = 0; i < 4; i++) { - Spline spline = filter.getSpline(i); - if (spline != null) { - mSplines[i] = new Spline(spline); - } - } - applyNewCurve(); + return (ImageFilterCurves) getImagePreset().getFilter(filterName); } + return null; + } + + private Spline getSpline(int index) { + return curves().getSpline(index); } @Override @@ -82,16 +74,9 @@ public class ImageCurves extends ImageSlave { } public void resetCurve() { - Spline spline = new Spline(); - - spline.addPoint(0.0f, 1.0f); - spline.addPoint(1.0f, 0.0f); - - for (int i = 0; i < 4; i++) { - mSplines[i] = new Spline(spline); - } - if (getMaster() != null) { - applyNewCurve(); + if (getMaster() != null && curves() != null) { + curves().reset(); + updateCachedImage(); } } @@ -118,7 +103,7 @@ public class ImageCurves extends ImageSlave { // We only display the other channels curves when showing the RGB curve if (mCurrentCurveIndex == Spline.RGB) { for (int i = 0; i < 4; i++) { - Spline spline = mSplines[i]; + Spline spline = getSpline(i); if (i != mCurrentCurveIndex && !spline.isOriginal()) { // And we only display a curve if it has more than two // points @@ -127,7 +112,7 @@ public class ImageCurves extends ImageSlave { } } // ...but we always display the current curve. - mSplines[mCurrentCurveIndex] + getSpline(mCurrentCurveIndex) .draw(canvas, Spline.colorForCurve(mCurrentCurveIndex), getWidth(), getHeight(), true); drawToast(canvas); @@ -136,12 +121,13 @@ public class ImageCurves extends ImageSlave { private int pickControlPoint(float x, float y) { int pick = 0; - float px = mSplines[mCurrentCurveIndex].getPoint(0).x; - float py = mSplines[mCurrentCurveIndex].getPoint(0).y; + Spline spline = getSpline(mCurrentCurveIndex); + float px = spline.getPoint(0).x; + float py = spline.getPoint(0).y; double delta = Math.sqrt((px - x) * (px - x) + (py - y) * (py - y)); - for (int i = 1; i < mSplines[mCurrentCurveIndex].getNbPoints(); i++) { - px = mSplines[mCurrentCurveIndex].getPoint(i).x; - py = mSplines[mCurrentCurveIndex].getPoint(i).y; + for (int i = 1; i < spline.getNbPoints(); i++) { + px = spline.getPoint(i).x; + py = spline.getPoint(i).y; double currentDelta = Math.sqrt((px - x) * (px - x) + (py - y) * (py - y)); if (currentDelta < delta) { @@ -151,7 +137,7 @@ public class ImageCurves extends ImageSlave { } if (!mDidAddPoint && (delta * getWidth() > 100) - && (mSplines[mCurrentCurveIndex].getNbPoints() < 10)) { + && (spline.getNbPoints() < 10)) { return -1; } @@ -176,15 +162,8 @@ public class ImageCurves extends ImageSlave { posY = (posY - margin) / (getHeight() - 2 * margin); if (e.getActionMasked() == MotionEvent.ACTION_UP) { - applyNewCurve(); mCurrentControlPoint = null; - String name = "Curves"; - ImagePreset copy = new ImagePreset(getImagePreset(), name); - - copy.setIsFx(false); - mImageLoader.getHistory().insert(copy, 0); - - invalidate(); + updateCachedImage(); mDidAddPoint = false; if (mDidDelete) { mDidDelete = false; @@ -196,48 +175,32 @@ public class ImageCurves extends ImageSlave { return true; } + Spline spline = getSpline(mCurrentCurveIndex); int pick = pickControlPoint(posX, posY); if (mCurrentControlPoint == null) { if (pick == -1) { mCurrentControlPoint = new ControlPoint(posX, posY); - mSplines[mCurrentCurveIndex].addPoint(mCurrentControlPoint); + spline.addPoint(mCurrentControlPoint); mDidAddPoint = true; } else { - mCurrentControlPoint = mSplines[mCurrentCurveIndex].getPoint(pick); + mCurrentControlPoint = spline.getPoint(pick); } } - if (mSplines[mCurrentCurveIndex].isPointContained(posX, pick)) { + if (spline.isPointContained(posX, pick)) { mCurrentControlPoint.x = posX; mCurrentControlPoint.y = posY; } else if (pick != -1) { - mSplines[mCurrentCurveIndex].deletePoint(pick); + spline.deletePoint(pick); mDidDelete = true; } - applyNewCurve(); - invalidate(); + updateCachedImage(); return true; } - public synchronized void applyNewCurve() { + public synchronized void updateCachedImage() { // update image if (getImagePreset() != null) { - String filterName = getFilterName(); - ImageFilterCurves filter = (ImageFilterCurves) getImagePreset() - .getFilter(filterName); - if (filter == null) { - filter = new ImageFilterCurves(); - filter.setName(filterName); - ImagePreset copy = new ImagePreset(getImagePreset()); - copy.add(filter); - setImagePreset(copy, false); - } - - if (filter != null) { - for (int i = 0; i < 4; i++) { - filter.setSpline(new Spline(mSplines[i]), i); - } - } mImageLoader.resetImageForPreset(getImagePreset(), this); invalidate(); } diff --git a/src/com/android/gallery3d/filtershow/ui/Spline.java b/src/com/android/gallery3d/filtershow/ui/Spline.java index b5c79747d..ddbf97c74 100644 --- a/src/com/android/gallery3d/filtershow/ui/Spline.java +++ b/src/com/android/gallery3d/filtershow/ui/Spline.java @@ -6,6 +6,7 @@ import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.drawable.Drawable; +import android.util.Log; import java.util.Collections; import java.util.Vector; @@ -20,6 +21,7 @@ public class Spline { public static final int RED = 1; public static final int GREEN = 2; public static final int BLUE = 3; + private static final String LOGTAG = "Spline"; private final Paint gPaint = new Paint(); @@ -350,4 +352,12 @@ public class Spline { return spline; } + public void show() { + Log.v(LOGTAG, "show curve " + this); + for (int i = 0; i < mPoints.size(); i++) { + ControlPoint point = mPoints.elementAt(i); + Log.v(LOGTAG, "point " + i + " is (" + point.x + ", " + point.y + ")"); + } + } + } |