Branch data 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 : : #include <drawinglayer/primitive2d/animatedprimitive2d.hxx>
21 : : #include <drawinglayer/animation/animationtiming.hxx>
22 : : #include <drawinglayer/primitive2d/transformprimitive2d.hxx>
23 : : #include <drawinglayer/geometry/viewinformation2d.hxx>
24 : : #include <drawinglayer/primitive2d/drawinglayer_primitivetypes2d.hxx>
25 : :
26 : : //////////////////////////////////////////////////////////////////////////////
27 : :
28 : : using namespace com::sun::star;
29 : :
30 : : //////////////////////////////////////////////////////////////////////////////
31 : :
32 : : namespace drawinglayer
33 : : {
34 : : namespace primitive2d
35 : : {
36 : 0 : AnimatedSwitchPrimitive2D::AnimatedSwitchPrimitive2D(
37 : : const animation::AnimationEntry& rAnimationEntry,
38 : : const Primitive2DSequence& rChildren,
39 : : bool bIsTextAnimation)
40 : : : GroupPrimitive2D(rChildren),
41 : : mpAnimationEntry(0),
42 : 0 : mbIsTextAnimation(bIsTextAnimation)
43 : : {
44 : : // clone given animation description
45 [ # # ]: 0 : mpAnimationEntry = rAnimationEntry.clone();
46 : 0 : }
47 : :
48 : 0 : AnimatedSwitchPrimitive2D::~AnimatedSwitchPrimitive2D()
49 : : {
50 : : // delete cloned animation description
51 [ # # ][ # # ]: 0 : delete mpAnimationEntry;
52 [ # # ]: 0 : }
53 : :
54 : 0 : bool AnimatedSwitchPrimitive2D::operator==(const BasePrimitive2D& rPrimitive) const
55 : : {
56 [ # # ]: 0 : if(GroupPrimitive2D::operator==(rPrimitive))
57 : : {
58 : 0 : const AnimatedSwitchPrimitive2D& rCompare = static_cast< const AnimatedSwitchPrimitive2D& >(rPrimitive);
59 : :
60 : 0 : return (getAnimationEntry() == rCompare.getAnimationEntry());
61 : : }
62 : :
63 : 0 : return false;
64 : : }
65 : :
66 : 0 : Primitive2DSequence AnimatedSwitchPrimitive2D::get2DDecomposition(const geometry::ViewInformation2D& rViewInformation) const
67 : : {
68 [ # # ]: 0 : if(getChildren().hasElements())
69 : : {
70 [ # # ][ # # ]: 0 : const double fState(getAnimationEntry().getStateAtTime(rViewInformation.getViewTime()));
71 : 0 : const sal_uInt32 nLen(getChildren().getLength());
72 : 0 : sal_uInt32 nIndex(basegfx::fround(fState * (double)nLen));
73 : :
74 [ # # ]: 0 : if(nIndex >= nLen)
75 : : {
76 : 0 : nIndex = nLen - 1L;
77 : : }
78 : :
79 [ # # ]: 0 : const Primitive2DReference xRef(getChildren()[nIndex], uno::UNO_QUERY_THROW);
80 [ # # ]: 0 : return Primitive2DSequence(&xRef, 1L);
81 : : }
82 : :
83 : 0 : return Primitive2DSequence();
84 : : }
85 : :
86 : : // provide unique ID
87 : 0 : ImplPrimitrive2DIDBlock(AnimatedSwitchPrimitive2D, PRIMITIVE2D_ID_ANIMATEDSWITCHPRIMITIVE2D)
88 : :
89 : : } // end of namespace primitive2d
90 : : } // end of namespace drawinglayer
91 : :
92 : : //////////////////////////////////////////////////////////////////////////////
93 : :
94 : : namespace drawinglayer
95 : : {
96 : : namespace primitive2d
97 : : {
98 : 0 : AnimatedBlinkPrimitive2D::AnimatedBlinkPrimitive2D(
99 : : const animation::AnimationEntry& rAnimationEntry,
100 : : const Primitive2DSequence& rChildren,
101 : : bool bIsTextAnimation)
102 : 0 : : AnimatedSwitchPrimitive2D(rAnimationEntry, rChildren, bIsTextAnimation)
103 : : {
104 : 0 : }
105 : :
106 : 0 : Primitive2DSequence AnimatedBlinkPrimitive2D::get2DDecomposition(const geometry::ViewInformation2D& rViewInformation) const
107 : : {
108 [ # # ]: 0 : if(getChildren().hasElements())
109 : : {
110 : 0 : const double fState(getAnimationEntry().getStateAtTime(rViewInformation.getViewTime()));
111 : :
112 [ # # ]: 0 : if(fState < 0.5)
113 : : {
114 : 0 : return getChildren();
115 : : }
116 : : }
117 : :
118 : 0 : return Primitive2DSequence();
119 : : }
120 : :
121 : : // provide unique ID
122 : 0 : ImplPrimitrive2DIDBlock(AnimatedBlinkPrimitive2D, PRIMITIVE2D_ID_ANIMATEDBLINKPRIMITIVE2D)
123 : :
124 : : } // end of namespace primitive2d
125 : : } // end of namespace drawinglayer
126 : :
127 : : //////////////////////////////////////////////////////////////////////////////
128 : :
129 : : namespace drawinglayer
130 : : {
131 : : namespace primitive2d
132 : : {
133 : 0 : AnimatedInterpolatePrimitive2D::AnimatedInterpolatePrimitive2D(
134 : : const std::vector< basegfx::B2DHomMatrix >& rmMatrixStack,
135 : : const animation::AnimationEntry& rAnimationEntry,
136 : : const Primitive2DSequence& rChildren,
137 : : bool bIsTextAnimation)
138 : : : AnimatedSwitchPrimitive2D(rAnimationEntry, rChildren, bIsTextAnimation),
139 [ # # ]: 0 : maMatrixStack()
140 : : {
141 : : // copy matrices to locally pre-decomposed matrix stack
142 : 0 : const sal_uInt32 nCount(rmMatrixStack.size());
143 [ # # ]: 0 : maMatrixStack.reserve(nCount);
144 : :
145 [ # # ]: 0 : for(sal_uInt32 a(0L); a < nCount; a++)
146 : : {
147 [ # # ][ # # ]: 0 : maMatrixStack.push_back(basegfx::tools::B2DHomMatrixBufferedDecompose(rmMatrixStack[a]));
[ # # ][ # # ]
148 : : }
149 : 0 : }
150 : :
151 : 0 : Primitive2DSequence AnimatedInterpolatePrimitive2D::get2DDecomposition(const geometry::ViewInformation2D& rViewInformation) const
152 : : {
153 : 0 : const sal_uInt32 nSize(maMatrixStack.size());
154 : :
155 [ # # ]: 0 : if(nSize)
156 : : {
157 [ # # ][ # # ]: 0 : double fState(getAnimationEntry().getStateAtTime(rViewInformation.getViewTime()));
158 : :
159 [ # # ]: 0 : if(fState < 0.0)
160 : : {
161 : 0 : fState = 0.0;
162 : : }
163 [ # # ]: 0 : else if(fState > 1.0)
164 : : {
165 : 0 : fState = 1.0;
166 : : }
167 : :
168 : 0 : const double fIndex(fState * (double)(nSize - 1L));
169 : 0 : const sal_uInt32 nIndA(sal_uInt32(floor(fIndex)));
170 : 0 : const double fOffset(fIndex - (double)nIndA);
171 [ # # ]: 0 : basegfx::B2DHomMatrix aTargetTransform;
172 [ # # ]: 0 : std::vector< basegfx::tools::B2DHomMatrixBufferedDecompose >::const_iterator aMatA(maMatrixStack.begin() + nIndA);
173 : :
174 [ # # ]: 0 : if(basegfx::fTools::equalZero(fOffset))
175 : : {
176 : : // use matrix from nIndA directly
177 [ # # ][ # # ]: 0 : aTargetTransform = aMatA->getB2DHomMatrix();
[ # # ][ # # ]
178 : : }
179 : : else
180 : : {
181 : : // interpolate. Get involved buffered decomposed matrices
182 : 0 : const sal_uInt32 nIndB((nIndA + 1L) % nSize);
183 [ # # ]: 0 : std::vector< basegfx::tools::B2DHomMatrixBufferedDecompose >::const_iterator aMatB(maMatrixStack.begin() + nIndB);
184 : :
185 : : // interpolate for fOffset [0.0 .. 1.0[
186 [ # # ][ # # ]: 0 : const basegfx::B2DVector aScale(basegfx::interpolate(aMatA->getScale(), aMatB->getScale(), fOffset));
187 [ # # ][ # # ]: 0 : const basegfx::B2DVector aTranslate(basegfx::interpolate(aMatA->getTranslate(), aMatB->getTranslate(), fOffset));
188 [ # # ][ # # ]: 0 : const double fRotate(((aMatB->getRotate() - aMatA->getRotate()) * fOffset) + aMatA->getRotate());
[ # # ]
189 [ # # ][ # # ]: 0 : const double fShearX(((aMatB->getShearX() - aMatA->getShearX()) * fOffset) + aMatA->getShearX());
[ # # ]
190 : :
191 : : // build matrix for state
192 : : aTargetTransform = basegfx::tools::createScaleShearXRotateTranslateB2DHomMatrix(
193 [ # # ][ # # ]: 0 : aScale, fShearX, fRotate, aTranslate);
[ # # ]
194 : : }
195 : :
196 : : // create new transform primitive reference, return new sequence
197 [ # # ][ # # ]: 0 : const Primitive2DReference xRef(new TransformPrimitive2D(aTargetTransform, getChildren()));
[ # # ]
198 [ # # ][ # # ]: 0 : return Primitive2DSequence(&xRef, 1L);
199 : : }
200 : : else
201 : : {
202 : 0 : return getChildren();
203 : : }
204 : : }
205 : :
206 : : // provide unique ID
207 : 0 : ImplPrimitrive2DIDBlock(AnimatedInterpolatePrimitive2D, PRIMITIVE2D_ID_ANIMATEDINTERPOLATEPRIMITIVE2D)
208 : :
209 : : } // end of namespace primitive2d
210 : : } // end of namespace drawinglayer
211 : :
212 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|