20#include <com/sun/star/animations/XAnimationNodeSupplier.hpp>
21#include <com/sun/star/animations/AnimationFill.hpp>
22#include <com/sun/star/animations/AnimationRestart.hpp>
23#include <com/sun/star/animations/Timing.hpp>
24#include <com/sun/star/animations/Event.hpp>
25#include <com/sun/star/animations/AnimationEndSync.hpp>
26#include <com/sun/star/animations/EventTrigger.hpp>
27#include <com/sun/star/presentation/EffectNodeType.hpp>
28#include <com/sun/star/presentation/EffectPresetClass.hpp>
29#include <com/sun/star/animations/AnimationNodeType.hpp>
30#include <com/sun/star/animations/AnimationTransformType.hpp>
31#include <com/sun/star/animations/AnimationCalcMode.hpp>
32#include <com/sun/star/util/XCloneable.hpp>
33#include <com/sun/star/animations/AnimationAdditiveMode.hpp>
34#include <com/sun/star/animations/XAnimateSet.hpp>
35#include <com/sun/star/animations/XAudio.hpp>
36#include <com/sun/star/animations/XTransitionFilter.hpp>
37#include <com/sun/star/animations/XAnimateColor.hpp>
38#include <com/sun/star/animations/XAnimateMotion.hpp>
39#include <com/sun/star/animations/XAnimateTransform.hpp>
40#include <com/sun/star/animations/ValuePair.hpp>
41#include <com/sun/star/animations/AnimationColorSpace.hpp>
42#include <com/sun/star/drawing/FillStyle.hpp>
43#include <com/sun/star/drawing/LineStyle.hpp>
44#include <com/sun/star/drawing/XDrawPage.hpp>
45#include <com/sun/star/awt/FontWeight.hpp>
46#include <com/sun/star/awt/FontUnderline.hpp>
47#include <com/sun/star/awt/FontSlant.hpp>
48#include <com/sun/star/container/XEnumerationAccess.hpp>
49#include <com/sun/star/presentation/ParagraphTarget.hpp>
50#include <com/sun/star/text/XSimpleText.hpp>
51#include <com/sun/star/animations/XIterateContainer.hpp>
52#include <com/sun/star/presentation/TextAnimationType.hpp>
57#include "../ppt/pptanimations.hxx"
59#include <osl/diagnose.h>
66using ::com::sun::star::uno::Any;
67using ::com::sun::star::util::XCloneable;
68using ::com::sun::star::uno::Reference;
69using ::com::sun::star::uno::UNO_QUERY;
70using ::com::sun::star::uno::UNO_QUERY_THROW;
71using ::com::sun::star::uno::Sequence;
72using ::com::sun::star::uno::Exception;
73using ::com::sun::star::beans::NamedValue;
74using ::com::sun::star::container::XEnumerationAccess;
75using ::com::sun::star::container::XEnumeration;
95 if( rString.equalsAscii(
p->mpAPIName ) )
104 rString += OUString::createFromAscii(
p->mpMSName );
107 rString = OUString::createFromAscii(
p->mpMSName );
112 const char* pDest[] = {
"#ppt_x",
"#ppt_y",
"#ppt_w",
"#ppt_h",
nullptr };
113 const char* pSource[] = {
"x",
"y",
"width",
"height",
nullptr };
116 const char** ps = pSource;
117 const char** pd = pDest;
121 const OUString aSearch( OUString::createFromAscii( *ps ) );
122 while( (
nIndex = rString.indexOf( aSearch,
nIndex )) != -1 )
124 sal_Int32
nLength = aSearch.getLength();
131 const OUString aNew( OUString::createFromAscii( *pd ) );
133 nIndex += aNew.getLength();
143 sal_uInt32 nPresetSubType = 0;
144 bool bTranslated =
false;
146 if ( ( nPresetClass == sal_uInt32(EffectPresetClass::ENTRANCE) ) || ( nPresetClass == sal_uInt32(EffectPresetClass::EXIT) ) )
148 if ( nPresetId != 21 )
154 if ( rPresetSubType ==
u"downward" )
159 else if ( rPresetSubType ==
u"across" )
168 if ( rPresetSubType ==
u"across" )
177 if ( rPresetSubType ==
u"right-to-top" )
182 else if ( rPresetSubType ==
u"right-to-bottom" )
187 else if ( rPresetSubType ==
u"left-to-top" )
192 else if ( rPresetSubType ==
u"left-to-bottom" )
204 while(
p->mpStrSubType )
208 nPresetSubType =
p->mnID;
218 return nPresetSubType;
223 const char* pRet =
nullptr;
232 if ( nSubType ==
p->mnSubType )
234 if ( bDirection ==
p->mbDirection )
263 mrSolverContainer ( rSolverContainer ),
264 mrExSoundCollection ( rExSoundCollection ),
271 sal_Int16 nFill = xNode->getFill();
274 if ((xNode->getType() == AnimationNodeType::ANIMATE)
275 ||(xNode->getType() == AnimationNodeType::SET)
276 ||(xNode->getType() == AnimationNodeType::TRANSITIONFILTER))
278 if ( nFill == AnimationFill::DEFAULT )
282 if ( nFill == AnimationFill::DEFAULT )
284 nFill = nFillDefault;
286 if( nFill == AnimationFill::AUTO )
288 nFill = AnimationFill::REMOVE;
289 bool bIsIndefiniteTiming =
true;
290 Any aAny = xNode->getDuration();
291 if( aAny.hasValue() )
294 if( aAny >>= eTiming )
295 bIsIndefiniteTiming = eTiming == Timing_INDEFINITE;
297 if ( bIsIndefiniteTiming )
299 aAny = xNode->getEnd();
300 if( aAny.hasValue() )
303 if( aAny >>= eTiming )
304 bIsIndefiniteTiming = eTiming == Timing_INDEFINITE;
306 if ( bIsIndefiniteTiming )
308 if ( !xNode->getRepeatCount().hasValue() )
310 aAny = xNode->getRepeatDuration();
311 if( aAny.hasValue() )
314 if( aAny >>= eTiming )
315 bIsIndefiniteTiming = eTiming == Timing_INDEFINITE;
317 if ( bIsIndefiniteTiming )
318 nFill = AnimationFill::FREEZE;
328 Reference< XAnimationNodeSupplier > xNodeSupplier( xPage, UNO_QUERY );
329 if( xNodeSupplier.is() )
331 const Reference< XAnimationNode > xRootNode( xNodeSupplier->getAnimationNode() );
344 Reference< XEnumerationAccess > xEnumerationAccess( xRootNode, UNO_QUERY_THROW );
345 Reference< XEnumeration > xEnumeration( xEnumerationAccess->createEnumeration(), css::uno::UNO_SET_THROW );
346 while( xEnumeration->hasMoreElements() )
348 Reference< XAnimationNode > xNode( xEnumeration->nextElement(), UNO_QUERY_THROW );
350 Reference< XEnumerationAccess > xEnumerationAccess2( xNode, UNO_QUERY );
351 if ( xEnumerationAccess2.is() )
353 Reference< XEnumeration > xEnumeration2( xEnumerationAccess2->createEnumeration(), css::uno::UNO_SET_THROW );
354 while( xEnumeration2->hasMoreElements() )
356 Reference< XAnimationNode > xChildNode( xEnumeration2->nextElement(), UNO_QUERY_THROW );
358 Reference< XEnumerationAccess > xEnumerationAccess3( xChildNode, UNO_QUERY_THROW );
359 Reference< XEnumeration > xEnumeration3( xEnumerationAccess3->createEnumeration(), css::uno::UNO_SET_THROW );
360 while( xEnumeration3->hasMoreElements() )
362 Reference< XAnimationNode > xChildNode2( xEnumeration3->nextElement(), UNO_QUERY_THROW );
364 Reference< XEnumerationAccess > xEnumerationAccess4( xChildNode2, UNO_QUERY_THROW );
365 Reference< XEnumeration > xEnumeration4( xEnumerationAccess4->createEnumeration(), css::uno::UNO_SET_THROW );
366 while( xEnumeration4->hasMoreElements() )
368 Reference< XAnimationNode > xChildNode3( xEnumeration4->nextElement(), UNO_QUERY_THROW );
370 switch( xChildNode3->getType() )
373 case AnimationNodeType::SET:
374 case AnimationNodeType::ANIMATECOLOR:
376 Reference< XAnimationNode > xMaster;
378 const Sequence< NamedValue > aUserData( xChildNode3->getUserData() );
379 const NamedValue*
p = std::find_if(aUserData.begin(), aUserData.end(),
380 [](
const NamedValue& rProp) { return rProp.Name ==
"master-element"; });
382 if (
p != aUserData.end())
383 p->Value >>= xMaster;
385 AfterEffectNodePtr pAfterEffectNode = std::make_shared<AfterEffectNode>( xChildNode3, xMaster );
414 xAfterEffectNode = (*aIter)->mxNode;
425 if( xNode.is() )
switch( xNode->getType() )
427 case AnimationNodeType::PAR :
428 case AnimationNodeType::SEQ :
429 case AnimationNodeType::ITERATE :
431 Reference< XEnumerationAccess > xEnumerationAccess( xNode, UNO_QUERY );
432 if( xEnumerationAccess.is() )
434 Reference< XEnumeration > xEnumeration = xEnumerationAccess->createEnumeration();
435 if( xEnumeration.is() )
437 while( xEnumeration->hasMoreElements() )
439 Reference< XAnimationNode > xChildNode( xEnumeration->nextElement(), UNO_QUERY );
440 if( xChildNode.is() && !
isEmptyNode( xChildNode ) )
448 case AnimationNodeType::SET :
449 case AnimationNodeType::ANIMATECOLOR :
459 const sal_uInt16 nInstance,
const sal_Int32 nGroupLevel,
const bool bTakeBackInteractiveSequenceTiming,
const sal_Int16 nFDef )
461 auto xNode = xNode_in;
472 bool bTakeBackInteractiveSequenceTimingForChild =
false;
473 sal_Int16 nFillDefault =
GetFillMode( xNode, nFDef );
475 Reference< XAnimationNode > xAudioNode;
476 static sal_uInt32 nAudioGroup;
479 bool bSkipChildren =
false;
481 switch( xNode->getType() )
483 case AnimationNodeType::CUSTOM :
492 case AnimationNodeType::PAR :
496 sal_Int32 nFlags = nGroupLevel == 2 ? 0x10 : 0;
497 if ( bTakeBackInteractiveSequenceTiming )
504 case AnimationNodeType::SEQ :
508 sal_Int32 nFlags = 12;
509 if ( ( nGroupLevel == 1 ) && ( nNodeType == css::presentation::EffectNodeType::INTERACTIVE_SEQUENCE ) )
512 bTakeBackInteractiveSequenceTimingForChild =
true;
520 case AnimationNodeType::ITERATE :
528 switch( xNode->getRestart() )
531 case AnimationRestart::DEFAULT : aAnim.
mnRestart = 0;
break;
532 case AnimationRestart::ALWAYS : aAnim.
mnRestart = 1;
break;
533 case AnimationRestart::WHEN_NOT_ACTIVE : aAnim.
mnRestart = 2;
break;
534 case AnimationRestart::NEVER : aAnim.
mnRestart = 3;
break;
537 switch( xNode->getFill() )
540 case AnimationFill::DEFAULT : aAnim.
mnFill = 0;
break;
541 case AnimationFill::REMOVE : aAnim.
mnFill = 1;
break;
542 case AnimationFill::FREEZE : aAnim.
mnFill = 2;
break;
543 case AnimationFill::HOLD : aAnim.
mnFill = 3;
break;
544 case AnimationFill::TRANSITION : aAnim.
mnFill = 4;
break;
555 case AnimationNodeType::ANIMATE :
565 case AnimationNodeType::SET :
568 if( (nGroupLevel != 4) || !bIsAfterEffectNode )
578 bSkipChildren =
true;
583 case AnimationNodeType::ANIMATEMOTION :
593 case AnimationNodeType::ANIMATECOLOR :
596 if( (nGroupLevel != 4) || !bIsAfterEffectNode )
598 if( bIsAfterEffectNode )
609 bSkipChildren =
true;
614 case AnimationNodeType::ANIMATETRANSFORM :
624 case AnimationNodeType::TRANSITIONFILTER :
634 case AnimationNodeType::AUDIO :
639 Reference< XAudio > xAudio( xNode, UNO_QUERY );
642 Any aAny( xAudio->getSource() );
645 if ( ( aAny >>=
aURL) && !
aURL.isEmpty() )
648 sal_Int32 nTrigger = 3;
649 sal_Int32 nU3 = nAudioGroup;
650 sal_Int32 nBegin = 0;
670 sal_uInt32
const nRefMode = 3;
671 sal_uInt32
const nRefType = 2;
673 sal_Int32
const begin = -1;
674 sal_Int32
const end = -1;
688 Reference< XAnimationNode > xAfterEffectNode;
694 Reference< XEnumerationAccess > xEnumerationAccess( xNode, UNO_QUERY );
695 if( xEnumerationAccess.is() )
697 Reference< XEnumeration > xEnumeration = xEnumerationAccess->createEnumeration();
698 if( xEnumeration.is() )
700 while( xEnumeration->hasMoreElements() )
702 Reference< XAnimationNode > xChildNode( xEnumeration->nextElement(), UNO_QUERY );
703 if( xChildNode.is() )
705 if ( xChildNode->getType() == AnimationNodeType::AUDIO )
707 xAudioNode = xChildNode;
718 if ( xAudioNode.is() )
721 if( xNode->getType() == AnimationNodeType::ITERATE )
729 Reference< css::util::XCloneable > xClonable( xNode, UNO_QUERY_THROW );
730 Reference< XAnimationNode > xCloneNode( xClonable->createClone(), UNO_QUERY_THROW );
733 xCloneNode->setBegin( aEmpty );
739 OSL_FAIL(
"(@CL)sd::ppt::AnimationExporter::createAfterEffectNodeClone(), could not create clone!" );
747 const Sequence< NamedValue > aUserData = xNode->getUserData();
748 for(
const NamedValue& rProp : aUserData )
750 if ( rProp.Name ==
"node-type" )
752 if ( rProp.Value >>=
nType )
761 const sal_Int16 nFillDefault )
767 switch( xNode->getRestart() )
770 case AnimationRestart::DEFAULT : aAnim.
mnRestart = 0;
break;
771 case AnimationRestart::ALWAYS : aAnim.
mnRestart = 1;
break;
772 case AnimationRestart::WHEN_NOT_ACTIVE : aAnim.
mnRestart = 2;
break;
773 case AnimationRestart::NEVER : aAnim.
mnRestart = 3;
break;
776 switch( nFillDefault )
779 case AnimationFill::DEFAULT : aAnim.
mnFill = 0;
break;
780 case AnimationFill::REMOVE : aAnim.
mnFill = 1;
break;
781 case AnimationFill::FREEZE :
782 case AnimationFill::HOLD : aAnim.
mnFill = 3;
break;
783 case AnimationFill::TRANSITION : aAnim.
mnFill = 4;
break;
786 double fDuration = 0.0;
787 css::animations::Timing eTiming;
788 if ( xNode->getDuration() >>= eTiming )
790 if ( eTiming == Timing_INDEFINITE )
793 else if ( xNode->getDuration() >>= fDuration )
795 aAnim.
mnDuration =
static_cast<sal_Int32
>( fDuration * 1000.0 );
803 switch( xNode->getType() )
805 case AnimationNodeType::PAR :
808 case AnimationNodeType::SEQ :
814 case css::presentation::EffectNodeType::TIMING_ROOT : aAnim.
mnNodeType = 0x12;
break;
815 case css::presentation::EffectNodeType::MAIN_SEQUENCE : aAnim.
mnNodeType = 0x18;
break;
820 case AnimationNodeType::ANIMATE :
821 case AnimationNodeType::SET :
823 case AnimationNodeType::CUSTOM :
824 case AnimationNodeType::ITERATE :
825 case AnimationNodeType::ANIMATEMOTION :
826 case AnimationNodeType::ANIMATECOLOR :
827 case AnimationNodeType::ANIMATETRANSFORM :
834 case AnimationNodeType::AUDIO :
841 case AnimationNodeType::TRANSITIONFILTER :
855 memset( pAny, 0, nLen );
856 if ( !rUserData.hasElements() )
859 for(
const NamedValue& rProp : rUserData )
861 if ( rProp.Name ==
"node-type" )
865 else if ( rProp.Name ==
"preset-class" )
869 else if ( rProp.Name ==
"preset-id" )
873 else if ( rProp.Name ==
"preset-sub-type" )
877 else if ( rProp.Name ==
"master-element" )
886 sal_uInt32 nPresetId = 0;
891 size_t nLast = aPreset.rfind(
'_' );
892 if ( ( nLast != std::u16string_view::npos ) && ( ( nLast + 1 ) < aPreset.size() ) )
894 std::u16string_view aNumber( aPreset.substr( nLast + 1 ) );
902 while(
p->mpStrPresetId && ((
p->mnPresetClass !=
static_cast<sal_Int32
>(nAPIPresetClass)) || !
o3tl::equalsAscii(aPreset,
p->mpStrPresetId )) )
905 if(
p->mpStrPresetId )
907 nPresetId =
p->mnPresetId;
917 sal_Int16 nNodeType = css::presentation::EffectNodeType::DEFAULT;
921 Reference< XAnimationNode > xMaster;
923 Any aMasterRel, aOverride, aRunTimeContext;
926 const Sequence< NamedValue > aUserData = xNode->getUserData();
936 sal_Int32 nMasterRel = 2;
937 if( xNode.is() && xMaster.is() && (xNode->getParent() == xMaster->getParent() ) )
940 aMasterRel <<= nMasterRel;
944 aOverride <<= sal_Int32(1);
947 aRunTimeContext <<= sal_Int32(1);
969 sal_uInt32 nPresetId = 0;
970 sal_uInt32 nPresetSubType = 0;
971 sal_uInt32 nAPIPresetClass = EffectPresetClass::CUSTOM;
973 bool bPresetClass, bPresetId, bPresetSubType;
974 bPresetId = bPresetClass = bPresetSubType =
false;
981 switch( nAPIPresetClass )
992 nPresetClass = nPPTPresetClass;
1000 nPresetId =
GetPresetID( sPreset, nAPIPresetClass, bPresetId );
1005 OUString sPresetSubType;
1009 bPresetSubType =
true;
1014 if ( bPresetSubType )
1026 bool bAfterEffect =
false;
1033 sal_Int32 nRunTimeContext = 0;
1044 Reference< XAnimateColor > xColor( xNode, UNO_QUERY );
1048 bool bDirection = !xColor->getDirection();
1055 sal_Int32 nOverride = 0;
1062 sal_Int32 nMasterRel = 0;
1076 Reference< XAnimate > xAnim( xNode, UNO_QUERY );
1095 if ( rAny.hasValue() )
1097 switch( rAny.getValueType().getTypeClass() )
1099 case css::uno::TypeClass_UNSIGNED_SHORT :
1100 case css::uno::TypeClass_SHORT :
1101 case css::uno::TypeClass_UNSIGNED_LONG :
1102 case css::uno::TypeClass_LONG :
1105 if ( rAny >>= nVal )
1113 case css::uno::TypeClass_DOUBLE :
1116 if ( rAny >>= fVal )
1123 case css::uno::TypeClass_FLOAT :
1126 if ( rAny >>= fVal )
1130 OUString aNumber( OUString::number( fVal ) );
1141 case css::uno::TypeClass_STRING :
1144 if ( rAny >>=
aStr )
1161 OUString
aStr( rVal );
1170 float fFloat =
static_cast<float>(rVal);
1191 for (
size_t i = 0;
i < aVal.size();
i++ )
1200 sal_Int32
const nConcurrent = 1;
1201 sal_Int32
const nNextAction = 1;
1202 sal_Int32 nEndSync = 0;
1203 sal_Int32
const nU4 = 0;
1204 sal_Int32
const nU5 = 3;
1206 sal_Int16 nAnimationEndSync = 0;
1207 if ( xNode->getEndSync() >>= nAnimationEndSync )
1209 if ( nAnimationEndSync == AnimationEndSync::ALL )
1226 for (
i = 0;
i < 4;
i++ )
1229 sal_Int32 nTrigger = 0;
1231 sal_Int32 nBegin = 0;
1233 bool bCreateEvent =
false;
1243 css::animations::Timing eTiming;
1246 if ( nFlags & 0x20 )
1249 Reference< XEnumerationAccess > xEA( xNode, UNO_QUERY_THROW );
1250 Reference< XEnumeration > xE( xEA->createEnumeration(), css::uno::UNO_SET_THROW );
1251 if ( xE->hasMoreElements() )
1253 Reference< XAnimationNode > xClickNode( xE->nextElement(), UNO_QUERY );
1254 aAny = xClickNode->getBegin();
1257 else if ( nFlags & 0x40 )
1263 aAny = xNode->getBegin();
1264 if ( nFlags & 0x10 )
1266 if ( ( aAny >>=
aEvent ) && (
aEvent.Trigger == EventTrigger::ON_NEXT ) )
1268 eTiming = Timing_INDEFINITE;
1275 aAny = xNode->getEnd();
1277 double fTiming = 0.0;
1280 bCreateEvent =
true;
1283 case EventTrigger::NONE : nTrigger = 0;
break;
1284 case EventTrigger::ON_BEGIN : nTrigger = 1;
break;
1285 case EventTrigger::ON_END : nTrigger = 2;
break;
1286 case EventTrigger::BEGIN_EVENT : nTrigger = 3;
break;
1287 case EventTrigger::END_EVENT : nTrigger = 4; nU1 = 2; nU3 =
mnCurrentGroup;
break;
1288 case EventTrigger::ON_CLICK : nTrigger = 5;
break;
1289 case EventTrigger::ON_DBL_CLICK : nTrigger = 6;
break;
1290 case EventTrigger::ON_MOUSE_ENTER : nTrigger = 7;
break;
1291 case EventTrigger::ON_MOUSE_LEAVE : nTrigger = 8;
break;
1292 case EventTrigger::ON_NEXT : nTrigger = 9;
break;
1293 case EventTrigger::ON_PREV : nTrigger = 10;
break;
1294 case EventTrigger::ON_STOP_AUDIO : nTrigger = 11;
break;
1296 if (
aEvent.Offset.hasValue() )
1298 if (
aEvent.Offset >>= eTiming )
1300 if ( eTiming == Timing_INDEFINITE )
1303 else if (
aEvent.Offset >>= fTiming )
1304 nBegin =
static_cast<sal_Int32
>( fTiming * 1000.0 );
1308 else if ( aAny >>= eTiming )
1310 bCreateEvent =
true;
1311 if ( eTiming == Timing_INDEFINITE )
1314 else if ( aAny >>= fTiming )
1316 bCreateEvent =
true;
1317 nBegin =
static_cast<sal_Int32
>( fTiming * 1000.0 );
1324 if ( nFlags & ( 1 <<
i ) )
1326 bCreateEvent =
true;
1334 if ( nFlags & ( 1 <<
i ) )
1336 bCreateEvent =
true;
1361 if ( rAttributeName ==
u"X"
1362 || rAttributeName ==
u"Y"
1363 || rAttributeName ==
u"Width"
1364 || rAttributeName ==
u"Height"
1368 if ( rSourceValue >>=
aStr )
1374 else if ( rAttributeName ==
u"Rotate"
1375 || rAttributeName ==
u"Opacity"
1376 || rAttributeName ==
u"CharHeight"
1377 || rAttributeName ==
u"SkewX"
1380 double fNumber = 0.0;
1381 if ( rSourceValue >>= fNumber )
1382 aDest += OUString::number( fNumber );
1384 else if ( rAttributeName ==
u"Color"
1385 || rAttributeName ==
u"FillColor"
1386 || rAttributeName ==
u"LineColor"
1387 || rAttributeName ==
u"CharColor"
1390 sal_Int32 nColor = 0;
1391 Sequence< double > aHSL( 3 );
1393 if ( rSourceValue >>= aHSL )
1396 + OUString::number(
static_cast<sal_Int32
>( aHSL[ 0 ] / ( 360.0 / 255 ) ) )
1398 + OUString::number(
static_cast<sal_Int32
>( aHSL[ 1 ] * 255.0 ) )
1400 + OUString::number(
static_cast<sal_Int32
>( aHSL[ 2 ] * 255.0 ) )
1403 else if ( rSourceValue >>= nColor )
1406 + OUString::number(
static_cast<sal_Int8>(nColor) )
1408 + OUString::number(
static_cast<sal_Int8>( nColor >> 8 ) )
1410 + OUString::number(
static_cast<sal_Int8>( nColor >> 16 ) )
1414 else if ( rAttributeName ==
u"FillStyle" )
1416 css::drawing::FillStyle eFillStyle;
1417 if ( rSourceValue >>= eFillStyle )
1419 if ( eFillStyle == css::drawing::FillStyle_NONE )
1425 else if (rAttributeName ==
u"FillOn")
1428 if ( rSourceValue >>= bFillOn )
1436 else if ( rAttributeName ==
u"LineStyle" )
1438 css::drawing::LineStyle eLineStyle;
1439 if ( rSourceValue >>= eLineStyle )
1441 if ( eLineStyle == css::drawing::LineStyle_NONE )
1447 else if ( rAttributeName ==
u"CharWeight" )
1449 float fFontWeight = 0.0;
1450 if ( rSourceValue >>= fFontWeight )
1452 if ( fFontWeight == css::awt::FontWeight::BOLD )
1458 else if ( rAttributeName ==
u"CharUnderline" )
1460 sal_Int16 nFontUnderline = 0;
1461 if ( rSourceValue >>= nFontUnderline )
1463 if ( nFontUnderline == css::awt::FontUnderline::NONE )
1469 else if ( rAttributeName ==
u"CharPosture" )
1471 css::awt::FontSlant eFontSlant;
1472 if ( rSourceValue >>= eFontSlant )
1474 if ( eFontSlant == css::awt::FontSlant_ITALIC )
1480 else if ( rAttributeName ==
u"Visibility" )
1492 if ( !aDest.isEmpty() )
1495 aRet = rSourceValue;
1501 Reference< XAnimateSet > xSet( xNode, UNO_QUERY );
1508 sal_uInt32
const nId1 = 1;
1509 sal_uInt32
const nId2 = 1;
1513 if ( aConvertedValue.hasValue() )
1520 sal_uInt32 nValueType = 0;
1527 static const Entry lcl_attributeMap[] =
1530 {
"charfontname", 0 },
1531 {
"charheight", 1 },
1532 {
"charposture", 0 },
1535 {
"charrotation", 1 },
1536 {
"charunderline", 0 },
1537 {
"charweight", 0 },
1549 {
"visibility", 1 },
1555 const Entry* pPtr = &lcl_attributeMap[ 0 ];
1556 while( pPtr->pName )
1560 nValueType = pPtr->nType;
1565 DBG_ASSERT( pPtr->pName,
"GetValueTypeForAttributeName, unknown property value!" );
1571 Reference< XAnimate > xAnimate( xNode, UNO_QUERY );
1572 if ( !xAnimate.is() )
1575 Any aBy ( xAnimate->getBy() );
1577 Any aTo ( xAnimate->getTo() );
1582 sal_uInt32 nBits = 0x38;
1583 sal_Int16 nTmp = xAnimate->getCalcMode();
1584 sal_uInt32 nCalcMode = (nTmp == AnimationCalcMode::LINEAR) ? 1 : 0;
1587 if ( aBy.hasValue() )
1589 if (
aFrom.hasValue() )
1591 if (
aTo.hasValue() )
1598 if ( aBy.hasValue() )
1600 if (
aFrom.hasValue() )
1602 if (
aTo.hasValue() )
1612 Reference< XAnimate > xAnimate( xNode, UNO_QUERY );
1613 if ( !xAnimate.is() )
1622 sal_uInt32 nBits = 0;
1623 sal_uInt32 nAdditive = 0;
1624 sal_uInt32 nAccumulate = 0;
1625 sal_uInt32
const nTransformType = 0;
1626 if ( xAnimate.is() )
1628 if ( !xAnimate->getAttributeName().isEmpty() )
1630 sal_Int16 nAdditiveMode = xAnimate->getAdditive();
1631 if ( nAdditiveMode != AnimationAdditiveMode::BASE )
1634 switch( nAdditiveMode )
1636 case AnimationAdditiveMode::SUM : nAdditive = 1;
break;
1637 case AnimationAdditiveMode::REPLACE : nAdditive = 2;
break;
1638 case AnimationAdditiveMode::MULTIPLY : nAdditive = 3;
break;
1639 case AnimationAdditiveMode::NONE : nAdditive = 4;
break;
1642 if ( xAnimate->getAccumulate() )
1653 if ( !xAnimate->getAttributeName().isEmpty() || nForceAttributeNames )
1656 OUString aAttributeName( xAnimate->getAttributeName() );
1657 if ( nForceAttributeNames )
1659 if( nForceAttributeNames == 1 )
1661 aAttributeName =
"r";
1667 OUString aToken( aAttributeName.getToken( 0,
';',
nIndex ) );
1688 Reference< XShape > xShape;
1691 rParagraphTarget =
false;
1696 ParagraphTarget aParaTarget;
1697 if( rAny >>= aParaTarget )
1698 xShape = aParaTarget.Shape;
1703 sal_Int16 nParagraph = aParaTarget.Paragraph;
1704 Reference< XSimpleText > xText( xShape, UNO_QUERY );
1708 rParagraphTarget =
true;
1709 Reference< XEnumerationAccess > xTextParagraphEnumerationAccess( xText, UNO_QUERY );
1710 if ( !xTextParagraphEnumerationAccess.is() )
1713 Reference< XEnumeration > xTextParagraphEnumeration( xTextParagraphEnumerationAccess->createEnumeration() );
1714 if ( !xTextParagraphEnumeration.is() )
1717 sal_Int16 nCurrentParagraph;
1718 rBegin = rEnd = nCurrentParagraph = 0;
1719 while ( xTextParagraphEnumeration->hasMoreElements() )
1721 Reference< XTextRange > xTextRange( xTextParagraphEnumeration->nextElement(), UNO_QUERY );
1722 if ( xTextRange.is() )
1724 OUString aParaText( xTextRange->getString() );
1725 sal_Int32
nLength = aParaText.getLength() + 1;
1727 if ( nCurrentParagraph == nParagraph )
1729 nCurrentParagraph++;
1739 sal_uInt32 nRefMode = 0;
1740 sal_Int32
begin = -1;
1742 bool bParagraphTarget;
1746 if( bParagraphTarget )
1749 if ( !(xShape.is() || bCreate2b01Atom) )
1757 sal_uInt32
const nRefType = 1;
1766 if ( bCreate2b01Atom )
1775 Sequence< double > aKeyTimes( xAnimate->getKeyTimes() );
1776 Sequence< Any > aValues( xAnimate->getValues() );
1777 OUString aFormula( xAnimate->getFormula() );
1778 if ( !aKeyTimes.hasElements() )
1783 for (
i = 0;
i < aKeyTimes.getLength();
i++ )
1787 sal_Int32 nKeyTime =
static_cast<sal_Int32
>( aKeyTimes[
i ] * 1000.0 );
1791 if ( aValues[
i ].hasValue() )
1794 if ( aValues[
i ] >>= aPair )
1803 if ( !
i && !aFormula.isEmpty() )
1806 aAny[ 1 ] <<= aFormula;
1818 double fRepeat = 0.0;
1819 float fRepeatCount = 0.0;
1820 css::animations::Timing eTiming;
1821 aAny = xNode->getRepeatCount();
1822 if ( aAny >>= eTiming )
1824 if ( eTiming == Timing_INDEFINITE )
1825 fRepeatCount = (float(3.40282346638528860e+38));
1827 else if ( aAny >>= fRepeat )
1828 fRepeatCount =
static_cast<float>(fRepeat);
1829 if ( fRepeatCount != 0.0 )
1832 sal_uInt32
const nType = 0;
1837 float fAccelerate =
static_cast<float>(xNode->getAcceleration());
1838 if ( bExportAlways || ( fAccelerate != 0.0 ) )
1841 sal_uInt32
const nType = 3;
1847 float fDecelerate =
static_cast<float>(xNode->getDecelerate());
1848 if ( bExportAlways || ( fDecelerate != 0.0 ) )
1851 sal_uInt32
const nType = 4;
1857 bool bAutoReverse = xNode->getAutoReverse();
1858 if ( bExportAlways || bAutoReverse )
1861 sal_uInt32
const nType = 5;
1862 sal_uInt32 nVal = bAutoReverse ? 1 : 0;
1870 Reference< XTransitionFilter > xFilter( xNode, UNO_QUERY );
1871 if ( !xFilter.is() )
1877 sal_uInt32
const nBits = 3;
1880 sal_uInt32 nTransition = xFilter->getMode() ? 0 : 1;
1884 const char* pFilter =
FindTransitionName( xFilter->getTransition(), xFilter->getSubtype(), xFilter->getDirection() );
1887 const OUString
aStr( OUString::createFromAscii( pFilter ) );
1895 Reference< XAnimateMotion > xMotion( xNode, UNO_QUERY );
1896 if ( !xMotion.is() )
1903 sal_uInt32
const nBits = 0x98;
1904 sal_uInt32
const nOrigin = 0x2;
1905 float const fByX = 100.0;
1906 float const fByY = 100.0;
1907 float const fFromX = 0.0;
1908 float const fFromY = 0.0;
1909 float const fToX = 100.0;
1910 float const fToY = 100.0;
1915 if ( xMotion->getPath() >>=
aStr )
1917 if ( !
aStr.isEmpty() )
1926 Reference< XAnimateTransform > xTransform( xNode, UNO_QUERY );
1927 if ( !xTransform.is() )
1930 if ( xTransform->getTransformType() == AnimationTransformType::SCALE )
1935 sal_uInt32 nBits = 0;
1936 sal_uInt32
const nZoomContents = 1;
1944 double fX = 0.0, fY = 0.0;
1946 if ( xTransform->getBy() >>= aPair )
1948 if ( ( aPair.First >>= fX ) && ( aPair.Second >>= fY ) )
1951 fByX =
static_cast<float>( fX * 100 );
1952 fByY =
static_cast<float>( fY * 100 );
1955 if ( xTransform->getFrom() >>= aPair )
1957 if ( ( aPair.First >>= fX ) && ( aPair.Second >>= fY ) )
1960 fFromX =
static_cast<float>( fX * 100 );
1961 fFromY =
static_cast<float>( fY * 100 );
1964 if( xTransform->getTo() >>= aPair )
1966 if ( ( aPair.First >>= fX ) && ( aPair.Second >>= fY ) )
1969 fToX =
static_cast<float>( fX * 100 );
1970 fToY =
static_cast<float>( fY * 100 );
1982 else if ( xTransform->getTransformType() == AnimationTransformType::ROTATE )
1987 sal_uInt32 nBits = 0;
1988 sal_uInt32
const nU1 = 0;
1994 if ( xTransform->getBy() >>= fVal )
1997 fBy =
static_cast<float>(fVal);
1999 if ( xTransform->getFrom() >>= fVal )
2002 fFrom =
static_cast<float>(fVal);
2004 if ( xTransform->getTo() >>= fVal )
2007 fTo =
static_cast<float>(fVal);
2017 bool bIsColor =
true;
2020 if ( nColorSpace == AnimationColorSpace::HSL )
2023 sal_Int32 nColor = 0;
2024 Sequence< double > aHSL( 3 );
2025 if ( rAny >>= nColor )
2027 rA =
static_cast<sal_uInt8>( nColor >> 16 );
2028 rB =
static_cast<sal_uInt8>( nColor >> 8 );
2031 else if ( rAny >>= aHSL )
2033 rA =
static_cast<sal_Int32
>( aHSL[ 0 ] * 255.0 / 360.0 );
2034 rB =
static_cast<sal_Int32
>( aHSL[ 1 ] * 255.0 );
2035 rC =
static_cast<sal_Int32
>( aHSL[ 2 ] * 255.0 );
2044 Reference< XAnimateColor > xColor( xNode, UNO_QUERY );
2051 sal_uInt32 nBits = 8;
2053 sal_Int32 nByMode, nByA, nByB, nByC;
2054 nByMode = nByA = nByB = nByC = 0;
2056 sal_Int32 nFromMode, nFromA, nFromB, nFromC;
2057 nFromMode = nFromA = nFromB = nFromC = 0;
2059 sal_Int32 nToMode, nToA, nToB, nToC;
2060 nToMode = nToA = nToB = nToC = 0;
2062 sal_Int16 nColorSpace = xColor->getColorInterpolation();
2064 Any aAny( xColor->getBy() );
2065 if ( aAny.hasValue() )
2067 if (
getColorAny( aAny, nColorSpace, nByMode, nByA, nByB, nByC ) )
2070 aAny = xColor->getFrom();
2071 if ( aAny.hasValue() )
2073 if (
getColorAny( aAny, nColorSpace, nFromMode, nFromA, nFromB, nFromC ) )
2076 aAny = xColor->getTo();
2077 if ( aAny.hasValue() )
2079 if (
getColorAny( aAny, nColorSpace, nToMode, nToA, nToB, nToC ) )
2092 Reference< XIterateContainer > xIterate( xNode, UNO_QUERY );
2093 if ( !xIterate.is() )
2098 float fInterval = 10.0;
2099 sal_Int32 nTextUnitEffect = 0;
2100 sal_Int32
const nU1 = 1;
2101 sal_Int32
const nU2 = 1;
2102 sal_Int32
const nU3 = 0xe;
2104 sal_Int16 nIterateType = xIterate->getIterateType();
2105 switch( nIterateType )
2107 case TextAnimationType::BY_WORD : nTextUnitEffect = 1;
break;
2108 case TextAnimationType::BY_LETTER : nTextUnitEffect = 2;
break;
2111 fInterval =
static_cast<float>(xIterate->getIterateInterval());
2114 double fDuration = 0.0;
2116 Reference< XEnumerationAccess > xEnumerationAccess( xNode, UNO_QUERY );
2117 if( xEnumerationAccess.is() )
2119 Reference< XEnumeration > xEnumeration = xEnumerationAccess->createEnumeration();
2120 if( xEnumeration.is() )
2122 while( xEnumeration->hasMoreElements() )
2124 Reference< XAnimate > xChildNode( xEnumeration->nextElement(), UNO_QUERY );
2125 if( xChildNode.is() )
2127 double fChildBegin = 0.0;
2128 double fChildDuration = 0.0;
2129 xChildNode->getBegin() >>= fChildBegin;
2130 xChildNode->getDuration() >>= fChildDuration;
2132 fChildDuration += fChildBegin;
2133 if( fChildDuration > fDuration )
2134 fDuration = fChildDuration;
2141 fInterval =
static_cast<float>(100.0 * fInterval / fDuration);
2144 aTarget = xIterate->getTarget();
sal_uInt32 GetShapeId(const css::uno::Reference< css::drawing::XShape > &rShape) const
SvStream & WriteInt32(sal_Int32 nInt32)
SvStream & WriteUChar(unsigned char nChar)
SvStream & WriteUInt16(sal_uInt16 nUInt16)
SvStream & WriteUInt32(sal_uInt32 nUInt32)
SvStream & WriteFloat(float nFloat)
static void GetUserData(const css::uno::Sequence< css::beans::NamedValue > &rUserData, const css::uno::Any **pAny, std::size_t nLen)
static void writeZString(SvStream &rStrm, std::u16string_view aVal)
ppt::ExSoundCollection & mrExSoundCollection
void doexport(const css::uno::Reference< css::drawing::XDrawPage > &xPage, SvStream &rStrm)
static bool GetNodeType(const css::uno::Reference< css::animations::XAnimationNode > &xNode, sal_Int16 &nType)
void exportAnimateTarget(SvStream &rStrm, const css::uno::Reference< css::animations::XAnimationNode > &xNode, const sal_uInt32 nForceAttributeName=0, int nAfterEffectType=AFTEREFFECT_NONE)
static sal_Int16 GetFillMode(const css::uno::Reference< css::animations::XAnimationNode > &xNode, const sal_Int16 nFillDefault)
void exportAnimate(SvStream &rStrm, const css::uno::Reference< css::animations::XAnimationNode > &xNode)
static css::uno::Any convertAnimateValue(const css::uno::Any &rSource, std::u16string_view rAttributeName)
static sal_uInt32 GetPresetID(std::u16string_view aPreset, sal_uInt32 nAPIPresetClass, bool &bPresetId)
const EscherSolverContainer & mrSolverContainer
static sal_Int16 exportAnimPropertySet(SvStream &rStrm, const css::uno::Reference< css::animations::XAnimationNode > &xNode)
if available exportAnimPropertySet
static bool getColorAny(const css::uno::Any &rAny, const sal_Int16 nColorSpace, sal_Int32 &rMode, sal_Int32 &rA, sal_Int32 &rB, sal_Int32 &rC)
static void exportAnimNode(SvStream &rStrm, const css::uno::Reference< css::animations::XAnimationNode > &xNode, const sal_Int16 nFillDefault)
static void exportAnimPropertyString(SvStream &rStrm, const sal_uInt16 nPropertyId, const OUString &rVal, const TranslateMode eTranslateMode)
void exportNode(SvStream &rStrm, css::uno::Reference< css::animations::XAnimationNode > const &xNode, const sal_uInt16 nContainerRecType, const sal_uInt16 nInstance, const sal_Int32 nGroupLevel, const bool bTakeBackInteractiveSequenceTiming, const sal_Int16 nFillDefault)
void exportAnimateSet(SvStream &rStrm, const css::uno::Reference< css::animations::XAnimationNode > &xNode, int nAfterEffectType)
static void exportAnimateKeyPoints(SvStream &rStrm, const css::uno::Reference< css::animations::XAnimate > &xAnimate)
void exportAnimateTransform(SvStream &rStrm, const css::uno::Reference< css::animations::XAnimationNode > &xNode)
static sal_uInt32 TranslatePresetSubType(const sal_uInt32 nPresetClass, const sal_uInt32 nPresetId, std::u16string_view rPresetSubType)
bool isAfterEffectNode(const css::uno::Reference< css::animations::XAnimationNode > &xNode) const
static const char * FindTransitionName(const sal_Int16 nType, const sal_Int16 nSubType, const bool bDirection)
AnimationExporter(const EscherSolverContainer &rSolverContainer, ppt::ExSoundCollection &rExSoundCollection)
void exportAnimateTargetElement(SvStream &rStrm, const css::uno::Any &rAny, const bool bCreate2b01Atom)
bool isEmptyNode(const css::uno::Reference< css::animations::XAnimationNode > &xNode) const
void exportTransitionFilter(SvStream &rStrm, const css::uno::Reference< css::animations::XAnimationNode > &xNode)
static void exportAnimValue(SvStream &rStrm, const css::uno::Reference< css::animations::XAnimationNode > &xNode, const bool bExportAlways)
void exportIterate(SvStream &rStrm, const css::uno::Reference< css::animations::XAnimationNode > &xNode)
void exportAnimateColor(SvStream &rStrm, const css::uno::Reference< css::animations::XAnimationNode > &xNode, int nAfterEffectType)
void processAfterEffectNodes(const css::uno::Reference< css::animations::XAnimationNode > &xNode)
static css::uno::Reference< css::animations::XAnimationNode > createAfterEffectNodeClone(const css::uno::Reference< css::animations::XAnimationNode > &xNode)
static void exportAnimPropertyByte(SvStream &rStrm, const sal_uInt16 nPropertyId, const sal_uInt8 nVal)
static css::uno::Reference< css::drawing::XShape > getTargetElementShape(const css::uno::Any &rAny, sal_Int32 &rBegin, sal_Int32 &rEnd, bool &rParagraphTarget)
static void exportAnimAction(SvStream &rStrm, const css::uno::Reference< css::animations::XAnimationNode > &xNode)
static void exportAnimPropertyuInt32(SvStream &rStrm, const sal_uInt16 nPropertyId, const sal_uInt32 nVal)
static void exportAnimPropertyFloat(SvStream &rStrm, const sal_uInt16 nPropertyId, const double &rVal)
void exportAnimEvent(SvStream &rStrm, const css::uno::Reference< css::animations::XAnimationNode > &xNode, const sal_Int32 nFlags=0)
static bool exportAnimProperty(SvStream &rStrm, const sal_uInt16 nPropertyId, const css::uno::Any &rAny, const TranslateMode eTranslateMode)
void exportAnimateMotion(SvStream &rStrm, const css::uno::Reference< css::animations::XAnimationNode > &xNode)
std::vector< AfterEffectNodePtr > maAfterEffectNodes
bool hasAfterEffectNode(const css::uno::Reference< css::animations::XAnimationNode > &xNode, css::uno::Reference< css::animations::XAnimationNode > &xAfterEffectNode) const
static sal_uInt32 GetValueTypeForAttributeName(std::u16string_view rAttributeName)
sal_uInt32 GetId(const OUString &)
#define DBG_ASSERT(sCon, aError)
#define TOOLS_WARN_EXCEPTION(area, stream)
bool equalsIgnoreAsciiCase(std::u16string_view s1, std::u16string_view s2)
constexpr bool starts_with(std::basic_string_view< charT, traits > sv, std::basic_string_view< charT, traits > x) noexcept
enumrange< T >::Iterator begin(enumrange< T >)
sal_uInt32 toUInt32(std::u16string_view str, sal_Int16 radix=10)
bool equalsAscii(std::u16string_view s1, std::string_view s2)
const ImplAttributeNameConversion * getAttributeConversionList()
const sal_Int32 mso_Anim_GroupType_MEDIA
SvStream & WriteAnimationNode(SvStream &rOut, AnimationNode const &rNode)
const int AFTEREFFECT_NONE
static void ImplTranslateAttribute(OUString &rString, const TranslateMode eTranslateMode)
const sal_Int32 mso_Anim_Behaviour_ANIMATION
const int AFTEREFFECT_COLOR
const sal_Int32 mso_Anim_GroupType_PAR
const sal_Int32 mso_Anim_GroupType_SEQ
const sal_Int32 mso_Anim_Behaviour_FILTER
const int AFTEREFFECT_SET
std::shared_ptr< AfterEffectNode > AfterEffectNodePtr
const sal_Int32 mso_Anim_GroupType_NODE
#define DFF_ANIM_RUNTIMECONTEXT
#define DFF_ANIM_PRESS_CLASS_OLE_ACTION
#define DFF_msofbtAnimateRotationData
#define DFF_msofbtAnimAction
#define DFF_msofbtAnimateMotionData
#define DFF_msofbtAnimateTargetSettings
#define DFF_msofbtAnimPropertySet
#define DFF_msofbtAnimateFilterData
#define DFF_msofbtAnimateSetData
#define DFF_msofbtAnimValue
#define DFF_ANIM_DIRECTION
#define DFF_msofbtAnimKeyPoints
#define DFF_msofbtAnimSubGoup
#define DFF_ANIM_PRESS_CLASS_USER_DEFINED
#define DFF_ANIM_NODE_TYPE_ON_CLICK
#define DFF_ANIM_EVENT_FILTER
#define DFF_msofbtAnimateTarget
#define DFF_ANIM_PRESET_SUB_TYPE
#define DFF_ANIM_NODE_TYPE
#define DFF_ANIM_PROPERTY_ID_COUNT
#define DFF_ANIM_PATH_EDIT_MODE
#define DFF_ANIM_AFTEREFFECT
#define DFF_msofbtAnimReference
#define DFF_msofbtAnimGroup
#define DFF_msofbtAnimateAttributeNames
#define DFF_msofbtAnimateTargetElement
#define DFF_msofbtAnimIteration
#define DFF_ANIM_NODE_TYPE_WITH_PREVIOUS
#define DFF_ANIM_OVERRIDE
#define DFF_msofbtAnimKeyTime
#define DFF_ANIM_PRESET_CLASS
#define DFF_ANIM_MASTERREL
#define DFF_ANIM_NODE_TYPE_INTERACTIVE_SEQ
#define DFF_ANIM_NODE_TYPE_AFTER_PREVIOUS
#define DFF_msofbtAnimTrigger
#define DFF_msofbtAnimAttributeValue
#define DFF_ANIM_PRESS_CLASS_EXIT
#define DFF_msofbtAnimNode
#define DFF_ANIM_PRESS_CLASS_EMPHASIS
#define DFF_ANIM_PROP_TYPE_UNISTRING
#define DFF_msofbtAnimateData
#define DFF_ANIM_NODE_TYPE_TIMING_ROOT
#define DFF_msofbtAnimateScale
#define DFF_ANIM_NODE_TYPE_MAIN_SEQUENCE
#define DFF_msofbtAnimEvent
#define DFF_msofbtAnimateScaleData
#define DFF_msofbtAnimateSet
#define DFF_ANIM_PRESET_ID
#define DFF_msofbtAnimateRotation
#define DFF_ANIM_PROP_TYPE_BYTE
#define DFF_ANIM_PRESS_CLASS_MOTIONPATH
#define DFF_ANIM_PROP_TYPE_INT32
#define DFF_ANIM_PRESS_CLASS_ENTRANCE
#define DFF_msofbtAnimateMotion
#define DFF_ANIM_PROP_TYPE_FLOAT
#define DFF_msofbtAnimateFilter
#define DFF_ANIM_PRESS_CLASS_MEDIACALL
#define DFF_msofbtAnimate
#define DFF_msofbtAnimateColorData
#define DFF_msofbtAnimateColor
#define TRANSLATE_NUMBER_TO_STRING
#define TRANSLATE_MEASURE
#define TRANSLATE_ATTRIBUTE
static const convert_subtype * getList()
static const preset_mapping * getList()
static const transition * getList()
this atom is the first entry in each animation group
sal_Int32 mnNodeType
see mso_Anim_Behaviour_?
sal_Int32 mnFill
see mso_Anim_Fill_?
sal_Int32 mnGroupType
see mso_Anim_GroupType_?
sal_Int32 mnRestart
see mso_Anim_Restart_?
sal_Int32 mnDuration
duration of this group in 1000th seconds