1774becc944de5ddcc1156711809fb3810bffea6dhoford/*
2774becc944de5ddcc1156711809fb3810bffea6dhoford * Copyright (C) 2015 The Android Open Source Project
3774becc944de5ddcc1156711809fb3810bffea6dhoford *
4774becc944de5ddcc1156711809fb3810bffea6dhoford * Licensed under the Apache License, Version 2.0 (the "License");
5774becc944de5ddcc1156711809fb3810bffea6dhoford * you may not use this file except in compliance with the License.
6774becc944de5ddcc1156711809fb3810bffea6dhoford * You may obtain a copy of the License at
7774becc944de5ddcc1156711809fb3810bffea6dhoford *
8774becc944de5ddcc1156711809fb3810bffea6dhoford *      http://www.apache.org/licenses/LICENSE-2.0
9774becc944de5ddcc1156711809fb3810bffea6dhoford *
10774becc944de5ddcc1156711809fb3810bffea6dhoford * Unless required by applicable law or agreed to in writing, software
11774becc944de5ddcc1156711809fb3810bffea6dhoford * distributed under the License is distributed on an "AS IS" BASIS,
12774becc944de5ddcc1156711809fb3810bffea6dhoford * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13774becc944de5ddcc1156711809fb3810bffea6dhoford * See the License for the specific language governing permissions and
14774becc944de5ddcc1156711809fb3810bffea6dhoford * limitations under the License.
15774becc944de5ddcc1156711809fb3810bffea6dhoford */
16774becc944de5ddcc1156711809fb3810bffea6dhoford
17774becc944de5ddcc1156711809fb3810bffea6dhofordpackage rs.example.android.com.healingbrush;
18774becc944de5ddcc1156711809fb3810bffea6dhoford
19774becc944de5ddcc1156711809fb3810bffea6dhofordimport android.content.Context;
20774becc944de5ddcc1156711809fb3810bffea6dhofordimport android.graphics.Bitmap;
21774becc944de5ddcc1156711809fb3810bffea6dhofordimport android.graphics.Canvas;
22774becc944de5ddcc1156711809fb3810bffea6dhofordimport android.graphics.Color;
23774becc944de5ddcc1156711809fb3810bffea6dhofordimport android.graphics.Matrix;
24774becc944de5ddcc1156711809fb3810bffea6dhofordimport android.graphics.Paint;
25774becc944de5ddcc1156711809fb3810bffea6dhofordimport android.graphics.Path;
26774becc944de5ddcc1156711809fb3810bffea6dhofordimport android.graphics.RectF;
27774becc944de5ddcc1156711809fb3810bffea6dhofordimport android.graphics.drawable.Drawable;
28774becc944de5ddcc1156711809fb3810bffea6dhofordimport android.util.AttributeSet;
29774becc944de5ddcc1156711809fb3810bffea6dhofordimport android.view.View;
30774becc944de5ddcc1156711809fb3810bffea6dhofordimport android.widget.ImageView;
31774becc944de5ddcc1156711809fb3810bffea6dhoford
32774becc944de5ddcc1156711809fb3810bffea6dhofordimport java.util.ArrayList;
33774becc944de5ddcc1156711809fb3810bffea6dhofordimport java.util.Arrays;
34774becc944de5ddcc1156711809fb3810bffea6dhoford
35774becc944de5ddcc1156711809fb3810bffea6dhofordpublic class DrawView extends View {
36774becc944de5ddcc1156711809fb3810bffea6dhoford    private static final String TAG = "DrawView";
37774becc944de5ddcc1156711809fb3810bffea6dhoford    private ImageView mImageView;
38774becc944de5ddcc1156711809fb3810bffea6dhoford    Path mPoints_backup = new Path();
39774becc944de5ddcc1156711809fb3810bffea6dhoford    float[] path = new float[200];
40774becc944de5ddcc1156711809fb3810bffea6dhoford    Path mPoints = new Path();
41774becc944de5ddcc1156711809fb3810bffea6dhoford    int len;
42774becc944de5ddcc1156711809fb3810bffea6dhoford    Paint mPaint1;
43774becc944de5ddcc1156711809fb3810bffea6dhoford    Paint mPaint2;
44774becc944de5ddcc1156711809fb3810bffea6dhoford    private boolean mDone;
45774becc944de5ddcc1156711809fb3810bffea6dhoford    ArrayList<Drawable> drawList = new ArrayList<Drawable>();
46774becc944de5ddcc1156711809fb3810bffea6dhoford
47774becc944de5ddcc1156711809fb3810bffea6dhoford    private void setup(Context context) {
48774becc944de5ddcc1156711809fb3810bffea6dhoford        mPaint1 = new Paint();
49774becc944de5ddcc1156711809fb3810bffea6dhoford        mPaint2 = new Paint();
50774becc944de5ddcc1156711809fb3810bffea6dhoford        mPaint1.setStyle(Paint.Style.STROKE);
51774becc944de5ddcc1156711809fb3810bffea6dhoford        mPaint1.setColor(Color.BLACK);
52774becc944de5ddcc1156711809fb3810bffea6dhoford        mPaint1.setStrokeWidth(2);
53774becc944de5ddcc1156711809fb3810bffea6dhoford        mPaint2.setStyle(Paint.Style.STROKE);
54774becc944de5ddcc1156711809fb3810bffea6dhoford        mPaint2.setColor(Color.YELLOW);
55774becc944de5ddcc1156711809fb3810bffea6dhoford    }
56774becc944de5ddcc1156711809fb3810bffea6dhoford
57774becc944de5ddcc1156711809fb3810bffea6dhoford    public DrawView(Context context) {
58774becc944de5ddcc1156711809fb3810bffea6dhoford        super(context);
59774becc944de5ddcc1156711809fb3810bffea6dhoford        setup(context);
60774becc944de5ddcc1156711809fb3810bffea6dhoford    }
61774becc944de5ddcc1156711809fb3810bffea6dhoford
62774becc944de5ddcc1156711809fb3810bffea6dhoford    public DrawView(Context context, AttributeSet attrs) {
63774becc944de5ddcc1156711809fb3810bffea6dhoford        super(context, attrs);
64774becc944de5ddcc1156711809fb3810bffea6dhoford        setup(context);
65774becc944de5ddcc1156711809fb3810bffea6dhoford    }
66774becc944de5ddcc1156711809fb3810bffea6dhoford
67774becc944de5ddcc1156711809fb3810bffea6dhoford    public DrawView(Context context, AttributeSet attrs, int defStyleAttr) {
68774becc944de5ddcc1156711809fb3810bffea6dhoford        super(context, attrs, defStyleAttr);
69774becc944de5ddcc1156711809fb3810bffea6dhoford        setup(context);
70774becc944de5ddcc1156711809fb3810bffea6dhoford    }
71774becc944de5ddcc1156711809fb3810bffea6dhoford
72774becc944de5ddcc1156711809fb3810bffea6dhoford    /**
73774becc944de5ddcc1156711809fb3810bffea6dhoford     * Assumes imageView is using matrix mode
74774becc944de5ddcc1156711809fb3810bffea6dhoford     *
75774becc944de5ddcc1156711809fb3810bffea6dhoford     * @param imageView
76774becc944de5ddcc1156711809fb3810bffea6dhoford     */
77774becc944de5ddcc1156711809fb3810bffea6dhoford    public void setImageView(ImageView imageView) {
78774becc944de5ddcc1156711809fb3810bffea6dhoford        mImageView = imageView;
79774becc944de5ddcc1156711809fb3810bffea6dhoford    }
80774becc944de5ddcc1156711809fb3810bffea6dhoford
81774becc944de5ddcc1156711809fb3810bffea6dhoford    RectF rec = new RectF();
82774becc944de5ddcc1156711809fb3810bffea6dhoford
83774becc944de5ddcc1156711809fb3810bffea6dhoford    @Override
84774becc944de5ddcc1156711809fb3810bffea6dhoford    protected void onDraw(Canvas canvas) {
85774becc944de5ddcc1156711809fb3810bffea6dhoford        Matrix m = mImageView.getImageMatrix();
86774becc944de5ddcc1156711809fb3810bffea6dhoford        Drawable d = mImageView.getDrawable();
87774becc944de5ddcc1156711809fb3810bffea6dhoford        canvas.concat(m);
88774becc944de5ddcc1156711809fb3810bffea6dhoford
89774becc944de5ddcc1156711809fb3810bffea6dhoford        for (Drawable elem : drawList) {
90774becc944de5ddcc1156711809fb3810bffea6dhoford            elem.draw(canvas);
91774becc944de5ddcc1156711809fb3810bffea6dhoford        }
92774becc944de5ddcc1156711809fb3810bffea6dhoford        canvas.drawPath(mPoints, mPaint1);
93774becc944de5ddcc1156711809fb3810bffea6dhoford        canvas.drawPath(mPoints, mPaint2);
94774becc944de5ddcc1156711809fb3810bffea6dhoford    }
95774becc944de5ddcc1156711809fb3810bffea6dhoford
96774becc944de5ddcc1156711809fb3810bffea6dhoford    public Region getRegion(Bitmap img) {
97774becc944de5ddcc1156711809fb3810bffea6dhoford        Region ret = new Region(Arrays.copyOf(path, len), img);
98774becc944de5ddcc1156711809fb3810bffea6dhoford
99774becc944de5ddcc1156711809fb3810bffea6dhoford        invalidate();
100774becc944de5ddcc1156711809fb3810bffea6dhoford        return ret;
101774becc944de5ddcc1156711809fb3810bffea6dhoford    }
102774becc944de5ddcc1156711809fb3810bffea6dhoford
103774becc944de5ddcc1156711809fb3810bffea6dhoford    public void downPoint(float[] imgPoint) {
104774becc944de5ddcc1156711809fb3810bffea6dhoford        path[0] = imgPoint[0];
105774becc944de5ddcc1156711809fb3810bffea6dhoford        path[1] = imgPoint[1];
106774becc944de5ddcc1156711809fb3810bffea6dhoford        len = 2;
107774becc944de5ddcc1156711809fb3810bffea6dhoford        mPoints_backup.reset();
108774becc944de5ddcc1156711809fb3810bffea6dhoford        mPoints_backup.addPath(mPoints);
109774becc944de5ddcc1156711809fb3810bffea6dhoford        mPoints.reset();
110774becc944de5ddcc1156711809fb3810bffea6dhoford        mPoints.moveTo(imgPoint[0], imgPoint[1]);
111774becc944de5ddcc1156711809fb3810bffea6dhoford    }
112774becc944de5ddcc1156711809fb3810bffea6dhoford
113774becc944de5ddcc1156711809fb3810bffea6dhoford    public void undo() {
114774becc944de5ddcc1156711809fb3810bffea6dhoford        mPoints.reset();
115774becc944de5ddcc1156711809fb3810bffea6dhoford        mPoints.addPath(mPoints_backup);
116774becc944de5ddcc1156711809fb3810bffea6dhoford    }
117774becc944de5ddcc1156711809fb3810bffea6dhoford
118774becc944de5ddcc1156711809fb3810bffea6dhoford    public void movePoint(float[] imgMoveList, int size) {
119774becc944de5ddcc1156711809fb3810bffea6dhoford        if (len + size * 2 >= path.length) {
120774becc944de5ddcc1156711809fb3810bffea6dhoford            path = Arrays.copyOf(path, 2 * (len + size * 2));
121774becc944de5ddcc1156711809fb3810bffea6dhoford        }
122774becc944de5ddcc1156711809fb3810bffea6dhoford        for (int i = size * 2 - 2; i >= 0; i -= 2) {
123774becc944de5ddcc1156711809fb3810bffea6dhoford            mPoints.lineTo(imgMoveList[i], imgMoveList[i + 1]);
124774becc944de5ddcc1156711809fb3810bffea6dhoford            path[len] = imgMoveList[i];
125774becc944de5ddcc1156711809fb3810bffea6dhoford            path[len + 1] = imgMoveList[i + 1];
126774becc944de5ddcc1156711809fb3810bffea6dhoford            len += 2;
127774becc944de5ddcc1156711809fb3810bffea6dhoford        }
128774becc944de5ddcc1156711809fb3810bffea6dhoford    }
129774becc944de5ddcc1156711809fb3810bffea6dhoford
130774becc944de5ddcc1156711809fb3810bffea6dhoford    public void upPoint(float[] imgPoint) {
131774becc944de5ddcc1156711809fb3810bffea6dhoford        if (len + 2 >= path.length) {
132774becc944de5ddcc1156711809fb3810bffea6dhoford            path = Arrays.copyOf(path, 2 * (len + 2));
133774becc944de5ddcc1156711809fb3810bffea6dhoford        }
134774becc944de5ddcc1156711809fb3810bffea6dhoford        path[len] = imgPoint[0];
135774becc944de5ddcc1156711809fb3810bffea6dhoford        path[len + 1] = imgPoint[1];
136774becc944de5ddcc1156711809fb3810bffea6dhoford        len += 2;
137774becc944de5ddcc1156711809fb3810bffea6dhoford        mPoints.lineTo(imgPoint[0], imgPoint[1]);
138774becc944de5ddcc1156711809fb3810bffea6dhoford        mPoints.close();
139774becc944de5ddcc1156711809fb3810bffea6dhoford        mDone = true;
140774becc944de5ddcc1156711809fb3810bffea6dhoford    }
141774becc944de5ddcc1156711809fb3810bffea6dhoford
142774becc944de5ddcc1156711809fb3810bffea6dhoford    public void addDrawable(Drawable d) {
143774becc944de5ddcc1156711809fb3810bffea6dhoford        drawList.add(d);
144774becc944de5ddcc1156711809fb3810bffea6dhoford    }
145774becc944de5ddcc1156711809fb3810bffea6dhoford
146774becc944de5ddcc1156711809fb3810bffea6dhoford    public void clearDrawables() {
147774becc944de5ddcc1156711809fb3810bffea6dhoford        drawList.clear();
148774becc944de5ddcc1156711809fb3810bffea6dhoford    }
149774becc944de5ddcc1156711809fb3810bffea6dhoford}
150