fix "uncover" slide transitions with presenter console

It turns out it is really not a good idea to render _anything_ on the
first run of performIn/performOut in classes derived from
SlideChangeBase. That is because the functions are called separetely for
every view, so, if there is more than one view, like when the presenter
console is active, it will be done only for the first of them. This
commit introduces another function, prepareForRun, that can be used
reliably for that purpose.

Change-Id: I2c690fb145ccc05a680d4c2991c73900336e6f42
This commit is contained in:
David Tardon 2012-08-14 14:44:18 +02:00
parent b843d90568
commit 2e8b2e6de1
3 changed files with 71 additions and 46 deletions

View file

@ -199,6 +199,10 @@ void SlideChangeBase::start( const AnimatableShapeSharedPtr& rShape,
prefetch(rShape,rLayer); // no-op, if already done
// get the subclasses a chance to do any specific initialization before run
for ( ViewsVecT::const_iterator aCurr( beginViews() ), aEnd( endViews() ); aCurr != aEnd; ++aCurr )
prepareForRun( *aCurr, aCurr->mpView->getCanvas() );
// start accompanying sound effect, if any
if( mpSoundPlayer )
{
@ -356,6 +360,12 @@ bool SlideChangeBase::operator()( double nValue )
return true;
}
void SlideChangeBase::prepareForRun(
const ViewEntry& /* rViewEntry */,
const boost::shared_ptr<cppcanvas::Canvas>& /* rDestinationCanvas */ )
{
}
void SlideChangeBase::performIn(
const cppcanvas::CustomSpriteSharedPtr& /*rSprite*/,
const ViewEntry& /*rViewEntry*/,

View file

@ -126,6 +126,18 @@ protected:
void renderBitmap( SlideBitmapSharedPtr const& pSlideBitmap,
boost::shared_ptr<cppcanvas::Canvas> const& pCanvas );
/** Called on derived classes to perform actions before first run.
This typically involves rendering of the initial slide content.
@param rViewEntry the view entry
@param rDestinationCanvas the canvas to render on
*/
virtual void prepareForRun(
const ViewEntry& rViewEntry,
const cppcanvas::CanvasSharedPtr& rDestinationCanvas );
/** Called on derived classes to implement actual slide change.
This method is called with the sprite of the slide coming 'in'

View file

@ -393,10 +393,13 @@ public:
rViewContainer,
rScreenUpdater,
rEventMultiplexer ),
maFadeColor( rFadeColor ),
mbFirstTurn( true )
maFadeColor( rFadeColor )
{}
virtual void prepareForRun(
const ViewEntry& rViewEntry,
const cppcanvas::CanvasSharedPtr& rDestinationCanvas );
virtual void performIn(
const ::cppcanvas::CustomSpriteSharedPtr& rSprite,
const ViewEntry& rViewEntry,
@ -411,9 +414,19 @@ public:
private:
const boost::optional< RGBColor > maFadeColor;
bool mbFirstTurn;
};
void FadingSlideChange::prepareForRun(
const ViewEntry& rViewEntry,
const cppcanvas::CanvasSharedPtr& rDestinationCanvas )
{
// clear page to given fade color. 'Leaving' slide is
// painted atop of that, but slowly fading out.
fillPage( rDestinationCanvas,
::basegfx::B2DSize( getEnteringSlideSizePixel( rViewEntry.mpView ) ),
*maFadeColor );
}
void FadingSlideChange::performIn(
const ::cppcanvas::CustomSpriteSharedPtr& rSprite,
const ViewEntry& /*rViewEntry*/,
@ -434,7 +447,7 @@ void FadingSlideChange::performIn(
void FadingSlideChange::performOut(
const ::cppcanvas::CustomSpriteSharedPtr& rSprite,
const ViewEntry& rViewEntry,
const ViewEntry& /* rViewEntry */,
const ::cppcanvas::CanvasSharedPtr& rDestinationCanvas,
double t )
{
@ -448,17 +461,6 @@ void FadingSlideChange::performOut(
// only needed for color fades
if( maFadeColor )
{
if( mbFirstTurn )
{
mbFirstTurn = false;
// clear page to given fade color. 'Leaving' slide is
// painted atop of that, but slowly fading out.
fillPage( rDestinationCanvas,
::basegfx::B2DSize( getEnteringSlideSizePixel( rViewEntry.mpView ) ),
*maFadeColor );
}
// Until half of the active time, fade out old
// slide. After half of the active time, old slide
// will be invisible.
@ -486,10 +488,13 @@ public:
rViewContainer,
rScreenUpdater,
rEventMultiplexer ),
maFadeColor( rFadeColor ),
mbFirstTurn( true )
maFadeColor( rFadeColor )
{}
virtual void prepareForRun(
const ViewEntry& rViewEntry,
const cppcanvas::CanvasSharedPtr& rDestinationCanvas );
virtual void performIn(
const ::cppcanvas::CustomSpriteSharedPtr& rSprite,
const ViewEntry& rViewEntry,
@ -504,9 +509,19 @@ public:
private:
RGBColor maFadeColor;
bool mbFirstTurn;
};
void CutSlideChange::prepareForRun(
const ViewEntry& rViewEntry,
const cppcanvas::CanvasSharedPtr& rDestinationCanvas )
{
// clear page to given fade color. 'Leaving' slide is
// painted atop of that
fillPage( rDestinationCanvas,
::basegfx::B2DSize( getEnteringSlideSizePixel( rViewEntry.mpView ) ),
maFadeColor );
}
void CutSlideChange::performIn(
const ::cppcanvas::CustomSpriteSharedPtr& rSprite,
const ViewEntry& /*rViewEntry*/,
@ -523,7 +538,7 @@ void CutSlideChange::performIn(
void CutSlideChange::performOut(
const ::cppcanvas::CustomSpriteSharedPtr& rSprite,
const ViewEntry& rViewEntry,
const ViewEntry& /* rViewEntry */,
const ::cppcanvas::CanvasSharedPtr& rDestinationCanvas,
double t )
{
@ -534,17 +549,6 @@ void CutSlideChange::performOut(
rDestinationCanvas,
"FadingSlideChange::performOut(): Invalid dest canvas" );
if( mbFirstTurn )
{
mbFirstTurn = false;
// clear page to given fade color. 'Leaving' slide is
// painted atop of that
fillPage( rDestinationCanvas,
::basegfx::B2DSize( getEnteringSlideSizePixel( rViewEntry.mpView ) ),
maFadeColor );
}
// Until 1/3rd of the active time, display old slide.
rSprite->setAlpha( t > 1/3.0 ? 0.0 : 1.0 );
}
@ -557,8 +561,6 @@ class MovingSlideChange : public SlideChangeBase
/// Direction vector for entering slide,
const ::basegfx::B2DVector maEnteringDirection;
bool mbFirstPerformCall;
public:
/** Create a new SlideChanger, for the given entering slide
bitmaps, which performes a moving slide change effect
@ -600,10 +602,13 @@ public:
// TODO(F1): calc correct length of direction
// vector. Directions not strictly horizontal or vertical
// must travel a longer distance.
maEnteringDirection( rEnteringDirection ),
mbFirstPerformCall( true )
maEnteringDirection( rEnteringDirection )
{}
virtual void prepareForRun(
const ViewEntry& rViewEntry,
const cppcanvas::CanvasSharedPtr& rDestinationCanvas );
virtual void performIn(
const ::cppcanvas::CustomSpriteSharedPtr& rSprite,
const ViewEntry& rViewEntry,
@ -617,6 +622,16 @@ public:
double t );
};
void MovingSlideChange::prepareForRun(
const ViewEntry& rViewEntry,
const cppcanvas::CanvasSharedPtr& rDestinationCanvas )
{
if ( maLeavingDirection.equalZero() )
renderBitmap( getLeavingBitmap( rViewEntry ), rDestinationCanvas );
else if ( maEnteringDirection.equalZero() )
renderBitmap( getEnteringBitmap( rViewEntry ), rDestinationCanvas );
}
void MovingSlideChange::performIn(
const ::cppcanvas::CustomSpriteSharedPtr& rSprite,
const ViewEntry& rViewEntry,
@ -632,12 +647,6 @@ void MovingSlideChange::performIn(
rDestinationCanvas,
"MovingSlideChange::performIn(): Invalid dest canvas" );
if (mbFirstPerformCall && maLeavingDirection.equalZero())
{
mbFirstPerformCall = false;
renderBitmap( getLeavingBitmap(rViewEntry), rDestinationCanvas );
}
// TODO(F1): This does not account for non-translational
// transformations! If the canvas is rotated, we still
// move the sprite unrotated (which might or might not
@ -670,12 +679,6 @@ void MovingSlideChange::performOut(
rDestinationCanvas,
"MovingSlideChange::performOut(): Invalid dest canvas" );
if (mbFirstPerformCall && maEnteringDirection.equalZero())
{
mbFirstPerformCall = false;
renderBitmap( getEnteringBitmap(rViewEntry), rDestinationCanvas );
}
// TODO(F1): This does not account for non-translational
// transformations! If the canvas is rotated, we still
// move the sprite unrotated (which might or might not