/*
* Copyright (c) 2002-@year@, University of Maryland
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are permitted provided
* that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice, this list of conditions
* and the following disclaimer.
*
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
* and the following disclaimer in the documentation and/or other materials provided with the
* distribution.
*
* Neither the name of the University of Maryland nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Piccolo was written at the Human-Computer Interaction Laboratory www.cs.umd.edu/hcil by Jesse Grosjean
* under the supervision of Ben Bederson. The Piccolo website is www.cs.umd.edu/hcil/piccolo.
*/
package edu.umd.cs.piccolo.util;
import java.awt.BasicStroke;
import java.awt.Stroke;
import java.awt.geom.GeneralPath;
import java.awt.geom.PathIterator;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Iterator;
import edu.umd.cs.piccolo.PCamera;
import edu.umd.cs.piccolo.PLayer;
import edu.umd.cs.piccolo.PRoot;
/**
* <b>PUtil</b> util methods for the Piccolo framework.
* <P>
* @version 1.0
* @author Jesse Grosjean
*/
public class PUtil {
public static Iterator NULL_ITERATOR = Collections.EMPTY_LIST.iterator();
public static Enumeration NULL_ENUMERATION = new Enumeration() {
public boolean hasMoreElements() { return false; }
public Object nextElement() { return null; }
};
public static long DEFAULT_ACTIVITY_STEP_RATE = 20;
public static int ACTIVITY_SCHEDULER_FRAME_DELAY = 10;
public static OutputStream NULL_OUTPUT_STREAM = new OutputStream() {
public void close() { }
public void flush() { }
public void write(byte[] b) { }
public void write(byte[] b, int off, int len) { }
public void write(int b) { }
};
public static PCamera createBasicScenegraph() {
PRoot r = new PRoot();
PLayer l = new PLayer();
PCamera c = new PCamera();
r.addChild(c);
r.addChild(l);
c.addLayer(l);
return c;
}
public static void writeStroke(Stroke aStroke, ObjectOutputStream out) throws IOException {
if (aStroke instanceof Serializable) {
out.writeBoolean(true);
out.writeBoolean(true);
out.writeObject(aStroke);
} else if (aStroke instanceof BasicStroke) {
out.writeBoolean(true);
out.writeBoolean(false);
BasicStroke s = (BasicStroke) aStroke;
float[] dash = s.getDashArray();
if (dash == null) {
out.write(0);
} else {
out.write(dash.length);
for (int i = 0; i < dash.length; i++) {
out.writeFloat(dash[i]);
}
}
out.writeFloat(s.getLineWidth());
out.writeInt(s.getEndCap());
out.writeInt(s.getLineJoin());
out.writeFloat(s.getMiterLimit());
out.writeFloat(s.getDashPhase());
} else {
out.writeBoolean(false);
}
}
public static Stroke readStroke(ObjectInputStream in) throws IOException, ClassNotFoundException {
boolean wroteStroke = in.readBoolean();
if (wroteStroke) {
boolean serializedStroke = in.readBoolean();
if (serializedStroke) {
return (Stroke) in.readObject();
} else {
float[] dash = null;
int dashLength = in.read();
if (dashLength != 0) {
dash = new float[dashLength];
for (int i = 0; i < dashLength; i++) {
dash[i] = in.readFloat();
}
}
float lineWidth = in.readFloat();
int endCap = in.readInt();
int lineJoin = in.readInt();
float miterLimit = in.readFloat();
float dashPhase = in.readFloat();
return new BasicStroke(lineWidth, endCap, lineJoin, miterLimit, dash, dashPhase);
}
} else {
return null;
}
}
private static final int PATH_IS_DONE = -1;
public static GeneralPath readPath(ObjectInputStream in) throws IOException, ClassNotFoundException {
GeneralPath path = new GeneralPath();
while(true) {
int segType = in.readInt();
switch(segType) {
case PathIterator.SEG_MOVETO:
path.moveTo(in.readFloat(), in.readFloat());
break;
case PathIterator.SEG_LINETO:
path.lineTo(in.readFloat(), in.readFloat());
break;
case PathIterator.SEG_QUADTO:
path.quadTo(in.readFloat(), in.readFloat(), in.readFloat(), in.readFloat());
break;
case PathIterator.SEG_CUBICTO:
path.curveTo(in.readFloat(), in.readFloat(), in.readFloat(), in.readFloat(), in.readFloat(), in.readFloat());
break;
case PathIterator.SEG_CLOSE:
path.closePath();
break;
case PATH_IS_DONE:
return path;
default:
throw new IOException();
}
}
}
public static void writePath(GeneralPath path, ObjectOutputStream out) throws IOException {
PathIterator i = path.getPathIterator(null);
float[] data = new float[6];
while(!i.isDone()) {
switch(i.currentSegment(data)) {
case PathIterator.SEG_MOVETO:
out.writeInt(PathIterator.SEG_MOVETO);
out.writeFloat(data[0]);
out.writeFloat(data[1]);
break;
case PathIterator.SEG_LINETO:
out.writeInt(PathIterator.SEG_LINETO);
out.writeFloat(data[0]);
out.writeFloat(data[1]);
break;
case PathIterator.SEG_QUADTO:
out.writeInt(PathIterator.SEG_QUADTO);
out.writeFloat(data[0]);
out.writeFloat(data[1]);
out.writeFloat(data[2]);
out.writeFloat(data[3]);
break;
case PathIterator.SEG_CUBICTO:
out.writeInt(PathIterator.SEG_CUBICTO);
out.writeFloat(data[0]);
out.writeFloat(data[1]);
out.writeFloat(data[2]);
out.writeFloat(data[3]);
out.writeFloat(data[4]);
out.writeFloat(data[5]);
break;
case PathIterator.SEG_CLOSE :
out.writeInt(PathIterator.SEG_CLOSE);
break;
default :
throw new IOException();
}
i.next();
}
out.writeInt(PATH_IS_DONE);
}
}