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