diff options
author | David Tardon <dtardon@redhat.com> | 2016-07-11 15:26:17 +0200 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2016-07-20 07:48:55 +0000 |
commit | 439df080e7e82908cd80e01ca1b3a03ddb3ac8ec (patch) | |
tree | 0660af4df552a3c255201835472df10f0df4feee /slideshow | |
parent | update credits (diff) | |
download | core-439df080e7e82908cd80e01ca1b3a03ddb3ac8ec.tar.gz core-439df080e7e82908cd80e01ca1b3a03ddb3ac8ec.zip |
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
(cherry picked from commit c726059adf71f9c812df3363b4902c52023827b6)
Reviewed-on: https://gerrit.libreoffice.org/27312
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'slideshow')
-rw-r--r-- | slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx | 38 | ||||
-rw-r--r-- | slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.hxx | 4 |
2 files changed, 25 insertions, 17 deletions
diff --git a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx index 6b7cd6011dc2..b6c3a6e0039f 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 bf2f1c1e84d2..488a035adef8 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. |