summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSzymon Kłos <szymon.klos@collabora.com>2018-02-02 10:21:50 +0100
committerSzymon Kłos <szymon.klos@collabora.com>2018-02-07 10:28:12 +0100
commita8a3e6a7fee5ac23bc2155b9391ead9402211147 (patch)
treec381a276f8e3b4e69e335a203fffeb6083ad4165
parente89964ebb3ba3bd7d694695c004c5f976d8d9616 (diff)
tdf#115394 import custom slide transition time in PPTX
* custom values are imported correctly * standard (fast, slow, medium) values are changed to match values in the MSO Change-Id: I004242afbbf641fe414abc8df248a2844c104502 Reviewed-on: https://gerrit.libreoffice.org/49139 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Szymon Kłos <szymon.klos@collabora.com>
-rw-r--r--include/oox/ppt/slidetransition.hxx4
-rw-r--r--offapi/com/sun/star/presentation/DrawPage.idl9
-rw-r--r--oox/source/ppt/slidetransition.cxx22
-rw-r--r--oox/source/ppt/slidetransitioncontext.cxx6
-rw-r--r--oox/source/token/properties.txt1
-rw-r--r--sd/qa/unit/data/pptx/tdf115394.pptxbin0 -> 31282 bytes
-rw-r--r--sd/qa/unit/import-tests.cxx34
-rw-r--r--sd/source/ui/inc/unoprnms.hxx1
-rw-r--r--sd/source/ui/unoidl/unopage.cxx2
9 files changed, 72 insertions, 7 deletions
diff --git a/include/oox/ppt/slidetransition.hxx b/include/oox/ppt/slidetransition.hxx
index 8986016f30aa..5a31b158334b 100644
--- a/include/oox/ppt/slidetransition.hxx
+++ b/include/oox/ppt/slidetransition.hxx
@@ -43,7 +43,10 @@ namespace oox { namespace ppt {
void setSlideProperties( PropertyMap& props );
void setTransitionFilterProperties( const css::uno::Reference< css::animations::XTransitionFilter > & xFilter );
+ /// Set one of standard values for slide transition duration
void setOoxTransitionSpeed( sal_Int32 nToken );
+ /// Set slide transition time directly
+ void setOoxTransitionSpeed( double fDuration );
void setMode( bool bMode )
{ mbMode = bMode; }
void setOoxAdvanceTime( sal_Int32 nAdvanceTime )
@@ -66,6 +69,7 @@ namespace oox { namespace ppt {
::sal_Int16 mnTransitionSubType;
bool mbTransitionDirectionNormal;
css::presentation::AnimationSpeed mnAnimationSpeed;
+ double mfTransitionDurationInSeconds;
bool mbMode; /**< http://api.libreoffice.org/docs/common/ref/com/sun/star/animations/XTransitionFilter.html Mode property */
::sal_Int32 mnAdvanceTime;
};
diff --git a/offapi/com/sun/star/presentation/DrawPage.idl b/offapi/com/sun/star/presentation/DrawPage.idl
index 18e499e81420..0e070470ad25 100644
--- a/offapi/com/sun/star/presentation/DrawPage.idl
+++ b/offapi/com/sun/star/presentation/DrawPage.idl
@@ -79,11 +79,11 @@ published service DrawPage
[property] short Layout;
- /** defines the speed of the fade-in effect of this page.
+ /** Defines the speed of the fade-in effect of this page.
+ @see TransitionSpeed
*/
[property] com::sun::star::presentation::AnimationSpeed Speed;
-
/** defines if a header presentation shape from the master page is visible
on this page.
*/
@@ -142,6 +142,11 @@ published service DrawPage
*/
[optional, property] long DateTimeFormat;
+ /** Specifies slide transition time in seconds.
+ @since LibreOffice 6.1
+ @see Speed
+ */
+ [property, optional] double TransitionDuration;
};
diff --git a/oox/source/ppt/slidetransition.cxx b/oox/source/ppt/slidetransition.cxx
index e609e6709c2f..7c1555b7dc80 100644
--- a/oox/source/ppt/slidetransition.cxx
+++ b/oox/source/ppt/slidetransition.cxx
@@ -45,6 +45,7 @@ namespace oox { namespace ppt {
, mnTransitionSubType( 0 )
, mbTransitionDirectionNormal( true )
, mnAnimationSpeed( AnimationSpeed_FAST )
+ , mfTransitionDurationInSeconds( -1.0 )
, mbMode( true )
, mnAdvanceTime( -1 )
{
@@ -56,6 +57,7 @@ namespace oox { namespace ppt {
, mnTransitionSubType( 0 )
, mbTransitionDirectionNormal( true )
, mnAnimationSpeed( AnimationSpeed_FAST )
+ , mfTransitionDurationInSeconds( -1.0 )
, mbMode( true )
, mnAdvanceTime( -1 )
{
@@ -76,6 +78,8 @@ namespace oox { namespace ppt {
aProps.setProperty( PROP_TransitionSubtype, mnTransitionSubType);
aProps.setProperty( PROP_TransitionDirection, mbTransitionDirectionNormal);
aProps.setProperty( PROP_Speed, mnAnimationSpeed);
+ if( mfTransitionDurationInSeconds >= 0.0 )
+ aProps.setProperty( PROP_TransitionDuration, mfTransitionDurationInSeconds);
aProps.setProperty( PROP_TransitionFadeColor, sal_Int32(0));
if( mnAdvanceTime != -1 ) {
aProps.setProperty( PROP_Duration, mnAdvanceTime/1000);
@@ -110,19 +114,21 @@ namespace oox { namespace ppt {
{
switch( nToken )
{
- /* In case you want to use time values in second,
- * the speed values are located in the PPT97 importer
- * sd/source/filter/ppt/ppt97animations.cxx:664
- * (void Ppt97Animation::UpdateCacheData() const)
+ /* the speed values are located in the PPT97 importer
+ * sd/source/filter/ppt/pptin.cxx:1783
+ * (void ImplSdPPTImport::ImportPageEffect)
*/
case XML_fast:
mnAnimationSpeed = AnimationSpeed_FAST;
+ mfTransitionDurationInSeconds = 0.5;
break;
case XML_med:
mnAnimationSpeed = AnimationSpeed_MEDIUM;
+ mfTransitionDurationInSeconds = 0.75;
break;
case XML_slow:
mnAnimationSpeed = AnimationSpeed_SLOW;
+ mfTransitionDurationInSeconds = 1.0;
break;
default:
// should not happen. just ignore
@@ -130,6 +136,14 @@ namespace oox { namespace ppt {
}
}
+ void SlideTransition::setOoxTransitionSpeed( double fDurationInSeconds )
+ {
+ // for compatibility
+ mnAnimationSpeed = ( fDurationInSeconds <= 0.5 ) ? AnimationSpeed_FAST
+ : ( fDurationInSeconds >= 1.0 ) ? AnimationSpeed_SLOW : AnimationSpeed_MEDIUM;
+ mfTransitionDurationInSeconds = fDurationInSeconds;
+ }
+
sal_Int16 SlideTransition::ooxToOdpEightDirections( ::sal_Int32 nOoxType )
{
sal_Int16 nOdpDirection;
diff --git a/oox/source/ppt/slidetransitioncontext.cxx b/oox/source/ppt/slidetransitioncontext.cxx
index 64d6d5942ba3..7639df7c023b 100644
--- a/oox/source/ppt/slidetransitioncontext.cxx
+++ b/oox/source/ppt/slidetransitioncontext.cxx
@@ -32,6 +32,7 @@
#include <oox/helper/attributelist.hxx>
#include <oox/token/namespaces.hxx>
#include <oox/token/tokens.hxx>
+#include <oox/token/properties.hxx>
using namespace ::com::sun::star;
using namespace ::oox::core;
@@ -50,6 +51,11 @@ SlideTransitionContext::SlideTransitionContext( FragmentHandler2 const & rParent
// ST_TransitionSpeed
maTransition.setOoxTransitionSpeed( rAttribs.getToken( XML_spd, XML_fast ) );
+ // p14:dur
+ sal_Int32 nDurationInMs = rAttribs.getInteger( P14_TOKEN( dur ), -1 );
+ if( nDurationInMs > -1 )
+ maTransition.setOoxTransitionSpeed( nDurationInMs / 1000.0 );
+
// TODO
rAttribs.getBool( XML_advClick, true );
diff --git a/oox/source/token/properties.txt b/oox/source/token/properties.txt
index fabb7383a891..e90bd9c58912 100644
--- a/oox/source/token/properties.txt
+++ b/oox/source/token/properties.txt
@@ -530,6 +530,7 @@ TopMargin
TotalsRow
Transformation
TransitionDirection
+TransitionDuration
TransitionFadeColor
TransitionSubtype
TransitionType
diff --git a/sd/qa/unit/data/pptx/tdf115394.pptx b/sd/qa/unit/data/pptx/tdf115394.pptx
new file mode 100644
index 000000000000..d01c90270f34
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf115394.pptx
Binary files differ
diff --git a/sd/qa/unit/import-tests.cxx b/sd/qa/unit/import-tests.cxx
index c54989eff192..652b6ace8626 100644
--- a/sd/qa/unit/import-tests.cxx
+++ b/sd/qa/unit/import-tests.cxx
@@ -174,6 +174,7 @@ public:
void testTdf114488();
void testTdf114913();
void testTdf114821();
+ void testTdf115394();
bool checkPattern(sd::DrawDocShellRef const & rDocRef, int nShapeNumber, std::vector<sal_uInt8>& rExpected);
void testPatternImport();
@@ -251,6 +252,7 @@ public:
CPPUNIT_TEST(testTdf114488);
CPPUNIT_TEST(testTdf114913);
CPPUNIT_TEST(testTdf114821);
+ CPPUNIT_TEST(testTdf115394);
CPPUNIT_TEST_SUITE_END();
};
@@ -2380,6 +2382,38 @@ void SdImportTest::testTdf114821()
xDocShRef->DoClose();
}
+void SdImportTest::testTdf115394()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc("/sd/qa/unit/data/pptx/tdf115394.pptx"), PPTX);
+ double fTransitionDuration;
+
+ // Slow in MS formats
+ SdPage* pPage1 = xDocShRef->GetDoc()->GetSdPage(0, PageKind::Standard);
+ fTransitionDuration = pPage1->getTransitionDuration();
+ CPPUNIT_ASSERT_EQUAL(1.0, fTransitionDuration);
+
+ // Medium in MS formats
+ SdPage* pPage2 = xDocShRef->GetDoc()->GetSdPage(1, PageKind::Standard);
+ fTransitionDuration = pPage2->getTransitionDuration();
+ CPPUNIT_ASSERT_EQUAL(0.75, fTransitionDuration);
+
+ // Fast in MS formats
+ SdPage* pPage3 = xDocShRef->GetDoc()->GetSdPage(2, PageKind::Standard);
+ fTransitionDuration = pPage3->getTransitionDuration();
+ CPPUNIT_ASSERT_EQUAL(0.5, fTransitionDuration);
+
+ // Custom values
+ SdPage* pPage4 = xDocShRef->GetDoc()->GetSdPage(3, PageKind::Standard);
+ fTransitionDuration = pPage4->getTransitionDuration();
+ CPPUNIT_ASSERT_EQUAL(0.25, fTransitionDuration);
+
+ SdPage* pPage5 = xDocShRef->GetDoc()->GetSdPage(4, PageKind::Standard);
+ fTransitionDuration = pPage5->getTransitionDuration();
+ CPPUNIT_ASSERT_EQUAL(4.25, fTransitionDuration);
+
+ xDocShRef->DoClose();
+}
+
CPPUNIT_TEST_SUITE_REGISTRATION(SdImportTest);
CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sd/source/ui/inc/unoprnms.hxx b/sd/source/ui/inc/unoprnms.hxx
index 3dd438f0ec28..1e5e3b910f3e 100644
--- a/sd/source/ui/inc/unoprnms.hxx
+++ b/sd/source/ui/inc/unoprnms.hxx
@@ -33,6 +33,7 @@
#define UNO_NAME_PAGE_NUMBER "Number"
#define UNO_NAME_PAGE_ORIENTATION "Orientation"
#define UNO_NAME_PAGE_SPEED "Speed"
+#define UNO_NAME_PAGE_TRANSITION_DURATION "TransitionDuration"
#define UNO_NAME_PAGE_WIDTH "Width"
#define UNO_NAME_PAGE_PREVIEW "Preview"
#define UNO_NAME_PAGE_PREVIEWBITMAP "PreviewBitmap"
diff --git a/sd/source/ui/unoidl/unopage.cxx b/sd/source/ui/unoidl/unopage.cxx
index fd1f877ec78b..2263860bfa02 100644
--- a/sd/source/ui/unoidl/unopage.cxx
+++ b/sd/source/ui/unoidl/unopage.cxx
@@ -142,7 +142,7 @@ const SvxItemPropertySet* ImplGetDrawPagePropertySet( bool bImpress, PageKind eP
{ OUString("TransitionSubtype"), WID_TRANSITION_SUBTYPE, ::cppu::UnoType<sal_Int16>::get(), 0, 0},
{ OUString("TransitionDirection"), WID_TRANSITION_DIRECTION, ::cppu::UnoType<sal_Bool>::get(), 0, 0},
{ OUString("TransitionFadeColor"), WID_TRANSITION_FADE_COLOR, ::cppu::UnoType<sal_Int32>::get(), 0, 0},
- { OUString("TransitionDuration"), WID_TRANSITION_DURATION, ::cppu::UnoType<double>::get(), 0, 0},
+ { OUString(UNO_NAME_PAGE_TRANSITION_DURATION), WID_TRANSITION_DURATION, ::cppu::UnoType<double>::get(), 0, 0},
{ OUString("LoopSound"), WID_LOOP_SOUND, cppu::UnoType<bool>::get(), 0, 0},
{ OUString("NavigationOrder"), WID_NAVORDER, cppu::UnoType<css::container::XIndexAccess>::get(),0, 0},
{ OUString(), 0, css::uno::Type(), 0, 0 }