ImageDraw.java revision e2c4d033de164d886af9d242d8672570730580d6
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.Rect;
9import android.graphics.RectF;
10import android.graphics.drawable.Drawable;
11import android.util.AttributeSet;
12import android.util.Log;
13import android.view.MotionEvent;
14
15import com.android.gallery3d.filtershow.editors.EditorDraw;
16import com.android.gallery3d.filtershow.filters.FilterDrawRepresentation;
17import com.android.gallery3d.filtershow.filters.ImageFilterDraw;
18
19public class ImageDraw extends ImageShow {
20
21    private static final String LOGTAG = "ImageDraw";
22    private int mCurrentColor = Color.RED;
23    final static float INITAL_STROKE_RADIUS = 40;
24    private float mCurrentSize = INITAL_STROKE_RADIUS;
25    private byte mType = 0;
26    private FilterDrawRepresentation mFRep;
27    private EditorDraw mEditorDraw;
28
29    public ImageDraw(Context context, AttributeSet attrs) {
30        super(context, attrs);
31        resetParameter();
32    }
33
34    public ImageDraw(Context context) {
35        super(context);
36        resetParameter();
37    }
38
39    public void setEditor(EditorDraw editorDraw) {
40        mEditorDraw = editorDraw;
41    }
42    public void setFilterDrawRepresentation(FilterDrawRepresentation fr) {
43        mFRep = fr;
44    }
45
46    public Drawable getIcon(Context context) {
47
48        return null;
49    }
50
51    @Override
52    public void resetParameter() {
53        if (mFRep != null) {
54            mFRep.clear();
55        }
56    }
57
58    public void setColor(int color) {
59        mCurrentColor = color;
60    }
61
62    public void setSize(int size) {
63        mCurrentSize = size;
64    }
65
66    public void setStyle(byte style) {
67        mType = (byte) (style % ImageFilterDraw.NUMBER_OF_STYLES);
68    }
69
70    public int getStyle() {
71        return mType;
72    }
73
74    public int getSize() {
75        return (int) mCurrentSize;
76    }
77
78    @Override
79    public void updateImage() {
80        super.updateImage();
81        invalidate();
82    }
83
84    float[] mTmpPoint = new float[2]; // so we do not malloc
85    @Override
86    public boolean onTouchEvent(MotionEvent event) {
87        if (event.getPointerCount() != 1) {
88            return false;
89        }
90
91        ImageFilterDraw filter = (ImageFilterDraw) getCurrentFilter();
92
93        if (event.getAction() == MotionEvent.ACTION_DOWN) {
94
95            mTmpPoint[0] = event.getX();
96            mTmpPoint[1] = event.getY();
97            mToOrig.mapPoints(mTmpPoint);
98            mFRep.startNewSection(mType, mCurrentColor, mCurrentSize, mTmpPoint[0], mTmpPoint[1]);
99
100        }
101        if (event.getAction() == MotionEvent.ACTION_MOVE) {
102            int historySize = event.getHistorySize();
103            final int pointerCount = event.getPointerCount();
104            for (int h = 0; h < historySize; h++) {
105                int p = 0;
106                {
107                    mTmpPoint[0] = event.getHistoricalX(p, h);
108                    mTmpPoint[1] = event.getHistoricalY(p, h);
109                    mToOrig.mapPoints(mTmpPoint);
110                    mFRep.addPoint(mTmpPoint[0], mTmpPoint[1]);
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            this.resetImageCaches(this);
120
121        }
122        mEditorDraw.commitLocalRepresentation();
123        invalidate();
124        return true;
125    }
126
127    Matrix mRotateToScreen;
128    Matrix mToScreen;
129    Matrix mToOrig = new Matrix();
130    private void calcScreenMapping() {
131
132        GeometryMetadata geo = getImagePreset().mGeoData;
133        mToScreen = geo.getOriginalToScreen(false,
134                mImageLoader.getOriginalBounds().width(),
135                mImageLoader.getOriginalBounds().height(), getWidth(), getHeight());
136        mRotateToScreen = geo.getOriginalToScreen(true,
137                mImageLoader.getOriginalBounds().width(),
138                mImageLoader.getOriginalBounds().height(), getWidth(), getHeight());
139        mRotateToScreen.invert(mToOrig);
140        mToOrig.invert(mRotateToScreen);
141    }
142
143    @Override
144    public void onDraw(Canvas canvas) {
145        super.onDraw(canvas);
146        calcScreenMapping();
147
148    }
149
150}
151