/**************************************************************
 * 
 * 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_XBufferController_idl__
#define __com_sun_star_rendering_XBufferController_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

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

/** Interface providing access to double/multi-buffer facilities of
    screen devices.<p>

    This interface provides methods to enable and control
    double/multi-buffering facilities on screen devices.<p>

    @since OOo 2.0
 */
published interface XBufferController : ::com::sun::star::uno::XInterface
{
    /** Create the given number of background buffers.<p>

        There's one buffer implicitely available, which is the canvas
        surface itself. Thus, calling <code>createBuffers(1)</code>
        creates a double-buffered object.<p>

        @param nBuffers
        The number of background&lt;buffers requested. Must be greater
        than 0.

        @return the number of actually generated buffers, which might
        be between 0 (no double-buffering available) and nBuffers.

        @throws <type>com::sun::star::lang::IllegalArgumentException</type>
        if nBuffers is smaller than one.
     */
    long    createBuffers( [in] long nBuffers )
        raises (com::sun::star::lang::IllegalArgumentException);

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

    /** Destroy all buffers generated via this object.
     */
    void    destroyBuffers();

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

    /** Switch the display to show the specified buffer.<p>

        The method returns, when the switch is performed and the
        selected buffer is shown on screen, or immediately when an
        error occurs. If the switch was successful, subsequent render
        operations will be directed to the new backbuffer.<p>

        Use this method if you need your screen display to be in sync
        with other things, e.g. sound playback.<p>

        @param bUpdateAll
        When <TRUE/>, update the whole screen. When <FALSE/>,
        implementation is permitted to restrict update to areas the
        canvas itself changed (e.g. because of render operations, or
        changes on the sprites). The former is useful for updates
        after window expose events, the latter for animation display.

        @return whether the switch was performed successfully.

        @throws <type>com::sun::star::lang::IllegalArgumentException</type>
        if nBuffer is outside the permissible range.
     */
    boolean	showBuffer( [in] boolean bUpdateAll );

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

    /** Schedule the display of the specified buffer.<p>

        The method returns, when the switching of the buffer is
        successfully scheduled, or immediately when an error
        occurs. If the switch was successful, subsequent render
        operations will be directed to the new backbuffer. Note that,
        if the buffer switching is exceedingly slow, or the frequency
        of switchBuffer() is exceedingly high, the buffer scheduled
        for display here might become the current render target
        <em>before</em> it is fully displayed on screen. In this case,
        any rendering operation to this buffer will block, until it is
        safe to perform the operation without visible cluttering.<p>

        Use this method if you favor maximal render speed, but don't
        necessarily require your screen display to be in sync with
        other things, e.g. sound playback.<p>

        @param bUpdateAll
        When <TRUE/>, update the whole screen. When <FALSE/>,
        implementation is permitted to restrict update to areas the
        canvas itself changed (e.g. because of render operations, or
        changes on the sprites). The former is useful for updates
        after window expose events, the latter for animation display.

        @return whether the switch was performed successfully.
     */
    boolean	switchBuffer( [in] boolean bUpdateAll );

};

}; }; }; };

#endif
