blob: b55cc2bc42ac3f5ee00482a47ed085cf93ded19b [file] [log] [blame]
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);
}
}