/**************************************************************
 * 
 * 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_XIeeeDoubleBitmap_idl__
#define __com_sun_star_rendering_XIeeeDoubleBitmap_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_XIeeeDoubleReadOnlyBitmap_idl__
#include <com/sun/star/rendering/XIeeeDoubleReadOnlyBitmap.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.<p>
 */
interface XIeeeDoubleBitmap : XIeeeDoubleReadOnlyBitmap
{
	//-------------------------------------------------------------------------

	/** 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<double> 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<double> color, [in] FloatingPointBitmapLayout bitmapLayout, [in] ::com::sun::star::geometry::IntegerPoint2D pos )
        raises (com::sun::star::lang::IllegalArgumentException,
                com::sun::star::lang::IndexOutOfBoundsException); 

};

}; }; }; };

#endif
