1/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.gallery3d.filtershow.imageshow;
18
19import android.content.Context;
20import android.graphics.Canvas;
21import android.graphics.Color;
22import android.graphics.Matrix;
23import android.graphics.Paint;
24import android.graphics.Paint.Style;
25import android.graphics.RectF;
26import android.view.MotionEvent;
27
28import com.android.gallery3d.filtershow.filters.FilterPoint;
29import com.android.gallery3d.filtershow.filters.RedEyeCandidate;
30
31public class ImageRedEye extends ImagePoint {
32    private static final String LOGTAG = "ImageRedEyes";
33    private RectF mCurrentRect = null;
34
35    public ImageRedEye(Context context) {
36        super(context);
37    }
38
39    @Override
40    public void resetParameter() {
41        super.resetParameter();
42        invalidate();
43    }
44
45    @Override
46
47    public boolean onTouchEvent(MotionEvent event) {
48        super.onTouchEvent(event);
49
50        if (event.getPointerCount() > 1) {
51            return true;
52        }
53
54        if (didFinishScalingOperation()) {
55            return true;
56        }
57
58        float ex = event.getX();
59        float ey = event.getY();
60
61        // let's transform (ex, ey) to displayed image coordinates
62        if (event.getAction() == MotionEvent.ACTION_DOWN) {
63            mCurrentRect = new RectF();
64            mCurrentRect.left = ex - mTouchPadding;
65            mCurrentRect.top = ey - mTouchPadding;
66        }
67        if (event.getAction() == MotionEvent.ACTION_MOVE) {
68            mCurrentRect.right = ex + mTouchPadding;
69            mCurrentRect.bottom = ey + mTouchPadding;
70        }
71        if (event.getAction() == MotionEvent.ACTION_UP) {
72            if (mCurrentRect != null) {
73                // transform to original coordinates
74                Matrix originalNoRotateToScreen = getImageToScreenMatrix(false);
75                Matrix originalToScreen = getImageToScreenMatrix(true);
76                Matrix invert = new Matrix();
77                originalToScreen.invert(invert);
78                RectF r = new RectF(mCurrentRect);
79                invert.mapRect(r);
80                RectF r2 = new RectF(mCurrentRect);
81                invert.reset();
82                originalNoRotateToScreen.invert(invert);
83                invert.mapRect(r2);
84                mRedEyeRep.addRect(r, r2);
85                this.resetImageCaches(this);
86            }
87            mCurrentRect = null;
88        }
89        mEditorRedEye.commitLocalRepresentation();
90        invalidate();
91        return true;
92    }
93
94    @Override
95    public void onDraw(Canvas canvas) {
96        super.onDraw(canvas);
97        Paint paint = new Paint();
98        paint.setStyle(Style.STROKE);
99        paint.setColor(Color.RED);
100        paint.setStrokeWidth(2);
101        if (mCurrentRect != null) {
102            paint.setColor(Color.RED);
103            RectF drawRect = new RectF(mCurrentRect);
104            canvas.drawRect(drawRect, paint);
105        }
106    }
107
108    @Override
109    protected void drawPoint(FilterPoint point, Canvas canvas, Matrix originalToScreen,
110            Matrix originalRotateToScreen, Paint paint) {
111        RedEyeCandidate candidate = (RedEyeCandidate) point;
112        RectF rect = candidate.getRect();
113        RectF drawRect = new RectF();
114        originalToScreen.mapRect(drawRect, rect);
115        RectF fullRect = new RectF();
116        originalRotateToScreen.mapRect(fullRect, rect);
117        paint.setColor(Color.BLUE);
118        canvas.drawRect(fullRect, paint);
119        canvas.drawLine(fullRect.centerX(), fullRect.top,
120                fullRect.centerX(), fullRect.bottom, paint);
121        canvas.drawLine(fullRect.left, fullRect.centerY(),
122                fullRect.right, fullRect.centerY(), paint);
123        paint.setColor(Color.GREEN);
124        float dw = drawRect.width();
125        float dh = drawRect.height();
126        float dx = fullRect.centerX() - dw / 2;
127        float dy = fullRect.centerY() - dh / 2;
128        drawRect.set(dx, dy, dx + dw, dy + dh);
129        canvas.drawRect(drawRect, paint);
130        canvas.drawLine(drawRect.centerX(), drawRect.top,
131                drawRect.centerX(), drawRect.bottom, paint);
132        canvas.drawLine(drawRect.left, drawRect.centerY(),
133                drawRect.right, drawRect.centerY(), paint);
134        canvas.drawCircle(drawRect.centerX(), drawRect.centerY(),
135                mTouchPadding, paint);
136    }
137}
138