/**************************************************************
 * 
 * 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_XBitmapPalette_idl__
#define __com_sun_star_rendering_XBitmapPalette_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_lang_IndexOutOfBoundsException_idl__
#include <com/sun/star/lang/IndexOutOfBoundsException.idl>
#endif 
#ifndef __com_sun_star_rendering_XColorSpace_idl__
#include <com/sun/star/rendering/XColorSpace.idl>
#endif


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

/** Interface to access the palette of a color-indexed bitmap.

	@since OpenOffice 2.0
 */
interface XBitmapPalette : ::com::sun::star::uno::XInterface
{
    /** Request the number of palette entries available.

    	@return the number of entries in this palette.
     */
    long getNumberOfEntries();

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

    /** Request the color for the given palette entry.

        @param entry
        Output parameter for the color components at the given palette
        entry.

    	@param nIndex
        The index of the palette entry to be retrieved. Valid range is
        [0,getNumberOfEntries()-1].

        @return <TRUE/>, if the given palette entry should be displayed
        opaque, and <FALSE/> if the entry should be displayed
        transparent. This is sometimes used for so-called mask
        transparency, by flagging certain palette entries to be fully
        transparent when displaying the bitmap.

        @throws <type>com::sun::star::lang::IndexOutOfBoundsException</type>
        if the index is smaller than zero or larger than
        <member>XBitmapPalette::getNumberOfEntries()</member>-1.
     */
    boolean getIndex( [out] sequence<ColorComponent> entry, [in] long nIndex )
        raises (com::sun::star::lang::IndexOutOfBoundsException);

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

    /** Set the color for the given palette entry.

    	@param color
        Sequence of device color values in the associated bitmap's
        device color format.

        @param transparency
        When <TRUE/>, the specified palette entry is displayed as
        opaque color. When <FALSE/>, the given entry displays as fully
        transparent during output.

    	@param nIndex
        The index of the palette entry to be changed. Valid range is
        [0,getNumberOfEntries()-1].

    	@return whether the palette entry was changed. For read-only
    	entries, this method always returns <FALSE/>.

        @throws <type>com::sun::star::lang::IndexOutOfBoundsException</type>
        if the index is smaller than zero or larger than
        <member>XBitmapPalette::getNumberOfEntries()</member>-1.

        @throws <type>com::sun::star::lang::IllegalArgumentException</type>
        if the given sequence of color components does not match the
        associated bitmap's device color format.
     */
    boolean setIndex( [in] sequence<ColorComponent> color, [in] boolean transparency, [in] long nIndex )
        raises (com::sun::star::lang::IndexOutOfBoundsException,
                com::sun::star::lang::IllegalArgumentException); 

	//-------------------------------------------------------------------------
    
    /** Query associated color space.<p>

    	@return the color space that is associated with this palette.
     */
    XColorSpace getColorSpace( );
};

}; }; }; };

#endif
