/**************************************************************
 * 
 * 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_XIntegerReadOnlyBitmap_idl__
#define __com_sun_star_rendering_XIntegerReadOnlyBitmap_idl__

#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_geometry_IntegerPoint2D_idl__
#include <com/sun/star/geometry/IntegerPoint2D.idl>
#endif
#ifndef __com_sun_star_geometry_IntegerRectangle2D_idl__
#include <com/sun/star/geometry/IntegerRectangle2D.idl>
#endif
#ifndef __com_sun_star_rendering_IntegerBitmapLayout_idl__
#include <com/sun/star/rendering/IntegerBitmapLayout.idl>
#endif
#ifndef __com_sun_star_rendering_XBitmap_idl__
#include <com/sun/star/rendering/XBitmap.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 {

interface XBitmapPalette;

/** This is a specialized interface for bitmaps having integer color
    channels. In contrast to <type>XIntegerBitmap</type>, this
    interface only permits read-only access.<p>

    Use this interface for e.g. bitmaps that are calculated
    on-the-fly, or that are pure functional, and thus cannot be
    modified.<p>

    If you get passed an instance of
    <type>XIntegerReadOnlyBitmap</type> that also supports the
    <type>XVolatileBitmap</type> interface, things become a bit more
    complicated. When reading data, one has to check for both
    <type>VolatileContentDestroyedException</type> and mismatching
    <type>IntegerBitmapLayout</type> return values. If either of them
    occurs, the whole bitmap read operation should be repeated, if you
    need consistent information.<p>
 */
interface XIntegerReadOnlyBitmap : XBitmap
{		  
	/** Query the raw data of this bitmap.<p>

    	Query the raw data of this bitmap, in the format as defined by
    	getMemoryLayout(). With the given rectangle, a subset of the
    	whole bitmap can be queried. If the internal data format's
    	pixel are not integer multiples of bytes (i.e. if one pixel
    	occupies less than a byte), the leftover content of the bytes
    	at the right of each scanline is filled with zeros. The
    	details of the scanline padding are to be retrieved from the
    	passed bitmap layout.<p>

        Note that the bitmap memory layout might change over time for
        volatile bitmaps.<p>

        @param bitmapLayout
        The memory layout the returned data is in. Note that the color
        space returned therein needs to always match the current color
        space as would have been returned by getMemoryLayout(). This
        is necessary to ensure correct operation under changing
        <type>XVolatileBitmap</type>.

        @param rect
        A rectangle, within the bounds of the bitmap, to retrieve the
        contens from.

        @throws <type>VolatileContentDestroyedException</type>
        if the bitmap is volatile, and the content has been destroyed by the system.

        @throws <type>com::sun::star::lang::IndexOutOfBoundsException</type>
        if parts of the given rectangle are outside the permissible
        bitmap area.
	 */
	sequence<byte> 		getData( [out] IntegerBitmapLayout bitmapLayout, [in] ::com::sun::star::geometry::IntegerRectangle2D rect )
        raises (com::sun::star::lang::IndexOutOfBoundsException,
                VolatileContentDestroyedException); 

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

	/** Get a single pixel of the bitmap, returning its color
		value.<p>

		If the internal data format's pixel are not integer multiples
		of bytes (i.e. if one pixel occupies less than a byte - the
		case of more than one byte per pixel is not specified), the
		color value is returned in the least significant bits of the
		single byte returned as the color. The details of the returned
		pixel data are to be retrieved from the passed bitmap layout.<p>

        Note that the bitmap memory layout might change for volatile
        bitmaps.<p>

        @param bitmapLayout
        The memory layout the returned data is in. Note that the color
        space returned therein needs to always match the current color
        space as would have been returned by getMemoryLayout(). This
        is necessary to ensure correct operation under changing
        <type>XVolatileBitmap</type>.

        @param pos
        A position, within the bounds of the bitmap, to retrieve the
        color from.

        @throws <type>VolatileContentDestroyedException</type>
        if the bitmap is volatile, and the content has been destroyed by the system.

        @throws <type>com::sun::star::lang::IndexOutOfBoundsException</type>
        if the given position is outside the permissible bitmap area.
	 */
	sequence<byte>		getPixel( [out] IntegerBitmapLayout bitmapLayout, [in] ::com::sun::star::geometry::IntegerPoint2D pos )
        raises (com::sun::star::lang::IndexOutOfBoundsException,
                VolatileContentDestroyedException); 

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

	/** Query the memory layout for this bitmap.<p>

    	Please note that for volatile bitmaps, the memory layout might
    	change between subsequent calls.<p>
	 */
	IntegerBitmapLayout	getMemoryLayout();
};

}; }; }; };

#endif
