/**************************************************************
 * 
 * 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_XIntegerBitmap_idl__
#define __com_sun_star_rendering_XIntegerBitmap_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_XIntegerReadOnlyBitmap_idl__
#include <com/sun/star/rendering/XIntegerReadOnlyBitmap.idl>
#endif


module com { module sun { module star { module rendering {

/** This is a specialized interface for bitmaps having integer color
    channels.<p>

    @since OOo 2.0
 */
interface XIntegerBitmap : XIntegerReadOnlyBitmap
{		  
	//-------------------------------------------------------------------------

	/** 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. 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 ignored and left unchanged in the
		bitmap. 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().

        @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 many
        elements.
	 */
	void				setData( [in] sequence<byte> data, [in] IntegerBitmapLayout 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>

        If the internal data format's pixel are not integer multiples
        of bytes (i.e. if one pixel occupies less than a byte), the
        color value is expected in the least significant bits of the
        single byte given as the color.<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().

        @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 many
        elements.
	 */
	void				setPixel( [in] sequence<byte> color, [in] IntegerBitmapLayout bitmapLayout, [in] ::com::sun::star::geometry::IntegerPoint2D pos )
        raises (com::sun::star::lang::IllegalArgumentException,
                com::sun::star::lang::IndexOutOfBoundsException);
};

}; }; }; };

#endif
