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 INCLUDED_SLIDESHOW_LAYERMANAGER_HXX
25*b1cdbd2cSJim Jagielski #define INCLUDED_SLIDESHOW_LAYERMANAGER_HXX
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <boost/shared_ptr.hpp>
28*b1cdbd2cSJim Jagielski #include <boost/noncopyable.hpp>
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski #include <cppcanvas/spritecanvas.hxx>
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski #include "unoview.hxx"
33*b1cdbd2cSJim Jagielski #include "unoviewcontainer.hxx"
34*b1cdbd2cSJim Jagielski #include "attributableshape.hxx"
35*b1cdbd2cSJim Jagielski #include "layer.hxx"
36*b1cdbd2cSJim Jagielski #include "tools.hxx"
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski #include <vector>
39*b1cdbd2cSJim Jagielski #include <map>
40*b1cdbd2cSJim Jagielski #include <hash_map>
41*b1cdbd2cSJim Jagielski #include <algorithm>
42*b1cdbd2cSJim Jagielski #include <functional>
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski namespace basegfx {
45*b1cdbd2cSJim Jagielski     class B2DRange;
46*b1cdbd2cSJim Jagielski }
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski namespace slideshow
49*b1cdbd2cSJim Jagielski {
50*b1cdbd2cSJim Jagielski     namespace internal
51*b1cdbd2cSJim Jagielski     {
52*b1cdbd2cSJim Jagielski 		/* Definition of Layermanager class */
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski         /** This class manages all of a slide's layers (and shapes)
55*b1cdbd2cSJim Jagielski 
56*b1cdbd2cSJim Jagielski 			Since layer content changes when animations start or end,
57*b1cdbd2cSJim Jagielski 			the layer manager keeps track of this and also handles
58*b1cdbd2cSJim Jagielski 			starting/stopping of Shape animations. Note that none of
59*b1cdbd2cSJim Jagielski 			the methods actually perform a screen update, this is
60*b1cdbd2cSJim Jagielski 			always delayed until the ActivitiesQueue explicitely
61*b1cdbd2cSJim Jagielski 			performs it.
62*b1cdbd2cSJim Jagielski 
63*b1cdbd2cSJim Jagielski             @see Layer
64*b1cdbd2cSJim Jagielski             @see Shape
65*b1cdbd2cSJim Jagielski          */
66*b1cdbd2cSJim Jagielski         class LayerManager : private boost::noncopyable
67*b1cdbd2cSJim Jagielski         {
68*b1cdbd2cSJim Jagielski         public:
69*b1cdbd2cSJim Jagielski             /** Create a new layer manager for the given page bounds
70*b1cdbd2cSJim Jagielski 
71*b1cdbd2cSJim Jagielski                 @param rViews
72*b1cdbd2cSJim Jagielski                 Views currently registered
73*b1cdbd2cSJim Jagielski 
74*b1cdbd2cSJim Jagielski                 @param rPageBounds
75*b1cdbd2cSJim Jagielski                 Overall page bounds, in user space coordinates
76*b1cdbd2cSJim Jagielski 
77*b1cdbd2cSJim Jagielski                 @param bDisableAnimationZOrder
78*b1cdbd2cSJim Jagielski                 When true, all sprite animations run in the
79*b1cdbd2cSJim Jagielski                 foreground.  That is, no extra layers are created, and
80*b1cdbd2cSJim Jagielski                 the slideshow runs potentially faster.
81*b1cdbd2cSJim Jagielski              */
82*b1cdbd2cSJim Jagielski             LayerManager( const UnoViewContainer&    rViews,
83*b1cdbd2cSJim Jagielski                           const ::basegfx::B2DRange& rPageBounds,
84*b1cdbd2cSJim Jagielski                           bool                       bDisableAnimationZOrder );
85*b1cdbd2cSJim Jagielski 
86*b1cdbd2cSJim Jagielski             /** Activate the LayerManager
87*b1cdbd2cSJim Jagielski 
88*b1cdbd2cSJim Jagielski                 This method activates the LayerManager. Prior to
89*b1cdbd2cSJim Jagielski                 activation, this instance will be passive, i.e. won't
90*b1cdbd2cSJim Jagielski                 render anything to any view.
91*b1cdbd2cSJim Jagielski 
92*b1cdbd2cSJim Jagielski                 @param bSlideBackgoundPainted
93*b1cdbd2cSJim Jagielski                 When true, the initial slide content on the background
94*b1cdbd2cSJim Jagielski                 layer is already rendered (e.g. from a previous slide
95*b1cdbd2cSJim Jagielski                 transition). When false, LayerManager also renders
96*b1cdbd2cSJim Jagielski                 initial content of background layer on next update()
97*b1cdbd2cSJim Jagielski                 call.
98*b1cdbd2cSJim Jagielski              */
99*b1cdbd2cSJim Jagielski             void activate( bool bSlideBackgoundPainted );
100*b1cdbd2cSJim Jagielski 
101*b1cdbd2cSJim Jagielski             /** Deactivate the LayerManager
102*b1cdbd2cSJim Jagielski 
103*b1cdbd2cSJim Jagielski                 This method deactivates the LayerManager. After
104*b1cdbd2cSJim Jagielski                 deactivation, this instance will be passive,
105*b1cdbd2cSJim Jagielski                 i.e. don't render anything to any view.  Furthermore,
106*b1cdbd2cSJim Jagielski                 if there's currently more than one Layer active, this
107*b1cdbd2cSJim Jagielski                 method also removes all but one.
108*b1cdbd2cSJim Jagielski              */
109*b1cdbd2cSJim Jagielski             void deactivate();
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski             // From ViewEventHandler, forwarded by SlideImpl
112*b1cdbd2cSJim Jagielski             /// Notify new view added to UnoViewContainer
113*b1cdbd2cSJim Jagielski             void viewAdded( const UnoViewSharedPtr& rView );
114*b1cdbd2cSJim Jagielski             /// Notify view removed from UnoViewContainer
115*b1cdbd2cSJim Jagielski             void viewRemoved( const UnoViewSharedPtr& rView );
116*b1cdbd2cSJim Jagielski             void viewChanged( const UnoViewSharedPtr& rView );
117*b1cdbd2cSJim Jagielski             void viewsChanged();
118*b1cdbd2cSJim Jagielski 
119*b1cdbd2cSJim Jagielski             /** Add the shape to this object
120*b1cdbd2cSJim Jagielski 
121*b1cdbd2cSJim Jagielski             	This method adds a shape to the page.
122*b1cdbd2cSJim Jagielski              */
123*b1cdbd2cSJim Jagielski             void addShape( const ShapeSharedPtr& rShape );
124*b1cdbd2cSJim Jagielski 
125*b1cdbd2cSJim Jagielski             /** Remove shape from this object
126*b1cdbd2cSJim Jagielski 
127*b1cdbd2cSJim Jagielski             	This method removes a shape from the shape.
128*b1cdbd2cSJim Jagielski              */
129*b1cdbd2cSJim Jagielski             bool removeShape( const ShapeSharedPtr& rShape );
130*b1cdbd2cSJim Jagielski 
131*b1cdbd2cSJim Jagielski             /** Lookup a Shape from an XShape model object
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski             	This method looks up the internal shape map for one
134*b1cdbd2cSJim Jagielski             	representing the given XShape.
135*b1cdbd2cSJim Jagielski 
136*b1cdbd2cSJim Jagielski                 @param xShape
137*b1cdbd2cSJim Jagielski                 The XShape object, for which the representing Shape
138*b1cdbd2cSJim Jagielski                 should be looked up.
139*b1cdbd2cSJim Jagielski              */
140*b1cdbd2cSJim Jagielski             ShapeSharedPtr lookupShape( const ::com::sun::star::uno::Reference<
141*b1cdbd2cSJim Jagielski                                            ::com::sun::star::drawing::XShape >& xShape ) const;
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski             /** Query a subset of the given original shape
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski 				This method queries a new (but not necessarily unique)
146*b1cdbd2cSJim Jagielski 				shape, which displays only the given subset of the
147*b1cdbd2cSJim Jagielski 				original one.
148*b1cdbd2cSJim Jagielski              */
149*b1cdbd2cSJim Jagielski             AttributableShapeSharedPtr getSubsetShape( const AttributableShapeSharedPtr& 	rOrigShape,
150*b1cdbd2cSJim Jagielski                                                        const DocTreeNode&					rTreeNode );
151*b1cdbd2cSJim Jagielski 
152*b1cdbd2cSJim Jagielski             /** Revoke a previously queried subset shape.
153*b1cdbd2cSJim Jagielski 
154*b1cdbd2cSJim Jagielski             	With this method, a previously requested subset shape
155*b1cdbd2cSJim Jagielski             	is revoked again. If the last client revokes a given
156*b1cdbd2cSJim Jagielski             	subset, it will cease to be displayed, and the
157*b1cdbd2cSJim Jagielski             	original shape will again show the subset data.
158*b1cdbd2cSJim Jagielski 
159*b1cdbd2cSJim Jagielski                 @param rOrigShape
160*b1cdbd2cSJim Jagielski                 The shape the subset was created from
161*b1cdbd2cSJim Jagielski 
162*b1cdbd2cSJim Jagielski                 @param rSubsetShape
163*b1cdbd2cSJim Jagielski                 The subset created from rOrigShape
164*b1cdbd2cSJim Jagielski              */
165*b1cdbd2cSJim Jagielski             void revokeSubset( const AttributableShapeSharedPtr& rOrigShape,
166*b1cdbd2cSJim Jagielski                                const AttributableShapeSharedPtr& rSubsetShape );
167*b1cdbd2cSJim Jagielski 
168*b1cdbd2cSJim Jagielski             /** Notify the LayerManager that the given Shape starts an
169*b1cdbd2cSJim Jagielski                 animation now.
170*b1cdbd2cSJim Jagielski 
171*b1cdbd2cSJim Jagielski 				This method enters animation mode for the Shape on all
172*b1cdbd2cSJim Jagielski 				registered views.
173*b1cdbd2cSJim Jagielski              */
174*b1cdbd2cSJim Jagielski             void enterAnimationMode( const AnimatableShapeSharedPtr& rShape );
175*b1cdbd2cSJim Jagielski 
176*b1cdbd2cSJim Jagielski             /** Notify the LayerManager that the given Shape is no
177*b1cdbd2cSJim Jagielski                 longer animated.
178*b1cdbd2cSJim Jagielski 
179*b1cdbd2cSJim Jagielski 				This methods ends animation mode for the given Shape
180*b1cdbd2cSJim Jagielski 				on all registered views.
181*b1cdbd2cSJim Jagielski              */
182*b1cdbd2cSJim Jagielski             void leaveAnimationMode( const AnimatableShapeSharedPtr& rShape );
183*b1cdbd2cSJim Jagielski 
184*b1cdbd2cSJim Jagielski             /** Notify that a shape needs an update
185*b1cdbd2cSJim Jagielski 
186*b1cdbd2cSJim Jagielski             	This method notifies the layer manager that a shape
187*b1cdbd2cSJim Jagielski             	update is necessary. This is useful if, during
188*b1cdbd2cSJim Jagielski             	animation playback, changes occur to shapes which make
189*b1cdbd2cSJim Jagielski             	an update necessary on an update() call. Otherwise,
190*b1cdbd2cSJim Jagielski             	update() will not render anything, which is not
191*b1cdbd2cSJim Jagielski             	triggered by calling one of the other LayerManager
192*b1cdbd2cSJim Jagielski             	methods.
193*b1cdbd2cSJim Jagielski 
194*b1cdbd2cSJim Jagielski                 @param rShape
195*b1cdbd2cSJim Jagielski                 Shape which needs an update
196*b1cdbd2cSJim Jagielski              */
197*b1cdbd2cSJim Jagielski             void notifyShapeUpdate( const ShapeSharedPtr& rShape);
198*b1cdbd2cSJim Jagielski 
199*b1cdbd2cSJim Jagielski             /** Check whether any update operations  are pending.
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski             	@return true, if this LayerManager has any updates
202*b1cdbd2cSJim Jagielski             	pending, i.e. needs to repaint something for the next
203*b1cdbd2cSJim Jagielski             	frame.
204*b1cdbd2cSJim Jagielski              */
205*b1cdbd2cSJim Jagielski             bool isUpdatePending() const;
206*b1cdbd2cSJim Jagielski 
207*b1cdbd2cSJim Jagielski             /** Update the content
208*b1cdbd2cSJim Jagielski 
209*b1cdbd2cSJim Jagielski 				This method updates the content on all layers on all
210*b1cdbd2cSJim Jagielski 				registered views. It does not issues a
211*b1cdbd2cSJim Jagielski 				View::updateScreen() call on registered views. Please
212*b1cdbd2cSJim Jagielski 				note that this method only takes into account changes
213*b1cdbd2cSJim Jagielski 				to shapes induced directly by calling methods of the
214*b1cdbd2cSJim Jagielski 				LayerManager. If a shape needs an update, because of
215*b1cdbd2cSJim Jagielski 				some external event unknown to the LayerManager (most
216*b1cdbd2cSJim Jagielski 				notably running animations), you have to notify the
217*b1cdbd2cSJim Jagielski 				LayerManager via notifyShapeUpdate().
218*b1cdbd2cSJim Jagielski 
219*b1cdbd2cSJim Jagielski                 @see LayerManager::updateScreen()
220*b1cdbd2cSJim Jagielski 
221*b1cdbd2cSJim Jagielski 	            @return whether the update finished successfully.
222*b1cdbd2cSJim Jagielski             */
223*b1cdbd2cSJim Jagielski             bool update();
224*b1cdbd2cSJim Jagielski 
225*b1cdbd2cSJim Jagielski             /** Render the content to given canvas
226*b1cdbd2cSJim Jagielski 
227*b1cdbd2cSJim Jagielski                 This is a one-shot operation, which simply draws all
228*b1cdbd2cSJim Jagielski                 shapes onto the given canvas, without any caching or
229*b1cdbd2cSJim Jagielski                 other fuzz. Don't use that for repeated output onto
230*b1cdbd2cSJim Jagielski                 the same canvas, the View concept is more optimal
231*b1cdbd2cSJim Jagielski                 then.
232*b1cdbd2cSJim Jagielski 
233*b1cdbd2cSJim Jagielski                 @param rTargetCanvas
234*b1cdbd2cSJim Jagielski                 Target canvas to output onto.
235*b1cdbd2cSJim Jagielski              */
236*b1cdbd2cSJim Jagielski             bool renderTo( const ::cppcanvas::CanvasSharedPtr& rTargetCanvas ) const;
237*b1cdbd2cSJim Jagielski 
238*b1cdbd2cSJim Jagielski         private:
239*b1cdbd2cSJim Jagielski             /** A hash map which maps the XShape to the corresponding Shape object.
240*b1cdbd2cSJim Jagielski 
241*b1cdbd2cSJim Jagielski                 Provides quicker lookup than ShapeSet for simple mappings
242*b1cdbd2cSJim Jagielski              */
243*b1cdbd2cSJim Jagielski             typedef ::std::hash_map<
244*b1cdbd2cSJim Jagielski                 ::com::sun::star::uno::Reference<
245*b1cdbd2cSJim Jagielski                     ::com::sun::star::drawing::XShape >,
246*b1cdbd2cSJim Jagielski                 ShapeSharedPtr,
247*b1cdbd2cSJim Jagielski                 hash< ::com::sun::star::uno::Reference<
248*b1cdbd2cSJim Jagielski                       ::com::sun::star::drawing::XShape > > > XShapeHash;
249*b1cdbd2cSJim Jagielski 
250*b1cdbd2cSJim Jagielski             class ShapeComparator
251*b1cdbd2cSJim Jagielski             {
252*b1cdbd2cSJim Jagielski             public:
operator ()(const ShapeSharedPtr & rpS1,const ShapeSharedPtr & rpS2) const253*b1cdbd2cSJim Jagielski                 bool operator() (const ShapeSharedPtr& rpS1, const ShapeSharedPtr& rpS2 ) const
254*b1cdbd2cSJim Jagielski                 {
255*b1cdbd2cSJim Jagielski                     return Shape::lessThanShape::compare(rpS1.get(), rpS2.get());
256*b1cdbd2cSJim Jagielski                 }
257*b1cdbd2cSJim Jagielski             };
258*b1cdbd2cSJim Jagielski             /** Set of all shapes
259*b1cdbd2cSJim Jagielski              */
260*b1cdbd2cSJim Jagielski         private:
261*b1cdbd2cSJim Jagielski             typedef ::std::map< ShapeSharedPtr, LayerWeakPtr, ShapeComparator > LayerShapeMap;
262*b1cdbd2cSJim Jagielski             typedef ::std::set< ShapeSharedPtr > ShapeUpdateSet;
263*b1cdbd2cSJim Jagielski 
264*b1cdbd2cSJim Jagielski 
265*b1cdbd2cSJim Jagielski             ////////////////////////////////////////////////////////////////////////
266*b1cdbd2cSJim Jagielski 
267*b1cdbd2cSJim Jagielski 
268*b1cdbd2cSJim Jagielski             /// Adds shape area to containing layer's damage area
269*b1cdbd2cSJim Jagielski             void addUpdateArea( ShapeSharedPtr const& rShape );
270*b1cdbd2cSJim Jagielski 
271*b1cdbd2cSJim Jagielski             LayerSharedPtr createForegroundLayer() const;
272*b1cdbd2cSJim Jagielski 
273*b1cdbd2cSJim Jagielski             /** Push changes from updateShapeLayerAssociations() to current layer
274*b1cdbd2cSJim Jagielski 
275*b1cdbd2cSJim Jagielski                 Factored-out method that resizes layer, if necessary,
276*b1cdbd2cSJim Jagielski                 assigns correct layer priority, and repaints contained shapes.
277*b1cdbd2cSJim Jagielski 
278*b1cdbd2cSJim Jagielski                 @param nCurrLayerIndex
279*b1cdbd2cSJim Jagielski                 Index of current layer in maLayers
280*b1cdbd2cSJim Jagielski 
281*b1cdbd2cSJim Jagielski                 @param aFirstLayerShape
282*b1cdbd2cSJim Jagielski                 Valid iterator out of maAllShapes, denoting the first
283*b1cdbd2cSJim Jagielski                 shape from nCurrLayerIndex
284*b1cdbd2cSJim Jagielski 
285*b1cdbd2cSJim Jagielski                 @param aEndLayerShapes
286*b1cdbd2cSJim Jagielski                 Valid iterator or end iterator out of maAllShapes,
287*b1cdbd2cSJim Jagielski                 denoting one-behind-the-last shape of nCurrLayerIndex
288*b1cdbd2cSJim Jagielski              */
289*b1cdbd2cSJim Jagielski             void           commitLayerChanges( std::size_t                    nCurrLayerIndex,
290*b1cdbd2cSJim Jagielski                                                LayerShapeMap::const_iterator  aFirstLayerShape,
291*b1cdbd2cSJim Jagielski                                                LayerShapeMap::const_iterator  aEndLayerShapes );
292*b1cdbd2cSJim Jagielski 
293*b1cdbd2cSJim Jagielski             /** Init Shape layers with background layer.
294*b1cdbd2cSJim Jagielski              */
295*b1cdbd2cSJim Jagielski             void          putShape2BackgroundLayer( LayerShapeMap::value_type& rShapeEntry );
296*b1cdbd2cSJim Jagielski 
297*b1cdbd2cSJim Jagielski             /** Commits any pending layer reorg, due to shapes either
298*b1cdbd2cSJim Jagielski                 entering or leaving animation mode
299*b1cdbd2cSJim Jagielski 
300*b1cdbd2cSJim Jagielski                 @param bBackgroundLayerPainted
301*b1cdbd2cSJim Jagielski                 When true, LayerManager does not render anything on
302*b1cdbd2cSJim Jagielski                 the background layer. Use this, if background has been
303*b1cdbd2cSJim Jagielski                 updated by other means (e.g. slide transition)
304*b1cdbd2cSJim Jagielski             */
305*b1cdbd2cSJim Jagielski             void          updateShapeLayers( bool bBackgroundLayerPainted );
306*b1cdbd2cSJim Jagielski 
307*b1cdbd2cSJim Jagielski             /** Common stuff when adding a shape
308*b1cdbd2cSJim Jagielski              */
309*b1cdbd2cSJim Jagielski             void          implAddShape( const ShapeSharedPtr& rShape );
310*b1cdbd2cSJim Jagielski 
311*b1cdbd2cSJim Jagielski             /** Common stuff when removing a shape
312*b1cdbd2cSJim Jagielski              */
313*b1cdbd2cSJim Jagielski             void          implRemoveShape( const ShapeSharedPtr& rShape );
314*b1cdbd2cSJim Jagielski 
315*b1cdbd2cSJim Jagielski             /** Add or remove views
316*b1cdbd2cSJim Jagielski 
317*b1cdbd2cSJim Jagielski                 Sharing duplicate code from viewAdded and viewRemoved
318*b1cdbd2cSJim Jagielski                 method. The only point of variation at those places
319*b1cdbd2cSJim Jagielski                 are removal vs. adding.
320*b1cdbd2cSJim Jagielski              */
321*b1cdbd2cSJim Jagielski             template<typename LayerFunc,
322*b1cdbd2cSJim Jagielski                      typename ShapeFunc> void manageViews( LayerFunc layerFunc,
323*b1cdbd2cSJim Jagielski                                                            ShapeFunc shapeFunc );
324*b1cdbd2cSJim Jagielski 
325*b1cdbd2cSJim Jagielski             bool updateSprites();
326*b1cdbd2cSJim Jagielski 
327*b1cdbd2cSJim Jagielski             /// Registered views
328*b1cdbd2cSJim Jagielski             const UnoViewContainer&  mrViews;
329*b1cdbd2cSJim Jagielski 
330*b1cdbd2cSJim Jagielski             /// All layers of this object. Vector owns the layers
331*b1cdbd2cSJim Jagielski             LayerVector              maLayers;
332*b1cdbd2cSJim Jagielski 
333*b1cdbd2cSJim Jagielski             /** Contains all shapes with their XShape reference as the key
334*b1cdbd2cSJim Jagielski              */
335*b1cdbd2cSJim Jagielski             XShapeHash				 maXShapeHash;
336*b1cdbd2cSJim Jagielski 
337*b1cdbd2cSJim Jagielski             /** Set of shapes this LayerManager own
338*b1cdbd2cSJim Jagielski 
339*b1cdbd2cSJim Jagielski                 Contains the same set of shapes as XShapeHash, but is
340*b1cdbd2cSJim Jagielski                 sorted in z order, for painting and layer
341*b1cdbd2cSJim Jagielski                 association. Set entries are enriched with two flags
342*b1cdbd2cSJim Jagielski                 for buffering animation enable/disable changes, and
343*b1cdbd2cSJim Jagielski                 shape update requests.
344*b1cdbd2cSJim Jagielski             */
345*b1cdbd2cSJim Jagielski             LayerShapeMap            maAllShapes;
346*b1cdbd2cSJim Jagielski 
347*b1cdbd2cSJim Jagielski             /** Set of shapes that have requested an update
348*b1cdbd2cSJim Jagielski 
349*b1cdbd2cSJim Jagielski                 When a shape is member of this set, its maShapes entry
350*b1cdbd2cSJim Jagielski                 has bNeedsUpdate set to true. We maintain this
351*b1cdbd2cSJim Jagielski                 redundant information for faster update processing.
352*b1cdbd2cSJim Jagielski              */
353*b1cdbd2cSJim Jagielski             ShapeUpdateSet           maUpdateShapes;
354*b1cdbd2cSJim Jagielski 
355*b1cdbd2cSJim Jagielski             /** Overall slide bounds (in user coordinate
356*b1cdbd2cSJim Jagielski                 system). shapes that exceed this boundary are clipped,
357*b1cdbd2cSJim Jagielski                 thus, layers only need to be of this size.
358*b1cdbd2cSJim Jagielski              */
359*b1cdbd2cSJim Jagielski             const basegfx::B2DRange  maPageBounds;
360*b1cdbd2cSJim Jagielski 
361*b1cdbd2cSJim Jagielski             /// Number of shape sprites currenly active on this LayerManager
362*b1cdbd2cSJim Jagielski             sal_Int32                mnActiveSprites;
363*b1cdbd2cSJim Jagielski 
364*b1cdbd2cSJim Jagielski             /// sal_True, if shapes might need to move to different layer
365*b1cdbd2cSJim Jagielski             bool                     mbLayerAssociationDirty;
366*b1cdbd2cSJim Jagielski 
367*b1cdbd2cSJim Jagielski             /// sal_False when deactivated
368*b1cdbd2cSJim Jagielski             bool                     mbActive;
369*b1cdbd2cSJim Jagielski 
370*b1cdbd2cSJim Jagielski             /** When true, all sprite animations run in the foreground.  That
371*b1cdbd2cSJim Jagielski                 is, no extra layers are created, and the slideshow runs
372*b1cdbd2cSJim Jagielski                 potentially faster.
373*b1cdbd2cSJim Jagielski              */
374*b1cdbd2cSJim Jagielski             bool                     mbDisableAnimationZOrder;
375*b1cdbd2cSJim Jagielski         };
376*b1cdbd2cSJim Jagielski 
377*b1cdbd2cSJim Jagielski         typedef ::boost::shared_ptr< LayerManager > LayerManagerSharedPtr;
378*b1cdbd2cSJim Jagielski     }
379*b1cdbd2cSJim Jagielski }
380*b1cdbd2cSJim Jagielski 
381*b1cdbd2cSJim Jagielski #endif /* INCLUDED_SLIDESHOW_LAYERMANAGER_HXX */
382