/**************************************************************
 * 
 * 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_XHalfFloatReadOnlyBitmap_idl__
#define __com_sun_star_rendering_XHalfFloatReadOnlyBitmap_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 {

/** Specialized interface for bitmaps containing half floats as their
    color components. Half floats are 16 bit wide, and some high-end
    GPUs already have them as supported frame buffer format. In
    contrast to <type>XHalfFloatBitmap</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 XHalfFloatReadOnlyBitmap : 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. Note: as we currently have no 16
    	bit float UNO data type, the values are transported as 16 bit
    	integers across the API (which requires casting on both
    	sides).<p>

        @throws <type>VolatileContentDestroyedException</type>
        if the bitmap is volatile, and the content has been destroyed by the system.
	 */
	sequence<short>				getData( [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>

        @throws <type>VolatileContentDestroyedException</type>
        if the bitmap is volatile, and the content has been destroyed by the system.
	 */
	sequence<short>				getPixel( [in] ::com::sun::star::geometry::IntegerPoint2D pos )
        raises (com::sun::star::lang::IndexOutOfBoundsException,
                VolatileContentDestroyedException); 

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

	/** Query the memory layout for this bitmap.<p>
	 */
	FloatingPointBitmapLayout	getMemoryLayout();
};

}; }; }; };

#endif
