29#include <com/sun/star/awt/XWindow.hpp>
47 css::rendering::XCustomSprite
48 > PresenterCustomSpriteInterfaceBase;
50class PresenterCustomSprite final
51 :
public PresenterCustomSpriteInterfaceBase
54 PresenterCustomSprite (
56 const Reference<rendering::XCustomSprite>& rxSprite,
57 const Reference<awt::XWindow>& rxBaseWindow);
58 PresenterCustomSprite(
const PresenterCustomSprite&) =
delete;
59 PresenterCustomSprite& operator=(
const PresenterCustomSprite&) =
delete;
60 virtual void disposing(std::unique_lock<std::mutex>&)
override;
64 virtual void SAL_CALL setAlpha (
double nAlpha)
override;
66 virtual void SAL_CALL move (
const geometry::RealPoint2D& rNewPos,
67 const rendering::ViewState& rViewState,
68 const rendering::RenderState& rRenderState)
override;
70 virtual void SAL_CALL transform (
const geometry::AffineMatrix2D& rTransformation)
override;
72 virtual void SAL_CALL clip (
const Reference<rendering::XPolyPolygon2D>& rClip)
override;
74 virtual void SAL_CALL setPriority (
double nPriority)
override;
76 virtual void SAL_CALL show()
override;
78 virtual void SAL_CALL hide()
override;
82 virtual Reference<rendering::XCanvas> SAL_CALL getContentCanvas()
override;
91 void ThrowIfDisposed();
99 const Reference<rendering::XSpriteCanvas>& rxUpdateCanvas,
100 const Reference<awt::XWindow>& rxUpdateWindow,
101 const Reference<rendering::XCanvas>& rxSharedCanvas,
102 const Reference<awt::XWindow>& rxSharedWindow,
103 const Reference<awt::XWindow>& rxWindow)
104 : mxUpdateCanvas(rxUpdateCanvas),
105 mxUpdateWindow(rxUpdateWindow),
106 mxSharedCanvas(rxSharedCanvas),
107 mxSharedWindow(rxSharedWindow),
109 mbOffsetUpdatePending(true)
112 mxWindow->addWindowListener(
this);
114 if (mxUpdateCanvas.is())
116 m_pUpdateRequester = CanvasUpdateRequester::Instance(mxUpdateCanvas);
120PresenterCanvas::~PresenterCanvas()
124void PresenterCanvas::disposing(std::unique_lock<std::mutex>&)
128 mxWindow->removeWindowListener(
this);
135void SAL_CALL PresenterCanvas::clear()
142void SAL_CALL PresenterCanvas::drawPoint (
143 const css::geometry::RealPoint2D& aPoint,
144 const css::rendering::ViewState& aViewState,
145 const css::rendering::RenderState& aRenderState)
148 mxSharedCanvas->drawPoint(aPoint,MergeViewState(aViewState),aRenderState);
151void SAL_CALL PresenterCanvas::drawLine (
152 const css::geometry::RealPoint2D& aStartPoint,
153 const css::geometry::RealPoint2D& aEndPoint,
154 const css::rendering::ViewState& aViewState,
155 const css::rendering::RenderState& aRenderState)
158 mxSharedCanvas->drawLine(aStartPoint,aEndPoint,MergeViewState(aViewState),aRenderState);
161void SAL_CALL PresenterCanvas::drawBezier (
162 const css::geometry::RealBezierSegment2D& aBezierSegment,
163 const css::geometry::RealPoint2D& aEndPoint,
164 const css::rendering::ViewState& aViewState,
165 const css::rendering::RenderState& aRenderState)
168 mxSharedCanvas->drawBezier(aBezierSegment,aEndPoint,MergeViewState(aViewState),aRenderState);
171css::uno::Reference<css::rendering::XCachedPrimitive> SAL_CALL PresenterCanvas::drawPolyPolygon (
172 const css::uno::Reference< css::rendering::XPolyPolygon2D >& xPolyPolygon,
173 const css::rendering::ViewState& aViewState,
174 const css::rendering::RenderState& aRenderState)
177 return mxSharedCanvas->drawPolyPolygon(
178 xPolyPolygon, MergeViewState(aViewState), aRenderState);
181css::uno::Reference<css::rendering::XCachedPrimitive> SAL_CALL PresenterCanvas::strokePolyPolygon (
182 const css::uno::Reference< css::rendering::XPolyPolygon2D >& xPolyPolygon,
183 const css::rendering::ViewState& aViewState,
184 const css::rendering::RenderState& aRenderState,
185 const css::rendering::StrokeAttributes& aStrokeAttributes)
188 return mxSharedCanvas->strokePolyPolygon(
189 xPolyPolygon, MergeViewState(aViewState), aRenderState, aStrokeAttributes);
192css::uno::Reference<css::rendering::XCachedPrimitive> SAL_CALL
193 PresenterCanvas::strokeTexturedPolyPolygon (
194 const css::uno::Reference< css::rendering::XPolyPolygon2D >& xPolyPolygon,
195 const css::rendering::ViewState& aViewState,
196 const css::rendering::RenderState& aRenderState,
197 const css::uno::Sequence< css::rendering::Texture >& aTextures,
198 const css::rendering::StrokeAttributes& aStrokeAttributes)
201 return mxSharedCanvas->strokeTexturedPolyPolygon(
202 xPolyPolygon, MergeViewState(aViewState), aRenderState, aTextures, aStrokeAttributes);
205css::uno::Reference<css::rendering::XCachedPrimitive> SAL_CALL
206 PresenterCanvas::strokeTextureMappedPolyPolygon(
207 const css::uno::Reference<css::rendering::XPolyPolygon2D >& xPolyPolygon,
208 const css::rendering::ViewState& aViewState,
209 const css::rendering::RenderState& aRenderState,
210 const css::uno::Sequence<css::rendering::Texture>& aTextures,
211 const css::uno::Reference<css::geometry::XMapping2D>& xMapping,
212 const css::rendering::StrokeAttributes& aStrokeAttributes)
215 return mxSharedCanvas->strokeTextureMappedPolyPolygon(
217 MergeViewState(aViewState),
224css::uno::Reference<css::rendering::XPolyPolygon2D> SAL_CALL
225 PresenterCanvas::queryStrokeShapes(
226 const css::uno::Reference<css::rendering::XPolyPolygon2D>& xPolyPolygon,
227 const css::rendering::ViewState& aViewState,
228 const css::rendering::RenderState& aRenderState,
229 const css::rendering::StrokeAttributes& aStrokeAttributes)
232 return mxSharedCanvas->queryStrokeShapes(
233 xPolyPolygon, MergeViewState(aViewState), aRenderState, aStrokeAttributes);
236css::uno::Reference<css::rendering::XCachedPrimitive> SAL_CALL
237 PresenterCanvas::fillPolyPolygon(
238 const css::uno::Reference<css::rendering::XPolyPolygon2D>& xPolyPolygon,
239 const css::rendering::ViewState& aViewState,
240 const css::rendering::RenderState& aRenderState)
243 return mxSharedCanvas->fillPolyPolygon(
244 xPolyPolygon, MergeViewState(aViewState), aRenderState);
247css::uno::Reference<css::rendering::XCachedPrimitive> SAL_CALL
248 PresenterCanvas::fillTexturedPolyPolygon(
249 const css::uno::Reference<css::rendering::XPolyPolygon2D>& xPolyPolygon,
250 const css::rendering::ViewState& aViewState,
251 const css::rendering::RenderState& aRenderState,
252 const css::uno::Sequence<css::rendering::Texture>& xTextures)
255 return mxSharedCanvas->fillTexturedPolyPolygon(
256 xPolyPolygon, MergeViewState(aViewState), aRenderState, xTextures);
259css::uno::Reference<css::rendering::XCachedPrimitive> SAL_CALL
260 PresenterCanvas::fillTextureMappedPolyPolygon(
261 const css::uno::Reference< css::rendering::XPolyPolygon2D >& xPolyPolygon,
262 const css::rendering::ViewState& aViewState,
263 const css::rendering::RenderState& aRenderState,
264 const css::uno::Sequence< css::rendering::Texture >& xTextures,
265 const css::uno::Reference< css::geometry::XMapping2D >& xMapping)
268 return mxSharedCanvas->fillTextureMappedPolyPolygon(
269 xPolyPolygon, MergeViewState(aViewState), aRenderState, xTextures, xMapping);
272css::uno::Reference<css::rendering::XCanvasFont> SAL_CALL
273 PresenterCanvas::createFont(
274 const css::rendering::FontRequest& aFontRequest,
275 const css::uno::Sequence< css::beans::PropertyValue >& aExtraFontProperties,
276 const css::geometry::Matrix2D& aFontMatrix)
279 return mxSharedCanvas->createFont(
280 aFontRequest, aExtraFontProperties, aFontMatrix);
283css::uno::Sequence<css::rendering::FontInfo> SAL_CALL
284 PresenterCanvas::queryAvailableFonts(
285 const css::rendering::FontInfo& aFilter,
286 const css::uno::Sequence< css::beans::PropertyValue >& aFontProperties)
289 return mxSharedCanvas->queryAvailableFonts(aFilter, aFontProperties);
292css::uno::Reference<css::rendering::XCachedPrimitive> SAL_CALL
293 PresenterCanvas::drawText(
294 const css::rendering::StringContext& aText,
295 const css::uno::Reference< css::rendering::XCanvasFont >& xFont,
296 const css::rendering::ViewState& aViewState,
297 const css::rendering::RenderState& aRenderState,
301 return mxSharedCanvas->drawText(
302 aText, xFont, MergeViewState(aViewState), aRenderState, nTextDirection);
305css::uno::Reference<css::rendering::XCachedPrimitive> SAL_CALL
306 PresenterCanvas::drawTextLayout(
307 const css::uno::Reference< css::rendering::XTextLayout >& xLayoutetText,
308 const css::rendering::ViewState& aViewState,
309 const css::rendering::RenderState& aRenderState)
312 return mxSharedCanvas->drawTextLayout(
313 xLayoutetText, MergeViewState(aViewState), aRenderState);
316css::uno::Reference<css::rendering::XCachedPrimitive> SAL_CALL
317 PresenterCanvas::drawBitmap(
318 const css::uno::Reference< css::rendering::XBitmap >& xBitmap,
319 const css::rendering::ViewState& aViewState,
320 const css::rendering::RenderState& aRenderState)
323 return mxSharedCanvas->drawBitmap(
324 xBitmap, MergeViewState(aViewState), aRenderState);
327css::uno::Reference<css::rendering::XCachedPrimitive> SAL_CALL
328 PresenterCanvas::drawBitmapModulated(
329 const css::uno::Reference< css::rendering::XBitmap>& xBitmap,
330 const css::rendering::ViewState& aViewState,
331 const css::rendering::RenderState& aRenderState)
334 return mxSharedCanvas->drawBitmapModulated(
335 xBitmap, MergeViewState(aViewState), aRenderState);
338css::uno::Reference<css::rendering::XGraphicDevice> SAL_CALL
339 PresenterCanvas::getDevice()
342 return mxSharedCanvas->getDevice();
347Reference<rendering::XAnimatedSprite> SAL_CALL
348 PresenterCanvas::createSpriteFromAnimation (
349 const css::uno::Reference<css::rendering::XAnimation>& rAnimation)
353 Reference<rendering::XSpriteCanvas> xSpriteCanvas (mxSharedCanvas, UNO_QUERY);
354 if (xSpriteCanvas.is())
355 return xSpriteCanvas->createSpriteFromAnimation(rAnimation);
360Reference<rendering::XAnimatedSprite> SAL_CALL
361 PresenterCanvas::createSpriteFromBitmaps (
362 const css::uno::Sequence<
363 css::uno::Reference< css::rendering::XBitmap > >& rAnimationBitmaps,
368 Reference<rendering::XSpriteCanvas> xSpriteCanvas (mxSharedCanvas, UNO_QUERY);
369 if (xSpriteCanvas.is())
370 return xSpriteCanvas->createSpriteFromBitmaps(rAnimationBitmaps, nInterpolationMode);
375Reference<rendering::XCustomSprite> SAL_CALL
376 PresenterCanvas::createCustomSprite (
377 const css::geometry::RealSize2D& rSpriteSize)
381 Reference<rendering::XSpriteCanvas> xSpriteCanvas (mxSharedCanvas, UNO_QUERY);
382 if (xSpriteCanvas.is())
383 return new PresenterCustomSprite(
385 xSpriteCanvas->createCustomSprite(rSpriteSize),
387 else if (mxUpdateCanvas.is())
388 return new PresenterCustomSprite(
390 mxUpdateCanvas->createCustomSprite(rSpriteSize),
396Reference<rendering::XSprite> SAL_CALL
397 PresenterCanvas::createClonedSprite (
398 const css::uno::Reference< css::rendering::XSprite >& rxOriginal)
402 Reference<rendering::XSpriteCanvas> xSpriteCanvas (mxSharedCanvas, UNO_QUERY);
403 if (xSpriteCanvas.is())
404 return xSpriteCanvas->createClonedSprite(rxOriginal);
405 if (mxUpdateCanvas.is())
406 return mxUpdateCanvas->createClonedSprite(rxOriginal);
414 mbOffsetUpdatePending =
true;
415 if (m_pUpdateRequester !=
nullptr)
417 m_pUpdateRequester->RequestUpdate(bUpdateAll);
428void SAL_CALL PresenterCanvas::disposing (
const css::lang::EventObject& rEvent)
431 if (rEvent.Source == mxWindow)
437void SAL_CALL PresenterCanvas::windowResized (
const css::awt::WindowEvent&)
440 mbOffsetUpdatePending =
true;
443void SAL_CALL PresenterCanvas::windowMoved (
const css::awt::WindowEvent&)
446 mbOffsetUpdatePending =
true;
449void SAL_CALL PresenterCanvas::windowShown (
const css::lang::EventObject&)
452 mbOffsetUpdatePending =
true;
455void SAL_CALL PresenterCanvas::windowHidden (
const css::lang::EventObject&)
462geometry::IntegerSize2D SAL_CALL PresenterCanvas::getSize()
468 const awt::Rectangle aWindowBox (mxWindow->getPosSize());
469 return geometry::IntegerSize2D(aWindowBox.Width, aWindowBox.Height);
472 return geometry::IntegerSize2D(0,0);
477 Reference<rendering::XBitmap> xBitmap (mxSharedCanvas, UNO_QUERY);
479 return xBitmap->hasAlpha();
484Reference<rendering::XBitmap> SAL_CALL PresenterCanvas::getScaledBitmap(
485 const css::geometry::RealSize2D&,
495rendering::ViewState PresenterCanvas::MergeViewState (
496 const rendering::ViewState& rViewState)
499 if (mbOffsetUpdatePending)
500 maOffset = GetOffset(mxSharedWindow);
501 return MergeViewState(rViewState, maOffset);
504css::rendering::ViewState PresenterCanvas::MergeViewState (
505 const css::rendering::ViewState& rViewState,
506 const css::awt::Point& rOffset)
509 if ( ! mxSharedCanvas.is())
512 Reference<rendering::XGraphicDevice> xDevice (mxSharedCanvas->getDevice());
517 rendering::ViewState aViewState (rViewState);
523 aViewState.AffineTransform.m02 += rOffset.X;
524 aViewState.AffineTransform.m12 += rOffset.Y;
527 if ( ! aViewState.Clip.is())
531 aViewState.Clip = ::basegfx::unotools::xPolyPolygonFromB2DPolyPolygon(
541 const ::basegfx::B2DPolyPolygon aClipPolygon (
542 ::basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(
544 const ::basegfx::B2DPolyPolygon aClippedClipPolygon (
545 ::basegfx::utils::clipPolyPolygonOnRange(
551 aViewState.Clip = ::basegfx::unotools::xPolyPolygonFromB2DPolyPolygon(
553 aClippedClipPolygon);
559awt::Point PresenterCanvas::GetOffset (
const Reference<awt::XWindow>& rxBaseWindow)
561 mbOffsetUpdatePending =
false;
562 if (mxWindow.is() && rxBaseWindow.is())
566 if (pWindow && pSharedWindow)
572 return awt::Point(aBox.
Left(), aBox.
Top());
576 return awt::Point(0, 0);
580 const css::geometry::AffineMatrix2D& rViewTransform,
581 const awt::Point& rOffset)
585 return ::basegfx::B2DRectangle();
589 return ::basegfx::B2DRectangle();
599 aLocalClip.
Left() - rOffset.X,
600 aLocalClip.
Top() - rOffset.Y,
601 aLocalClip.
Right() - rOffset.X + 1,
602 aLocalClip.
Bottom() - rOffset.Y + 1);
608 ::basegfx::unotools::homMatrixFromAffineMatrix(
609 aInvertedViewStateTransformation,
611 if (aInvertedViewStateTransformation.
invert())
615 aWindowRectangle.
transform(aInvertedViewStateTransformation);
618 return aWindowRectangle;
621Reference<rendering::XPolyPolygon2D> PresenterCanvas::UpdateSpriteClip (
622 const Reference<rendering::XPolyPolygon2D>& rxOriginalClip,
623 const geometry::RealPoint2D& rLocation)
627 if ( ! mxWindow.is())
628 return rxOriginalClip;
630 Reference<rendering::XGraphicDevice> xDevice (mxSharedCanvas->getDevice());
632 return rxOriginalClip;
636 const awt::Rectangle aWindowBox (mxWindow->getPosSize());
637 const double nMinX (-rLocation.X);
638 const double nMinY (-rLocation.Y);
639 const double nMaxX (aWindowBox.Width-rLocation.X);
640 const double nMaxY (aWindowBox.Height-rLocation.Y);
643 Reference<rendering::XPolyPolygon2D> xPolygon;
644 if (rxOriginalClip.is())
647 const ::basegfx::B2DPolyPolygon aOriginalClip (
648 ::basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(rxOriginalClip));
650 const ::basegfx::B2DPolyPolygon aClippedClipPolygon (
651 ::basegfx::utils::clipPolyPolygonOnRange(
656 xPolygon = ::basegfx::unotools::xPolyPolygonFromB2DPolyPolygon(
658 aClippedClipPolygon);
663 Sequence<Sequence<geometry::RealPoint2D> > aPoints
672 Reference<rendering::XLinePolyPolygon2D> xLinePolygon(
673 xDevice->createCompatibleLinePolyPolygon(aPoints));
674 if (xLinePolygon.is())
675 xLinePolygon->setClosed(0,
true);
676 xPolygon = xLinePolygon;
682void PresenterCanvas::ThrowIfDisposed()
686 throw lang::DisposedException (
"PresenterCanvas object has already been disposed",
687 static_cast<uno::XWeak*
>(
this));
693PresenterCustomSprite::PresenterCustomSprite (
695 const Reference<rendering::XCustomSprite>& rxSprite,
696 const Reference<awt::XWindow>& rxBaseWindow)
704void PresenterCustomSprite::disposing(std::unique_lock<std::mutex>&)
706 Reference<XComponent> xComponent (
mxSprite, UNO_QUERY);
709 xComponent->dispose();
715void SAL_CALL PresenterCustomSprite::setAlpha (
const double nAlpha)
721void SAL_CALL PresenterCustomSprite::move (
722 const geometry::RealPoint2D& rNewPos,
723 const rendering::ViewState& rViewState,
724 const rendering::RenderState& rRenderState)
739void SAL_CALL PresenterCustomSprite::transform (
const geometry::AffineMatrix2D& rTransformation)
742 mxSprite->transform(rTransformation);
745void SAL_CALL PresenterCustomSprite::clip (
const Reference<rendering::XPolyPolygon2D>& rxClip)
754void SAL_CALL PresenterCustomSprite::setPriority (
const double nPriority)
760void SAL_CALL PresenterCustomSprite::show()
766void SAL_CALL PresenterCustomSprite::hide()
774Reference<rendering::XCanvas> PresenterCustomSprite::getContentCanvas()
777 return mxSprite->getContentCanvas();
780void PresenterCustomSprite::ThrowIfDisposed()
784 throw lang::DisposedException (
"PresenterCustomSprite object has already been disposed",
785 static_cast<uno::XWeak*
>(
this));
Reference< rendering::XCustomSprite > mxSprite
rtl::Reference< PresenterCanvas > mpCanvas
geometry::RealPoint2D maPosition
Reference< awt::XWindow > mxBaseWindow
static vcl::Window * GetWindow(const css::uno::Reference< css::awt::XWindow > &rxWindow)
BASEGFX_DLLPUBLIC void transform(const B2DHomMatrix &rMatrix)
PresenterCanvas(const css::uno::Reference< css::rendering::XSpriteCanvas > &rxUpdateCanvas, const css::uno::Reference< css::awt::XWindow > &rxUpdateWindow, const css::uno::Reference< css::rendering::XCanvas > &rxSharedCanvas, const css::uno::Reference< css::awt::XWindow > &rxSharedWindow, const css::uno::Reference< css::awt::XWindow > &rxWindow)
This constructor is used when a PresenterCanvas object is created directly, typically by the Presente...