50#include <com/sun/star/awt/XPaintListener.hpp>
51#include <com/sun/star/presentation/XSlideShowView.hpp>
52#include <com/sun/star/rendering/CompositeOperation.hpp>
53#include <com/sun/star/util/XModifyListener.hpp>
80 bool operator<(
const SpriteEntry& rRHS)
const
85 std::weak_ptr< cppcanvas::CustomSprite >
mpSprite;
89typedef std::vector< SpriteEntry > SpriteVector;
157 aClipPoly.transform( pCanvas->getTransformation() );
158 pCanvas->setClip( aClipPoly );
169 const ::basegfx::B2DPolygon aPoly(
170 ::basegfx::utils::createPolygonFromRect(
178 pPolyPoly->setCompositeOp( css::rendering::CompositeOperation::SOURCE );
179 pPolyPoly->setRGBAFillColor( 0xFFFFFF00U );
185 pCliplessCanvas->setClip();
187 if( pCanvas->getClip() )
193 pPolyPoly2->setRGBALineColor( 0x008000FFU );
215 ::canvas::tools::calcTransformedRectBounds( aTmpRect,
220 return ::basegfx::B2IRange();
225 return ::basegfx::B2IRange( ::basegfx::fround(aTmpRect.
getMinX()),
226 ::basegfx::fround(aTmpRect.
getMinY()),
227 ::basegfx::fround(aTmpRect.
getMaxX()) + 1,
228 ::basegfx::fround(aTmpRect.
getMaxY()) + 1 );
238class LayerSpriteContainer
243 enum{ SPRITE_ULLAGE=256 };
254 double getSpritePriority( std::size_t nSpriteNum )
const
274 SpriteVector aValidSprites;
285 aValidSprites.push_back( rSprite );
287 pCurrSprite->setPriority(
288 getSpritePriority( aValidSprites.size()-1 ));
297 LayerSpriteContainer() :
325 SpriteEntry aEntry( pSprite,nPriority );
328 SpriteVector::iterator aInsertPos(
335 const std::size_t nNumSprites(
maSprites.size() );
336 if( nNumSprites > SPRITE_ULLAGE ||
349 pSprite->setPriority(
350 getSpritePriority( nNumSprites-1 ));
373class SlideViewLayer :
public ViewLayer
423 View
const*
const pParentView) :
437 SlideViewLayer(
const SlideViewLayer&) =
delete;
438 SlideViewLayer& operator=(
const SlideViewLayer&) =
delete;
463 virtual css::geometry::IntegerSize2D getTranslationOffset()
const override
469 geometry::IntegerSize2D offset(0, 0);
486 const ::basegfx::B2DSize& rSpriteSizePixel,
487 double nPriority )
const override
500 OSL_ENSURE( !rRange.
isEmpty() &&
502 "SlideViewLayer::setPriority(): prio MUST be larger than 1.0 (because "
503 "the background layer already lies there)" );
538 virtual void clear()
const override
549 virtual void clearAll()
const override
563 virtual bool isOnView(
ViewSharedPtr const& rView)
const override
588 sal::static_int_cast<sal_Int32>(rSpriteSize.getY())) );
609 "SlideViewLayer::getCanvas(): no layer sprite" );
614 "SlideViewLayer::getCanvas(): sprite doesn't yield a canvas" );
619 createClipPolygon(
maClip,
637 createClipPolygon(
maClip,
643 virtual bool resize( const ::basegfx::B2DRange& rArea )
override
655typedef cppu::WeakComponentImplHelper<
656 css::util::XModifyListener,
657 css::awt::XPaintListener> SlideViewBase;
665 public SlideViewBase,
669 SlideView(
const uno::Reference<presentation::XSlideShowView>& xView,
670 EventQueue& rEventQueue,
671 EventMultiplexer& rEventMultiplexer );
677 virtual bool updateScreen()
const override;
678 virtual bool paintScreen()
const override;
679 virtual void setViewSize( const ::basegfx::B2DSize& )
override;
680 virtual void setCursorShape( sal_Int16 nPointerShape )
override;
683 virtual bool isOnView(
ViewSharedPtr const& rView)
const override;
684 virtual void clear()
const override;
685 virtual void clearAll()
const override;
688 double nPriority )
const override;
690 virtual geometry::IntegerSize2D getTranslationOffset()
const override;
691 virtual ::basegfx::B2DHomMatrix getTransformation()
const override;
693 virtual void setClip( const ::basegfx::B2DPolyPolygon& rClip )
override;
694 virtual bool resize( const ::basegfx::B2DRange& rArea )
override;
697 virtual void _dispose()
override;
698 virtual uno::Reference<presentation::XSlideShowView> getUnoView()
const override;
699 virtual void setIsSoundEnabled (
const bool bValue)
override;
700 virtual bool isSoundEnabled()
const override;
703 virtual void SAL_CALL disposing( lang::EventObject
const& evt )
override;
705 virtual void SAL_CALL modified(
const lang::EventObject& aEvent )
override;
707 virtual void SAL_CALL
windowPaint(
const awt::PaintEvent& e )
override;
710 virtual void SAL_CALL disposing()
override;
715 typedef std::vector< std::weak_ptr<SlideViewLayer> > ViewLayerVector;
718 void pruneLayers(
bool bWithViewLayerUpdate=
false )
const;
723 enum{ LAYER_ULLAGE=8 };
725 uno::Reference<presentation::XSlideShowView>
mxView;
742SlideView::SlideView(
const uno::Reference<presentation::XSlideShowView>& xView,
743 EventQueue& rEventQueue,
744 EventMultiplexer& rEventMultiplexer ) :
760 "SlideView::SlideView(): Invalid view" );
763 xView->getCanvas() );
765 "Could not create cppcanvas" );
767 geometry::AffineMatrix2D aViewTransform(
768 xView->getTransformation() );
777 OSL_FAIL(
"SlideView::SlideView(): Singular matrix!" );
790void SlideView::disposing()
792 osl::MutexGuard aGuard( m_aMutex );
801 mxView->removeTransformationChangedListener(
this );
802 mxView->removePaintListener(
this );
809 osl::MutexGuard aGuard( m_aMutex );
812 "SlideView::createViewLayer(): Disposed" );
818 if( nNumLayers > LAYER_ULLAGE )
821 auto xViewLayer = std::make_shared<SlideViewLayer>(
mpCanvas,
831bool SlideView::updateScreen()
const
833 osl::MutexGuard aGuard( m_aMutex );
836 "SlideView::updateScreen(): Disposed" );
838 return mpCanvas->updateScreen(
false );
841bool SlideView::paintScreen()
const
843 osl::MutexGuard aGuard( m_aMutex );
846 "SlideView::paintScreen(): Disposed" );
848 return mpCanvas->updateScreen(
true );
851void SlideView::clear()
const
853 osl::MutexGuard aGuard( m_aMutex );
856 "SlideView::clear(): Disposed" );
861 clearRect(getCanvas()->
clone(),
866 getTransformation()));
869void SlideView::clearAll()
const
871 osl::MutexGuard aGuard( m_aMutex );
874 "SlideView::clear(): Disposed" );
889 osl::MutexGuard aGuard( m_aMutex );
895void SlideView::setCursorShape( sal_Int16 nPointerShape )
897 osl::MutexGuard
const guard( m_aMutex );
900 mxView->setMouseCursor( nPointerShape );
905 return rView.get() ==
this;
910 osl::MutexGuard aGuard( m_aMutex );
913 "SlideView::getCanvas(): Disposed" );
920 double nPriority )
const
922 osl::MutexGuard aGuard( m_aMutex );
927 mpCanvas->createCustomSprite( rSpriteSizePixel ) );
937 OSL_FAIL(
"SlideView::setPriority() is a NOOP for slide view - "
938 "content will always be shown in the background" );
943 osl::MutexGuard aGuard( m_aMutex );
951geometry::IntegerSize2D SlideView::getTranslationOffset()
const
953 return mxView->getTranslationOffset();
958 return getTransformation();
963 osl::MutexGuard aGuard( m_aMutex );
975bool SlideView::resize( const ::basegfx::B2DRange& )
977 OSL_FAIL(
"SlideView::resize(): ignored for the View, can't change size "
978 "effectively, anyway" );
983uno::Reference<presentation::XSlideShowView> SlideView::getUnoView()
const
985 osl::MutexGuard aGuard( m_aMutex );
989void SlideView::setIsSoundEnabled (
const bool bValue)
994bool SlideView::isSoundEnabled()
const
999void SlideView::_dispose()
1005void SlideView::disposing( lang::EventObject
const& evt )
1008 osl::MutexGuard
const guard( m_aMutex );
1012 OSL_ASSERT( evt.Source ==
mxView );
1020struct WeakRefWrapper
1023 uno::WeakReference<uno::XInterface>
const m_wObj;
1024 std::function<void (SlideView&)>
const m_func;
1026 WeakRefWrapper(SlideView & rObj, std::function<
void (SlideView&)> func)
1028 ,
m_wObj(rObj.getXWeak())
1035 uno::Reference<uno::XInterface>
const xObj(
m_wObj);
1044void SlideView::modified(
const lang::EventObject& )
1046 osl::MutexGuard
const guard( m_aMutex );
1048 OSL_ENSURE(
mxView.is(),
"SlideView::modified(): "
1049 "Disposed, but event received from XSlideShowView?!");
1054 geometry::AffineMatrix2D aViewTransform(
1055 mxView->getTransformation() );
1064 OSL_FAIL(
"SlideView::modified(): Singular matrix!" );
1086 [] (SlideView & rThis) { rThis.mrEventMultiplexer.notifyViewChanged(rThis.mxView); }),
1087 "EventMultiplexer::notifyViewChanged"));
1091void SlideView::windowPaint(
const awt::PaintEvent& )
1093 osl::MutexGuard aGuard( m_aMutex );
1095 OSL_ENSURE(
mxView.is() &&
mpCanvas,
"Disposed, but event received?!" );
1101 [] (SlideView & rThis) { rThis.mrEventMultiplexer.notifyViewClobbered(rThis.mxView); }),
1102 "EventMultiplexer::notifyViewClobbered") );
1105void SlideView::updateCanvas()
1108 "SlideView::updateCanvasTransform(): Disposed" );
1114 mpCanvas->setTransformation( getTransformation() );
1116 createClipPolygon(
maClip,
1121 pruneLayers(
true );
1124void SlideView::updateClip()
1127 "SlideView::updateClip(): Disposed" );
1133 createClipPolygon(
maClip,
1140void SlideView::pruneLayers(
bool bWithViewLayerUpdate )
const
1142 ViewLayerVector aValidLayers;
1145 getTransformation() );
1150 std::shared_ptr< SlideViewLayer > xCurrLayer( rView.lock() );
1154 aValidLayers.push_back( xCurrLayer );
1156 if( bWithViewLayerUpdate )
1157 xCurrLayer->updateView( rCurrTransform,
1172 std::shared_ptr<SlideView>
const that(
1174 new SlideView(xView,
1176 rEventMultiplexer)));
1179 xView->addTransformationChangedListener( that.get() );
1180 xView->addPaintListener( that.get() );
1183 that->updateCanvas();
double getMinimum() const
void scale(double fX, double fY)
B2IPoint getMinimum() const
B2I64Tuple getRange() const
void intersect(const Range2D &rRange)
static PolyPolygonSharedPtr createPolyPolygon(const CanvasSharedPtr &, const ::basegfx::B2DPolygon &rPoly)
static SpriteCanvasSharedPtr createSpriteCanvas(const vcl::Window &rVCLWindow)
This class multiplexes user-activated and slide-show global events.
This class handles events in a presentation.
T * clone(T *const other)
#define ENSURE_OR_RETURN_FALSE(c, m)
#define ENSURE_OR_THROW(c, m)
DECL_LISTENERMULTIPLEXER_END void SAL_CALL windowPaint(const css::awt::PaintEvent &e) override
B2DPolygon createPolygonFromRect(const B2DRectangle &rRect, double fRadiusX, double fRadiusY)
B2DPolyPolygon clipPolyPolygonOnRange(const B2DPolyPolygon &rCandidate, const B2DRange &rRange, bool bInside, bool bStroke)
B2DPolyPolygon correctOrientations(const B2DPolyPolygon &rCandidate)
B2DPolyPolygon stripNeutralPolygons(const B2DPolyPolygon &rCandidate)
B2DPolyPolygon solveCrossovers(const B2DPolyPolygon &rCandidate, size_t *pPointLimit=nullptr)
B2DPolyPolygon stripDispensablePolygons(const B2DPolyPolygon &rCandidate, bool bKeepAboveZero=false)
B2IRange fround(const B2DRange &rRange)
std::shared_ptr< T > make_shared_from_UNO(T *p)
std::shared_ptr< ::cppcanvas::CustomSprite > CustomSpriteSharedPtr
std::shared_ptr< PolyPolygon > PolyPolygonSharedPtr
std::shared_ptr< ::cppcanvas::SpriteCanvas > SpriteCanvasSharedPtr
std::shared_ptr< Canvas > CanvasSharedPtr
std::shared_ptr< View > ViewSharedPtr
std::shared_ptr< ViewLayer > ViewLayerSharedPtr
UnoViewSharedPtr createSlideView(uno::Reference< presentation::XSlideShowView > const &xView, EventQueue &rEventQueue, EventMultiplexer &rEventMultiplexer)
std::shared_ptr< UnoView > UnoViewSharedPtr
::basegfx::B2DHomMatrix getSpriteTransformation(const ::basegfx::B2DVector &rPixelSize, const ::basegfx::B2DVector &rOrigSize, const ShapeAttributeLayerSharedPtr &pAttr)
basegfx::B2DRange maLayerBounds
Bounds of this layer in user space coordinates.
basegfx::B1DRange maLayerPrioRange
Priority of this layer, relative to other view layers.
basegfx::B2DHomMatrix maViewTransform
cppcanvas::SpriteCanvasSharedPtr mpCanvas
basegfx::B2IRange maLayerBoundsPixel
Bounds of this layer in device pixel.
basegfx::B2DHomMatrix maTransformation
Current overall view transformation.
LayerSpriteContainer maSpriteContainer
Smart container for all sprites issued by this layer.
EventMultiplexer & mrEventMultiplexer
basegfx::B2DSize maUserSize
Current size of the view in user coordinates.
std::weak_ptr< cppcanvas::CustomSprite > mpSprite
output surface (necessarily a sprite, won't otherwise be able to display anything before other sprite...
View const *const mpParentView
ptr back to owning view. needed for isOnView() method
ViewLayerVector maViewLayers
EventQueue & mrEventQueue
const cppcanvas::SpriteCanvasSharedPtr mpSpriteCanvas
'parent' canvas, this viewlayer is associated with
cppcanvas::CanvasSharedPtr mpOutputCanvas
actual output canvas retrieved from a sprite
SpriteVector maSprites
All sprites that have been issued by this container (pruned from time to time, for invalid references...
std::function< void(SlideView &)> const m_func
basegfx::B2DPolyPolygon maClip
Current clip polygon in user coordinates.
uno::WeakReference< uno::XInterface > const m_wObj
uno::Reference< presentation::XSlideShowView > mxView
bool operator<(const wwFont &r1, const wwFont &r2)