19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  this work for additional information regarding copyright ownership.
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  (the "License"); you may not use this file except in compliance with
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  the License.  You may obtain a copy of the License at
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  See the License for the specific language governing permissions and
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  limitations under the License.
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @author Denis M. Kishenko
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @version $Revision$
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage java.awt.geom;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The Interface PathIterator represents an iterator object that can be used to
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * traverse the outline of a {@link java.awt.Shape}. It returns points along the
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * boundary of the Shape which may be actual vertices (in the case of a shape
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * made of line segments) or may be points on a curved segment with the distance
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * between the points determined by a chosen flattening factor.
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If the shape is closed, the outline is traversed in the counter-clockwise
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * direction. That means that moving forward along the boundary is to travel in
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * such a way that the interior of the shape is to the left of the outline path
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and the exterior of the shape is to the right of the outline path. The
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * interior and exterior of the shape are determined by a winding rule.
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @since Android 1.0
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic interface PathIterator {
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The Constant WIND_EVEN_ODD indicates the winding rule that says that a
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * point is outside the shape if any infinite ray from the point crosses the
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * outline of the shape an even number of times, otherwise it is inside.
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int WIND_EVEN_ODD = 0;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The Constant WIND_NON_ZERO indicates the winding rule that says that a
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * point is inside the shape if every infinite ray starting from that point
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * crosses the outline of the shape a non-zero number of times.
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int WIND_NON_ZERO = 1;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The Constant SEG_MOVETO indicates that to follow the shape's outline from
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the previous point to the current point, the cursor (traversal point)
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * should be placed directly on the current point.
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SEG_MOVETO = 0;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The Constant SEG_LINETO indicates that to follow the shape's outline from
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the previous point to the current point, the cursor (traversal point)
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * should follow a straight line.
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SEG_LINETO = 1;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The Constant SEG_QUADTO indicates that to follow the shape's outline from
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the previous point to the current point, the cursor (traversal point)
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * should follow a quadratic curve.
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SEG_QUADTO = 2;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The Constant SEG_CUBICTO indicates that to follow the shape's outline
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * from the previous point to the current point, the cursor (traversal
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * point) should follow a cubic curve.
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SEG_CUBICTO = 3;
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The Constant SEG_CLOSE indicates that the previous point was the end of
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the shape's outline.
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SEG_CLOSE = 4;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the winding rule, either {@link PathIterator#WIND_EVEN_ODD} or
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link PathIterator#WIND_NON_ZERO}.
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the winding rule.
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getWindingRule();
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Checks if this PathIterator has been completely traversed.
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true, if this PathIterator has been completely traversed.
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isDone();
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Tells this PathIterator to skip to the next segment.
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void next();
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the coordinates of the next vertex point along the shape's outline
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and a flag that indicates what kind of segment to use in order to connect
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the previous vertex point to the current vertex point to form the current
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * segment.
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param coords
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the array that the coordinates of the end point of the current
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            segment are written into.
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the flag that indicates how to follow the shape's outline from
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         the previous point to the current one, chosen from the following
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         constants: {@link PathIterator#SEG_MOVETO},
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         {@link PathIterator#SEG_LINETO}, {@link PathIterator#SEG_QUADTO},
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         {@link PathIterator#SEG_CUBICTO}, or
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         {@link PathIterator#SEG_CLOSE}.
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int currentSegment(float[] coords);
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the coordinates of the next vertex point along the shape's outline
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and a flag that indicates what kind of segment to use in order to connect
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the previous vertex point to the current vertex point to form the current
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * segment.
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param coords
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the array that the coordinates of the end point of the current
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            segment are written into.
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the flag that indicates how to follow the shape's outline from
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         the previous point to the current one, chosen from the following
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         constants: {@link PathIterator#SEG_MOVETO},
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         {@link PathIterator#SEG_LINETO}, {@link PathIterator#SEG_QUADTO},
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         {@link PathIterator#SEG_CUBICTO}, or
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         {@link PathIterator#SEG_CLOSE}.
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int currentSegment(double[] coords);
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
147