/**************************************************************
 *
 * 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 OpenOffice 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
