1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski #ifndef _CAIROCANVAS_SPRITECANVASHELPER_HXX_
25*b1cdbd2cSJim Jagielski #define _CAIROCANVAS_SPRITECANVASHELPER_HXX_
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <com/sun/star/rendering/XSpriteCanvas.hpp>
28*b1cdbd2cSJim Jagielski #include <com/sun/star/rendering/XIntegerBitmap.hpp>
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski #include <canvas/spriteredrawmanager.hxx>
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski #include "cairo_cairo.hxx"
33*b1cdbd2cSJim Jagielski #include "cairo_canvashelper.hxx"
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski namespace basegfx
36*b1cdbd2cSJim Jagielski {
37*b1cdbd2cSJim Jagielski     class B2IRange;
38*b1cdbd2cSJim Jagielski }
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski namespace cairocanvas
41*b1cdbd2cSJim Jagielski {
42*b1cdbd2cSJim Jagielski     class SpriteCanvas;
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski     class SpriteCanvasHelper : public CanvasHelper
45*b1cdbd2cSJim Jagielski     {
46*b1cdbd2cSJim Jagielski     public:
47*b1cdbd2cSJim Jagielski         SpriteCanvasHelper();
48*b1cdbd2cSJim Jagielski 
49*b1cdbd2cSJim Jagielski         void init( ::canvas::SpriteRedrawManager& rManager,
50*b1cdbd2cSJim Jagielski                    SpriteCanvas&                  rOwningSpriteCanvas,
51*b1cdbd2cSJim Jagielski                    const ::basegfx::B2ISize&      rSize );
52*b1cdbd2cSJim Jagielski 
53*b1cdbd2cSJim Jagielski         /// Dispose all internal references
54*b1cdbd2cSJim Jagielski         void disposing();
55*b1cdbd2cSJim Jagielski 
56*b1cdbd2cSJim Jagielski         // XSpriteCanvas
57*b1cdbd2cSJim Jagielski         ::com::sun::star::uno::Reference<
58*b1cdbd2cSJim Jagielski   			::com::sun::star::rendering::XAnimatedSprite > 		createSpriteFromAnimation(
59*b1cdbd2cSJim Jagielski                 const ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XAnimation >& animation );
60*b1cdbd2cSJim Jagielski 
61*b1cdbd2cSJim Jagielski         ::com::sun::star::uno::Reference<
62*b1cdbd2cSJim Jagielski   			::com::sun::star::rendering::XAnimatedSprite > 		createSpriteFromBitmaps(
63*b1cdbd2cSJim Jagielski                 const ::com::sun::star::uno::Sequence<
64*b1cdbd2cSJim Jagielski                 	  ::com::sun::star::uno::Reference<
65*b1cdbd2cSJim Jagielski                 			::com::sun::star::rendering::XBitmap > >& animationBitmaps,
66*b1cdbd2cSJim Jagielski                 sal_Int8                                              interpolationMode );
67*b1cdbd2cSJim Jagielski 
68*b1cdbd2cSJim Jagielski         ::com::sun::star::uno::Reference<
69*b1cdbd2cSJim Jagielski   			::com::sun::star::rendering::XCustomSprite > 		createCustomSprite(
70*b1cdbd2cSJim Jagielski                 const ::com::sun::star::geometry::RealSize2D& spriteSize );
71*b1cdbd2cSJim Jagielski 
72*b1cdbd2cSJim Jagielski         ::com::sun::star::uno::Reference<
73*b1cdbd2cSJim Jagielski   			::com::sun::star::rendering::XSprite > 				createClonedSprite(
74*b1cdbd2cSJim Jagielski                 const ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XSprite >& original );
75*b1cdbd2cSJim Jagielski 
76*b1cdbd2cSJim Jagielski         /** Actually perform the screen update
77*b1cdbd2cSJim Jagielski 
78*b1cdbd2cSJim Jagielski             @param rCurrArea
79*b1cdbd2cSJim Jagielski             Current window area in absolute screen coordinates
80*b1cdbd2cSJim Jagielski 
81*b1cdbd2cSJim Jagielski         	@param bUpdateAll
82*b1cdbd2cSJim Jagielski             sal_True, if everything must be updated, not only changed
83*b1cdbd2cSJim Jagielski             sprites
84*b1cdbd2cSJim Jagielski 
85*b1cdbd2cSJim Jagielski             @param io_bSurfaceDirty
86*b1cdbd2cSJim Jagielski             In/out parameter, whether backbuffer surface is dirty (if
87*b1cdbd2cSJim Jagielski             yes, we're performing a full update, anyway)
88*b1cdbd2cSJim Jagielski          */
89*b1cdbd2cSJim Jagielski         sal_Bool updateScreen( const ::basegfx::B2IRange& rCurrArea,
90*b1cdbd2cSJim Jagielski                                sal_Bool                   bUpdateAll,
91*b1cdbd2cSJim Jagielski                                bool&                      io_bSurfaceDirty );
92*b1cdbd2cSJim Jagielski 
93*b1cdbd2cSJim Jagielski 
94*b1cdbd2cSJim Jagielski         // SpriteRedrawManager functor calls
95*b1cdbd2cSJim Jagielski         // -------------------------------------------------
96*b1cdbd2cSJim Jagielski 
97*b1cdbd2cSJim Jagielski         /** Gets called for simple background repaints
98*b1cdbd2cSJim Jagielski          */
99*b1cdbd2cSJim Jagielski         void backgroundPaint( const ::basegfx::B2DRange& rUpdateRect );
100*b1cdbd2cSJim Jagielski 
101*b1cdbd2cSJim Jagielski         /** Gets called when area can be handled by scrolling.
102*b1cdbd2cSJim Jagielski 
103*b1cdbd2cSJim Jagielski         	Called method must copy screen content from rMoveStart to
104*b1cdbd2cSJim Jagielski         	rMoveEnd, and restore the background in the uncovered
105*b1cdbd2cSJim Jagielski         	areas.
106*b1cdbd2cSJim Jagielski 
107*b1cdbd2cSJim Jagielski             @param rMoveStart
108*b1cdbd2cSJim Jagielski             Source rect of the scroll
109*b1cdbd2cSJim Jagielski 
110*b1cdbd2cSJim Jagielski             @param rMoveEnd
111*b1cdbd2cSJim Jagielski             Dest rect of the scroll
112*b1cdbd2cSJim Jagielski 
113*b1cdbd2cSJim Jagielski             @param rUpdateArea
114*b1cdbd2cSJim Jagielski             All info necessary, should rMoveStart be partially or
115*b1cdbd2cSJim Jagielski             fully outside the outdev
116*b1cdbd2cSJim Jagielski          */
117*b1cdbd2cSJim Jagielski         void scrollUpdate( const ::basegfx::B2DRange& 							rMoveStart,
118*b1cdbd2cSJim Jagielski                            const ::basegfx::B2DRange& 							rMoveEnd,
119*b1cdbd2cSJim Jagielski                            const ::canvas::SpriteRedrawManager::UpdateArea& 	rUpdateArea );
120*b1cdbd2cSJim Jagielski 
121*b1cdbd2cSJim Jagielski         void opaqueUpdate( const ::basegfx::B2DRange&                          rTotalArea,
122*b1cdbd2cSJim Jagielski                            const ::std::vector< ::canvas::Sprite::Reference >& rSortedUpdateSprites );
123*b1cdbd2cSJim Jagielski 
124*b1cdbd2cSJim Jagielski         void genericUpdate( const ::basegfx::B2DRange&                          rTotalArea,
125*b1cdbd2cSJim Jagielski                             const ::std::vector< ::canvas::Sprite::Reference >& rSortedUpdateSprites );
126*b1cdbd2cSJim Jagielski 
127*b1cdbd2cSJim Jagielski     private:
128*b1cdbd2cSJim Jagielski         ::cairo::SurfaceSharedPtr getCompositingSurface( const ::basegfx::B2ISize& rNeededSize );
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski         /// Set from the SpriteCanvas: instance coordinating sprite redraw
131*b1cdbd2cSJim Jagielski     	::canvas::SpriteRedrawManager*	mpRedrawManager;
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski         /// Set from the init method. used to generate sprites
134*b1cdbd2cSJim Jagielski         SpriteCanvas*                   mpOwningSpriteCanvas;
135*b1cdbd2cSJim Jagielski 
136*b1cdbd2cSJim Jagielski         /// a temporary surface used to composite the frontbuffer image
137*b1cdbd2cSJim Jagielski         ::cairo::SurfaceSharedPtr           mpCompositingSurface;
138*b1cdbd2cSJim Jagielski         ::basegfx::B2ISize               maCompositingSurfaceSize;
139*b1cdbd2cSJim Jagielski     };
140*b1cdbd2cSJim Jagielski }
141*b1cdbd2cSJim Jagielski 
142*b1cdbd2cSJim Jagielski #endif /* _CAIROCANVAS_SPRITECANVASHELPER_HXX_ */
143*b1cdbd2cSJim Jagielski 
144