/**************************************************************
 * 
 * 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 INCLUDED_CANVAS_BITMAP_HXX
#define INCLUDED_CANVAS_BITMAP_HXX

#include <com/sun/star/uno/Reference.hxx>
#include <com/sun/star/rendering/XCanvas.hpp>
#include <com/sun/star/rendering/IntegerBitmapLayout.hpp>
#include <com/sun/star/geometry/IntegerRectangle2D.hpp>
#include <com/sun/star/geometry/IntegerPoint2D.hpp>
#include <canvas/rendering/icolorbuffer.hxx>
#include <canvas/rendering/icachedprimitive.hxx>
#include <canvas/rendering/isurfaceproxymanager.hxx>

#include <boost/shared_ptr.hpp>
#include <boost/scoped_ptr.hpp>
#include <vector>

namespace basegfx
{
    class B2IVector;
    class B2DPoint;
    class B2DHomMatrix;
    class B2DPolyPolygon;
}

namespace canvas
{
    class ImplBitmap;

    /** Bitmap class, with XCanvas-like render interface.

        This class provides a bitmap, that can be rendered into,
        with an interface compatible to XCanvas. Furthermore, the
        bitmaps held here can optionally be backed by (possibly
        hw-accelerated) textures.
    */
	class Bitmap
    {
    public:
        /** Create bitmap with given size

            @param rSize
            Size of the bitmap, in pixel

            @param rMgr
            SurfaceProxyManager, to use for HW acceleration

            @param bWithAlpha
            When true, the created bitmap will have an alpha channel,
            false otherwise
         */
        Bitmap( const ::basegfx::B2IVector&          rSize,
                const ISurfaceProxyManagerSharedPtr& rMgr,
                bool                                 bWithAlpha );
        ~Bitmap();

        /// Query whether this bitmap contains alpha channel information
        bool hasAlpha() const;

        /// Query size of the bitmap in pixel
        ::basegfx::B2IVector getSize() const;

		::com::sun::star::uno::Sequence< sal_Int8 > getData(
			::com::sun::star::rendering::IntegerBitmapLayout&		bitmapLayout,
			const ::com::sun::star::geometry::IntegerRectangle2D&	rect );

		void setData(
			const ::com::sun::star::uno::Sequence< sal_Int8 >&		data, 
			const ::com::sun::star::rendering::IntegerBitmapLayout& bitmapLayout,
			const ::com::sun::star::geometry::IntegerRectangle2D&	rect );

		void setPixel(
			const ::com::sun::star::uno::Sequence< sal_Int8 >&		color, 
			const ::com::sun::star::rendering::IntegerBitmapLayout& bitmapLayout,
			const ::com::sun::star::geometry::IntegerPoint2D&		pos );

		::com::sun::star::uno::Sequence< sal_Int8 > getPixel(
			::com::sun::star::rendering::IntegerBitmapLayout&		bitmapLayout,
            const ::com::sun::star::geometry::IntegerPoint2D&		pos );

        /** Render the bitmap content to associated
            SurfaceProxyManager's screen.

            @param fAlpha
            Overall alpha for content

            @param rPos
            Output position
            
            @param rTransform
            Output transformation (does not affect output position)
         */
        bool draw( double                         fAlpha,
                   const ::basegfx::B2DPoint&     rPos,
                   const ::basegfx::B2DHomMatrix& rTransform );

        /** Render the bitmap content to associated
            SurfaceProxyManager's screen.

            @param fAlpha
            Overall alpha for content

            @param rPos
            Output position
            
            @param rArea
            Subset of the surface to render. Coordinate system are
            surface area pixel, given area will be clipped to the
            surface bounds.
            
            @param rTransform
            Output transformation (does not affect output position)
         */
        bool draw( double                         fAlpha,
                   const ::basegfx::B2DPoint&     rPos,
                   const ::basegfx::B2DRange&     rArea,
                   const ::basegfx::B2DHomMatrix& rTransform );
        
        /** Render the bitmap content to associated
            SurfaceProxyManager's screen.

            @param fAlpha
            Overall alpha for content

            @param rPos
            Output position
            
            @param rClipPoly
            Clip polygon for the surface. The clip polygon is also
            subject to the output transformation.
            
            @param rTransform
            Output transformation (does not affect output position)
         */
        bool draw( double                           fAlpha,
                   const ::basegfx::B2DPoint&       rPos,
                   const ::basegfx::B2DPolyPolygon& rClipPoly,
                   const ::basegfx::B2DHomMatrix&   rTransform );

        /** Clear whole bitmap with given color.

            This method sets every single pixel of the bitmap to the
            specified color value.
         */
        void clear( const ::com::sun::star::uno::Sequence< double >& color );

        void fillB2DPolyPolygon( 
            const ::basegfx::B2DPolyPolygon&                    rPolyPolygon, 
            const ::com::sun::star::rendering::ViewState& 		viewState, 
            const ::com::sun::star::rendering::RenderState& 	renderState );


        // High-level drawing operations (from the XCanvas interface)
        // ==========================================================

        /// See XCanvas interface
        void drawPoint( const ::com::sun::star::geometry::RealPoint2D& 		aPoint, 
                        const ::com::sun::star::rendering::ViewState& 		viewState, 
                        const ::com::sun::star::rendering::RenderState& 	renderState );
        /// See XCanvas interface
        void drawLine( const ::com::sun::star::geometry::RealPoint2D& 	aStartPoint, 
                       const ::com::sun::star::geometry::RealPoint2D& 	aEndPoint, 
                       const ::com::sun::star::rendering::ViewState& 	viewState, 
                       const ::com::sun::star::rendering::RenderState& 	renderState	);
        /// See XCanvas interface
        void drawBezier( const ::com::sun::star::geometry::RealBezierSegment2D&	aBezierSegment, 
                         const ::com::sun::star::geometry::RealPoint2D& 		aEndPoint,
                         const ::com::sun::star::rendering::ViewState& 			viewState, 
                         const ::com::sun::star::rendering::RenderState& 		renderState );
        /// See XCanvas interface
        ICachedPrimitiveSharedPtr drawPolyPolygon( 
            const ::com::sun::star::uno::Reference< 
                  ::com::sun::star::rendering::XPolyPolygon2D >& 	xPolyPolygon, 
            const ::com::sun::star::rendering::ViewState&           viewState, 
            const ::com::sun::star::rendering::RenderState&         renderState );

        /// See XCanvas interface
        ICachedPrimitiveSharedPtr strokePolyPolygon( 
            const ::com::sun::star::uno::Reference< 
                  ::com::sun::star::rendering::XPolyPolygon2D >& 	xPolyPolygon, 
            const ::com::sun::star::rendering::ViewState&           viewState, 
            const ::com::sun::star::rendering::RenderState& 		renderState, 
            const ::com::sun::star::rendering::StrokeAttributes&    strokeAttributes );
        /** See XCanvas interface

            @param textureAnnotations
            Vector of shared pointers to bitmap textures,
            <em>corresponding</em> in indices to the textures
            sequence. This is to decouple this interface from the
            client's XBitmap-implementation class.
         */
        ICachedPrimitiveSharedPtr strokeTexturedPolyPolygon( 
            const ::com::sun::star::uno::Reference< 
                  ::com::sun::star::rendering::XPolyPolygon2D >& 	xPolyPolygon, 
            const ::com::sun::star::rendering::ViewState&           viewState, 
            const ::com::sun::star::rendering::RenderState& 		renderState, 
            const ::com::sun::star::uno::Sequence< 
                  ::com::sun::star::rendering::Texture >&           textures,
            const ::std::vector< ::boost::shared_ptr<Bitmap> >&     textureAnnotations, 
            const ::com::sun::star::rendering::StrokeAttributes&    strokeAttributes );
        /** See XCanvas interface

            @param textureAnnotations
            Vector of shared pointers to bitmap textures,
            <em>corresponding</em> in indices to the textures
            sequence. This is to decouple this interface from the
            client's XBitmap-implementation class.
         */
        ICachedPrimitiveSharedPtr strokeTextureMappedPolyPolygon( 
            const ::com::sun::star::uno::Reference< 
                  ::com::sun::star::rendering::XPolyPolygon2D >& 	xPolyPolygon, 
            const ::com::sun::star::rendering::ViewState& 			viewState, 
            const ::com::sun::star::rendering::RenderState& 		renderState, 
            const ::com::sun::star::uno::Sequence< 
                  ::com::sun::star::rendering::Texture >&           textures,
            const ::std::vector< ::boost::shared_ptr<Bitmap> >&     textureAnnotations, 
            const ::com::sun::star::uno::Reference< 
                  ::com::sun::star::geometry::XMapping2D >& 		xMapping, 
            const ::com::sun::star::rendering::StrokeAttributes& 	strokeAttributes );
        /// See XCanvas interface
        ICachedPrimitiveSharedPtr fillPolyPolygon( 
            const ::com::sun::star::uno::Reference< 
                  ::com::sun::star::rendering::XPolyPolygon2D >& 	xPolyPolygon, 
            const ::com::sun::star::rendering::ViewState& 			viewState, 
            const ::com::sun::star::rendering::RenderState& 		renderState );
        /** See XCanvas interface

            @param textureAnnotations
            Vector of shared pointers to bitmap textures,
            <em>corresponding</em> in indices to the textures
            sequence. This is to decouple this interface from the
            client's XBitmap-implementation class.
         */
        ICachedPrimitiveSharedPtr fillTexturedPolyPolygon( 
            const ::com::sun::star::uno::Reference< 
                  ::com::sun::star::rendering::XPolyPolygon2D >&	xPolyPolygon, 
            const ::com::sun::star::rendering::ViewState& 			viewState, 
            const ::com::sun::star::rendering::RenderState& 		renderState, 
            const ::com::sun::star::uno::Sequence< 
                  ::com::sun::star::rendering::Texture >&           textures,
            const ::std::vector< ::boost::shared_ptr<Bitmap> >&     textureAnnotations ); 
        /** See XCanvas interface

            @param textureAnnotations
            Vector of shared pointers to bitmap textures,
            <em>corresponding</em> in indices to the textures
            sequence. This is to decouple this interface from the
            client's XBitmap-implementation class.
         */
        ICachedPrimitiveSharedPtr fillTextureMappedPolyPolygon( 
            const ::com::sun::star::uno::Reference< 
                  ::com::sun::star::rendering::XPolyPolygon2D >& 	xPolyPolygon, 
            const ::com::sun::star::rendering::ViewState&           viewState, 
            const ::com::sun::star::rendering::RenderState& 		renderState, 
            const ::com::sun::star::uno::Sequence< 
                  ::com::sun::star::rendering::Texture >&           textures,
            const ::std::vector< ::boost::shared_ptr<Bitmap> >&     textureAnnotations,
            const ::com::sun::star::uno::Reference< 
                  ::com::sun::star::geometry::XMapping2D >& 		xMapping );

        /// See XCanvas interface
        ICachedPrimitiveSharedPtr drawBitmap( 
            const ::com::sun::star::uno::Reference< 
                  ::com::sun::star::rendering::XBitmap >&   xBitmap, 
            const ::com::sun::star::rendering::ViewState& 	viewState, 
            const ::com::sun::star::rendering::RenderState& renderState );
        /// See XCanvas interface
        ICachedPrimitiveSharedPtr drawBitmap( 
            const ::boost::shared_ptr<Bitmap>&              rImage, 
            const ::com::sun::star::rendering::ViewState& 	viewState, 
            const ::com::sun::star::rendering::RenderState& renderState );

        /// See XCanvas interface
        ICachedPrimitiveSharedPtr drawBitmapModulated( 
            const ::com::sun::star::uno::Reference< 
                  ::com::sun::star::rendering::XBitmap >&		xBitmap, 
            const ::com::sun::star::rendering::ViewState& 		viewState, 
            const ::com::sun::star::rendering::RenderState&     renderState );
        /// See XCanvas interface
        ICachedPrimitiveSharedPtr drawBitmapModulated( 
            const ::boost::shared_ptr<Bitmap>&                  rImage, 
            const ::com::sun::star::rendering::ViewState& 		viewState, 
            const ::com::sun::star::rendering::RenderState&     renderState );

    private:
        friend class ImplBitmap;

        const ::boost::scoped_ptr< ImplBitmap > mpImpl;
	};

    typedef ::boost::shared_ptr< Bitmap > BitmapSharedPtr;
}

#endif /* INCLUDED_CANVAS_BITMAP_HXX */
