/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "nsIDOMSVGElement.idl"

interface nsIDOMSVGAnimatedNumber;

[scriptable, uuid(89AF3EAE-1703-461A-A2E0-86D2131C11AC)]
interface nsIDOMSVGPathElement
  : nsIDOMSVGElement
/*
        The SVG DOM makes use of multiple interface inheritance.
        Since XPCOM only supports single interface inheritance,
        the best thing that we can do is to promise that whenever
        an object implements _this_ interface it will also
        implement the following interfaces. (We then have to QI to
        hop between them.)
        
    nsIDOMSVGTests,
    nsIDOMSVGLangSpace,
    nsIDOMSVGExternalResourcesRequired,
    nsIDOMSVGStylable,
    nsIDOMSVGTransformable,
    events::nsIDOMEventTarget,
    nsIDOMSVGAnimatedPathData
*/
{ 
  readonly attribute nsIDOMSVGAnimatedNumber pathLength;
  
  float          getTotalLength();
  // SVGPoint
  nsISupports getPointAtLength(in float distance);
  unsigned long  getPathSegAtLength(in float distance);

  // SVGPathSegClosePath
  nsISupports createSVGPathSegClosePath();
  // SVGPathSegMoveToAbs
  nsISupports createSVGPathSegMovetoAbs(in float x, in float y);
  // SVGPathSegMoveToRel
  nsISupports createSVGPathSegMovetoRel(in float x, in float y);
  // SVGPathSegLineToAbs
  nsISupports createSVGPathSegLinetoAbs(in float x, in float y);
  // SVGPathSegLineToRel
  nsISupports createSVGPathSegLinetoRel(in float x, in float y);

  // SVGPathSegCurveToCubicAbs
  nsISupports                         createSVGPathSegCurvetoCubicAbs(in float x,
                                                                      in float y,
                                                                      in float x1,
                                                                      in float y1,
                                                                      in float x2,
                                                                      in float y2);
  // SVGPathSegCurveToCubicRel
  nsISupports                         createSVGPathSegCurvetoCubicRel(in float x,
                                                                      in float y,
                                                                      in float x1,
                                                                      in float y1,
                                                                      in float x2,
                                                                      in float y2);
  // SVGPathSegCurveToQuadraticAbs
  nsISupports                         createSVGPathSegCurvetoQuadraticAbs(in float x,
                                                                          in float y,
                                                                          in float x1,
                                                                          in float y1);
  // SVGPathSegCurveToQuadraticRel
  nsISupports                         createSVGPathSegCurvetoQuadraticRel(in float x,
                                                                          in float y,
                                                                          in float x1,
                                                                          in float y1);

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

  // SVGPathSegLineToHorizontalAbs
  nsISupports createSVGPathSegLinetoHorizontalAbs(in float x);
  // SVGPathSegLineToHorizontalRel
  nsISupports createSVGPathSegLinetoHorizontalRel(in float x);
  // SVGPathSegLineToVerticalAbs
  nsISupports createSVGPathSegLinetoVerticalAbs(in float y);
  // SVGPathSegLineToVerticalRel
  nsISupports createSVGPathSegLinetoVerticalRel(in float y);

  // SVGPathSegCurveToCubicSmoothAbs
  nsISupports                               createSVGPathSegCurvetoCubicSmoothAbs(in float x,
                                                                                  in float y,
                                                                                  in float x2,
                                                                                  in float y2);
  // SVGPathSegCurveToCubicSmoothRel
  nsISupports                               createSVGPathSegCurvetoCubicSmoothRel(in float x,
                                                                                  in float y,
                                                                                  in float x2,
                                                                                  in float y2);
  // SVGPathSegCurveToQuadraticSmoothAbs
  nsISupports                               createSVGPathSegCurvetoQuadraticSmoothAbs(in float x,
                                                                                      in float y);
  // SVGPathSegCurveToQuadraticSmoothRel
  nsISupports                               createSVGPathSegCurvetoQuadraticSmoothRel(in float x,
                                                                                      in float y);
};
