/**************************************************************
 * 
 * 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_XIeeeFloatBitmap_idl__
#define __com_sun_star_rendering_XIeeeFloatBitmap_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_XIeeeFloatReadOnlyBitmap_idl__
#include <com/sun/star/rendering/XIeeeFloatReadOnlyBitmap.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 IEEE floats as their
    color components.<p>
 */
interface XIeeeFloatBitmap : XIeeeFloatReadOnlyBitmap
{
	//-------------------------------------------------------------------------

	/** Set raw data of a bitmap.<p>

    	Set raw data of a bitmap, in the format as defined by
    	getMemoryLayout(). With the given rectangle, a subset of the
    	bitmap can be changed. When setting subsets of the bitmap, the
    	same scanline padding takes place as when the whole bitmap is
    	changed.<p>
        
        When setting data on volatile bitmaps, always call isValid()
        before, and retrieve a new memory layout via
        getMemoryLayout(). At least under Windows, the memory layout
        can change for the same bitmap, if the user e.g. switches the
        screen resolution. Thus, this method will throw an
        IllegalArgumentException, if the memory layout changed between
        a call to getMemoryLayout() and setData().<p>

        @param data
        Data to set
        
        @param bitmapLayout
        Layout of the data to set. Must match this bitmap's current
        layout.

        @param rect
        Destination rectangle, within the bounds of the bitmap, to set
        the data in.

        @throws <type>com::sun::star::lang::IndexOutOfBoundsException</type>
        if parts of the given rectangle are outside the permissible
        bitmap area.

        @throws <type>com::sun::star::lang::IllegalArgumentException</type>
        if the given memory layout does not match this bitmap's
        layout, or if the given data sequence has too few or too much
        elements.
	 */
	void						setData( [in] sequence<float> data, [in] FloatingPointBitmapLayout bitmapLayout, [in] ::com::sun::star::geometry::IntegerRectangle2D rect )
        raises (com::sun::star::lang::IllegalArgumentException,
                com::sun::star::lang::IndexOutOfBoundsException); 

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

	/** Set a single pixel of the bitmap with the given color
		value.<p>

        When setting data on volatile bitmaps, always call isValid()
        before, and retrieve a new memory layout via
        getMemoryLayout(). At least under Windows, the memory layout
        can change for the same bitmap, if the user e.g. switches the
        screen resolution. Thus, this method will throw an
        IllegalArgumentException, if the memory layout changed between
        a call to getMemoryLayout() and setPixel().<p>

        @param color
        The color value(s) to set

        @param bitmapLayout
        Layout of the color elements to set. Must match this bitmap's
        current layout.

        @param pos
        Pixel position with the bounds of the bitmap to set.

        @throws <type>com::sun::star::lang::IndexOutOfBoundsException</type>
        if the given point is outside the permissible bitmap area.

        @throws <type>com::sun::star::lang::IllegalArgumentException</type>
        if the given memory layout does not match this bitmap's
        layout, or if the given data sequence has too few or too much
        elements.
	 */
	void						setPixel( [in] sequence<float> color, [in] FloatingPointBitmapLayout bitmapLayout, [in] ::com::sun::star::geometry::IntegerPoint2D pos )
        raises (com::sun::star::lang::IllegalArgumentException,
                com::sun::star::lang::IndexOutOfBoundsException);
};

}; }; }; };

#endif
