/*

   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

 */
package org.apache.batik.parser;

/**
 * This interface must be implemented and then registred as the
 * handler of a <code>PathParser</code> instance in order to be
 * notified of parsing events.
 *
 * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
 * @version $Id$
 */
public interface PathHandler {
    /**
     * Invoked when the path starts.
     * @exception ParseException if an error occured while processing the path
     */
    void startPath() throws ParseException;

    /**
     * Invoked when the path ends.
     * @exception ParseException if an error occured while processing the path
     */
    void endPath() throws ParseException;

    /**
     * Invoked when a relative moveto command has been parsed.
     * <p>Command : <b>m</b>
     * @param x the relative x coordinate for the end point
     * @param y the relative y coordinate for the end point
     * @exception ParseException if an error occured while processing the path
     */
    void movetoRel(float x, float y) throws ParseException;

    /**
     * Invoked when an absolute moveto command has been parsed.
     * <p>Command : <b>M</b>
     * @param x the absolute x coordinate for the end point
     * @param y the absolute y coordinate for the end point
     * @exception ParseException if an error occured while processing the path
     */
    void movetoAbs(float x, float y) throws ParseException;

    /**
     * Invoked when a closepath has been parsed.
     * <p>Command : <b>z</b> | <b>Z</b>
     * @exception ParseException if an error occured while processing the path
     */
    void closePath() throws ParseException;

    /**
     * Invoked when a relative line command has been parsed.
     * <p>Command : <b>l</b>
     * @param x the relative x coordinates for the end point
     * @param y the relative y coordinates for the end point
     * @exception ParseException if an error occured while processing the path
     */
    void linetoRel(float x, float y) throws ParseException;

    /**
     * Invoked when an absolute line command has been parsed.
     * <p>Command : <b>L</b>
     * @param x the absolute x coordinate for the end point
     * @param y the absolute y coordinate for the end point
     * @exception ParseException if an error occured while processing the path
     */
    void linetoAbs(float x, float y) throws ParseException;

    /**
     * Invoked when an horizontal relative line command has been parsed.
     * <p>Command : <b>h</b>
     * @param x the relative X coordinate of the end point
     * @exception ParseException if an error occured while processing the path
     */
    void linetoHorizontalRel(float x) throws ParseException;

    /**
     * Invoked when an horizontal absolute line command has been parsed.
     * <p>Command : <b>H</b>
     * @param x the absolute X coordinate of the end point
     * @exception ParseException if an error occured while processing the path
     */
    void linetoHorizontalAbs(float x) throws ParseException;

    /**
     * Invoked when a vertical relative line command has been parsed.
     * <p>Command : <b>v</b>
     * @param y the relative Y coordinate of the end point
     * @exception ParseException if an error occured while processing the path
     */
    void linetoVerticalRel(float y) throws ParseException;

    /**
     * Invoked when a vertical absolute line command has been parsed.
     * <p>Command : <b>V</b>
     * @param y the absolute Y coordinate of the end point
     * @exception ParseException if an error occured while processing the path
     */
    void linetoVerticalAbs(float y) throws ParseException;

    /**
     * Invoked when a relative cubic bezier curve command has been parsed.
     * <p>Command : <b>c</b>
     * @param x1 the relative x coordinate for the first control point
     * @param y1 the relative y coordinate for the first control point
     * @param x2 the relative x coordinate for the second control point
     * @param y2 the relative y coordinate for the second control point
     * @param x the relative x coordinate for the end point
     * @param y the relative y coordinate for the end point
     * @exception ParseException if an error occured while processing the path
     */
    void curvetoCubicRel(float x1, float y1, 
                         float x2, float y2, 
                         float x, float y) throws ParseException;


    /**
     * Invoked when an absolute cubic bezier curve command has been parsed.
     * <p>Command : <b>C</b>
     * @param x1 the absolute x coordinate for the first control point
     * @param y1 the absolute y coordinate for the first control point
     * @param x2 the absolute x coordinate for the second control point
     * @param y2 the absolute y coordinate for the second control point
     * @param x the absolute x coordinate for the end point
     * @param y the absolute y coordinate for the end point
     * @exception ParseException if an error occured while processing the path
     */
    void curvetoCubicAbs(float x1, float y1, 
                         float x2, float y2, 
                         float x, float y) throws ParseException;

