/*
 * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
 * Copyright (C) 2006 Apple Computer, Inc.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. 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.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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. 
 */

module svg {

    interface [Conditional=SVG] SVGPathElement : SVGElement,
                                                 SVGTests,
                                                 SVGLangSpace,
                                                 SVGExternalResourcesRequired,
                                                 SVGStylable,
                                                 SVGTransformable,
                                                 SVGAnimatedPathData {
        readonly attribute SVGAnimatedNumber pathLength;

        float getTotalLength();
        SVGPoint getPointAtLength(in float distance);
        unsigned long getPathSegAtLength(in float distance);

        SVGPathSegClosePath createSVGPathSegClosePath();

        SVGPathSegMovetoAbs createSVGPathSegMovetoAbs(in float x, 
                                                      in float y);
        SVGPathSegMovetoRel createSVGPathSegMovetoRel(in float x, 
                                                      in float y);

        SVGPathSegLinetoAbs createSVGPathSegLinetoAbs(in float x, 
                                                      in float y);
        SVGPathSegLinetoRel createSVGPathSegLinetoRel(in float x, 
                                                      in float y);

        SVGPathSegCurvetoCubicAbs createSVGPathSegCurvetoCubicAbs(in float x, 
                                                                  in float y, 
                                                                  in float x1, 
                                                                  in float y1, 
                                                                  in float x2, 
                                                                  in float y2);
        SVGPathSegCurvetoCubicRel createSVGPathSegCurvetoCubicRel(in float x, 
                                                                  in float y, 
                                                                  in float x1, 
                                                                  in float y1, 
                                                                  in float x2, 
                                                                  in float y2);

        SVGPathSegCurvetoQuadraticAbs createSVGPathSegCurvetoQuadraticAbs(in float x, 
                                                                          in float y, 
                                                                          in float x1, 
                                                                          in float y1);
        SVGPathSegCurvetoQuadraticRel createSVGPathSegCurvetoQuadraticRel(in float x, 
                                                                          in float y, 
                                                                          in float x1, 
                                                                          in float y1);

        SVGPathSegArcAbs createSVGPathSegArcAbs(in float x, 
                                                in float y, 
                                                in float r1, 
                                                in float r2, 
                                                in float angle, 
                                                in boolean largeArcFlag, 
                                                in boolean sweepFlag);
        SVGPathSegArcRel createSVGPathSegArcRel(in float x, 
                                                in float y, 
                                                in float r1, 
                                                in float r2, 
                                                in float angle, 
                                                in boolean largeArcFlag, 
                                                in boolean sweepFlag);

        SVGPathSegLinetoHorizontalAbs createSVGPathSegLinetoHorizontalAbs(in float x);
        SVGPathSegLinetoHorizontalRel createSVGPathSegLinetoHorizontalRel(in float x);

        SVGPathSegLinetoVerticalAbs createSVGPathSegLinetoVerticalAbs(in float y);
        SVGPathSegLinetoVerticalRel createSVGPathSegLinetoVerticalRel(in float y);

        SVGPathSegCurvetoCubicSmoothAbs createSVGPathSegCurvetoCubicSmoothAbs(in float x, 
                                                                              in float y, 
                                                                              in float x2, 
                                                                              in float y2);
        SVGPathSegCurvetoCubicSmoothRel createSVGPathSegCurvetoCubicSmoothRel(in float x, 
                                                                              in float y, 
                                                                              in float x2, 
                                                                              in float y2);

        SVGPathSegCurvetoQuadraticSmoothAbs createSVGPathSegCurvetoQuadraticSmoothAbs(in float x, 
                                                                                      in float y);
        SVGPathSegCurvetoQuadraticSmoothRel createSVGPathSegCurvetoQuadraticSmoothRel(in float x, 
                                                                                      in float y);
    };

}
