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

#include <cppcanvas/renderer.hxx>
#include <cppcanvas/bitmap.hxx>

#include <basegfx/range/b2drectangle.hxx>
#include <basegfx/polygon/b2dpolygon.hxx>

#include <boost/shared_ptr.hpp>
#include <boost/utility.hpp>

#include "tools.hxx"
#include "shapeattributelayer.hxx"
#include "animatedsprite.hxx"
#include "viewlayer.hxx"
#include "doctreenode.hxx"

#include <vector>


namespace slideshow
{
    namespace internal
    {
        /** This class is the viewable representation of a draw
            document's XShape, associated to a specific View

            The class is able to render the associated XShape on
            View implementations.
         */
        class ViewShape : private boost::noncopyable
        {
        public:
            /** Create a ViewShape for the given View

            	@param rView
                The associated View object.
             */
            explicit ViewShape( const ViewLayerSharedPtr& rViewLayer );

			/** Query the associated view layer of this shape
             */
            ViewLayerSharedPtr getViewLayer() const;

            /** Query dimension of a safety border around the shape for AA

            	If the view performs antialiasing, this method
            	calculates a safety border around the shape, in the
            	shape coordinate system, which is guaranteed to
            	include every pixel touched when rendering the shape.
             */
            ::basegfx::B2DSize getAntialiasingBorder() const;


            // animation methods
            //------------------------------------------------------------------

            /** Notify the ViewShape that an animation starts now

				This method enters animation mode on the associate
				target view. The shape can be animated in parallel on
				different views.

	            @return whether the mode change finished successfully.
             */
            bool enterAnimationMode();

            /** Notify the ViewShape that it is no longer animated

				This methods ends animation mode on the associate
				target view
             */
            void leaveAnimationMode();

            /** Query whether the ViewShape is currently animated

				This method checks whether the ViewShape is currently in
				animation mode.
             */
            bool isBackgroundDetached() const { return mbAnimationMode; }


            // render methods
            //------------------------------------------------------------------

            enum UpdateFlags
            {
                NONE=			0,
                TRANSFORMATION=	1,
                CLIP=			2,
                ALPHA=			4,
                POSITION=		8,
                CONTENT=	    16,
                FORCE=			32
            };

            struct RenderArgs
            {
                /** Create render argument struct

                    @param rOrigBounds
                    The initial shape bounds

                    @param rUpdateBounds
                    The area covered by the shape

                    @param rBounds
                    The current shape bounds

                    @param rAttr
                    The current shape attribute set. Can be NULL, for
                    default attributes. Attention: stored as a reference,
                    thus, parameter object must stay valid!

                    @param rSubsets
                    Vector of subset rendering ranges. Attention:
                    stored as a reference, thus, parameter object must
                    stay valid!

                    @param nPrio
                    Shape priority
                */
                RenderArgs( const ::basegfx::B2DRectangle&		rOrigBounds,
                            const ::basegfx::B2DRectangle&		rUpdateBounds,
                            const ::basegfx::B2DRectangle&		rBounds,
                            const ::basegfx::B2DRectangle&		rUnitBounds,
                            const ShapeAttributeLayerSharedPtr&	rAttr,
                            const VectorOfDocTreeNodes&			rSubsets,
                            double                              nPrio ) :
                    maOrigBounds( rOrigBounds ),
                    maUpdateBounds( rUpdateBounds ),
                    maBounds( rBounds ),
                    maUnitBounds( rUnitBounds ),
                    mrAttr( rAttr ),
                    mrSubsets( rSubsets ),
                    mnShapePriority( nPrio )
                {
                }

                const ::basegfx::B2DRectangle		maOrigBounds;
                const ::basegfx::B2DRectangle		maUpdateBounds;
                const ::basegfx::B2DRectangle		maBounds;
                const ::basegfx::B2DRectangle		maUnitBounds;
                const ShapeAttributeLayerSharedPtr&	mrAttr;
                const VectorOfDocTreeNodes&			mrSubsets;
                const double                        mnShapePriority;
            };

            /** Update the ViewShape

				This method updates the ViewShape on the associated
				view. If the shape is currently animated, the render
				target is the sprite, otherwise the view's
				canvas. This method does not render anything, if the
				update flags are 0.

                @param rMtf
                The metafile representation of the shape

                @param rArgs
                Parameter structure, containing all necessary arguments

                @param nUpdateFlags
                Bitmask of things to update. Use FORCE to force a repaint.

                @param bIsVisible
                When false, the shape is fully invisible (and possibly
                don't need to be painted)

	            @return whether the rendering finished successfully.
            */
            bool update( const GDIMetaFileSharedPtr&	rMtf,
                         const RenderArgs&				rArgs,
                         int							nUpdateFlags,
                         bool							bIsVisible ) const;

