xref: /trunk/main/slideshow/source/inc/tools.hxx (revision 7ee1d29c)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef INCLUDED_SLIDESHOW_TOOLS_HXX
25 #define INCLUDED_SLIDESHOW_TOOLS_HXX
26 
27 #include <com/sun/star/uno/Sequence.hxx>
28 #include <com/sun/star/beans/XPropertySet.hpp>
29 
30 #include <cppcanvas/color.hxx>
31 
32 #include "shapeattributelayer.hxx"
33 #include "shape.hxx"
34 #include "rgbcolor.hxx"
35 #include "hslcolor.hxx"
36 
37 #include <boost/shared_ptr.hpp>
38 #include <boost/current_function.hpp>
39 
40 #include <functional>
41 #include <cstdlib>
42 #include <string.h> // for strcmp
43 #include <algorithm>
44 
45 
46 #define OUSTR(x) ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(x) )
47 
48 
49 namespace com { namespace sun { namespace star { namespace beans {
50     struct NamedValue;
51 } } } }
52 namespace basegfx
53 {
54     class B2DRange;
55     class B2DVector;
56     class B2IVector;
57     class B2DHomMatrix;
58 }
59 namespace cppcanvas{ class Canvas; }
60 
61 class GDIMetaFile;
62 
63 /* Definition of some animation tools */
64 namespace slideshow
65 {
66     namespace internal
67     {
68         class UnoView;
69         class Shape;
70         class ShapeAttributeLayer;
71 
72         typedef ::boost::shared_ptr< GDIMetaFile > GDIMetaFileSharedPtr;
73 
74         template <typename T>
hash_value(T * const & p)75         inline ::std::size_t hash_value( T * const& p )
76         {
77             ::std::size_t d = static_cast< ::std::size_t >(
78                 reinterpret_cast< ::std::ptrdiff_t >(p) );
79             return d + (d >> 3);
80         }
81         // xxx todo: remove with boost::hash when 1.33 is available
82         template <typename T>
83         struct hash : ::std::unary_function<T, ::std::size_t>
84         {
operator ()slideshow::internal::hash85             ::std::size_t operator()( T const& val ) const {
86                 return hash_value(val);
87             }
88         };
89     }
90 }
91 
92 namespace com { namespace sun { namespace star { namespace uno {
93         // xxx todo: shift to namespace com::sun::star::uno when
94         //           1.33 is available
95         template <typename T>
hash_value(::com::sun::star::uno::Reference<T> const & x)96         inline ::std::size_t hash_value(
97             ::com::sun::star::uno::Reference<T> const& x )
98         {
99             // normalize to object root, because _only_ XInterface is defined
100             // to be stable during object lifetime:
101             ::com::sun::star::uno::Reference<
102                   ::com::sun::star::uno::XInterface> const xRoot(
103                       x, ::com::sun::star::uno::UNO_QUERY );
104             return slideshow::internal::hash<void *>()(xRoot.get());
105         }
106 }}}}
107 
108 namespace slideshow
109 {
110     namespace internal
111     {
112         /** Cycle mode of intrinsic animations
113          */
114         enum CycleMode
115         {
116             /// loop the animation back to back
117             CYCLE_LOOP,
118             /// loop, but play backwards from end to start
119             CYCLE_PINGPONGLOOP
120         };
121 
122 
123         // Value extraction from Any
124         // =========================
125 
126         /// extract unary double value from Any
127 		bool extractValue( double&								o_rValue,
128                            const ::com::sun::star::uno::Any& 	rSourceAny,
129                            const boost::shared_ptr<Shape>&		rShape,
130                            const basegfx::B2DVector&			rSlideBounds );
131 
132         /// extract int from Any
133         bool extractValue( sal_Int32&							o_rValue,
134                            const ::com::sun::star::uno::Any& 	rSourceAny,
135                            const boost::shared_ptr<Shape>&		rShape,
136                            const basegfx::B2DVector&			rSlideBounds );
137 
138         /// extract enum/constant group value from Any
139         bool extractValue( sal_Int16&							o_rValue,
140                            const ::com::sun::star::uno::Any& 	rSourceAny,
141                            const boost::shared_ptr<Shape>&		rShape,
142                            const basegfx::B2DVector&			rSlideBounds );
143 
144         /// extract color value from Any
145         bool extractValue( RGBColor&							o_rValue,
146                            const ::com::sun::star::uno::Any& 	rSourceAny,
147                            const boost::shared_ptr<Shape>&		rShape,
148                            const basegfx::B2DVector&			rSlideBounds );
149 
150         /// extract color value from Any
151         bool extractValue( HSLColor&							o_rValue,
152                            const ::com::sun::star::uno::Any& 	rSourceAny,
153                            const boost::shared_ptr<Shape>&		rShape,
154                            const basegfx::B2DVector&			rSlideBounds );
155 
156         /// extract plain string from Any
157         bool extractValue( ::rtl::OUString&						o_rValue,
158                            const ::com::sun::star::uno::Any& 	rSourceAny,
159                            const boost::shared_ptr<Shape>&		rShape,
160                            const basegfx::B2DVector&			rSlideBounds );
161 
162         /// extract bool value from Any
163         bool extractValue( bool&								o_rValue,
164                            const ::com::sun::star::uno::Any& 	rSourceAny,
165                            const boost::shared_ptr<Shape>&		rShape,
166                            const basegfx::B2DVector&			rSlideBounds );
167 
168         /// extract double 2-tuple from Any
169         bool extractValue( basegfx::B2DTuple&					o_rPair,
170                            const ::com::sun::star::uno::Any& 	rSourceAny,
171                            const boost::shared_ptr<Shape>&		rShape,
172                            const basegfx::B2DVector&			rSlideBounds );
173 
174         /** Search a sequence of NamedValues for a given element.
175 
176         	@return true, if the sequence contains the specified
177         	element.
178          */
179         bool findNamedValue( ::com::sun::star::uno::Sequence<
180                              	::com::sun::star::beans::NamedValue > const& rSequence,
181                              const ::com::sun::star::beans::NamedValue&	rSearchKey );
182 
183         /** Search a sequence of NamedValues for an element with a given name.
184 
185         	@param o_pRet
186             If non-NULL, receives the full NamedValue found (if it was
187             found, that is).
188 
189         	@return true, if the sequence contains the specified
190         	element.
191          */
192         bool findNamedValue( ::com::sun::star::beans::NamedValue* 		o_pRet,
193                              const ::com::sun::star::uno::Sequence<
194                              	::com::sun::star::beans::NamedValue >& 	rSequence,
195                              const ::rtl::OUString&						rSearchString );
196 
197         basegfx::B2DRange calcRelativeShapeBounds( const basegfx::B2DVector& rPageSize,
198                                                    const basegfx::B2DRange&  rShapeBounds );
199 
200         /** Get the shape transformation from the attribute set
201 
202 	        @param rBounds
203             Original shape bound rect (to substitute default attribute
204             layer values)
205 
206             @param pAttr
207             Attribute set. Might be NULL (then, rBounds is used to set
208             a simple scale and translate of the unit rect to rBounds).
209         */
210         basegfx::B2DHomMatrix getShapeTransformation(
211             const basegfx::B2DRange&                      rBounds,
212             const boost::shared_ptr<ShapeAttributeLayer>& pAttr );
213 
214         /** Get a shape's sprite transformation from the attribute set
215 
216 	        @param rPixelSize
217             Pixel size of the sprite
218 
219             @param rOrigSize
220             Original shape size (i.e. the size of the actual sprite
221             content, in the user coordinate system)
222 
223             @param pAttr
224             Attribute set. Might be NULL (then, rBounds is used to set
225             a simple scale and translate of the unit rect to rBounds).
226 
227             @return the transformation to be applied to the sprite.
228         */
229         basegfx::B2DHomMatrix getSpriteTransformation(
230             const basegfx::B2DVector&                     rPixelSize,
231             const basegfx::B2DVector&                     rOrigSize,
232             const boost::shared_ptr<ShapeAttributeLayer>& pAttr );
233 
234         /** Calc update area for a shape.
235 
236         	This method calculates the 'covered' area for the shape,
237         	i.e. the rectangle that is affected when rendering the
238         	shape. Apart from applying the given transformation to the
239         	shape rectangle, this method also takes attributes into
240         	account, which further scale the output (e.g. character
241         	sizes).
242 
243             @param rUnitBounds
244             Shape bounds, in the unit rect coordinate space
245 
246             @param rShapeTransform
247             Transformation matrix the shape should undergo.
248 
249             @param pAttr
250             Current shape attributes
251          */
252         basegfx::B2DRange getShapeUpdateArea(
253             const basegfx::B2DRange&                      rUnitBounds,
254             const basegfx::B2DHomMatrix&                  rShapeTransform,
255             const boost::shared_ptr<ShapeAttributeLayer>& pAttr );
256 
257         /** Calc update area for a shape.
258 
259         	This method calculates the 'covered' area for the shape,
260         	i.e. the rectangle that is affected when rendering the
261         	shape. The difference from the other getShapeUpdateArea()
262         	method is the fact that this one works without
263         	ShapeAttributeLayer, and only scales up the given shape
264         	user coordinate bound rect. The method is typically used
265         	to retrieve user coordinate system bound rects for shapes
266         	which are smaller than the default unit bound rect
267         	(because e.g. of subsetting)
268 
269             @param rUnitBounds
270             Shape bounds, in the unit rect coordinate space
271 
272             @param rShapeBounds
273             Current shape bounding box in user coordinate space.
274          */
275         basegfx::B2DRange getShapeUpdateArea( const basegfx::B2DRange& rUnitBounds,
276                                               const basegfx::B2DRange& rShapeBounds );
277 
278         /** Calc output position and size of shape, according to given
279             attribute layer.
280 
281             Rotations, shears etc. and not taken into account,
282             i.e. the returned rectangle is NOT the bounding box. Use
283             it as if aBounds.getMinimum() is the output position and
284             aBounds.getRange() the scaling of the shape.
285          */
286         basegfx::B2DRange getShapePosSize(
287             const basegfx::B2DRange&                      rOrigBounds,
288             const boost::shared_ptr<ShapeAttributeLayer>& pAttr );
289 
290         /** Convert a plain UNO API 32 bit int to RGBColor
291          */
292         RGBColor unoColor2RGBColor( sal_Int32 );
293         /** Convert an IntSRGBA to plain UNO API 32 bit int
294          */
295         sal_Int32 RGBAColor2UnoColor( cppcanvas::Color::IntSRGBA );
296 
297         /** Fill a plain rectangle on the given canvas with the given color
298          */
299         void fillRect( const boost::shared_ptr< cppcanvas::Canvas >& rCanvas,
300                        const basegfx::B2DRange&                      rRect,
301                        cppcanvas::Color::IntSRGBA                    aFillColor );
302 
303         /** Init canvas with default background (white)
304          */
305         void initSlideBackground( const boost::shared_ptr< cppcanvas::Canvas >& rCanvas,
306                                   const basegfx::B2IVector&                     rSize );
307 
308         /// Gets a random ordinal [0,n)
getRandomOrdinal(const::std::size_t n)309         inline ::std::size_t getRandomOrdinal( const ::std::size_t n )
310         {
311             return static_cast< ::std::size_t >(
312                 double(n) * rand() / (RAND_MAX + 1.0) );
313         }
314 
315         /// To work around ternary operator in initializer lists
316         /// (Solaris compiler problems)
317         template <typename T>
ternary_op(const bool cond,T const & arg1,T const & arg2)318         inline T const & ternary_op(
319             const bool cond, T const & arg1, T const & arg2 )
320         {
321             if (cond)
322                 return arg1;
323             else
324                 return arg2;
325         }
326 
327         template <typename ValueType>
getPropertyValue(ValueType & rValue,com::sun::star::uno::Reference<com::sun::star::beans::XPropertySet> const & xPropSet,rtl::OUString const & propName)328         inline bool getPropertyValue(
329             ValueType & rValue,
330             com::sun::star::uno::Reference<
331             com::sun::star::beans::XPropertySet> const & xPropSet,
332             rtl::OUString const & propName )
333         {
334             try {
335                 const com::sun::star::uno::Any& a(
336                     xPropSet->getPropertyValue( propName ) );
337                 bool const bRet = (a >>= rValue);
338 #if OSL_DEBUG_LEVEL > 0
339                 if( !bRet )
340                     OSL_TRACE( "%s: while retrieving property %s, cannot extract Any of type %s\n",
341                                ::rtl::OUStringToOString( propName,
342                                                          RTL_TEXTENCODING_ASCII_US ).getStr(),
343                                BOOST_CURRENT_FUNCTION,
344                                ::rtl::OUStringToOString( a.getValueTypeRef()->pTypeName,
345                                                          RTL_TEXTENCODING_ASCII_US ).getStr() );
346 #endif
347                 return bRet;
348             }
349             catch (com::sun::star::uno::RuntimeException &)
350             {
351                 throw;
352             }
353             catch (com::sun::star::uno::Exception &)
354             {
355                 return false;
356             }
357         }
358 
359         template <typename ValueType>
getPropertyValue(com::sun::star::uno::Reference<ValueType> & rIfc,com::sun::star::uno::Reference<com::sun::star::beans::XPropertySet> const & xPropSet,rtl::OUString const & propName)360         inline bool getPropertyValue(
361             com::sun::star::uno::Reference< ValueType >& rIfc,
362             com::sun::star::uno::Reference<
363             com::sun::star::beans::XPropertySet> const & xPropSet,
364             rtl::OUString const & propName )
365         {
366             try
367             {
368                 const com::sun::star::uno::Any& a(
369                     xPropSet->getPropertyValue( propName ));
370                 rIfc.set( a,
371                           com::sun::star::uno::UNO_QUERY );
372 
373                 bool const bRet = rIfc.is();
374 #if OSL_DEBUG_LEVEL > 0
375                 if( !bRet )
376                     OSL_TRACE( "%s: while retrieving property %s, cannot extract Any of type %s to interface\n",
377                                ::rtl::OUStringToOString( propName,
378                                                          RTL_TEXTENCODING_ASCII_US ).getStr(),
379                                BOOST_CURRENT_FUNCTION,
380                                ::rtl::OUStringToOString( a.getValueTypeRef()->pTypeName,
381                                                          RTL_TEXTENCODING_ASCII_US ).getStr() );
382 #endif
383                 return bRet;
384             }
385             catch (com::sun::star::uno::RuntimeException &)
386             {
387                 throw;
388             }
389             catch (com::sun::star::uno::Exception &)
390             {
391                 return false;
392             }
393         }
394 
395         /// Get the content of the BoundRect shape property
396         basegfx::B2DRange getAPIShapeBounds( const ::com::sun::star::uno::Reference<
397                                                 ::com::sun::star::drawing::XShape >& xShape );
398 
399         /// Get the content of the ZOrder shape property
400         double getAPIShapePrio( const ::com::sun::star::uno::Reference<
401                                       ::com::sun::star::drawing::XShape >& xShape );
402 
403         basegfx::B2IVector getSlideSizePixel( const basegfx::B2DVector&         rSize,
404                                               const boost::shared_ptr<UnoView>& pView );
405     }
406 }
407 
408 #endif /* INCLUDED_SLIDESHOW_TOOLS_HXX */
409