diff options
author | John Hoford <google.com> | 2013-01-25 13:28:34 -0800 |
---|---|---|
committer | John Hoford <hoford@google.com> | 2013-01-30 18:57:44 -0800 |
commit | 9beac537774310fc435bc513ba25a8230b14f0e4 (patch) | |
tree | 9cede5c32d88e18916c82f59af90756fb1789d7c /src/com/android/gallery3d/filtershow/filters/ImageFilterDraw.java | |
parent | d08e8639ce9a0088a34d6fb9630e4fb8b4f9e035 (diff) | |
download | android_packages_apps_Snap-9beac537774310fc435bc513ba25a8230b14f0e4.tar.gz android_packages_apps_Snap-9beac537774310fc435bc513ba25a8230b14f0e4.tar.bz2 android_packages_apps_Snap-9beac537774310fc435bc513ba25a8230b14f0e4.zip |
add color selection ui to draw
Change-Id: Ie2fa3522141e4f98e2b7f805c1ebe3385083bb02
Diffstat (limited to 'src/com/android/gallery3d/filtershow/filters/ImageFilterDraw.java')
-rw-r--r-- | src/com/android/gallery3d/filtershow/filters/ImageFilterDraw.java | 260 |
1 files changed, 223 insertions, 37 deletions
diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilterDraw.java b/src/com/android/gallery3d/filtershow/filters/ImageFilterDraw.java index cadcbb3f9..fac9e99a9 100644 --- a/src/com/android/gallery3d/filtershow/filters/ImageFilterDraw.java +++ b/src/com/android/gallery3d/filtershow/filters/ImageFilterDraw.java @@ -21,27 +21,29 @@ import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; -import android.graphics.Path; -import android.graphics.PorterDuff; -import android.graphics.PorterDuffXfermode; -import android.graphics.RectF; -import android.graphics.Xfermode; import android.graphics.Paint.Style; +import android.graphics.Path; +import android.graphics.PathMeasure; import android.util.Log; import com.android.gallery3d.R; -import com.android.gallery3d.filtershow.imageshow.GeometryMetadata; +import com.android.gallery3d.filtershow.editors.EditorDraw; import java.util.Arrays; -import java.util.Vector; public class ImageFilterDraw extends ImageFilter { private static final String LOGTAG = "ImageFilterDraw"; - - final float STROKE_RADIUS = 40; + public final static char SIMPLE_STYLE = 0; + public final static char BRUSH_STYLE = 1; Bitmap mOverlayBitmap; // this accelerates interaction - int mCachedStrokes =-1; - SimpleDraw mSimpleDraw = new SimpleDraw(); + int mCachedStrokes = -1; + int mCurrentStyle = 0; + DrawStyle[] mDrawings = new DrawStyle[] { + new SimpleDraw(), new Brush() }; + + public void setStyle(char style) { + mCurrentStyle = style; + } public static interface DrawStyle { public DrawStyle clone(); @@ -55,6 +57,7 @@ public class ImageFilterDraw extends ImageFilter { public void paintCurrentStroke(Canvas canvas, Matrix toScrMatrix, boolean highQuality); public int paintLast(int from, Canvas canvas, Matrix toScrMatrix, boolean highQuality); public boolean same(DrawStyle o); + public boolean empty(); }; class SimpleDraw implements DrawStyle { @@ -67,10 +70,11 @@ public class ImageFilterDraw extends ImageFilter { private float mCurrentRadius; private int mCurrentColor; + @Override public DrawStyle clone() { SimpleDraw ret = new SimpleDraw(); ret.mPaths = new Path[mPaths.length]; - for (int i = 0; i < mPaths.length; i++) { + for (int i = 0; i < ret.mPaths.length; i++) { ret.mPaths[i] = new Path(mPaths[i]); } ret.mColors = Arrays.copyOf(mColors, mColors.length); @@ -79,25 +83,35 @@ public class ImageFilterDraw extends ImageFilter { return ret; } + @Override + public boolean empty() { + return mStrokeCnt == -1; + } + + @Override public void setSize(float radius) { mCurrentRadius = radius; } + @Override public void setColor(int color) { mCurrentColor = color; } + @Override public void startStroke(float x, float y) { mCurrentPath = new Path(); mCurrentPath.moveTo(x, y); } + @Override public void stroke(float x, float y) { if (mCurrentPath != null) { mCurrentPath.lineTo(x, y); } } + @Override public void endStroke(float x, float y) { if (mCurrentPath != null) { mCurrentPath.lineTo(x, y); @@ -114,13 +128,18 @@ public class ImageFilterDraw extends ImageFilter { mStrokeCnt++; } } + + @Override public void clearCurren(){ mCurrentPath = null; } + + @Override public void paintCurrentStroke(Canvas canvas, Matrix toScrMatrix, boolean highQuality) { Path path = mCurrentPath; - if (path == null) + if (path == null) { return; + } Paint paint = new Paint(); paint.setStyle(Style.STROKE); @@ -134,6 +153,7 @@ public class ImageFilterDraw extends ImageFilter { canvas.drawPath(mCacheTransPath, paint); } + @Override public int paintLast(int from, Canvas canvas, Matrix toScrMatrix, boolean highQuality) { Paint paint = new Paint(); Matrix m = new Matrix(); @@ -149,6 +169,7 @@ public class ImageFilterDraw extends ImageFilter { return mStrokeCnt; } + @Override public boolean same(DrawStyle o) { if (!(o instanceof SimpleDraw)) { return false; @@ -171,23 +192,177 @@ public class ImageFilterDraw extends ImageFilter { return true; } + @Override + public int getNumberOfStrokes() { + return mStrokeCnt; + } + } + + class Brush implements DrawStyle { + private Path[] mPaths = new Path[0]; + private int[] mColors = new int[0]; + private float[] mRadius = new float[0]; + private int mStrokeCnt = 0; + + private Path mCurrentPath; + private float mCurrentRadius; + private int mCurrentColor; + + @Override + public DrawStyle clone() { + Brush ret = new Brush(); + ret.mPaths = new Path[mPaths.length]; + for (int i = 0; i < ret.mPaths.length; i++) { + ret.mPaths[i] = new Path(mPaths[i]); + } + ret.mColors = Arrays.copyOf(mColors, mColors.length); + ret.mRadius = Arrays.copyOf(mRadius, mRadius.length); + ret.mStrokeCnt = mStrokeCnt; + return ret; + } + + @Override + public boolean empty() { + return mStrokeCnt == -1; + } + + @Override + public void setSize(float radius) { + mCurrentRadius = radius; + } + + @Override + public void setColor(int color) { + mCurrentColor = color; + } + + @Override + public void startStroke(float x, float y) { + mCurrentPath = new Path(); + mCurrentPath.moveTo(x, y); + } + + @Override + public void stroke(float x, float y) { + if (mCurrentPath != null) { + mCurrentPath.lineTo(x, y); + } + } + + @Override + public void endStroke(float x, float y) { + if (mCurrentPath != null) { + mCurrentPath.lineTo(x, y); + Path[] np = new Path[mStrokeCnt + 1]; + for (int i = 0; i < mStrokeCnt; i++) { + np[i] = mPaths[i]; + } + np[mStrokeCnt] = mCurrentPath; + mColors = Arrays.copyOf(mColors, mColors.length + 1); + mRadius = Arrays.copyOf(mRadius, mRadius.length + 1); + mRadius[mStrokeCnt] = mCurrentRadius; + mColors[mStrokeCnt] = mCurrentColor; + mPaths = np; + mStrokeCnt++; + clearCurren(); + } + } + + @Override + public void clearCurren() { + mCurrentPath = null; + } + + @Override + public void paintCurrentStroke(Canvas canvas, Matrix toScrMatrix, boolean highQuality) { + Path path = mCurrentPath; + if (path == null) { + return; + } + Paint paint = new Paint(); + + canvas.save(); + canvas.concat(toScrMatrix); + paint.setStyle(Style.STROKE); + + float scale = toScrMatrix.mapRadius(1); + draw(canvas, paint, mCurrentColor, mCurrentRadius, path); + canvas.restore(); + } + + @Override + public int paintLast(int from, Canvas canvas, Matrix toScrMatrix, boolean highQuality) { + Paint paint = new Paint(); + + Matrix m = new Matrix(); + canvas.save(); + canvas.concat(toScrMatrix); + paint.setStyle(Style.STROKE); + for (int i = from; i < mStrokeCnt; i++) { + + draw(canvas, paint, mColors[i], mRadius[i], mPaths[i]); + } + canvas.restore(); + return mStrokeCnt; + } + + PathMeasure mPathMeasure = new PathMeasure(); + + void draw(Canvas canvas, Paint paint, int color, float size, Path path) { + + mPathMeasure.setPath(path, false); + float[] pos = new float[2]; + float[] tan = new float[2]; + paint.setColor(color); + float len = mPathMeasure.getLength(); + for (float i = 0; i < len; i += (size) / 2) { + mPathMeasure.getPosTan(i, pos, tan); + canvas.drawCircle(pos[0], pos[1], size, paint); + } + + } + + @Override + public boolean same(DrawStyle o) { + if (!(o instanceof Brush)) { + return false; + } + Brush sd = (Brush) o; + boolean same; + same = Arrays.equals(mRadius, sd.mRadius); + if (!same) { + return false; + } + same = Arrays.equals(mColors, sd.mColors); + if (!same) { + return false; + } + for (int i = 0; i < mPaths.length; i++) { + if (!mPaths[i].equals(sd.mPaths)) { + return false; + } + } + return true; + } + + @Override public int getNumberOfStrokes() { return mStrokeCnt; } } - public void startSection(int color, float x, float y) { - mSimpleDraw.setColor(color); - mSimpleDraw.setSize(STROKE_RADIUS); - mSimpleDraw.startStroke(x, y); + public void startSection(int color, float size, float x, float y) { + mDrawings[mCurrentStyle].setColor(color); + mDrawings[mCurrentStyle].setSize(size); + mDrawings[mCurrentStyle].startStroke(x, y); } public void addPoint(float x, float y) { - mSimpleDraw.stroke(x, y); + mDrawings[mCurrentStyle].stroke(x, y); } public void endSection(float x, float y) { - mSimpleDraw.endStroke(x, y); + mDrawings[mCurrentStyle].endStroke(x, y); } public ImageFilterDraw() { @@ -202,11 +377,18 @@ public class ImageFilterDraw extends ImageFilter { paint.setStyle(Style.STROKE); paint.setColor(Color.RED); paint.setStrokeWidth(40); - if (mSimpleDraw.mStrokeCnt == -1) { + boolean empty = true; + for (int i = 0; i < mDrawings.length; i++) { + empty &= mDrawings[i].empty(); + } + if (empty) { return; } if (highQuality) { - mSimpleDraw.paintLast(0, canvas, originalRotateToScreen, highQuality); + for (int i = 0; i < mDrawings.length; i++) { + mDrawings[i].paintLast(0, canvas, originalRotateToScreen, highQuality); + } + return; } if (mOverlayBitmap == null || @@ -217,22 +399,19 @@ public class ImageFilterDraw extends ImageFilter { canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888); mCachedStrokes = 0; } - if (mCachedStrokes < mSimpleDraw.getNumberOfStrokes()) { + if (mCachedStrokes < mDrawings[mCurrentStyle].getNumberOfStrokes()) { fillBuffer(originalRotateToScreen); } canvas.drawBitmap(mOverlayBitmap, 0, 0, paint); } public void fillBuffer(Matrix originalRotateToScreen) { - Paint paint = new Paint(); - paint.setStyle(Style.STROKE); - paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER)); - paint.setStrokeWidth(STROKE_RADIUS); - Canvas drawCache = new Canvas(mOverlayBitmap); - mCachedStrokes = mSimpleDraw.paintLast( - mCachedStrokes, drawCache, originalRotateToScreen, false); + for (int i = 0; i < mDrawings.length; i++) { + mCachedStrokes = mDrawings[i].paintLast( + mCachedStrokes, drawCache, originalRotateToScreen, false); + } } @Override @@ -247,21 +426,23 @@ public class ImageFilterDraw extends ImageFilter { @Override public int getEditingViewId() { - return R.id.imageDraw; + return EditorDraw.ID; } @Override public ImageFilter clone() throws CloneNotSupportedException { ImageFilterDraw filter = (ImageFilterDraw) super.clone(); - filter.mSimpleDraw = (SimpleDraw) mSimpleDraw.clone(); + filter.mDrawings = mDrawings.clone(); return filter; } @Override public boolean isNil() { - if (mSimpleDraw.getNumberOfStrokes() != 0) { - return false; + for (int i = 0; i < mDrawings.length; i++) { + if (mDrawings[i].getNumberOfStrokes() != 0) { + return false; + } } return true; } @@ -274,15 +455,21 @@ public class ImageFilterDraw extends ImageFilter { } ImageFilterDraw dfilter = (ImageFilterDraw) filter; - return mSimpleDraw.same(dfilter.mSimpleDraw); + boolean same = true; + for (int i = 0; i < mDrawings.length; i++) { + same &= mDrawings[i].same(dfilter.mDrawings[i]); + } + return same; } public void clear() { - mSimpleDraw.clearCurren(); + mDrawings[mCurrentStyle].clearCurren(); } public void draw(Canvas canvas, Matrix originalRotateToScreen) { - mSimpleDraw.paintCurrentStroke(canvas, originalRotateToScreen, false); + for (int i = 0; i < mDrawings.length; i++) { + mDrawings[i].paintCurrentStroke(canvas, originalRotateToScreen, false); + } } @Override @@ -298,5 +485,4 @@ public class ImageFilterDraw extends ImageFilter { return bitmap; } - } |