/*
 * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
 * Copyright (C) 2006 Apple Inc. All rights reserved.
 *
 * 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 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 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 {
        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);

        readonly attribute SVGPathSegList pathSegList;
        readonly attribute SVGPathSegList normalizedPathSegList;
        readonly attribute SVGPathSegList animatedPathSegList;
        readonly attribute SVGPathSegList animatedNormalizedPathSegList;
    };

}
