/**************************************************************
 * 
 * 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_graphic_XPrimitiveFactory2D_idl__
#define __com_sun_star_graphic_XPrimitiveFactory2D_idl__

#ifndef __com_sun_star_uno_XInterface_idl__
#include <com/sun/star/uno/XInterface.idl>
#endif
#ifndef __com_sun_star_beans_PropertyValue_idl__
#include <com/sun/star/beans/PropertyValue.idl>
#endif

//////////////////////////////////////////////////////////////////////////////
// predefines

module com {  module sun {  module star {  module drawing {
	interface XShape;
	interface XDrawPage;
}; }; }; };

//////////////////////////////////////////////////////////////////////////////

module com {  module sun {  module star {  module graphic {

interface XPrimitive2D;

/** XPrimitiveFactory2D interface

    Use this interface to generate XPrimitive2D instances
 */
interface XPrimitiveFactory2D : ::com::sun::star::uno::XInterface
{
    /** Create primitives from <type>::com::sun::star::drawing::XShape</type>

        @param xShape
        The XShape, for which the primitives are to be
        generated. Specifying an invalid or empty shape here will
        result in an empty return value.

        @param aParms
        Sequence of factory parameters, whose semantics depend on the
        shape to be generated.

        @return a sequence of primitives, that consists of the
        geometrical representation from the given XShape.
     */
    sequence< XPrimitive2D > createPrimitivesFromXShape( 
		[in] ::com::sun::star::drawing::XShape xShape,
        [in] sequence< ::com::sun::star::beans::PropertyValue > aParms );

    /** Create primitives from <type>::com::sun::star::drawing::XDrawPage</type>

        @param xDrawPage
        The XDrawPage, for which the primitives are to be
        generated. Specifying an invalid or empty page here will
        result in an empty return value.

        @param aParms
        Sequence of factory parameters, whose semantics depend on the
        page to be generated.         

        @return a sequence of primitives, that consists of the
        geometrical representation for the given XDrawPage.
     */
    sequence< XPrimitive2D > createPrimitivesFromXDrawPage( 
		[in] ::com::sun::star::drawing::XDrawPage xDrawPage,
        [in] sequence< ::com::sun::star::beans::PropertyValue > aParms );

};

}; }; }; };

//////////////////////////////////////////////////////////////////////////////

#endif

// eof
