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