/**************************************************************
 * 
 * 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_XBitmapCanvas_idl__
#define __com_sun_star_rendering_XBitmapCanvas_idl__

#ifndef __com_sun_star_uno_XInterface_idl__
#include <com/sun/star/uno/XInterface.idl>
#endif
#ifndef __com_sun_star_lang_IllegalArgumentException_idl__
#include <com/sun/star/lang/IllegalArgumentException.idl>
#endif
#ifndef __com_sun_star_geometry_RealRectangle2D_idl__
#include <com/sun/star/geometry/RealRectangle2D.idl>
#endif
#ifndef __com_sun_star_rendering_RenderState_idl__
#include <com/sun/star/rendering/RenderState.idl>
#endif
#ifndef __com_sun_star_rendering_XCanvas_idl__
#include <com/sun/star/rendering/XCanvas.idl>
#endif
#ifndef __com_sun_star_rendering_VolatileContentDestroyedException_idl__
#include <com/sun/star/rendering/VolatileContentDestroyedException.idl>
#endif


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

/** This is a specialization of the canvas interface for bitmapped
    canvases.<p>

    This interface is a specialization of the canvas interface for
    bitmapped canvases, where additional methods for accessing and
    moving of bitmap content are provided.<p>

    @since OOo 2.0
 */
published interface XBitmapCanvas : XCanvas
{
    /** This method copies a rectangular area from a place of one
        canvas to a place on another.<p>

        This method copies a rectangular area from a place of one
        canvas to a place on another. Source and destination areas are
        permitted to overlap. If the source view or render state has a
        clipping set, the regions clipped away from the source
        rectangle are regarded fully transparent for the copy
        operation. The device color for both source and destination
        render state is ignored, the compositing mode only for the
        source render state.<p>

        @param sourceCanvas
        Canvas from which to copy the bitmap data. Can be identical to
        the canvas this method is called on, but must be valid.

        @param sourceRect
        Rectangle from which to copy the bitmap data. This rectangle
        is subject to both view and render transformation, before
        being applied. Thus, on screen, it does not necessarily
        resemble a rectangle any more. The rectangle must be
        non-empty, see
        <type scope="::com::sun::star::geometry">RealRectangle2D</type>
        for details.

        @param sourceViewState
        The view state to apply to the source of this copy
        operation. The view transformation must be non-singular.

        @param sourceRenderState
        The render state to apply to the source of this copy
        operation. The render transformation must be non-singular, and
        the compositing mode must be one of the
        <type>CompositingOperation</type> values.

        @param destRect
        Rectangle into which to copy the bitmap data. This rectangle
        is subject to both view and render transformation, before
        being applied. Thus, on screen, it does not necessarily
        resemble a rectangle any more. The rectangle must be
        non-empty, see
        <type scope="::com::sun::star::geometry">RealRectangle2D</type>
        for details.

        @param destViewState
        The view state to apply to the destination of this copy
        operation. The view transformation must be non-singular.

        @param destRenderState

        The render state to apply to the destination of this copy
        operation. The render transformation must be non-singular, and
        the compositing mode must be one of the
        <type>CompositingOperation</type> values.

        @throws <type>com::sun::star::lang::IllegalArgumentException</type>
        if one of the parameters are not within the specified range.
     */
    void copyRect( [in] XBitmapCanvas sourceCanvas,
                   [in] ::com::sun::star::geometry::RealRectangle2D sourceRect, [in] ViewState sourceViewState, [in] RenderState sourceRenderState,
                   [in] ::com::sun::star::geometry::RealRectangle2D destRect, [in] ViewState destViewState, [in] RenderState destRenderState )
        raises (com::sun::star::lang::IllegalArgumentException,
                VolatileContentDestroyedException);

};

}; }; }; };

#endif
