[kaffe] CVS kaffe (dalibor): Partially resynced with GNU Classpath CVS
Kaffe CVS
Kaffe Mailing List <kaffe@kaffe.org>
Sat Nov 22 10:53:02 2003
PatchSet 4167
Date: 2003/11/22 18:50:12
Author: dalibor
Branch: HEAD
Tag: (none)
Log:
Partially resynced with GNU Classpath CVS
Members:
ChangeLog:1.1759->1.1760
libraries/javalib/gnu/java/rmi/rmic/Compile_jikes.java:1.2->1.3
libraries/javalib/gnu/java/rmi/rmic/Compile_kjc.java:1.1->1.2
libraries/javalib/gnu/java/rmi/rmic/RMICException.java:1.1->1.2
libraries/javalib/java/awt/datatransfer/DataFlavor.java:1.10->1.11
libraries/javalib/java/awt/geom/FlatteningPathIterator.java:1.1->1.2
libraries/javalib/java/io/ByteArrayOutputStream.java:1.11->1.12
libraries/javalib/java/io/StreamTokenizer.java:1.22->1.23
libraries/javalib/java/net/Inet4Address.java:1.3->1.4
libraries/javalib/java/net/SocketPermission.java:1.2->1.3
libraries/javalib/java/net/URL.java:1.34->1.35
libraries/javalib/java/net/URLStreamHandler.java:1.12->1.13
libraries/javalib/java/nio/ByteBuffer.java:1.7->1.8
libraries/javalib/java/security/cert/CertStore.java:1.1->1.2
libraries/javalib/java/sql/Timestamp.java:1.6->1.7
libraries/javalib/java/text/CollationKey.java:1.13->1.14
libraries/javalib/java/text/FieldPosition.java:1.8->1.9
libraries/javalib/java/util/TreeMap.java:1.15->1.16
libraries/javalib/java/util/zip/Checksum.java:1.3->1.4
libraries/javalib/java/util/zip/InflaterInputStream.java:1.6->1.7
libraries/javalib/java/util/zip/ZipConstants.java:1.8->1.9
libraries/javalib/javax/naming/CompoundName.java:1.2->1.3
Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.1759 kaffe/ChangeLog:1.1760
--- kaffe/ChangeLog:1.1759 Sat Nov 22 05:57:28 2003
+++ kaffe/ChangeLog Sat Nov 22 18:50:12 2003
@@ -1,3 +1,85 @@
+2002-11-22 Dalibor Topic <robilad@kaffe.org>
+
+ Partially resynced with GNU Classpath. Detailed ChangeLog follows.
+
+ 2003-08-29 Dalibor Topic <robilad@kaffe.org>
+
+ * gnu/java/rmi/rmic/Compile_kjc.java: New file.
+ * gnu/java/rmi/rmic/Compile_jikes.java: Likewise
+ * gnu/java/rmi/rmic/RMICException.java: Likewise.
+
+ 2003-11-15 Michael Koch <konqueror@gmx.de>
+
+ * java/awt/datatransfer/DataFlavor.java,
+ java/security/cert/CertStore.java,
+ java/sql/Timestamp.java,
+ javax/naming/CompoundName.java (equals):
+ Removed some redundant obj == null checks.
+
+ 2003-11-11 Sascha Brawer <brawer@dandelis.ch>
+
+ * java/awt/geom/FlatteningPathIterator.java: Entirely re-written.
+
+ 2003-11-17 Jeff Sturm <jsturm@one-point.com>
+
+ * java/io/ByteArrayOutputStream.java (resize):
+ Fix off-by-one error.
+
+ 2003-11-16 Tom Tromey <tromey@redhat.com>
+
+ * java/io/StreamTokenizer.java (commentChar): Clear other
+ attributes for character.
+ (quoteChar): Likewise.
+
+ 2003-11-09 Tom Tromey <tromey@redhat.com>
+
+ * java/net/Inet4Address.java (serialVersionUID): Updated.
+
+ 2003-11-04 Michael Koch <konqueror@gmx.de>
+
+ * java/net/SocketPermission.java
+ (equals): Removed unneeded obj == null check.
+ * java/net/URL.java
+ (equals): Removed unneeded obj == null check.
+
+ 2003-11-13 Guilhem Lavaux <guilhem@kaffe.org>
+ Mark Wielaard <mark@klomp.org>
+
+ * java/net/URLStreamHandler (parseUrl): Fixed URL parsing
+ ('@' should be checked to distinguish port from userinfo).
+ (toExternalForm): Add @ userInfo if necessary.
+
+ 2003-11-04 Michael Koch <konqueror@gmx.de>
+
+ * java/nio/ByteBuffer.java
+ (equals): Removed unneeded obj != null check.
+
+ 2003-10-21 Michael Koch <konqueror@gmx.de>
+
+ * java/text/CollationKey.java
+ (compareTo): Simplified implementation.
+ (equals): Reoved redundant obj == null check.
+
+ 2003-11-19 Dalibor Topic <robilad@kaffe.org>
+
+ * java/text/FieldPosition.java (equals): Adapted to handle
+ field_attribute. Added fast-circuit check for comparison to self.
+ Replaced use of instanceof by getClass to fix symmetry for derived
+ types.
+ (toString): Adapted to handle field_attribute. Improved readability.
+ (hashCode): New method.
+
+ 2003-10-26 Bryce McKinlay <bryce@mckinlay.net.nz>
+ * java/util/TreeMap.java: Doc fixes. HashMap -> TreeMap.
+
+ 2003-11-04 Michael Koch <konqueror@gmx.de>
+
+ * java/util/zip/Checksum.java,
+ java/util/zip/ZipConstants.java:
+ Removed redundant modifiers.
+ * java/util/zip/InflaterInputStream.java:
+ Merged copyright with libgcj's version.
+
2003-11-21 Guilhem Lavaux <guilhem@kaffe.org>
* libraries/javalib/kjc.jar: Regenerated to include Ito's patch.
Index: kaffe/libraries/javalib/gnu/java/rmi/rmic/Compile_jikes.java
diff -u kaffe/libraries/javalib/gnu/java/rmi/rmic/Compile_jikes.java:1.2 kaffe/libraries/javalib/gnu/java/rmi/rmic/Compile_jikes.java:1.3
--- kaffe/libraries/javalib/gnu/java/rmi/rmic/Compile_jikes.java:1.2 Tue Sep 16 12:35:53 2003
+++ kaffe/libraries/javalib/gnu/java/rmi/rmic/Compile_jikes.java Sat Nov 22 18:50:13 2003
@@ -1,56 +1,56 @@
-/*
- Copyright (c) 2003 Free Software Foundation, Inc.
-
-This file is part of GNU Classpath.
-
-GNU Classpath is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
-
-GNU Classpath is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GNU Classpath; see the file COPYING. If not, write to the
-Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-02111-1307 USA.
-
-Linking this library statically or dynamically with other modules is
-making a combined work based on this library. Thus, the terms and
-conditions of the GNU General Public License cover the whole
-combination.
-
-As a special exception, the copyright holders of this library give you
-permission to link this library with independent modules to produce an
-executable, regardless of the license terms of these independent
-modules, and to copy and distribute the resulting executable under
-terms of your choice, provided that you also meet, for each linked
-independent module, the terms and conditions of the license of that
-module. An independent module is a module which is not derived from
-or based on this library. If you modify this library, you may extend
-this exception to your version of the library, but you are not
-obligated to do so. If you do not wish to do so, delete this
-exception statement from your version. */
-
-package gnu.java.rmi.rmic;
-
-/** Subclass of Compiler that can be used to invoke jikes. */
-public class Compile_jikes extends CompilerProcess
-{
- /** Compiler arguments to invoke jikes */
- private static final String [] COMPILER_ARGS =
- {
- "jikes"
- };
-
- /** Compute the command line for the process. */
- public String[] computeArguments (String filename)
- {
- return computeTypicalArguments(COMPILER_ARGS,
- getDestination(),
- filename);
- }
-}
+/*
+ Copyright (c) 2003 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.java.rmi.rmic;
+
+/** Subclass of Compiler that can be used to invoke jikes. */
+public class Compile_jikes extends CompilerProcess
+{
+ /** Compiler arguments to invoke jikes */
+ private static final String [] COMPILER_ARGS =
+ {
+ "jikes"
+ };
+
+ /** Compute the command line for the process. */
+ public String[] computeArguments (String filename)
+ {
+ return computeTypicalArguments(COMPILER_ARGS,
+ getDestination(),
+ filename);
+ }
+}
Index: kaffe/libraries/javalib/gnu/java/rmi/rmic/Compile_kjc.java
diff -u kaffe/libraries/javalib/gnu/java/rmi/rmic/Compile_kjc.java:1.1 kaffe/libraries/javalib/gnu/java/rmi/rmic/Compile_kjc.java:1.2
--- kaffe/libraries/javalib/gnu/java/rmi/rmic/Compile_kjc.java:1.1 Mon Aug 18 17:40:33 2003
+++ kaffe/libraries/javalib/gnu/java/rmi/rmic/Compile_kjc.java Sat Nov 22 18:50:13 2003
@@ -1,56 +1,56 @@
-/*
- Copyright (c) 2003 Free Software Foundation, Inc.
-
-This file is part of GNU Classpath.
-
-GNU Classpath is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
-
-GNU Classpath is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GNU Classpath; see the file COPYING. If not, write to the
-Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-02111-1307 USA.
-
-Linking this library statically or dynamically with other modules is
-making a combined work based on this library. Thus, the terms and
-conditions of the GNU General Public License cover the whole
-combination.
-
-As a special exception, the copyright holders of this library give you
-permission to link this library with independent modules to produce an
-executable, regardless of the license terms of these independent
-modules, and to copy and distribute the resulting executable under
-terms of your choice, provided that you also meet, for each linked
-independent module, the terms and conditions of the license of that
-module. An independent module is a module which is not derived from
-or based on this library. If you modify this library, you may extend
-this exception to your version of the library, but you are not
-obligated to do so. If you do not wish to do so, delete this
-exception statement from your version. */
-
-package gnu.java.rmi.rmic;
-
-/** Subclass of Compiler that can be used to invoke kjc. */
-public class Compile_kjc extends CompilerProcess
-{
- /** Compiler arguments to invoke kjc */
- private static final String [] COMPILER_ARGS =
- {
- "kjc"
- };
-
- /** Compute the command line for the process. */
- public String[] computeArguments (String filename)
- {
- return computeTypicalArguments(COMPILER_ARGS,
- getDestination(),
- filename);
- }
-}
+/*
+ Copyright (c) 2003 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.java.rmi.rmic;
+
+/** Subclass of Compiler that can be used to invoke kjc. */
+public class Compile_kjc extends CompilerProcess
+{
+ /** Compiler arguments to invoke kjc */
+ private static final String [] COMPILER_ARGS =
+ {
+ "kjc"
+ };
+
+ /** Compute the command line for the process. */
+ public String[] computeArguments (String filename)
+ {
+ return computeTypicalArguments(COMPILER_ARGS,
+ getDestination(),
+ filename);
+ }
+}
Index: kaffe/libraries/javalib/gnu/java/rmi/rmic/RMICException.java
diff -u kaffe/libraries/javalib/gnu/java/rmi/rmic/RMICException.java:1.1 kaffe/libraries/javalib/gnu/java/rmi/rmic/RMICException.java:1.2
--- kaffe/libraries/javalib/gnu/java/rmi/rmic/RMICException.java:1.1 Mon Aug 18 17:40:33 2003
+++ kaffe/libraries/javalib/gnu/java/rmi/rmic/RMICException.java Sat Nov 22 18:50:13 2003
@@ -1,66 +1,66 @@
-/*
- Copyright (c) 2003 Free Software Foundation, Inc.
-
-This file is part of GNU Classpath.
-
-GNU Classpath is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
-
-GNU Classpath is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GNU Classpath; see the file COPYING. If not, write to the
-Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-02111-1307 USA.
-
-Linking this library statically or dynamically with other modules is
-making a combined work based on this library. Thus, the terms and
-conditions of the GNU General Public License cover the whole
-combination.
-
-As a special exception, the copyright holders of this library give you
-permission to link this library with independent modules to produce an
-executable, regardless of the license terms of these independent
-modules, and to copy and distribute the resulting executable under
-terms of your choice, provided that you also meet, for each linked
-independent module, the terms and conditions of the license of that
-module. An independent module is a module which is not derived from
-or based on this library. If you modify this library, you may extend
-this exception to your version of the library, but you are not
-obligated to do so. If you do not wish to do so, delete this
-exception statement from your version. */
-
-package gnu.java.rmi.rmic;
-
-/**
- * Thrown by the underlying compiler used by RMIC when it fails to compile a file.
- *
- * @author Dalibor Topic <robilad@kaffe.org>
- */
-
-public class RMICException extends Exception {
- /**
- * Create an exception with a message. The cause remains uninitialized.
- *
- * @param s the message string
- * @see #initCause(Throwable)
- */
- public RMICException(String message) {
- super(message);
- }
-
- /**
- * Create an exception with a message and a cause.
- *
- * @param s the message string
- * @param cause the cause of this exception
- */
- public RMICException(String message, Throwable cause) {
- super(message, cause);
- }
-}
+/*
+ Copyright (c) 2003 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.java.rmi.rmic;
+
+/**
+ * Thrown by the underlying compiler used by RMIC when it fails to compile a file.
+ *
+ * @author Dalibor Topic <robilad@kaffe.org>
+ */
+
+public class RMICException extends Exception {
+ /**
+ * Create an exception with a message. The cause remains uninitialized.
+ *
+ * @param s the message string
+ * @see #initCause(Throwable)
+ */
+ public RMICException(String message) {
+ super(message);
+ }
+
+ /**
+ * Create an exception with a message and a cause.
+ *
+ * @param s the message string
+ * @param cause the cause of this exception
+ */
+ public RMICException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
Index: kaffe/libraries/javalib/java/awt/datatransfer/DataFlavor.java
diff -u kaffe/libraries/javalib/java/awt/datatransfer/DataFlavor.java:1.10 kaffe/libraries/javalib/java/awt/datatransfer/DataFlavor.java:1.11
--- kaffe/libraries/javalib/java/awt/datatransfer/DataFlavor.java:1.10 Sun Aug 10 18:47:48 2003
+++ kaffe/libraries/javalib/java/awt/datatransfer/DataFlavor.java Sat Nov 22 18:50:14 2003
@@ -723,9 +723,6 @@
public boolean
equals(Object obj)
{
- if (obj == null)
- return(false);
-
if (!(obj instanceof DataFlavor))
return(false);
Index: kaffe/libraries/javalib/java/awt/geom/FlatteningPathIterator.java
diff -u kaffe/libraries/javalib/java/awt/geom/FlatteningPathIterator.java:1.1 kaffe/libraries/javalib/java/awt/geom/FlatteningPathIterator.java:1.2
--- kaffe/libraries/javalib/java/awt/geom/FlatteningPathIterator.java:1.1 Wed Nov 6 11:52:24 2002
+++ kaffe/libraries/javalib/java/awt/geom/FlatteningPathIterator.java Sat Nov 22 18:50:15 2003
@@ -1,5 +1,5 @@
-/* FlatteningPathIterator.java -- performs interpolation of curved paths
- Copyright (C) 2002 Free Software Foundation
+/* FlatteningPathIterator.java -- Approximates curves by straight lines
+ Copyright (C) 2003 Free Software Foundation
This file is part of GNU Classpath.
@@ -38,68 +38,542 @@
package java.awt.geom;
+import java.util.NoSuchElementException;
+
+
/**
- * This class can be used to perform the flattening required by the Shape
- * interface. It interpolates a curved path segment into a sequence of flat
- * ones within a certain flatness, up to a recursion limit.
- *
- * @author Eric Blake <ebb9@email.byu.edu>
- * @see Shape
- * @see RectangularShape#getPathIterator(AffineTransform, double)
+ * A PathIterator for approximating curved path segments by sequences
+ * of straight lines. Instances of this class will only return
+ * segments of type {@link PathIterator#SEG_MOVETO}, {@link
+ * PathIterator#SEG_LINETO}, and {@link PathIterator#SEG_CLOSE}.
+ *
+ * <p>The accuracy of the approximation is determined by two
+ * parameters:
+ *
+ * <ul><li>The <i>flatness</i> is a threshold value for deciding when
+ * a curved segment is consided flat enough for being approximated by
+ * a single straight line. Flatness is defined as the maximal distance
+ * of a curve control point to the straight line that connects the
+ * curve start and end. A lower flatness threshold means a closer
+ * approximation. See {@link QuadCurve2D#getFlatness()} and {@link
+ * CubicCurve2D#getFlatness()} for drawings which illustrate the
+ * meaning of flatness.</li>
+ *
+ * <li>The <i>recursion limit</i> imposes an upper bound for how often
+ * a curved segment gets subdivided. A limit of <i>n</i> means that
+ * for each individual quadratic and cubic Bézier spline
+ * segment, at most 2<sup><small><i>n</i></small></sup> {@link
+ * PathIterator#SEG_LINETO} segments will be created.</li></ul>
+ *
+ * <p><b>Memory Efficiency:</b> The memory consumption grows linearly
+ * with the recursion limit. Neither the <i>flatness</i> parameter nor
+ * the number of segments in the flattened path will affect the memory
+ * consumption.
+ *
+ * <p><b>Thread Safety:</b> Multiple threads can safely work on
+ * separate instances of this class. However, multiple threads should
+ * not concurrently access the same instance, as no synchronization is
+ * performed.
+ *
+ * @see <a href="doc-files/FlatteningPathIterator-1.html"
+ * >Implementation Note</a>
+ *
+ * @author Sascha Brawer (brawer@dandelis.ch)
+ *
* @since 1.2
- * @status STUBS ONLY
*/
-public class FlatteningPathIterator implements PathIterator
+public class FlatteningPathIterator
+ implements PathIterator
{
- // The iterator we are applied to.
- private PathIterator subIterator;
- private double flatness;
- private int limit;
-
+ /**
+ * The PathIterator whose curved segments are being approximated.
+ */
+ private final PathIterator srcIter;
+
+
+ /**
+ * The square of the flatness threshold value, which determines when
+ * a curve segment is considered flat enough that no further
+ * subdivision is needed.
+ *
+ * <p>Calculating flatness actually produces the squared flatness
+ * value. To avoid the relatively expensive calculation of a square
+ * root for each curve segment, we perform all flatness comparisons
+ * on squared values.
+ *
+ * @see QuadCurve2D#getFlatnessSq()
+ * @see CubicCurve2D#getFlatnessSq()
+ */
+ private final double flatnessSq;
+
+
+ /**
+ * The maximal number of subdivions that are performed to
+ * approximate a quadratic or cubic curve segment.
+ */
+ private final int recursionLimit;
+
+
+ /**
+ * A stack for holding the coordinates of subdivided segments.
+ *
+ * @see <a href="doc-files/FlatteningPathIterator-1.html"
+ * >Implementation Note</a>
+ */
+ private double[] stack;
+
+
+ /**
+ * The current stack size.
+ *
+ * @see <a href="doc-files/FlatteningPathIterator-1.html"
+ * >Implementation Note</a>
+ */
+ private int stackSize;
+
+
+ /**
+ * The number of recursions that were performed to arrive at
+ * a segment on the stack.
+ *
+ * @see <a href="doc-files/FlatteningPathIterator-1.html"
+ * >Implementation Note</a>
+ */
+ private int[] recLevel;
+
+
+
+ private final double[] scratch = new double[6];
+
+
+ /**
+ * The segment type of the last segment that was returned by
+ * the source iterator.
+ */
+ private int srcSegType;
+
+
+ /**
+ * The current <i>x</i> position of the source iterator.
+ */
+ private double srcPosX;
+
+
+ /**
+ * The current <i>y</i> position of the source iterator.
+ */
+ private double srcPosY;
+
+
+ /**
+ * A flag that indicates when this path iterator has finished its
+ * iteration over path segments.
+ */
+ private boolean done;
+
+
+ /**
+ * Constructs a new PathIterator for approximating an input
+ * PathIterator with straight lines. The approximation works by
+ * recursive subdivisons, until the specified flatness threshold is
+ * not exceeded.
+ *
+ * <p>There will not be more than 10 nested recursion steps, which
+ * means that a single <code>SEG_QUADTO</code> or
+ * <code>SEG_CUBICTO</code> segment is approximated by at most
+ * 2<sup><small>10</small></sup> = 1024 straight lines.
+ */
public FlatteningPathIterator(PathIterator src, double flatness)
{
this(src, flatness, 10);
}
- public FlatteningPathIterator(PathIterator src, double flatness, int limit)
+
+
+ /**
+ * Constructs a new PathIterator for approximating an input
+ * PathIterator with straight lines. The approximation works by
+ * recursive subdivisons, until the specified flatness threshold is
+ * not exceeded. Additionally, the number of recursions is also
+ * bound by the specified recursion limit.
+ */
+ public FlatteningPathIterator(PathIterator src, double flatness,
+ int limit)
{
- subIterator = src;
- this.flatness = flatness;
- this.limit = limit;
if (flatness < 0 || limit < 0)
throw new IllegalArgumentException();
+
+ srcIter = src;
+ flatnessSq = flatness * flatness;
+ recursionLimit = limit;
+ fetchSegment();
}
+
+ /**
+ * Returns the maximally acceptable flatness.
+ *
+ * @see QuadCurve2D#getFlatness()
+ * @see CubicCurve2D#getFlatness()
+ */
public double getFlatness()
{
- return flatness;
+ return Math.sqrt(flatnessSq);
}
+
+ /**
+ * Returns the maximum number of recursive curve subdivisions.
+ */
public int getRecursionLimit()
{
- return limit;
+ return recursionLimit;
}
+
+ // Documentation will be copied from PathIterator.
public int getWindingRule()
{
- return subIterator.getWindingRule();
+ return srcIter.getWindingRule();
}
+
+ // Documentation will be copied from PathIterator.
public boolean isDone()
{
- return subIterator.isDone();
+ return done;
}
+
+ // Documentation will be copied from PathIterator.
public void next()
{
- throw new Error("not implemented");
+ if (stackSize > 0)
+ {
+ --stackSize;
+ if (stackSize > 0)
+ {
+ switch (srcSegType)
+ {
+ case PathIterator.SEG_QUADTO:
+ subdivideQuadratic();
+ return;
+
+ case PathIterator.SEG_CUBICTO:
+ subdivideCubic();
+ return;
+
+ default:
+ throw new IllegalStateException();
+ }
+ }
+ }
+
+ srcIter.next();
+ fetchSegment();
}
+
+ // Documentation will be copied from PathIterator.
public int currentSegment(double[] coords)
{
- throw new Error("not implemented");
+ if (done)
+ throw new NoSuchElementException();
+
+ switch (srcSegType)
+ {
+ case PathIterator.SEG_CLOSE:
+ return srcSegType;
+
+ case PathIterator.SEG_MOVETO:
+ case PathIterator.SEG_LINETO:
+ coords[0] = srcPosX;
+ coords[1] = srcPosY;
+ return srcSegType;
+
+ case PathIterator.SEG_QUADTO:
+ if (stackSize == 0)
+ {
+ coords[0] = srcPosX;
+ coords[1] = srcPosY;
+ }
+ else
+ {
+ int sp = stack.length - 4 * stackSize;
+ coords[0] = stack[sp + 2];
+ coords[1] = stack[sp + 3];
+ }
+ return PathIterator.SEG_LINETO;
+
+ case PathIterator.SEG_CUBICTO:
+ if (stackSize == 0)
+ {
+ coords[0] = srcPosX;
+ coords[1] = srcPosY;
+ }
+ else
+ {
+ int sp = stack.length - 6 * stackSize;
+ coords[0] = stack[sp + 4];
+ coords[1] = stack[sp + 5];
+ }
+ return PathIterator.SEG_LINETO;
+ }
+
+ throw new IllegalStateException();
}
+
+
+ // Documentation will be copied from PathIterator.
public int currentSegment(float[] coords)
{
- throw new Error("not implemented");
+ if (done)
+ throw new NoSuchElementException();
+
+ switch (srcSegType)
+ {
+ case PathIterator.SEG_CLOSE:
+ return srcSegType;
+
+ case PathIterator.SEG_MOVETO:
+ case PathIterator.SEG_LINETO:
+ coords[0] = (float) srcPosX;
+ coords[1] = (float) srcPosY;
+ return srcSegType;
+
+ case PathIterator.SEG_QUADTO:
+ if (stackSize == 0)
+ {
+ coords[0] = (float) srcPosX;
+ coords[1] = (float) srcPosY;
+ }
+ else
+ {
+ int sp = stack.length - 4 * stackSize;
+ coords[0] = (float) stack[sp + 2];
+ coords[1] = (float) stack[sp + 3];
+ }
+ return PathIterator.SEG_LINETO;
+
+ case PathIterator.SEG_CUBICTO:
+ if (stackSize == 0)
+ {
+ coords[0] = (float) srcPosX;
+ coords[1] = (float) srcPosY;
+ }
+ else
+ {
+ int sp = stack.length - 6 * stackSize;
+ coords[0] = (float) stack[sp + 4];
+ coords[1] = (float) stack[sp + 5];
+ }
+ return PathIterator.SEG_LINETO;
+ }
+
+ throw new IllegalStateException();
+ }
+
+
+ /**
+ * Fetches the next segment from the source iterator.
+ */
+ private void fetchSegment()
+ {
+ int sp;
+
+ if (srcIter.isDone())
+ {
+ done = true;
+ return;
+ }
+
+ srcSegType = srcIter.currentSegment(scratch);
+
+ switch (srcSegType)
+ {
+ case PathIterator.SEG_CLOSE:
+ return;
+
+ case PathIterator.SEG_MOVETO:
+ case PathIterator.SEG_LINETO:
+ srcPosX = scratch[0];
+ srcPosY = scratch[1];
+ return;
+
+ case PathIterator.SEG_QUADTO:
+ if (recursionLimit == 0)
+ {
+ srcPosX = scratch[2];
+ srcPosY = scratch[3];
+ stackSize = 0;
+ return;
+ }
+ sp = 4 * recursionLimit;
+ stackSize = 1;
+ if (stack == null)
+ {
+ stack = new double[sp + /* 4 + 2 */ 6];
+ recLevel = new int[recursionLimit + 1];
+ }
+ recLevel[0] = 0;
+ stack[sp] = srcPosX; // P1.x
+ stack[sp + 1] = srcPosY; // P1.y
+ stack[sp + 2] = scratch[0]; // C.x
+ stack[sp + 3] = scratch[1]; // C.y
+ srcPosX = stack[sp + 4] = scratch[2]; // P2.x
+ srcPosY = stack[sp + 5] = scratch[3]; // P2.y
+ subdivideQuadratic();
+ break;
+
+ case PathIterator.SEG_CUBICTO:
+ if (recursionLimit == 0)
+ {
+ srcPosX = scratch[4];
+ srcPosY = scratch[5];
+ stackSize = 0;
+ return;
+ }
+ sp = 6 * recursionLimit;
+ stackSize = 1;
+ if ((stack == null) || (stack.length < sp + 8))
+ {
+ stack = new double[sp + /* 6 + 2 */ 8];
+ recLevel = new int[recursionLimit + 1];
+ }
+ recLevel[0] = 0;
+ stack[sp] = srcPosX; // P1.x
+ stack[sp + 1] = srcPosY; // P1.y
+ stack[sp + 2] = scratch[0]; // C1.x
+ stack[sp + 3] = scratch[1]; // C1.y
+ stack[sp + 4] = scratch[2]; // C2.x
+ stack[sp + 5] = scratch[3]; // C2.y
+ srcPosX = stack[sp + 6] = scratch[4]; // P2.x
+ srcPosY = stack[sp + 7] = scratch[5]; // P2.y
+ subdivideCubic();
+ return;
+ }
+ }
+
+
+ /**
+ * Repeatedly subdivides the quadratic curve segment that is on top
+ * of the stack. The iteration terminates when the recursion limit
+ * has been reached, or when the resulting segment is flat enough.
+ */
+ private void subdivideQuadratic()
+ {
+ int sp;
+ int level;
+
+ sp = stack.length - 4 * stackSize - 2;
+ level = recLevel[stackSize - 1];
+ while ((level < recursionLimit)
+ && (QuadCurve2D.getFlatnessSq(stack, sp) >= flatnessSq))
+ {
+ recLevel[stackSize] = recLevel[stackSize - 1] = ++level;
+ QuadCurve2D.subdivide(stack, sp, stack, sp - 4, stack, sp);
+ ++stackSize;
+ sp -= 4;
+ }
}
-} // class FlatteningPathIterator
+
+
+ /**
+ * Repeatedly subdivides the cubic curve segment that is on top
+ * of the stack. The iteration terminates when the recursion limit
+ * has been reached, or when the resulting segment is flat enough.
+ */
+ private void subdivideCubic()
+ {
+ int sp;
+ int level;
+
+ sp = stack.length - 6 * stackSize - 2;
+ level = recLevel[stackSize - 1];
*** Patch too long, truncated ***