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