    /**
     * Invoked when a relative smooth cubic bezier curve command has
     * been parsed. The first control point is assumed to be the
     * reflection of the second control point on the previous command
     * relative to the current point.
     * <p>Command : <b>s</b>
     * @param x2 the relative x coordinate for the second control point
     * @param y2 the relative y coordinate for the second control point
     * @param x the relative x coordinate for the end point
     * @param y the relative y coordinate for the end point
     * @exception ParseException if an error occured while processing the path
     */
    void curvetoCubicSmoothRel(float x2, float y2, 
                               float x, float y) throws ParseException;

    /**
     * Invoked when an absolute smooth cubic bezier curve command has
     * been parsed. The first control point is assumed to be the
     * reflection of the second control point on the previous command
     * relative to the current point.
     * <p>Command : <b>S</b>
     * @param x2 the absolute x coordinate for the second control point
     * @param y2 the absolute y coordinate for the second control point
     * @param x the absolute x coordinate for the end point
     * @param y the absolute y coordinate for the end point
     * @exception ParseException if an error occured while processing the path
     */
    void curvetoCubicSmoothAbs(float x2, float y2, 
                               float x, float y) throws ParseException;

    /**
     * Invoked when a relative quadratic bezier curve command has been parsed.
     * <p>Command : <b>q</b>
     * @param x1 the relative x coordinate for the control point
     * @param y1 the relative y coordinate for the control point
     * @param x the relative x coordinate for the end point
     * @param y the relative x coordinate for the end point
     * @exception ParseException if an error occured while processing the path
     */
    void curvetoQuadraticRel(float x1, float y1, 
                             float x, float y) throws ParseException;

    /**
     * Invoked when an absolute quadratic bezier curve command has been parsed.
     * <p>Command : <b>Q</b>
     * @param x1 the absolute x coordinate for the control point
     * @param y1 the absolute y coordinate for the control point
     * @param x the absolute x coordinate for the end point
     * @param y the absolute x coordinate for the end point
     * @exception ParseException if an error occured while processing the path
     */
    void curvetoQuadraticAbs(float x1, float y1, 
                             float x, float y) throws ParseException;

    /**
     * Invoked when a relative smooth quadratic bezier curve command
     * has been parsed. The control point is assumed to be the
     * reflection of the control point on the previous command
     * relative to the current point.
     * <p>Command : <b>t</b>
     * @param x the relative x coordinate for the end point 
     * @param y the relative y coordinate for the end point 
     * @exception ParseException if an error occured while processing the path
     */
    void curvetoQuadraticSmoothRel(float x, float y) throws ParseException;

    /**
     * Invoked when an absolute smooth quadratic bezier curve command
     * has been parsed. The control point is assumed to be the
     * reflection of the control point on the previous command
     * relative to the current point.
     * <p>Command : <b>T</b>
     * @param x the absolute x coordinate for the end point 
     * @param y the absolute y coordinate for the end point 
     * @exception ParseException if an error occured while processing the path
     */
    void curvetoQuadraticSmoothAbs(float x, float y) throws ParseException;

    /**
     * Invoked when a relative elliptical arc command has been parsed. 
     * <p>Command : <b>a</b>
     * @param rx the X axis radius for the ellipse
     * @param ry the Y axis radius for the ellipse 
     * @param xAxisRotation the rotation angle in degrees for the ellipse's
     *                      X-axis relative to the X-axis
     * @param largeArcFlag the value of the large-arc-flag 
     * @param sweepFlag the value of the sweep-flag 
     * @param x the relative x coordinate for the end point 
     * @param y the relative y coordinate for the end point 
     * @exception ParseException if an error occured while processing the path
     */
    void arcRel(float rx, float ry, 
                float xAxisRotation, 
                boolean largeArcFlag, boolean sweepFlag, 
                float x, float y) throws ParseException;


    /**
     * Invoked when an absolute elliptical arc command has been parsed.
     * <p>Command : <b>A</b>
     * @param rx the X axis radius for the ellipse
     * @param ry the Y axis radius for the ellipse 
     * @param xAxisRotation the rotation angle in degrees for the ellipse's
     *                      X-axis relative to the X-axis
     * @param largeArcFlag the value of the large-arc-flag 
     * @param sweepFlag the value of the sweep-flag 
     * @param x the absolute x coordinate for the end point 
     * @param y the absolute y coordinate for the end point 
     * @exception ParseException if an error occured while processing the path
     */
    void arcAbs(float rx, float ry, 
                float xAxisRotation, 
                boolean largeArcFlag, boolean sweepFlag, 
                float x, float y) throws ParseException;
}
