1 /* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.gallery3d.filtershow.filters; 18 19 import android.graphics.Path; 20 import android.util.Log; 21 22 import com.android.gallery3d.R; 23 import com.android.gallery3d.filtershow.editors.EditorDraw; 24 25 import java.util.Vector; 26 27 public class FilterDrawRepresentation extends FilterRepresentation { 28 private static final String LOGTAG = "FilterDrawRepresentation"; 29 30 public static class StrokeData implements Cloneable { 31 public byte mType; 32 public Path mPath; 33 public float mRadius; 34 public int mColor; 35 public int noPoints = 0; 36 @Override toString()37 public String toString() { 38 return "stroke(" + mType + ", path(" + (mPath) + "), " + mRadius + " , " 39 + Integer.toHexString(mColor) + ")"; 40 } 41 @Override clone()42 public StrokeData clone() throws CloneNotSupportedException { 43 return (StrokeData) super.clone(); 44 } 45 } 46 47 private Vector<StrokeData> mDrawing = new Vector<StrokeData>(); 48 private StrokeData mCurrent; // used in the currently drawing style 49 FilterDrawRepresentation()50 public FilterDrawRepresentation() { 51 super("Draw"); 52 setFilterClass(ImageFilterDraw.class); 53 setPriority(FilterRepresentation.TYPE_VIGNETTE); 54 setTextId(R.string.imageDraw); 55 setButtonId(R.id.drawOnImageButton); 56 setEditorId(EditorDraw.ID); 57 setOverlayId(R.drawable.filtershow_drawing); 58 setOverlayOnly(true); 59 } 60 61 @Override toString()62 public String toString() { 63 return getName() + " : strokes=" + mDrawing.size() 64 + ((mCurrent == null) ? " no current " 65 : ("draw=" + mCurrent.mType + " " + mCurrent.noPoints)); 66 } 67 getDrawing()68 public Vector<StrokeData> getDrawing() { 69 return mDrawing; 70 } 71 getCurrentDrawing()72 public StrokeData getCurrentDrawing() { 73 return mCurrent; 74 } 75 76 @Override clone()77 public FilterRepresentation clone() throws CloneNotSupportedException { 78 FilterDrawRepresentation representation = (FilterDrawRepresentation) super.clone(); 79 return representation; 80 } 81 82 @Override isNil()83 public boolean isNil() { 84 return getDrawing().isEmpty(); 85 } 86 87 @Override useParametersFrom(FilterRepresentation a)88 public void useParametersFrom(FilterRepresentation a) { 89 if (a instanceof FilterDrawRepresentation) { 90 FilterDrawRepresentation representation = (FilterDrawRepresentation) a; 91 try { 92 if (representation.mCurrent != null) { 93 mCurrent = (StrokeData) representation.mCurrent.clone(); 94 } else { 95 mCurrent = null; 96 } 97 if (representation.mDrawing != null) { 98 mDrawing = (Vector<StrokeData>) representation.mDrawing.clone(); 99 } else { 100 mDrawing = null; 101 } 102 103 } catch (CloneNotSupportedException e) { 104 e.printStackTrace(); 105 } 106 } else { 107 Log.v(LOGTAG, "cannot use parameters from " + a); 108 } 109 } 110 111 @Override equals(FilterRepresentation representation)112 public boolean equals(FilterRepresentation representation) { 113 if (!super.equals(representation)) { 114 return false; 115 } 116 if (representation instanceof FilterDrawRepresentation) { 117 FilterDrawRepresentation fdRep = (FilterDrawRepresentation) representation; 118 if (fdRep.mDrawing.size() != mDrawing.size()) 119 return false; 120 if (fdRep.mCurrent == null && mCurrent.mPath == null) { 121 return true; 122 } 123 if (fdRep.mCurrent != null && mCurrent.mPath != null) { 124 if (fdRep.mCurrent.noPoints == mCurrent.noPoints) { 125 return true; 126 } 127 return false; 128 } 129 } 130 return false; 131 } 132 startNewSection(byte type, int color, float size, float x, float y)133 public void startNewSection(byte type, int color, float size, float x, float y) { 134 mCurrent = new StrokeData(); 135 mCurrent.mColor = color; 136 mCurrent.mRadius = size; 137 mCurrent.mType = type; 138 mCurrent.mPath = new Path(); 139 mCurrent.mPath.moveTo(x, y); 140 mCurrent.noPoints = 0; 141 } 142 addPoint(float x, float y)143 public void addPoint(float x, float y) { 144 mCurrent.noPoints++; 145 mCurrent.mPath.lineTo(x, y); 146 } 147 endSection(float x, float y)148 public void endSection(float x, float y) { 149 mCurrent.mPath.lineTo(x, y); 150 mCurrent.noPoints++; 151 mDrawing.add(mCurrent); 152 mCurrent = null; 153 } 154 clearCurrentSection()155 public void clearCurrentSection() { 156 mCurrent = null; 157 } 158 clear()159 public void clear() { 160 mCurrent = null; 161 mDrawing.clear(); 162 } 163 164 } 165