            /** Retrieve renderer for given canvas and metafile.

            	If necessary, the renderer is created or updated for
            	the metafile and attribute layer.

                @return a renderer that renders to the given
                destination canvas
             */
            ::cppcanvas::RendererSharedPtr getRenderer( const ::cppcanvas::CanvasSharedPtr&	rDestinationCanvas,
                                                        const GDIMetaFileSharedPtr&			rMtf,
                                                        const ShapeAttributeLayerSharedPtr&	rAttr ) const;


        private:
            struct RendererCacheEntry
            {
                RendererCacheEntry() :
                    mpDestinationCanvas(),
                    mpRenderer(),
                    mpMtf(),
                    mpLastBitmap(),
                    mpLastBitmapCanvas()
                {
                }

                ::cppcanvas::CanvasSharedPtr getDestinationCanvas()
                {
                    return mpDestinationCanvas;
                }

                ::cppcanvas::CanvasSharedPtr		mpDestinationCanvas;
                ::cppcanvas::RendererSharedPtr		mpRenderer;
                GDIMetaFileSharedPtr				mpMtf;
                ::cppcanvas::BitmapSharedPtr		mpLastBitmap;
                ::cppcanvas::BitmapCanvasSharedPtr	mpLastBitmapCanvas;
            };

            typedef ::std::vector< RendererCacheEntry >	RendererCacheVector;


            /** Prefetch Renderer for given canvas
             */
            bool prefetch( RendererCacheEntry&					io_rCacheEntry,
                           const ::cppcanvas::CanvasSharedPtr&	rDestinationCanvas,
                           const GDIMetaFileSharedPtr&			rMtf,
                           const ShapeAttributeLayerSharedPtr&	rAttr ) const;

            /** Draw with prefetched Renderer to stored canvas

            	This method draws prefetched Renderer to its
            	associated canvas (which happens to be mpLastCanvas).
             */
            bool draw( const ::cppcanvas::CanvasSharedPtr&	rDestinationCanvas,
                       const GDIMetaFileSharedPtr&			rMtf,
                       const ShapeAttributeLayerSharedPtr&	rAttr,
                       const ::basegfx::B2DHomMatrix&		rTransform,
                       const ::basegfx::B2DPolyPolygon*		pClip,
                       const VectorOfDocTreeNodes&			rSubsets ) const;

            /** Render shape to an active sprite
             */
            bool renderSprite( const ViewLayerSharedPtr&            rViewLayer,
                               const GDIMetaFileSharedPtr&			rMtf,
                               const ::basegfx::B2DRectangle&		rOrigBounds,
                               const ::basegfx::B2DRectangle&		rBounds,
                               const ::basegfx::B2DRectangle&		rUnitBounds,
                               int									nUpdateFlags,
                               const ShapeAttributeLayerSharedPtr&	pAttr,
                               const VectorOfDocTreeNodes&			rSubsets,
                               double                               nPrio,
                               bool 								bIsVisible ) const;

            /** Render shape to given canvas
             */
            bool render( const ::cppcanvas::CanvasSharedPtr&	rDestinationCanvas,
                         const GDIMetaFileSharedPtr&			rMtf,
                         const ::basegfx::B2DRectangle&			rBounds,
                         const ::basegfx::B2DRectangle&			rUpdateBounds,
                         int									nUpdateFlags,
                         const ShapeAttributeLayerSharedPtr&	pAttr,
                         const VectorOfDocTreeNodes&			rSubsets,
                         bool 									bIsVisible ) const;

            /** Calc sprite size in pixel

            	Converts user coordinate system to device pixel, and
            	adds antialiasing border.

            	@param rUserSize
                Size of the sprite in user coordinate system (doc coordinates)
             */
            ::basegfx::B2DSize calcSpriteSizePixel( const ::basegfx::B2DSize& rUserSize ) const;

            enum{ MAX_RENDER_CACHE_ENTRIES=2 };

            /** Retrieve a valid iterator to renderer cache entry

            	This method ensures that an internal limit of
            	MAX_RENDER_CACHE_ENTRIES is not exceeded.

            	@param rDestinationCanvas
                Destination canvas to retrieve cache entry for

            	@return a valid iterator to a renderer cache entry for
            	the given canvas. The entry might be
            	default-constructed (if newly added)
             */
            RendererCacheVector::iterator getCacheEntry( const ::cppcanvas::CanvasSharedPtr& rDestinationCanvas ) const;

            void invalidateRenderer() const;

            /** The view layer this object is part of.

                Needed for sprite creation
            */
            ViewLayerSharedPtr							mpViewLayer;

            /// A set of cached mtf/canvas combinations
            mutable RendererCacheVector					maRenderers;

            /// The sprite object
            mutable AnimatedSpriteSharedPtr				mpSprite;

            /// If true, render() calls go to the sprite
            mutable bool								mbAnimationMode;

            /// If true, shape needs full repaint (and the sprite a setup, if any)
            mutable bool								mbForceUpdate;
        };

        typedef ::boost::shared_ptr< ViewShape > ViewShapeSharedPtr;

    }
}

#endif /* INCLUDED_SLIDESHOW_VIEWSHAPE_HXX */
