include/oox/ppt/slidetransition.hxx           |    4 +++
 offapi/com/sun/star/presentation/DrawPage.idl |    9 +++++-
 oox/source/ppt/slidetransition.cxx            |   30 ++++++++++++++++------
 oox/source/ppt/slidetransitioncontext.cxx     |    6 ++++
 oox/source/token/properties.txt               |    1 
 sd/qa/unit/data/pptx/tdf115394.pptx           |binary
 sd/qa/unit/import-tests.cxx                   |   34 ++++++++++++++++++++++++++
 sd/source/ui/inc/unoprnms.hxx                 |    1 
 sd/source/ui/unoidl/unopage.cxx               |    2 -
 9 files changed, 76 insertions(+), 11 deletions(-)

New commits:
commit 6f05db5a19c0bd82b937e2c79f766bb35c60acc1
Author: Szymon Kłos <szymon.k...@collabora.com>
Date:   Fri Feb 2 10:21:50 2018 +0100

    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 <c...@libreoffice.org>
    Reviewed-by: Szymon Kłos <szymon.k...@collabora.com>
    Reviewed-on: https://gerrit.libreoffice.org/49521
    Reviewed-by: Andras Timar <andras.ti...@collabora.com>
    Tested-by: Andras Timar <andras.ti...@collabora.com>

diff --git a/include/oox/ppt/slidetransition.hxx 
b/include/oox/ppt/slidetransition.hxx
index 41df7b2f7948..e0383aaf154f 100644
--- a/include/oox/ppt/slidetransition.hxx
+++ b/include/oox/ppt/slidetransition.hxx
@@ -42,7 +42,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 {
         bool  mbTransitionDirectionNormal;
         ::sal_Int16 mnAnimationSpeed;
         ::sal_Int32 mnFadeColor;
+        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 9ae715fa49c0..dc2dbf923b67 100644
--- a/oox/source/ppt/slidetransition.cxx
+++ b/oox/source/ppt/slidetransition.cxx
@@ -47,6 +47,7 @@ namespace oox { namespace ppt {
         , mbTransitionDirectionNormal( true )
         , mnAnimationSpeed( AnimationSpeed_FAST )
         , mnFadeColor( 0 )
+        , mfTransitionDurationInSeconds( -1.0 )
         , mbMode( true )
         , mnAdvanceTime( -1 )
     {
@@ -59,6 +60,7 @@ namespace oox { namespace ppt {
         , mbTransitionDirectionNormal( true )
         , mnAnimationSpeed( AnimationSpeed_FAST )
         , mnFadeColor( 0 )
+        , mfTransitionDurationInSeconds( -1.0 )
         , mbMode( true )
         , mnAdvanceTime( -1 )
     {
@@ -79,11 +81,13 @@ 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, mnFadeColor);
-        if( mnAdvanceTime != -1 ) {
-        aProps.setProperty( PROP_Duration, mnAdvanceTime/1000);
-        aProps.setProperty( PROP_Change, static_cast<sal_Int32>(1));
-        }
+            if( mnAdvanceTime != -1 ) {
+                aProps.setProperty( PROP_Duration, mnAdvanceTime/1000);
+                aProps.setProperty( PROP_Change, static_cast<sal_Int32>(1));
+            }
         }
         catch( Exception& )
         {
@@ -113,19 +117,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
@@ -133,6 +139,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 9b29653e98e6..bed6060d4d4a 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& rParent, const
     // 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 52909147b9e1..f4ca60265708 100644
--- a/oox/source/token/properties.txt
+++ b/oox/source/token/properties.txt
@@ -527,6 +527,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
Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf115394.pptx differ
diff --git a/sd/qa/unit/import-tests.cxx b/sd/qa/unit/import-tests.cxx
index ab58fe2fd7c0..187d678a2958 100644
--- a/sd/qa/unit/import-tests.cxx
+++ b/sd/qa/unit/import-tests.cxx
@@ -150,6 +150,7 @@ public:
     void testTdf109223();
     void testActiveXCheckbox();
     void testTdf108926();
+    void testTdf115394();
 
     bool checkPattern(sd::DrawDocShellRef& rDocRef, int nShapeNumber, 
std::vector<sal_uInt8>& rExpected);
     void testPatternImport();
@@ -219,6 +220,7 @@ public:
     CPPUNIT_TEST(testTdf109223);
     CPPUNIT_TEST(testActiveXCheckbox);
     CPPUNIT_TEST(testTdf108926);
+    CPPUNIT_TEST(testTdf115394);
 
     CPPUNIT_TEST_SUITE_END();
 };
@@ -2259,6 +2261,38 @@ void SdImportTest::testTdf108926()
     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 9e5f6feff2dc..b4307a2da338 100644
--- a/sd/source/ui/unoidl/unopage.cxx
+++ b/sd/source/ui/unoidl/unopage.cxx
@@ -145,7 +145,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 }
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to