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