| /************************************************************** | 
 |  *  | 
 |  * 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 _VCLCANVAS_SPRITECANVASHELPER_HXX_ | 
 | #define _VCLCANVAS_SPRITECANVASHELPER_HXX_ | 
 |  | 
 | #include <com/sun/star/rendering/XSpriteCanvas.hpp> | 
 | #include <com/sun/star/rendering/XIntegerBitmap.hpp> | 
 |  | 
 | #include <vcl/virdev.hxx> | 
 |  | 
 | #include <canvas/spriteredrawmanager.hxx> | 
 | #include <canvas/elapsedtime.hxx> | 
 | #include <canvas/vclwrapper.hxx> | 
 | #include "canvashelper.hxx" | 
 | #include "impltools.hxx" | 
 |  | 
 |  | 
 | namespace vclcanvas | 
 | { | 
 |     class RedrawManager; | 
 |     class SpriteCanvas; | 
 |  | 
 |     class SpriteCanvasHelper : public CanvasHelper | 
 |     { | 
 |     public: | 
 |         SpriteCanvasHelper(); | 
 |  | 
 |         void init( const OutDevProviderSharedPtr& rOutDev,  | 
 |                    SpriteCanvas&                  rOwningSpriteCanvas, | 
 |                    ::canvas::SpriteRedrawManager& rManager, | 
 |                    bool                           bProtect, | 
 |                    bool                           bHaveAlpha ); | 
 |  | 
 |         /// Dispose all internal references | 
 |         void disposing(); | 
 |  | 
 |         // XSpriteCanvas | 
 |         ::com::sun::star::uno::Reference<  | 
 |   			::com::sun::star::rendering::XAnimatedSprite > 		createSpriteFromAnimation(  | 
 |                 const ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XAnimation >& animation ); | 
 |  | 
 |         ::com::sun::star::uno::Reference<  | 
 |   			::com::sun::star::rendering::XAnimatedSprite > 		createSpriteFromBitmaps(  | 
 |                 const ::com::sun::star::uno::Sequence<  | 
 |                 	  ::com::sun::star::uno::Reference<  | 
 |                 			::com::sun::star::rendering::XBitmap > >& animationBitmaps,  | 
 |                 sal_Int8                                              interpolationMode ); | 
 |      | 
 |         ::com::sun::star::uno::Reference<  | 
 |   			::com::sun::star::rendering::XCustomSprite > 		createCustomSprite(  | 
 |                 const ::com::sun::star::geometry::RealSize2D& spriteSize ); | 
 |      | 
 |         ::com::sun::star::uno::Reference<  | 
 |   			::com::sun::star::rendering::XSprite > 				createClonedSprite(  | 
 |                 const ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XSprite >& original ); | 
 |  | 
 |         /** Actually perform the screen update | 
 |  | 
 |         	@param bUpdateAll | 
 |             sal_True, if everything must be updated, not only changed | 
 |             sprites | 
 |  | 
 |             @param io_bSurfaceDirty | 
 |             In/out parameter, whether backbuffer surface is dirty (if | 
 |             yes, we're performing a full update, anyway) | 
 |          */ | 
 |         sal_Bool updateScreen( sal_Bool bUpdateAll, | 
 |                                bool&	io_bSurfaceDirty ); | 
 |  | 
 |         // SpriteRedrawManager functor calls | 
 |         // ------------------------------------------------- | 
 |  | 
 |         /** Gets called for simple background repaints | 
 |          */ | 
 |         void backgroundPaint( const ::basegfx::B2DRange& rUpdateRect ); | 
 |  | 
 |         /** Gets called when area can be handled by scrolling. | 
 |  | 
 |         	Called method must copy screen content from rMoveStart to | 
 |         	rMoveEnd, and restore the background in the uncovered | 
 |         	areas. | 
 |  | 
 |             @param rMoveStart | 
 |             Source rect of the scroll | 
 |  | 
 |             @param rMoveEnd | 
 |             Dest rect of the scroll | 
 |  | 
 |             @param rUpdateArea | 
 |             All info necessary, should rMoveStart be partially or | 
 |             fully outside the outdev | 
 |          */ | 
 |         void scrollUpdate( const ::basegfx::B2DRange& 							rMoveStart,  | 
 |                            const ::basegfx::B2DRange& 							rMoveEnd, | 
 |                            const ::canvas::SpriteRedrawManager::UpdateArea& 	rUpdateArea ); | 
 |  | 
 |         void opaqueUpdate( const ::basegfx::B2DRange&                          rTotalArea, | 
 |                            const ::std::vector< ::canvas::Sprite::Reference >& rSortedUpdateSprites ); | 
 |  | 
 |         void genericUpdate( const ::basegfx::B2DRange&                          rTotalArea, | 
 |                             const ::std::vector< ::canvas::Sprite::Reference >& rSortedUpdateSprites ); | 
 |  | 
 |         ::com::sun::star::uno::Any isUnsafeScrolling() const  | 
 |         {  | 
 |             return ::com::sun::star::uno::makeAny(mbIsUnsafeScrolling);  | 
 |         } | 
 |         void enableUnsafeScrolling( const ::com::sun::star::uno::Any& rAny )  | 
 |         {  | 
 |             mbIsUnsafeScrolling = rAny.get<bool>();  | 
 |         } | 
 |  | 
 |         ::com::sun::star::uno::Any isSpriteBounds() const | 
 |         {  | 
 |             return ::com::sun::star::uno::makeAny(mbShowSpriteBounds);  | 
 |         } | 
 |         void enableSpriteBounds( const ::com::sun::star::uno::Any& rAny ) | 
 |         {  | 
 |             mbShowSpriteBounds = rAny.get<bool>();  | 
 |         } | 
 |  | 
 |     private: | 
 |         void renderFrameCounter( OutputDevice& rOutDev ); | 
 |         void renderSpriteCount( OutputDevice& rOutDev ); | 
 |         void renderMemUsage( OutputDevice& rOutDev ); | 
 |  | 
 |         /// Set from the SpriteCanvas: instance coordinating sprite redraw | 
 |     	::canvas::SpriteRedrawManager*					mpRedrawManager; | 
 |  | 
 |         /// Set from the init method. used to generate sprites | 
 |         SpriteCanvas*                                   mpOwningSpriteCanvas; | 
 |  | 
 |         /** Background compositing surface. | 
 |  | 
 |         	Typically, sprites will be composited in the background, | 
 |         	before pushing them to screen. This happens here. | 
 |          */ | 
 |         ::canvas::vcltools::VCLObject< VirtualDevice >	maVDev; | 
 |  | 
 |         /// For the frame counter timings | 
 |         ::canvas::tools::ElapsedTime					maLastUpdate; | 
 |  | 
 |         /// When true, canvas displays debug info on each frame | 
 |         bool											mbShowFrameInfo; | 
 |  | 
 |         /// When true, canvas creates all new sprites with red lines in the corners | 
 |         bool											mbShowSpriteBounds; | 
 |  | 
 |         /// When true, canvas uses the scroll optimization (direct scrolls in front buffer) | 
 |         bool                                            mbIsUnsafeScrolling; | 
 |     }; | 
 | } | 
 |  | 
 | #endif /* _VCLCANVAS_SPRITECANVASHELPER_HXX_ */ | 
 |  |