[Libreoffice-commits] core.git: slideshow/source

David Tardon dtardon at redhat.com
Mon Jul 11 14:05:22 UTC 2016


 slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx |   38 ++++++----
 slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.hxx |    4 -
 2 files changed, 25 insertions(+), 17 deletions(-)

New commits:
commit c726059adf71f9c812df3363b4902c52023827b6
Author: David Tardon <dtardon at redhat.com>
Date:   Mon Jul 11 15:26:17 2016 +0200

    tdf#97195 fix crash in diamond shape transition
    
    The setScene() function was a hack from the beginning--it was only
    introduced to avoid the need to override displaySlides_() in
    DiamondTransition. And it worked until someone started to make false
    assumptions about the scene, like that it is unchanging or that both
    slides have the same (non-zero) number of elements...
    
    Change-Id: I401cccc4dfbcba0a5f5544d3aac94d1cae027c99

diff --git a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx
index cd43fed..d1d4c5e 100644
--- a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx
+++ b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx
@@ -70,11 +70,6 @@ OGLTransitionImpl::~OGLTransitionImpl()
 {
 }
 
-void OGLTransitionImpl::setScene(TransitionScene const& rScene)
-{
-    maScene = rScene;
-}
-
 void OGLTransitionImpl::uploadModelViewProjectionMatrices()
 {
     double EyePos(10.0);
@@ -1138,18 +1133,26 @@ public:
         {}
 
 private:
-    virtual void prepare( double nTime, double SlideWidth, double SlideHeight, double DispWidth, double DispHeight ) override;
+    virtual void displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale ) override;
+
+    Primitives_t makeLeavingSlide(double nTime) const;
 };
 
-void DiamondTransition::prepare( double nTime, double /* SlideWidth */, double /* SlideHeight */, double /* DispWidth */, double /* DispHeight */ )
+void DiamondTransition::displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex,
+                                              double SlideWidthScale, double SlideHeightScale )
 {
-    Primitive Slide1, Slide2;
+    CHECK_GL_ERROR();
+    applyOverallOperations( nTime, SlideWidthScale, SlideHeightScale );
 
-    Slide1.pushTriangle (glm::vec2 (0,0), glm::vec2 (1,0), glm::vec2 (0,1));
-    Slide1.pushTriangle (glm::vec2 (1,0), glm::vec2 (0,1), glm::vec2 (1,1));
-    Primitives_t aEnteringSlidePrimitives;
-    aEnteringSlidePrimitives.push_back (Slide1);
+    CHECK_GL_ERROR();
+    displaySlide( nTime, glLeavingSlideTex, makeLeavingSlide(nTime), SlideWidthScale, SlideHeightScale );
+    displaySlide( nTime, glEnteringSlideTex, getScene().getEnteringSlide(), SlideWidthScale, SlideHeightScale );
+    CHECK_GL_ERROR();
+}
 
+Primitives_t DiamondTransition::makeLeavingSlide(double nTime) const
+{
+    Primitive Slide2;
     if( nTime >= 0.5 ) {
         double m = 1 - nTime;
 
@@ -1174,13 +1177,20 @@ void DiamondTransition::prepare( double nTime, double /* SlideWidth */, double /
     Primitives_t aLeavingSlidePrimitives;
     aLeavingSlidePrimitives.push_back (Slide2);
 
-    setScene(TransitionScene(aLeavingSlidePrimitives, aEnteringSlidePrimitives));
+    return aLeavingSlidePrimitives;
 }
 
 std::shared_ptr<OGLTransitionImpl>
 makeDiamondTransition(const TransitionSettings& rSettings)
 {
-    return std::make_shared<DiamondTransition>(TransitionScene(), rSettings);
+    Primitive Slide1;
+    Slide1.pushTriangle (glm::vec2 (0,0), glm::vec2 (1,0), glm::vec2 (0,1));
+    Slide1.pushTriangle (glm::vec2 (1,0), glm::vec2 (0,1), glm::vec2 (1,1));
+    Primitives_t aEnteringSlidePrimitives;
+    aEnteringSlidePrimitives.push_back (Slide1);
+    Primitives_t aLeavingSlidePrimitives;
+    aLeavingSlidePrimitives.push_back (Slide1);
+    return std::make_shared<DiamondTransition>(TransitionScene(aLeavingSlidePrimitives, aEnteringSlidePrimitives), rSettings);
 }
 
 }
diff --git a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.hxx b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.hxx
index bf2f1c1..488a035 100644
--- a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.hxx
+++ b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.hxx
@@ -165,8 +165,6 @@ protected:
         return maScene;
     }
 
-    void setScene(TransitionScene const& rScene);
-
     void displaySlide( double nTime, sal_Int32 glSlideTex, const Primitives_t& primitives, double SlideWidthScale, double SlideHeightScale );
     void displayScene( double nTime, double SlideWidth, double SlideHeight, double DispWidth, double DispHeight);
     void applyOverallOperations( double nTime, double SlideWidthScale, double SlideHeightScale );
@@ -210,7 +208,7 @@ private:
     virtual GLuint makeShader() const = 0;
 
 private:
-    TransitionScene maScene;
+    const TransitionScene maScene;
     const TransitionSettings maSettings;
 
     /** Calculates the projection and model/view matrices, and upload them.


More information about the Libreoffice-commits mailing list