ImageDraw.java revision f4b659334750a5aa75f929d18857a2ab93c9d939
1
2package com.android.gallery3d.filtershow.imageshow;
3
4import android.content.Context;
5import android.graphics.Canvas;
6import android.graphics.Color;
7import android.graphics.Matrix;
8import android.graphics.drawable.Drawable;
9import android.util.AttributeSet;
10import android.view.MotionEvent;
11
12import com.android.gallery3d.filtershow.editors.EditorDraw;
13import com.android.gallery3d.filtershow.filters.FilterDrawRepresentation;
14import com.android.gallery3d.filtershow.filters.ImageFilterDraw;
15
16public class ImageDraw extends ImageShow {
17
18    private static final String LOGTAG = "ImageDraw";
19    private int mCurrentColor = Color.RED;
20    final static float INITAL_STROKE_RADIUS = 40;
21    private float mCurrentSize = INITAL_STROKE_RADIUS;
22    private byte mType = 0;
23    private FilterDrawRepresentation mFRep;
24    private EditorDraw mEditorDraw;
25
26    public ImageDraw(Context context, AttributeSet attrs) {
27        super(context, attrs);
28        resetParameter();
29    }
30
31    public ImageDraw(Context context) {
32        super(context);
33        resetParameter();
34    }
35
36    public void setEditor(EditorDraw editorDraw) {
37        mEditorDraw = editorDraw;
38    }
39    public void setFilterDrawRepresentation(FilterDrawRepresentation fr) {
40        mFRep = fr;
41    }
42
43    public Drawable getIcon(Context context) {
44
45        return null;
46    }
47
48    @Override
49    public void resetParameter() {
50        if (mFRep != null) {
51            mFRep.clear();
52        }
53    }
54
55    public void setColor(int color) {
56        mCurrentColor = color;
57    }
58
59    public void setSize(int size) {
60        mCurrentSize = size;
61    }
62
63    public void setStyle(byte style) {
64        mType = (byte) (style % ImageFilterDraw.NUMBER_OF_STYLES);
65    }
66
67    public int getStyle() {
68        return mType;
69    }
70
71    public int getSize() {
72        return (int) mCurrentSize;
73    }
74
75    float[] mTmpPoint = new float[2]; // so we do not malloc
76    @Override
77    public boolean onTouchEvent(MotionEvent event) {
78        if (event.getPointerCount() > 1) {
79            boolean ret = super.onTouchEvent(event);
80            if (mFRep.getCurrentDrawing() != null) {
81                mFRep.clearCurrentSection();
82                mEditorDraw.commitLocalRepresentation();
83            }
84            return ret;
85        }
86        if (event.getAction() != MotionEvent.ACTION_DOWN) {
87            if (mFRep.getCurrentDrawing() == null) {
88                return super.onTouchEvent(event);
89            }
90        }
91
92        if (event.getAction() == MotionEvent.ACTION_DOWN) {
93            calcScreenMapping();
94            mTmpPoint[0] = event.getX();
95            mTmpPoint[1] = event.getY();
96            mToOrig.mapPoints(mTmpPoint);
97            mFRep.startNewSection( mTmpPoint[0], mTmpPoint[1]);
98        }
99
100        if (event.getAction() == MotionEvent.ACTION_MOVE) {
101
102            int historySize = event.getHistorySize();
103            for (int h = 0; h < historySize; h++) {
104                int p = 0;
105                {
106                    mTmpPoint[0] = event.getHistoricalX(p, h);
107                    mTmpPoint[1] = event.getHistoricalY(p, h);
108                    mToOrig.mapPoints(mTmpPoint);
109                    mFRep.addPoint(mTmpPoint[0], mTmpPoint[1]);
110                }
111            }
112        }
113
114        if (event.getAction() == MotionEvent.ACTION_UP) {
115            mTmpPoint[0] = event.getX();
116            mTmpPoint[1] = event.getY();
117            mToOrig.mapPoints(mTmpPoint);
118            mFRep.endSection(mTmpPoint[0], mTmpPoint[1]);
119        }
120        mEditorDraw.commitLocalRepresentation();
121        invalidate();
122        return true;
123    }
124
125    Matrix mRotateToScreen = new Matrix();
126    Matrix mToOrig;
127    private void calcScreenMapping() {
128        mToOrig = getScreenToImageMatrix(true);
129        mToOrig.invert(mRotateToScreen);
130    }
131
132    @Override
133    public void onDraw(Canvas canvas) {
134        super.onDraw(canvas);
135        calcScreenMapping();
136
137    }
138
139}
140