27#include <com/sun/star/animations/TransitionType.hpp>
28#include <com/sun/star/animations/TransitionSubType.hpp>
56void fillPage( const ::cppcanvas::CanvasSharedPtr& rDestinationCanvas,
57 const ::basegfx::B2DSize& rPageSizePixel,
58 const RGBColor& rFillColor )
62 const ::cppcanvas::CanvasSharedPtr pDevicePixelCanvas(
63 rDestinationCanvas->clone() );
68 const ::basegfx::B2DHomMatrix aViewTransform(
69 rDestinationCanvas->getTransformation() );
70 const ::basegfx::B2DPoint aOutputPosPixel(
75 aOutputPosPixel.getX(),
76 aOutputPosPixel.getY(),
77 aOutputPosPixel.getX() + rPageSizePixel.getWidth(),
78 aOutputPosPixel.getY() + rPageSizePixel.getHeight() ),
79 rFillColor.getIntegerColor() );
82class PluginSlideChange:
public SlideChangeBase
84 struct TransitionViewPair {
88 TransitionViewPair( uno::Reference<presentation::XTransition> xTransition,
UnoViewSharedPtr xView )
110 PluginSlideChange( sal_Int16 nTransitionType,
111 sal_Int16 nTransitionSubType,
112 const RGBColor& rTransitionFadeColor,
113 std::optional<SlideSharedPtr>
const& leavingSlide_,
115 const UnoViewContainer& rViewContainer,
116 ScreenUpdater& rScreenUpdater,
118 presentation::XTransitionFactory> xFactory,
120 EventMultiplexer& rEventMultiplexer) :
121 SlideChangeBase( leavingSlide_,
135 for(
const auto& rView : rViewContainer )
137 if( !addTransition( rView ) )
141 "Failed to create plugin transition");
146 virtual ~PluginSlideChange()
override
153 uno::Reference<presentation::XTransition> rTransition =
mxFactory->createTransition(
158 getLeavingBitmap(ViewEntry(rView))->getXBitmap(),
159 getEnteringBitmap(ViewEntry(rView))->getXBitmap() );
161 if( rTransition.is() )
162 maTransitions.emplace_back(
new TransitionViewPair( rTransition, rView ) );
169 virtual bool operator()(
double t )
override
172 pTransition->update( t );
184 SAL_INFO(
"slideshow",
"PluginSlideChange viewAdded");
189 if( pCurrView->mpView == rView )
193 SAL_INFO(
"slideshow",
"need to be added" );
194 addTransition( rView );
199 SAL_INFO(
"slideshow",
"PluginSlideChange viewRemoved");
203 [&rView](
const std::unique_ptr<TransitionViewPair>& rxTransition) { return rxTransition->mpView == rView; });
206 SAL_INFO(
"slideshow",
"view removed" );
213 SAL_INFO(
"slideshow",
"PluginSlideChange viewChanged");
218 if( pCurrView->mpView == rView )
220 SAL_INFO(
"slideshow",
"view changed" );
221 pCurrView->mxTransition->viewChanged( rView->getUnoView(),
222 getLeavingBitmap(ViewEntry(rView))->getXBitmap(),
223 getEnteringBitmap(ViewEntry(rView))->getXBitmap() );
226 SAL_INFO(
"slideshow",
"view did not change" );
230 virtual void viewsChanged()
override
232 SAL_INFO(
"slideshow",
"PluginSlideChange viewsChanged");
237 SAL_INFO(
"slideshow",
"view changed" );
239 pCurrView->mxTransition->viewChanged( pView->getUnoView(),
240 getLeavingBitmap(ViewEntry(pView))->getXBitmap(),
241 getEnteringBitmap(ViewEntry(pView))->getXBitmap() );
256 uno::Reference<presentation::XTransitionFactory>
mxFactory;
259class ClippedSlideChange :
public SlideChangeBase
269 const TransitionInfo& rTransitionInfo,
270 const UnoViewContainer& rViewContainer,
271 ScreenUpdater& rScreenUpdater,
272 EventMultiplexer& rEventMultiplexer,
273 bool bDirectionForward,
278 std::optional<SlideSharedPtr>(),
290 virtual void performIn(
291 const ::cppcanvas::CustomSpriteSharedPtr& rSprite,
292 const ViewEntry& rViewEntry,
293 const ::cppcanvas::CanvasSharedPtr& rDestinationCanvas,
296 virtual void performOut(
297 const ::cppcanvas::CustomSpriteSharedPtr& rSprite,
298 const ViewEntry& rViewEntry,
299 const ::cppcanvas::CanvasSharedPtr& rDestinationCanvas,
306void ClippedSlideChange::performIn(
307 const ::cppcanvas::CustomSpriteSharedPtr& rSprite,
308 const ViewEntry& rViewEntry,
309 const ::cppcanvas::CanvasSharedPtr& ,
317 rSprite->setClipPixel(
322void ClippedSlideChange::performOut(
323 const ::cppcanvas::CustomSpriteSharedPtr& ,
325 const ::cppcanvas::CanvasSharedPtr& ,
332class FadingSlideChange :
public SlideChangeBase
339 std::optional<SlideSharedPtr>
const & leavingSlide,
341 std::optional<RGBColor>
const& rFadeColor,
343 const UnoViewContainer& rViewContainer,
344 ScreenUpdater& rScreenUpdater,
345 EventMultiplexer& rEventMultiplexer )
346 : SlideChangeBase( leavingSlide,
355 virtual void prepareForRun(
356 const ViewEntry& rViewEntry,
359 virtual void performIn(
360 const ::cppcanvas::CustomSpriteSharedPtr& rSprite,
361 const ViewEntry& rViewEntry,
362 const ::cppcanvas::CanvasSharedPtr& rDestinationCanvas,
365 virtual void performOut(
366 const ::cppcanvas::CustomSpriteSharedPtr& rSprite,
367 const ViewEntry& rViewEntry,
368 const ::cppcanvas::CanvasSharedPtr& rDestinationCanvas,
375void FadingSlideChange::prepareForRun(
376 const ViewEntry& rViewEntry,
383 fillPage( rDestinationCanvas,
389void FadingSlideChange::performIn(
390 const ::cppcanvas::CustomSpriteSharedPtr& rSprite,
392 const ::cppcanvas::CanvasSharedPtr& ,
397 "FadingSlideChange::performIn(): Invalid sprite" );
401 rSprite->setAlpha( t > 0.5 ? 2.0*(t-0.5) : 0.0 );
404 rSprite->setAlpha( t );
407void FadingSlideChange::performOut(
408 const ::cppcanvas::CustomSpriteSharedPtr& rSprite,
410 const ::cppcanvas::CanvasSharedPtr& rDestinationCanvas,
415 "FadingSlideChange::performOut(): Invalid sprite" );
418 "FadingSlideChange::performOut(): Invalid dest canvas" );
426 rSprite->setAlpha( t > 0.5 ? 0.0 : 2.0*(0.5-t) );
430class CutSlideChange :
public SlideChangeBase
437 std::optional<SlideSharedPtr>
const & leavingSlide,
439 const RGBColor& rFadeColor,
441 const UnoViewContainer& rViewContainer,
442 ScreenUpdater& rScreenUpdater,
443 EventMultiplexer& rEventMultiplexer )
444 : SlideChangeBase( leavingSlide,
453 virtual void prepareForRun(
454 const ViewEntry& rViewEntry,
457 virtual void performIn(
458 const ::cppcanvas::CustomSpriteSharedPtr& rSprite,
459 const ViewEntry& rViewEntry,
460 const ::cppcanvas::CanvasSharedPtr& rDestinationCanvas,
463 virtual void performOut(
464 const ::cppcanvas::CustomSpriteSharedPtr& rSprite,
465 const ViewEntry& rViewEntry,
466 const ::cppcanvas::CanvasSharedPtr& rDestinationCanvas,
473void CutSlideChange::prepareForRun(
474 const ViewEntry& rViewEntry,
479 fillPage( rDestinationCanvas,
484void CutSlideChange::performIn(
485 const ::cppcanvas::CustomSpriteSharedPtr& rSprite,
487 const ::cppcanvas::CanvasSharedPtr& ,
492 "CutSlideChange::performIn(): Invalid sprite" );
495 rSprite->setAlpha( t > 2/3.0 ? 1.0 : 0.0 );
498void CutSlideChange::performOut(
499 const ::cppcanvas::CustomSpriteSharedPtr& rSprite,
501 const ::cppcanvas::CanvasSharedPtr& rDestinationCanvas,
506 "CutSlideChange::performOut(): Invalid sprite" );
509 "CutSlideChange::performOut(): Invalid dest canvas" );
512 rSprite->setAlpha( t > 1/3.0 ? 0.0 : 1.0 );
515class MovingSlideChange :
public SlideChangeBase
541 const std::optional<SlideSharedPtr>& leavingSlide,
544 const UnoViewContainer& rViewContainer,
545 ScreenUpdater& rScreenUpdater,
546 EventMultiplexer& rEventMultiplexer,
547 const ::basegfx::B2DVector& rLeavingDirection,
548 const ::basegfx::B2DVector& rEnteringDirection )
550 leavingSlide, pEnteringSlide, pSoundPlayer,
551 rViewContainer, rScreenUpdater, rEventMultiplexer,
567 virtual void prepareForRun(
568 const ViewEntry& rViewEntry,
571 virtual void performIn(
572 const ::cppcanvas::CustomSpriteSharedPtr& rSprite,
573 const ViewEntry& rViewEntry,
574 const ::cppcanvas::CanvasSharedPtr& rDestinationCanvas,
577 virtual void performOut(
578 const ::cppcanvas::CustomSpriteSharedPtr& rSprite,
579 const ViewEntry& rViewEntry,
580 const ::cppcanvas::CanvasSharedPtr& rDestinationCanvas,
584void MovingSlideChange::prepareForRun(
585 const ViewEntry& rViewEntry,
589 renderBitmap( getLeavingBitmap( rViewEntry ), rDestinationCanvas );
591 renderBitmap( getEnteringBitmap( rViewEntry ), rDestinationCanvas );
594void MovingSlideChange::performIn(
595 const ::cppcanvas::CustomSpriteSharedPtr& rSprite,
596 const ViewEntry& rViewEntry,
597 const ::cppcanvas::CanvasSharedPtr& rDestinationCanvas,
604 "MovingSlideChange::performIn(): Invalid sprite" );
607 "MovingSlideChange::performIn(): Invalid dest canvas" );
614 rDestinationCanvas->getTransformation() );
619 auto aSlideSizePixel = getEnteringSlideSizePixel(rViewEntry.mpView);
627void MovingSlideChange::performOut(
628 const ::cppcanvas::CustomSpriteSharedPtr& rSprite,
629 const ViewEntry& rViewEntry,
630 const ::cppcanvas::CanvasSharedPtr& rDestinationCanvas,
637 "MovingSlideChange::performOut(): Invalid sprite" );
640 "MovingSlideChange::performOut(): Invalid dest canvas" );
647 rDestinationCanvas->getTransformation() );
652 auto aSlideSizePixel = getEnteringSlideSizePixel(rViewEntry.mpView);
661 std::optional<SlideSharedPtr>
const & leavingSlide_,
663 const UnoViewContainer& rViewContainer,
664 ScreenUpdater& rScreenUpdater,
665 EventMultiplexer& rEventMultiplexer,
667 sal_Int16 nTransitionSubType,
671 std::optional<SlideSharedPtr> leavingSlide;
672 if (leavingSlide_ && *leavingSlide_ !=
nullptr)
679 leavingSlide = leavingSlide_;
685 switch( nTransitionSubType )
689 "createPushWipeTransition(): Unexpected transition "
690 "subtype for animations::TransitionType::PUSHWIPE "
694 case animations::TransitionSubType::FROMTOP:
698 case animations::TransitionSubType::FROMBOTTOM:
702 case animations::TransitionSubType::FROMLEFT:
706 case animations::TransitionSubType::FROMRIGHT:
710 case animations::TransitionSubType::FROMBOTTOMRIGHT:
714 case animations::TransitionSubType::FROMBOTTOMLEFT:
718 case animations::TransitionSubType::FROMTOPRIGHT:
722 case animations::TransitionSubType::FROMTOPLEFT:
726 case animations::TransitionSubType::COMBHORIZONTAL:
731 case animations::TransitionSubType::COMBVERTICAL:
739 return std::make_shared<CombTransition>( leavingSlide,
750 return std::make_shared<MovingSlideChange>( leavingSlide,
762 std::optional<SlideSharedPtr>
const & leavingSlide,
764 const UnoViewContainer& rViewContainer,
765 ScreenUpdater& rScreenUpdater,
766 EventMultiplexer& rEventMultiplexer,
768 sal_Int16 nTransitionSubType,
769 bool bTransitionDirection,
774 switch( nTransitionSubType )
778 "createSlideWipeTransition(): Unexpected transition "
779 "subtype for animations::TransitionType::SLIDEWIPE "
783 case animations::TransitionSubType::FROMTOP:
787 case animations::TransitionSubType::FROMRIGHT:
791 case animations::TransitionSubType::FROMLEFT:
795 case animations::TransitionSubType::FROMBOTTOM:
799 case animations::TransitionSubType::FROMBOTTOMRIGHT:
803 case animations::TransitionSubType::FROMBOTTOMLEFT:
807 case animations::TransitionSubType::FROMTOPRIGHT:
811 case animations::TransitionSubType::FROMTOPLEFT:
816 if( bTransitionDirection )
823 return std::make_shared<MovingSlideChange>(
824 std::optional<SlideSharedPtr>() ,
840 return std::make_shared<MovingSlideChange>( leavingSlide,
852 sal_Int16 nTransitionType,
853 sal_Int16 nTransitionSubType,
854 const RGBColor& rTransitionFadeColor,
855 std::optional<SlideSharedPtr>
const& pLeavingSlide,
857 const UnoViewContainer& rViewContainer,
858 ScreenUpdater& rScreenUpdater,
859 const uno::Reference<
860 presentation::XTransitionFactory>& xFactory,
862 EventMultiplexer& rEventMultiplexer)
865 std::make_shared<PluginSlideChange>(
868 rTransitionFadeColor,
877 if( !pTransition->Success() )
888 const UnoViewContainer& rViewContainer,
889 ScreenUpdater& rScreenUpdater,
890 EventMultiplexer& rEventMultiplexer,
891 const uno::Reference<presentation::XTransitionFactory>& xOptionalFactory,
892 sal_Int16 nTransitionType,
893 sal_Int16 nTransitionSubType,
894 bool bTransitionDirection,
895 const RGBColor& rTransitionFadeColor,
899 if (nTransitionType == 0 && nTransitionSubType == 0) {
902 pSoundPlayer->startPlayback();
911 "TransitionFactory::createSlideTransition(): Invalid entering slide" );
913 if( xOptionalFactory.is() &&
914 xOptionalFactory->hasTransition(nTransitionType, nTransitionSubType) )
918 createPluginTransition(
921 rTransitionFadeColor,
922 std::make_optional(pLeavingSlide),
928 rEventMultiplexer ));
934 const TransitionInfo* pTransitionInfo(
937 if( pTransitionInfo !=
nullptr )
939 switch( pTransitionInfo->meTransitionClass )
944 "TransitionFactory::createSlideTransition(): "
945 "Invalid type/subtype combination encountered."
946 << nTransitionType <<
" " << nTransitionSubType );
955 nTransitionType, nTransitionSubType ) );
958 return std::make_shared<ClippedSlideChange>( pEnteringSlide,
964 bTransitionDirection,
970 switch( nTransitionType )
974 "TransitionFactory::createSlideTransition(): "
975 "Unexpected transition type for "
976 "TRANSITION_SPECIAL transitions" );
979 case animations::TransitionType::RANDOM:
984 const TransitionInfo* pRandomTransitionInfo(
988 pRandomTransitionInfo !=
nullptr,
989 "TransitionFactory::createSlideTransition(): "
990 "Got invalid random transition info" );
993 pRandomTransitionInfo->mnTransitionType !=
994 animations::TransitionType::RANDOM,
995 "TransitionFactory::createSlideTransition(): "
996 "Got random again for random input!" );
1006 pRandomTransitionInfo->mnTransitionType,
1007 pRandomTransitionInfo->mnTransitionSubType,
1008 bTransitionDirection,
1009 rTransitionFadeColor,
1013 case animations::TransitionType::PUSHWIPE:
1015 return createPushWipeTransition(
1016 std::make_optional(pLeavingSlide),
1023 bTransitionDirection,
1027 case animations::TransitionType::SLIDEWIPE:
1029 return createSlideWipeTransition(
1030 std::make_optional(pLeavingSlide),
1037 bTransitionDirection,
1041 case animations::TransitionType::BARWIPE:
1042 case animations::TransitionType::FADE:
1045 std::optional<SlideSharedPtr> leavingSlide;
1046 std::optional<RGBColor> aFadeColor;
1048 switch( nTransitionSubType )
1050 case animations::TransitionSubType::CROSSFADE:
1057 case animations::TransitionSubType::FADETOCOLOR:
1058 case animations::TransitionSubType::FADEFROMCOLOR:
1059 case animations::TransitionSubType::FADEOVERCOLOR:
1060 if (pLeavingSlide) {
1063 leavingSlide = pLeavingSlide;
1065 aFadeColor = rTransitionFadeColor;
1070 "SlideTransitionFactory::createSlideTransition(): Unknown FADE subtype" );
1073 if( nTransitionType == animations::TransitionType::FADE )
1074 return std::make_shared<FadingSlideChange>(
1081 rEventMultiplexer );
1083 return std::make_shared<CutSlideChange>(
1086 rTransitionFadeColor,
1090 rEventMultiplexer );
1101 "TransitionFactory::createSlideTransition(): "
1102 "Unknown type/subtype combination encountered "
1103 << nTransitionType <<
" " << nTransitionSubType );
1105 "TransitionFactory::createSlideTransition(): "
1106 "Unknown type/subtype combination encountered" );
virtual void viewRemoved(const UnoViewSharedPtr &rView) override
Notify removed view.
virtual void viewAdded(const UnoViewSharedPtr &rView) override
Notify new view.
virtual void viewChanged(const UnoViewSharedPtr &rView) override
Notify changed view.
virtual void viewsChanged() override
Notify that all views changed.
#define ENSURE_OR_THROW(c, m)
Reference< XSingleServiceFactory > xFactory
#define SAL_WARN(area, stream)
#define SAL_INFO(area, stream)
std::shared_ptr< Canvas > CanvasSharedPtr
ParametricPolyPolygonSharedPtr createClipPolyPolygon(sal_Int16 nTransitionType, sal_Int16 nTransitionSubType)
NumberAnimationSharedPtr createSlideTransition(const SlideSharedPtr &rLeavingSlide, const SlideSharedPtr &rEnteringSlide, const UnoViewContainer &rViewContainer, ScreenUpdater &rScreenUpdater, EventMultiplexer &rEventMultiplexer, const css::uno::Reference< css::presentation::XTransitionFactory > &xOptionalFactory, sal_Int16 nTransitionType, sal_Int16 nTransitionSubType, bool bTransitionDirection, const RGBColor &rTransitionFadeColor, const SoundPlayerSharedPtr &rSoundPlayer)
Create a transition effect for slides.
::std::shared_ptr< NumberAnimation > NumberAnimationSharedPtr
sal_Int32 RGBAColor2UnoColor(::cppcanvas::IntSRGBA aColor)
::std::shared_ptr< SoundPlayer > SoundPlayerSharedPtr
const TransitionInfo * getRandomTransitionInfo()
const TransitionInfo * getTransitionInfo(sal_Int16 nTransitionType, sal_Int16 nTransitionSubType)
void fillRect(const ::cppcanvas::CanvasSharedPtr &rCanvas, const ::basegfx::B2DRectangle &rRect, ::cppcanvas::IntSRGBA aFillColor)
::std::shared_ptr< Slide > SlideSharedPtr
std::shared_ptr< UnoView > UnoViewSharedPtr
::std::shared_ptr< ParametricPolyPolygon > ParametricPolyPolygonSharedPtr
ClippingFunctor maClippingFunctor
sal_Int16 mnTransitionType
const std::optional< RGBColor > maFadeColor
std::vector< std::unique_ptr< TransitionViewPair > > maTransitions
uno::Reference< presentation::XTransitionFactory > mxFactory
uno::Reference< presentation::XTransition > mxTransition
const ::basegfx::B2DVector maEnteringDirection
Direction vector for entering slide,.
RGBColor mnTransitionFadeColor
sal_Int16 mnTransitionSubType
const ::basegfx::B2DVector maLeavingDirection
Direction vector for leaving slide,.
@ TRANSITION_SPECIAL
Transition expressed by hand-crafted function.
@ TRANSITION_CLIP_POLYPOLYGON
Transition expressed by parametric clip polygon.
@ TRANSITION_INVALID
Invalid type.
css::drawing::Direction3D aDirection