1/*
2 * Copyright (C) 2015 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 rs.example.android.com.healingbrush;
18
19import android.content.Context;
20import android.graphics.Bitmap;
21import android.graphics.Canvas;
22import android.graphics.Color;
23import android.graphics.Matrix;
24import android.graphics.Paint;
25import android.graphics.Path;
26import android.graphics.RectF;
27import android.graphics.drawable.Drawable;
28import android.util.AttributeSet;
29import android.view.View;
30import android.widget.ImageView;
31
32import java.util.ArrayList;
33import java.util.Arrays;
34
35public class DrawView extends View {
36    private static final String TAG = "DrawView";
37    private ImageView mImageView;
38    Path mPoints_backup = new Path();
39    float[] path = new float[200];
40    Path mPoints = new Path();
41    int len;
42    Paint mPaint1;
43    Paint mPaint2;
44    private boolean mDone;
45    private boolean mUseDefaultRegion = true;
46
47    ArrayList<Drawable> drawList = new ArrayList<Drawable>();
48
49    private void setup(Context context) {
50        mPaint1 = new Paint();
51        mPaint2 = new Paint();
52        mPaint1.setStyle(Paint.Style.STROKE);
53        mPaint1.setColor(Color.BLACK);
54        mPaint1.setStrokeWidth(2);
55        mPaint2.setStyle(Paint.Style.STROKE);
56        mPaint2.setColor(Color.YELLOW);
57    }
58
59    public DrawView(Context context) {
60        super(context);
61        setup(context);
62    }
63
64    public DrawView(Context context, AttributeSet attrs) {
65        super(context, attrs);
66        setup(context);
67    }
68
69    public DrawView(Context context, AttributeSet attrs, int defStyleAttr) {
70        super(context, attrs, defStyleAttr);
71        setup(context);
72    }
73
74    /**
75     * Assumes imageView is using matrix mode
76     *
77     * @param imageView
78     */
79    public void setImageView(ImageView imageView) {
80        mImageView = imageView;
81    }
82
83    RectF rec = new RectF();
84
85    @Override
86    protected void onDraw(Canvas canvas) {
87        Matrix m = mImageView.getImageMatrix();
88        Drawable d = mImageView.getDrawable();
89        canvas.concat(m);
90
91        for (Drawable elem : drawList) {
92            elem.draw(canvas);
93        }
94        canvas.drawPath(mPoints, mPaint1);
95        canvas.drawPath(mPoints, mPaint2);
96    }
97
98    public Region getRegion(Bitmap img) {
99        Region ret;
100        if (mUseDefaultRegion) {
101            float[] defaultPath = {10.0f, 110.0f,
102                                   110.0f, 10.0f,
103                                   210.0f, 110.0f,
104                                   110.0f, 210.0f};
105            ret = new Region(Arrays.copyOf(defaultPath, defaultPath.length), img);
106        } else {
107            ret = new Region(Arrays.copyOf(path, len), img);
108        }
109        invalidate();
110        return ret;
111    }
112
113    public void downPoint(float[] imgPoint) {
114        path[0] = imgPoint[0];
115        path[1] = imgPoint[1];
116        len = 2;
117        mPoints_backup.reset();
118        mPoints_backup.addPath(mPoints);
119        mPoints.reset();
120        mPoints.moveTo(imgPoint[0], imgPoint[1]);
121        mUseDefaultRegion = false;
122    }
123
124    public void undo() {
125        mPoints.reset();
126        mPoints.addPath(mPoints_backup);
127    }
128
129    public void movePoint(float[] imgMoveList, int size) {
130        if (len + size * 2 >= path.length) {
131            path = Arrays.copyOf(path, 2 * (len + size * 2));
132        }
133        for (int i = size * 2 - 2; i >= 0; i -= 2) {
134            mPoints.lineTo(imgMoveList[i], imgMoveList[i + 1]);
135            path[len] = imgMoveList[i];
136            path[len + 1] = imgMoveList[i + 1];
137            len += 2;
138        }
139    }
140
141    public void upPoint(float[] imgPoint) {
142        if (len + 2 >= path.length) {
143            path = Arrays.copyOf(path, 2 * (len + 2));
144        }
145        path[len] = imgPoint[0];
146        path[len + 1] = imgPoint[1];
147        len += 2;
148        mPoints.lineTo(imgPoint[0], imgPoint[1]);
149        mPoints.close();
150        mDone = true;
151    }
152
153    public void addDrawable(Drawable d) {
154        drawList.add(d);
155    }
156
157    public void clearDrawables() {
158        drawList.clear();
159    }
160}
161