/**************************************************************
 * 
 * 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.
 * 
 *************************************************************/


#ifndef __com_sun_star_rendering_XBezierPolyPolygon2D_idl__
#define __com_sun_star_rendering_XBezierPolyPolygon2D_idl__

#ifndef __com_sun_star_uno_XInterface_idl__
#include <com/sun/star/uno/XInterface.idl>
#endif
#ifndef __com_sun_star_lang_IndexOutOfBoundsException_idl__
#include <com/sun/star/lang/IndexOutOfBoundsException.idl>
#endif
#ifndef __com_sun_star_rendering_XPolyPolygon2D_idl__
#include <com/sun/star/rendering/XPolyPolygon2D.idl>
#endif
#ifndef __com_sun_star_geometry_RealBezierSegment2D_idl__
#include <com/sun/star/geometry/RealBezierSegment2D.idl>
#endif

module com { module sun { module star { module rendering {

/** This is a specialized interface for a 2D poly-polygon containing
    straight line and bezier segments.<p>

    This poly-polygon can contain polygons consisting of a mixture of
    cubic bezier curves and straight lines. As the straight line is a
    special case of a cubic bezier curve (control points collinear
    with the line through start and end point), this can be expressed
    uniformly with a sequence of <type>RealBezierSegment2D</type>s.<p>

    By convention, a <type>RealBezierSegment2D</type> is a straight
    line segment, if all three contained points are strictly equal.<p>

    @since OOo 2.0
 */
published interface XBezierPolyPolygon2D : XPolyPolygon2D
{
    /** Query subset of this poly-polygon.<p>

        Query subset of this poly-polygon, starting at the given
        polygon and the given point within that polygon, and
        containing the specified number of polygons and points in the
        last polygon.<p>

        @param nPolygonIndex
        The index of the polygon to start point retrieval with. This
        index must be in the range [0,numPolygons-1].

        @param nNumberOfPolygons
        The number of polygons to extract. This value must not exceed
        numPolygons-nPolygonIndex.

        @param nPointIndex
        The index of the first point in the first polygon to
        extract. This value must not exceed the number of points in
        this polygon minus one.

        @param nNumberOfPoints
        The number of points to extract from the last polygon. This
        value must not exceed the number of points in this last
        polygon minus one.

        @returns the sequence of extracted points.

        @throws <type>com::sun::star::lang::IndexOutOfBoundsException</type>
        if one of the given values exceed the permissible range.
     */
    sequence< sequence < ::com::sun::star::geometry::RealBezierSegment2D > > getBezierSegments( [in] long nPolygonIndex, [in] long nNumberOfPolygons, [in] long nPointIndex, [in] long nNumberOfPoints )
        raises (com::sun::star::lang::IndexOutOfBoundsException);

    //-------------------------------------------------------------------------

    /** Set the specified sequence of bezier segments to the poly-polygon.

        This method can either set the whole poly-polygon to the new
        data, or insert the segments at the given index

        @param nPolygonIndex
        The index of the polygon to start segment insertion with. This
        index must be in the range [0,numPolygons], and the insertion
        will take place <em>before</em> this position (i.e. when
        specifying 0 here, the given bezier sequence will precede all
        existing polygons already within the poly-polygon). To append
        to a poly-polygon, call setPoints() with
        <member>XBezierPolyPolygon2D::getNumberOfPolygons()</member>
        as the polygon index. If nPolygonIndex is -1, the given
        bezier sequence <em>replaces</em> the poly-polygon content,
        such that after this method completes, it contains exactly the
        specified bezier segment data.

        @throws <type>com::sun::star::lang::IndexOutOfBoundsException</type>
        if one of the given values exceed the permissible range.
     */
    void setBezierSegments( [in] sequence< sequence< ::com::sun::star::geometry::RealBezierSegment2D > > points, [in] long nPolygonIndex )
        raises (com::sun::star::lang::IndexOutOfBoundsException);

    //-------------------------------------------------------------------------

    /** Get a single point from the poly-polygon.

        @param nPolygonIndex
        The index of the polygon where the point to be extract is
        contained within. This index must be in the range
        [0,numPolygons-1].

        @param nPointIndex
        The index of the point in the polygon specified by
        nPolygonIndex, which is to be retrieved.  This value must not
        exceed the number of points in this polygon minus one.

        @returns the requested point.

        @throws <type>com::sun::star::lang::IndexOutOfBoundsException</type>
        if one of the given values exceed the permissible range.

     */
    ::com::sun::star::geometry::RealBezierSegment2D	getBezierSegment( [in] long nPolygonIndex, [in] long nPointIndex )
        raises (com::sun::star::lang::IndexOutOfBoundsException);

    //-------------------------------------------------------------------------

    /** Set a single point on the poly-polygon.<p>

        The remaining points of the poly-polygon will not be changed by
        this method. Use
        <member>XBezierPolyPolygon2D::getNumberOfPolygons()</member>
        or
        <member>XBezierPolyPolygon2D::getNumberOfPolygonPoints()</member>
        to append points or polygons, respectively.<p>

        @param point
        The point to be set at the poly-polygon.

        @param nPolygonIndex
        The index of the polygon to insert the point in. This index
        must be in the range [0,numPolygons].

        @param nPointIndex
        The index of the point in the polygon specified by
        nPolygonIndex, which is to be set.  This value must not
        exceed the number of points in this polygon.

        @throws <type>com::sun::star::lang::IndexOutOfBoundsException</type>
        if one of the given values exceed the permissible range.
     */
    void setBezierSegment( [in] ::com::sun::star::geometry::RealBezierSegment2D point, [in] long nPolygonIndex, [in] long nPointIndex )
        raises (com::sun::star::lang::IndexOutOfBoundsException);
};

}; }; }; };

#endif
