1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_slideshow.hxx"
30 
31 #include <canvas/debug.hxx>
32 #include <basegfx/matrix/b2dhommatrix.hxx>
33 #include <basegfx/numeric/ftools.hxx>
34 #include <basegfx/matrix/b2dhommatrixtools.hxx>
35 #include "randomwipe.hxx"
36 #include "tools.hxx"
37 
38 
39 namespace slideshow {
40 namespace internal {
41 
42 RandomWipe::RandomWipe( sal_Int32 nElements, bool randomBars )
43     : m_positions( new ::basegfx::B2DPoint[ nElements ] ),
44       m_nElements( nElements ),
45       m_rect( createUnitRect() )
46 {
47     ::basegfx::B2DHomMatrix aTransform;
48     if (randomBars)
49     {
50         double edge = (1.0 / nElements);
51         for ( sal_Int32 pos = nElements; pos--; )
52             m_positions[ pos ].setY( ::basegfx::pruneScaleValue( pos * edge ) );
53         aTransform.scale( 1.0, ::basegfx::pruneScaleValue(edge) );
54     }
55     else // dissolve effect
56     {
57         sal_Int32 sqrtElements = static_cast<sal_Int32>(
58             sqrt( static_cast<double>(nElements) ) );
59         double edge = (1.0 / sqrtElements);
60         for ( sal_Int32 pos = nElements; pos--; ) {
61             m_positions[ pos ] = ::basegfx::B2DPoint(
62                 ::basegfx::pruneScaleValue( (pos % sqrtElements) * edge ),
63                 ::basegfx::pruneScaleValue( (pos / sqrtElements) * edge ) );
64         }
65         const double pedge = ::basegfx::pruneScaleValue(edge);
66         aTransform.scale( pedge, pedge );
67     }
68     m_rect.transform( aTransform );
69 
70     // mix up:
71     for (sal_Int32 nIndex=0; nIndex<nElements; ++nIndex)
72     {
73         const sal_Int32 nOtherIndex (getRandomOrdinal(nElements));
74         OSL_ASSERT(nOtherIndex>=0 && nOtherIndex<nElements);
75         ::std::swap(m_positions[nIndex], m_positions[nOtherIndex]);
76     }
77 }
78 
79 ::basegfx::B2DPolyPolygon RandomWipe::operator () ( double t )
80 {
81     ::basegfx::B2DPolyPolygon res;
82     for ( sal_Int32 pos = static_cast<sal_Int32>(t * m_nElements); pos--; )
83     {
84         ::basegfx::B2DPoint const & point = m_positions[ pos ];
85         ::basegfx::B2DPolygon poly( m_rect );
86         poly.transform(basegfx::tools::createTranslateB2DHomMatrix(point.getX(), point.getY()));
87         res.append( poly );
88     }
89     return res;
90 }
91 
92 }
93 }
94