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

#include <cppcanvas/customsprite.hxx>

#include <basegfx/matrix/b2dhommatrix.hxx>
#include <basegfx/vector/b2dsize.hxx>
#include <basegfx/point/b2dpoint.hxx>
#include <basegfx/polygon/b2dpolypolygon.hxx>

#include "viewlayer.hxx"

#include <boost/optional.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/noncopyable.hpp>


/* Definition of AnimatedSprite class */

namespace slideshow
{
    namespace internal
    {
        /** This class provides the sprite for animated shapes.

			Besides encapsulating the Canvas sprite for animated
			shapes, this class also handles dynamic sprite resizing
			and all the gory details of offset calculations and
			rounding prevention.
         */
        class AnimatedSprite : private boost::noncopyable
        {
        public:
            /** Create a new AnimatedSprite, for the given metafile
                shape.

                @param rViewLayer
                The destination view layer, on which the animation should appear

            	@param rSpriteSizePixel
                The overall size of the sprite in device coordinate
                space, sufficient to display all transformations,
                shape changes and clips.

                @param nSpritePrio
                Priority of the sprite. Must remain static over the
                lifetime of this object
             */
            AnimatedSprite( const ViewLayerSharedPtr&	rViewLayer,
                            const ::basegfx::B2DSize&	rSpriteSizePixel,
                            double                      nSpritePrio );

            /** Resize the sprite.

            	@param rSpriteSizePixel
                The new size in pixel

                @return true, if the resize was successful. If false
                is returned, the sprite might be invalid.
             */
            bool resize( const ::basegfx::B2DSize& rSpriteSizePixel );

            /** Set an offset for the content output in pixel

            	This method offsets the output on the sprite content
            	canvas by the specified amount of device pixel (for
            	subsequent render operations).
             */
            void 				setPixelOffset( const ::basegfx::B2DSize& rPixelOffset );

            /// Retrieve current pixel offset for content output.
            ::basegfx::B2DSize	getPixelOffset() const;

            /// Show the sprite
            void show();

            /// Hide the sprite
            void hide();

            /** Query the content canvas for the current sprite.

            	Note that this method must be called
            	<em>every time</em> something is rendered to the
            	sprite, because XCustomSprite does not guarantee the
            	validity of the canvas after a render operation.

                Furthermore, the view transformation on the returned
                canvas is already correctly setup, matching the
                associated destination canvas.
             */
            ::cppcanvas::CanvasSharedPtr getContentCanvas() const;

            /** Move the sprite in device pixel space.

            	If the sprite is not yet created, this method has no
            	effect.
             */
            void movePixel( const ::basegfx::B2DPoint& rNewPos );

            /** Set the alpha value of the sprite.

            	If the sprite is not yet created, this method has no
            	effect.
             */
            void setAlpha( double rAlpha );

            /** Set a sprite clip in user coordinate space.

            	If the sprite is not yet created, this method has no
            	effect.
             */
            void clip( const ::basegfx::B2DPolyPolygon& rClip );

            /** Clears a sprite clip

            	If the sprite is not yet created, this method has no
            	effect.
             */
            void clip();

            /** Set a sprite transformation.

            	If the sprite is not yet created, this method has no
            	effect.
             */
            void transform( const ::basegfx::B2DHomMatrix& rTransform );

            /** Set the sprite priority.

				The sprite priority determines the ordering of the
				sprites on screen, i.e. which sprite lies before which.

                @param rPrio
                The new sprite prio. Must be in the range [0,1]
             */ 
            void setPriority( double rPrio );

        private:
            ViewLayerSharedPtr											mpViewLayer;

            ::cppcanvas::CustomSpriteSharedPtr							mpSprite;
            ::basegfx::B2DSize											maEffectiveSpriteSizePixel;
            ::basegfx::B2DSize											maContentPixelOffset;

            double                                                      mnSpritePrio;
            double														mnAlpha;
            ::boost::optional< ::basegfx::B2DPoint >                    maPosPixel;
            ::boost::optional< ::basegfx::B2DPolyPolygon >              maClip;
            ::boost::optional< ::basegfx::B2DHomMatrix >                maTransform;

            bool														mbSpriteVisible;
        };

        typedef ::boost::shared_ptr< AnimatedSprite > AnimatedSpriteSharedPtr;

    }
}

#endif /* INCLUDED_SLIDESHOW_ANIMATEDSPRITE_HXX */
