| package com.android.gallery3d.filtershow.imageshow; |
| /* |
| * Copyright (C) 2013 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. |
| */ |
| |
| import android.content.Context; |
| import android.content.res.Resources; |
| import android.graphics.Canvas; |
| import android.graphics.Matrix; |
| import android.util.AttributeSet; |
| import android.view.MotionEvent; |
| |
| import com.android.gallery3d.R; |
| import com.android.gallery3d.filtershow.editors.EditorGrad; |
| import com.android.gallery3d.filtershow.filters.FilterGradRepresentation; |
| |
| public class ImageGrad extends ImageShow { |
| private static final String LOGTAG = "ImageGrad"; |
| private FilterGradRepresentation mGradRep; |
| private EditorGrad mEditorGrad; |
| private float mMinTouchDist; |
| private int mActiveHandle = -1; |
| private GradControl mEllipse; |
| |
| Matrix mToScr = new Matrix(); |
| float[] mPointsX = new float[FilterGradRepresentation.MAX_POINTS]; |
| float[] mPointsY = new float[FilterGradRepresentation.MAX_POINTS]; |
| |
| public ImageGrad(Context context) { |
| super(context); |
| Resources res = context.getResources(); |
| mMinTouchDist = res.getDimensionPixelSize(R.dimen.gradcontrol_min_touch_dist); |
| mEllipse = new GradControl(context); |
| mEllipse.setShowReshapeHandles(false); |
| } |
| |
| public ImageGrad(Context context, AttributeSet attrs) { |
| super(context, attrs); |
| Resources res = context.getResources(); |
| mMinTouchDist = res.getDimensionPixelSize(R.dimen.gradcontrol_min_touch_dist); |
| mEllipse = new GradControl(context); |
| mEllipse.setShowReshapeHandles(false); |
| } |
| |
| @Override |
| public boolean onTouchEvent(MotionEvent event) { |
| int mask = event.getActionMasked(); |
| |
| if (mActiveHandle == -1) { |
| if (MotionEvent.ACTION_DOWN != mask) { |
| return super.onTouchEvent(event); |
| } |
| if (event.getPointerCount() == 1) { |
| mActiveHandle = mEllipse.getCloseHandle(event.getX(), event.getY()); |
| if (mActiveHandle == -1) { |
| float x = event.getX(); |
| float y = event.getY(); |
| float min_d = Float.MAX_VALUE; |
| int pos = -1; |
| for (int i = 0; i < mPointsX.length; i++) { |
| if (mPointsX[i] == -1) { |
| continue; |
| } |
| float d = (float) Math.hypot(x - mPointsX[i], y - mPointsY[i]); |
| if ( min_d > d) { |
| min_d = d; |
| pos = i; |
| } |
| } |
| if (min_d > mMinTouchDist){ |
| pos = -1; |
| } |
| |
| if (pos != -1) { |
| mGradRep.setSelectedPoint(pos); |
| resetImageCaches(this); |
| mEditorGrad.updateSeekBar(mGradRep); |
| mEditorGrad.commitLocalRepresentation(); |
| invalidate(); |
| } |
| } |
| } |
| if (mActiveHandle == -1) { |
| return super.onTouchEvent(event); |
| } |
| } else { |
| switch (mask) { |
| case MotionEvent.ACTION_UP: { |
| |
| mActiveHandle = -1; |
| break; |
| } |
| case MotionEvent.ACTION_DOWN: { |
| break; |
| } |
| } |
| } |
| float x = event.getX(); |
| float y = event.getY(); |
| |
| mEllipse.setScrImageInfo(getScreenToImageMatrix(true), |
| MasterImage.getImage().getOriginalBounds()); |
| |
| switch (mask) { |
| case (MotionEvent.ACTION_DOWN): { |
| mEllipse.actionDown(x, y, mGradRep); |
| break; |
| } |
| case (MotionEvent.ACTION_UP): |
| case (MotionEvent.ACTION_MOVE): { |
| mEllipse.actionMove(mActiveHandle, x, y, mGradRep); |
| setRepresentation(mGradRep); |
| break; |
| } |
| } |
| invalidate(); |
| mEditorGrad.commitLocalRepresentation(); |
| return true; |
| } |
| |
| public void setRepresentation(FilterGradRepresentation pointRep) { |
| mGradRep = pointRep; |
| Matrix toImg = getScreenToImageMatrix(false); |
| |
| toImg.invert(mToScr); |
| |
| float[] c1 = new float[] { mGradRep.getPoint1X(), mGradRep.getPoint1Y() }; |
| float[] c2 = new float[] { mGradRep.getPoint2X(), mGradRep.getPoint2Y() }; |
| |
| if (c1[0] == -1) { |
| float cx = MasterImage.getImage().getOriginalBounds().width() / 2; |
| float cy = MasterImage.getImage().getOriginalBounds().height() / 2; |
| float rx = Math.min(cx, cy) * .4f; |
| |
| mGradRep.setPoint1(cx, cy-rx); |
| mGradRep.setPoint2(cx, cy+rx); |
| c1[0] = cx; |
| c1[1] = cy-rx; |
| mToScr.mapPoints(c1); |
| if (getWidth() != 0) { |
| mEllipse.setPoint1(c1[0], c1[1]); |
| c2[0] = cx; |
| c2[1] = cy+rx; |
| mToScr.mapPoints(c2); |
| mEllipse.setPoint2(c2[0], c2[1]); |
| } |
| mEditorGrad.commitLocalRepresentation(); |
| } else { |
| mToScr.mapPoints(c1); |
| mToScr.mapPoints(c2); |
| mEllipse.setPoint1(c1[0], c1[1]); |
| mEllipse.setPoint2(c2[0], c2[1]); |
| } |
| } |
| |
| public void drawOtherPoints(Canvas canvas) { |
| computCenterLocations(); |
| for (int i = 0; i < mPointsX.length; i++) { |
| if (mPointsX[i] != -1) { |
| mEllipse.paintGrayPoint(canvas, mPointsX[i], mPointsY[i]); |
| } |
| } |
| } |
| |
| public void computCenterLocations() { |
| int x1[] = mGradRep.getXPos1(); |
| int y1[] = mGradRep.getYPos1(); |
| int x2[] = mGradRep.getXPos2(); |
| int y2[] = mGradRep.getYPos2(); |
| int selected = mGradRep.getSelectedPoint(); |
| boolean m[] = mGradRep.getMask(); |
| float[] c = new float[2]; |
| for (int i = 0; i < m.length; i++) { |
| if (selected == i || !m[i]) { |
| mPointsX[i] = -1; |
| continue; |
| } |
| |
| c[0] = (x1[i]+x2[i])/2; |
| c[1] = (y1[i]+y2[i])/2; |
| mToScr.mapPoints(c); |
| |
| mPointsX[i] = c[0]; |
| mPointsY[i] = c[1]; |
| } |
| } |
| |
| public void setEditor(EditorGrad editorGrad) { |
| mEditorGrad = editorGrad; |
| } |
| |
| @Override |
| public void onDraw(Canvas canvas) { |
| super.onDraw(canvas); |
| if (mGradRep == null) { |
| return; |
| } |
| setRepresentation(mGradRep); |
| mEllipse.draw(canvas); |
| drawOtherPoints(canvas); |
| } |
| |
| } |