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