/**************************************************************
 * 
 * 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_XGraphicRasterizer_idl
#define com_sun_star_graphic_XGraphicRasterizer_idl

#include <com/sun/star/io/XInputStream.idl>
#include <com/sun/star/graphic/XGraphic.idl>
#include <com/sun/star/beans/PropertyValues.idl>
#include <com/sun/star/beans/XPropertySet.idl>
#include <com/sun/star/awt/Size.idl>

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

/** This interfaces exposes the initialize and a rasterize method to
    rasterize a given data stream to a pixel graphic
  */
interface XGraphicRasterizer : ::com::sun::star::uno::XInterface
{
    /** Initializing the rasterizer

        <p>This method could also be used to determine, if
        the provided data is able to be rasterized by the
        implementation. The implementation should take care of
        this feature as well as setting the default image size in
        pixel within the given output parameter.</p>

		@param DataStream
			The input stream of data that should be rasterized

		@param DPI_X
			The horizontal resolution of the callers device in pixel per inch. This
            value is needed to calculate the correct dimensions of the graphic to be
            rasterized. If a value of <value>0</value> is given, a horizontal default
            resolution of 72 DPI is used.

		@param DPI_Y
			The vertical resolution of the callers device in pixel per inch. This
            value is needed to calculate the correct dimensions of the graphic to be
            rasterized. If a value of <value>0</value> is given, a vertical default
            resolution of 72 DPI is used.

        @param DefaultSizePixel
            The default rendering size in pixel of the underlying graphics
            data may be available after the call via this output parameter.

            In case no default size can be determined during initialization,
            a default pixel size of 0,0 is returned. In this case, the caller
            needs to assume a default pixel size, appropriate for the calling
            context.

        @returns
            A boolean value indicating if rasterizing of the given data is
            possible at all and if the initialization process happened
            successfully.

		@see com::sun::star::io::XInputStream
        @see com::sun::star::awt::Size
    */
    boolean initializeData( [in] com::sun::star::io::XInputStream DataStream,
                            [in] unsigned long DPI_X,
                            [in] unsigned long DPI_Y,
                            [out] com::sun::star::awt::Size DefaultSizePixel );

	/** Rasterizing the initialized data into a <type>XGraphic</type> container.

        <p>The <type>XGraphic</type> container will contain a pixel
        type graphic after a successful rasterization process</p>

        <p>In case of any fault during the rasterization process,
        the <type>XGraphic</type> container will be empty afterwards and
        the method will return false</p>

		@param Width
			The width in pixel of the graphic to be rasterized.
            This parameter is used without taking other transformation
            values into account.

		@param Height
			The height in pixel of the graphic to be rasterized.
            This parameter is used without taking other transformation
            values into account.

		@param RotateAngle
			The rotation angle of the graphic to be rasterized.
            This parameter is used without taking other transformation
            values into account. The rotation is applied after scaling
            and shearing the original image.

		@param ShearXAngle
			The horizontal shear angle of the graphic to be rasterized.
            This parameter is used without taking other transformation
            values into account. The shearing is applied after scaling
            and before rotation of the image.

		@param ShearYAngle
			The vertical shear angle of the graphic to be rasterized.
            This parameter is used without taking other transformation
            values into account. The shearing is applied after scaling
            and before rotation of the image.

		@param RasterizeProperties
			Additional properties for special needs (undefined by now)

		@param Graphic
			An interface to a graphic container into which the given data
            should be rasterized.

        @returns com::sun::star::graphic::XGraphic
            An interface to a graphic container that holds the rasterized pixel data

		@see com::sun::star::beans::PropertyValues
        @see com::sun::star::graphic::XGraphic
	*/
	com::sun::star::graphic::XGraphic rasterize( [in] unsigned long Width,
                                                 [in] unsigned long Height,
                                                 [in] double RotateAngle,
                                                 [in] double ShearAngle_X,
                                                 [in] double ShearAngle_Y,
                                                 [in] com::sun::star::beans::PropertyValues RasterizeProperties );
};

} ; } ; } ; } ;

#endif
