/**************************************************************
 * 
 * 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_XIeeeDoubleReadOnlyBitmap_idl__
#define __com_sun_star_rendering_XIeeeDoubleReadOnlyBitmap_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_rendering_FloatingPointBitmapLayout_idl__
#include <com/sun/star/rendering/FloatingPointBitmapLayout.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_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 {

/** This is a specialized interface for bitmaps containing IEEE
    doubles for their color components. In contrast to
    <type>XIeeeDoubleBitmap</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>XHalfFloatReadOnlyBitmap</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>FloatingPointBitmapLayout</type> return values. If either of them
    occurs, the whole bitmap read operation should be repeated.<p>
 */
interface XIeeeDoubleReadOnlyBitmap : 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. When querying subsets of the
    	bitmap, the same scanline padding takes place as when the
    	whole bitmap is requested.<p>

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

        @param bitmapLayout
        The memory layout the returned data is in.

        @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<double>			getData( [out] FloatingPointBitmapLayout 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>

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

        @param bitmapLayout
        The memory layout the returned data is in.

        @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<double>			getPixel( [out] FloatingPointBitmapLayout 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>
	 */
	FloatingPointBitmapLayout	getMemoryLayout();
};

}; }; }; };

#endif
