LibreOffice Module svx (master) 1
sdrpagewindow.cxx
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 *
9 * This file incorporates work covered by the following license notice:
10 *
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 */
19
20#include <svx/sdrpagewindow.hxx>
21#include <com/sun/star/awt/XWindow.hpp>
22#include <com/sun/star/awt/PosSize.hpp>
23#include <com/sun/star/lang/XMultiServiceFactory.hpp>
24#include <comphelper/lok.hxx>
27#include <svx/svdview.hxx>
28#include <svx/svdpagv.hxx>
32#include <svx/fmview.hxx>
33#include <sfx2/lokhelper.hxx>
35#include <tools/debug.hxx>
36#include <vcl/window.hxx>
37
38using namespace ::com::sun::star;
39
41{
42 // #110094# ObjectContact section
44
45 // the SdrPageView this window belongs to
47
48 // the PaintWindow to paint on. Here is access to OutDev etc.
49 // #i72752# change to pointer to allow patcing it in DrawLayer() if necessary
52
53 // UNO stuff for xControls
54 uno::Reference<awt::XControlContainer> mxControlContainer;
55
56 Impl( SdrPageView& rPageView, SdrPaintWindow& rPaintWindow ) :
57 mpObjectContact(nullptr),
58 mrPageView(rPageView),
59 mpPaintWindow(&rPaintWindow),
61 {
62 }
63};
64
65
66uno::Reference<awt::XControlContainer> const & SdrPageWindow::GetControlContainer( bool _bCreateIfNecessary ) const
67{
68 if (!mpImpl->mxControlContainer.is() && _bCreateIfNecessary)
69 {
70 SdrView& rView = GetPageView().GetView();
71
73 if ( rPaintWindow.OutputToWindow() && !rView.IsPrintPreview() )
74 {
75 vcl::Window* pWindow = rPaintWindow.GetOutputDevice().GetOwnerWindow();
76 const_cast< SdrPageWindow* >( this )->mpImpl->mxControlContainer = VCLUnoHelper::CreateControlContainer( pWindow );
77
78 // #100394# xC->setVisible triggers window->Show() and this has
79 // problems when the view is not completely constructed which may
80 // happen when loading. This leads to accessibility broadcasts which
81 // throw asserts due to the not finished view. All this chain can be avoided
82 // since xC->setVisible is here called only for the side effect in
83 // UnoControlContainer::setVisible(...) which calls createPeer(...).
84 // This will now be called directly from here.
85
86 uno::Reference< awt::XControl > xControl(mpImpl->mxControlContainer, uno::UNO_QUERY);
87 if(xControl.is())
88 {
89 uno::Reference< uno::XInterface > xContext = xControl->getContext();
90 if(!xContext.is())
91 {
92 xControl->createPeer( uno::Reference<awt::XToolkit>(), uno::Reference<awt::XWindowPeer>() );
93 }
94 }
95 }
96 else
97 {
98 // Printer and VirtualDevice, or rather: no OutDev
99 uno::Reference< lang::XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory() );
100 const_cast< SdrPageWindow* >( this )->mpImpl->mxControlContainer.set(xFactory->createInstance("com.sun.star.awt.UnoControlContainer"), uno::UNO_QUERY);
101 uno::Reference< awt::XControlModel > xModel(xFactory->createInstance("com.sun.star.awt.UnoControlContainerModel"), uno::UNO_QUERY);
102 uno::Reference< awt::XControl > xControl(mpImpl->mxControlContainer, uno::UNO_QUERY);
103 if (xControl.is())
104 xControl->setModel(xModel);
105
106 OutputDevice& rOutDev = rPaintWindow.GetOutputDevice();
107 Point aPosPix = rOutDev.GetMapMode().GetOrigin();
108 Size aSizePix = rOutDev.GetOutputSizePixel();
109
110 uno::Reference< awt::XWindow > xContComp(mpImpl->mxControlContainer, uno::UNO_QUERY);
111 if( xContComp.is() )
112 xContComp->setPosSize(aPosPix.X(), aPosPix.Y(), aSizePix.Width(), aSizePix.Height(), awt::PosSize::POSSIZE);
113 }
114
115 FmFormView* pViewAsFormView = dynamic_cast< FmFormView* >( &rView );
116 if ( pViewAsFormView )
117 pViewAsFormView->InsertControlContainer(mpImpl->mxControlContainer);
118 }
119 return mpImpl->mxControlContainer;
120}
121
123 mpImpl(new Impl(rPageView, rPaintWindow))
124{
125}
126
128{
129 // #i26631#
131
132 if (!mpImpl->mxControlContainer.is())
133 return;
134
135 auto & rView = static_cast<SdrPaintView &>(GetPageView().GetView());
136
137 // notify derived views
138 FmFormView* pViewAsFormView = dynamic_cast< FmFormView* >( &rView );
139 if ( pViewAsFormView )
140 pViewAsFormView->RemoveControlContainer(mpImpl->mxControlContainer);
141
142 // dispose the control container
143 uno::Reference< lang::XComponent > xComponent(mpImpl->mxControlContainer, uno::UNO_QUERY);
144 xComponent->dispose();
145}
146
148{
149 return mpImpl->mrPageView;
150}
151
153{
154 return *mpImpl->mpPaintWindow;
155}
156
158{
159 return mpImpl->mpOriginalPaintWindow;
160}
161
162// OVERLAY MANAGER
164{
166}
167
169{
170 if (!mpImpl)
171 return nullptr;
172
173 if (!mpImpl->mpOriginalPaintWindow)
174 {
175 // first patch
176 mpImpl->mpOriginalPaintWindow = mpImpl->mpPaintWindow;
177 mpImpl->mpPaintWindow = &rPaintWindow;
178 mpImpl->mpOriginalPaintWindow->setPatched(&rPaintWindow);
179 return mpImpl->mpOriginalPaintWindow;
180 }
181 else
182 {
183 // second or more patch
184 auto pPreviousPaintWindow = mpImpl->mpPaintWindow;
185 mpImpl->mpPaintWindow = &rPaintWindow;
186 mpImpl->mpOriginalPaintWindow->setPatched(&rPaintWindow);
187 return pPreviousPaintWindow;
188 }
189}
190
192{
193 if (pPreviousPaintWindow == mpImpl->mpOriginalPaintWindow)
194 {
195 // first patch
196 mpImpl->mpPaintWindow = mpImpl->mpOriginalPaintWindow;
197 mpImpl->mpOriginalPaintWindow->setPatched(nullptr);
198 mpImpl->mpOriginalPaintWindow = nullptr;
199 }
200 else
201 {
202 // second or more patch
203 mpImpl->mpPaintWindow = pPreviousPaintWindow;
204 mpImpl->mpOriginalPaintWindow->setPatched(pPreviousPaintWindow);
205 }
206}
207
209{
210 // give OC the chance to do ProcessDisplay preparations
211 if(HasObjectContact())
212 {
214 }
215}
216
218{
219 // give OC the chance to do ProcessDisplay preparations
220 if(HasObjectContact())
221 {
223 }
224
225 // if necessary, remember changed RedrawArea at PaintWindow for usage with
226 // overlay and PreRenderDevice stuff
228}
229
230
231// clip test
232#ifdef CLIPPER_TEST
233#include <svx/svdopath.hxx>
235#include <tools/helpers.hxx>
240
241// for ::std::sort
242#include <algorithm>
243
244namespace
245{
246 void impPaintStrokePolygon(const basegfx::B2DPolygon& rCandidate, OutputDevice& rOutDev, Color aColor)
247 {
248 basegfx::B2DPolygon aCandidate(rCandidate);
249
250 if(aCandidate.areControlPointsUsed())
251 {
252 aCandidate = basegfx::utils::adaptiveSubdivideByAngle(rCandidate);
253 }
254
255 if(aCandidate.count())
256 {
257 const sal_uInt32 nLoopCount(aCandidate.isClosed() ? aCandidate.count() : aCandidate.count() - 1);
258 rOutDev.SetFillColor();
259 rOutDev.SetLineColor(aColor);
260
261 for(sal_uInt32 a(0); a < nLoopCount; a++)
262 {
263 const basegfx::B2DPoint aBStart(aCandidate.getB2DPoint(a));
264 const basegfx::B2DPoint aBEnd(aCandidate.getB2DPoint((a + 1) % aCandidate.count()));
265 const Point aStart(FRound(aBStart.getX()), FRound(aBStart.getY()));
266 const Point aEnd(FRound(aBEnd.getX()), FRound(aBEnd.getY()));
267 rOutDev.DrawLine(aStart, aEnd);
268 }
269 }
270 }
271
272 void impTryTest(const SdrPageView& rPageView, OutputDevice& rOutDev)
273 {
274 if(rPageView.GetPage() && rPageView.GetPage()->GetObjCount() >= 2)
275 {
276 SdrPage* pPage = rPageView.GetPage();
277 SdrObject* pObjA = pPage->GetObj(0);
278
279 if(dynamic_cast<const SdrPathObj*>( pObjA))
280 {
281 basegfx::B2DPolyPolygon aPolyA(pObjA->GetPathPoly());
283
285
286 for(sal_uInt32 a(1); a < rPageView.GetPage()->GetObjCount(); a++)
287 {
288 SdrObject* pObjB = pPage->GetObj(a);
289
290 if(dynamic_cast<const SdrPathObj*>( pObjB))
291 {
292 basegfx::B2DPolyPolygon aCandidate(pObjB->GetPathPoly());
293 aCandidate = basegfx::utils::correctOrientations(aCandidate);
294 aPolyB.append(aCandidate);
295 }
296 }
297
298 if(aPolyA.count() && aPolyA.isClosed() && aPolyB.count())
299 {
300 // poly A is the clipregion, clip poly b against it. Algo depends on
301 // poly b being closed.
303
304 for(auto const& rPolygon : aResult)
305 {
309 Color aColor(nR, nG, nB);
310 impPaintStrokePolygon(rPolygon, rOutDev, aColor);
311 }
312 }
313 }
314 }
315 }
316} // end of anonymous namespace
317#endif // CLIPPER_TEST
318
319
321{
322 // set Redirector
324
325 // set PaintingPageView
326 const SdrView& rView = mpImpl->mrPageView.GetView();
327 SdrModel& rModel = rView.GetModel();
328
329 // get to be processed layers
330 const bool bPrinter(GetPaintWindow().OutputToPrinter());
331 SdrLayerIDSet aProcessLayers = bPrinter ? mpImpl->mrPageView.GetPrintableLayers() : mpImpl->mrPageView.GetVisibleLayers();
332
333 // create PaintInfoRec; use Rectangle only temporarily
334 const vcl::Region& rRegion = GetPaintWindow().GetRedrawRegion();
335
336 // create processing data
337 sdr::contact::DisplayInfo aDisplayInfo;
338
339 // Draw all layers. do NOT draw form layer from CompleteRedraw, this is done separately
340 // as a single layer paint
341 const SdrLayerAdmin& rLayerAdmin = rModel.GetLayerAdmin();
342 const SdrLayerID nControlLayerId = rLayerAdmin.GetLayerID(rLayerAdmin.GetControlLayerName());
343 aProcessLayers.Clear(nControlLayerId);
344
345 // still something to paint?
346 if(!aProcessLayers.IsEmpty())
347 {
348 aDisplayInfo.SetProcessLayers(aProcessLayers);
349
350 // Set region as redraw area
351 aDisplayInfo.SetRedrawArea(rRegion);
352
353 // paint page
354 GetObjectContact().ProcessDisplay(aDisplayInfo);
355 }
356
357 // reset redirector
359
360 // LineClip test
361#ifdef CLIPPER_TEST
362 if(true)
363 {
364 impTryTest(GetPageView(), GetPaintWindow().GetOutputDevice());
365 }
366#endif // CLIPPER_TEST
367}
368
371 basegfx::B2IRectangle const*const pPageFrame)
372{
373 // set redirector
375
376 // set PaintingPageView
377 const SdrView& rView = mpImpl->mrPageView.GetView();
378 SdrModel& rModel = rView.GetModel();
379
380 // get the layers to process
381 const bool bPrinter(GetPaintWindow().OutputToPrinter());
382 SdrLayerIDSet aProcessLayers = bPrinter ? mpImpl->mrPageView.GetPrintableLayers() : mpImpl->mrPageView.GetVisibleLayers();
383
384 // is the given layer visible at all?
385 if(aProcessLayers.IsSet(*pId))
386 {
387 // find out if we are painting the ControlLayer
388 const SdrLayerAdmin& rLayerAdmin = rModel.GetLayerAdmin();
389 const SdrLayerID nControlLayerId = rLayerAdmin.GetLayerID(rLayerAdmin.GetControlLayerName());
390 const bool bControlLayerProcessingActive(nControlLayerId == *pId);
391
392 // create PaintInfoRec, use Rectangle only temporarily
393 const vcl::Region& rRegion = GetPaintWindow().GetRedrawRegion();
394
395 // create processing data
396 sdr::contact::DisplayInfo aDisplayInfo;
397
398 // is it the control layer? If Yes, set flag
399 aDisplayInfo.SetControlLayerProcessingActive(bControlLayerProcessingActive);
400
401 // Draw just the one given layer
402 aProcessLayers.ClearAll();
403 aProcessLayers.Set(*pId);
404
405 aDisplayInfo.SetProcessLayers(aProcessLayers);
406
407 // Set region as redraw area
408 aDisplayInfo.SetRedrawArea(rRegion);
409
410 // Writer or calc, coming from original RedrawOneLayer.
411 // #i72889# no page painting or MasterPage painting for layer painting
412 const bool bOldPageDecorationAllowed(GetPageView().GetView().IsPageDecorationAllowed());
413 const bool bOldMasterPageVisualizationAllowed(GetPageView().GetView().IsMasterPageVisualizationAllowed());
416
417 if (pPageFrame) // Writer page frame for anchor based clipping
418 {
419 aDisplayInfo.SetWriterPageFrame(*pPageFrame);
420 }
421
422 // paint page
423 GetObjectContact().ProcessDisplay(aDisplayInfo);
424
425 // reset temporarily changed flags
426 GetPageView().GetView().SetPageDecorationAllowed(bOldPageDecorationAllowed);
427 GetPageView().GetView().SetMasterPageVisualizationAllowed(bOldMasterPageVisualizationAllowed);
428 }
429
430 // reset redirector
432}
433
434// Invalidate call, used from ObjectContact(OfPageView) in InvalidatePartOfView(...)
436{
437 if (GetPageView().IsVisible() && GetPaintWindow().OutputToWindow())
438 {
439 OutputDevice& rWindow(GetPaintWindow().GetOutputDevice());
440 basegfx::B2DRange aDiscreteRange(rRange);
441 aDiscreteRange.transform(rWindow.GetViewTransformation());
442
444 {
445 // invalidate one discrete unit more under the assumption that AA
446 // needs one pixel more
447 aDiscreteRange.grow(1.0);
448 }
449
450 // If the shapes use negative X coordinates, make them positive before sending
451 // the invalidation rectangle.
452 bool bNegativeX = mpImpl->mrPageView.GetView().IsNegativeX();
453
454 const tools::Rectangle aVCLDiscreteRectangle(
455 static_cast<tools::Long>(bNegativeX ? std::max(0.0, ceil(-aDiscreteRange.getMaxX())) : floor(aDiscreteRange.getMinX())),
456 static_cast<tools::Long>(floor(aDiscreteRange.getMinY())),
457 static_cast<tools::Long>(bNegativeX ? std::max(0.0, floor(-aDiscreteRange.getMinX())) : ceil(aDiscreteRange.getMaxX())),
458 static_cast<tools::Long>(ceil(aDiscreteRange.getMaxY())));
459
460 const bool bWasMapModeEnabled(rWindow.IsMapModeEnabled());
461 rWindow.EnableMapMode(false);
462 GetPageView().GetView().InvalidateOneWin(rWindow, aVCLDiscreteRectangle);
463 rWindow.EnableMapMode(bWasMapModeEnabled);
464 }
466 {
467 // we don't really have to have a paint window with LOK; OTOH we know
468 // that the drawinglayer units are 100ths of mm, so they are easy to
469 // convert to twips
470
471 // If the shapes use negative X coordinates, make them positive before sending
472 // the invalidation rectangle.
473 bool bNegativeX = mpImpl->mrPageView.GetView().IsNegativeX();
474 const tools::Rectangle aRect100thMM(
475 static_cast<tools::Long>(bNegativeX ? std::max(0.0, ceil(-rRange.getMaxX())) : floor(rRange.getMinX())),
476 static_cast<tools::Long>(floor(rRange.getMinY())),
477 static_cast<tools::Long>(bNegativeX ? std::max(0.0, floor(-rRange.getMinX())) : ceil(rRange.getMaxX())),
478 static_cast<tools::Long>(ceil(rRange.getMaxY())));
479
480 const tools::Rectangle aRectTwips = o3tl::convert(aRect100thMM, o3tl::Length::mm100, o3tl::Length::twip);
481
482 if (SfxViewShell* pViewShell = SfxViewShell::Current())
483 SfxLokHelper::notifyInvalidation(pViewShell, &aRectTwips);
484 }
485}
486
487// ObjectContact section
489{
490 if (!mpImpl->mpObjectContact)
491 {
493 const_cast<SdrPageWindow&>(*this),
494 "svx::svdraw::SdrPageWindow mpObjectContact");
495 }
496
497 return *mpImpl->mpObjectContact;
498}
499
501{
502 if (!mpImpl->mpObjectContact)
503 {
505 *this,
506 "svx::svdraw::SdrPageWindow mpObjectContact" );
507 }
508
509 return *mpImpl->mpObjectContact;
510}
511
513{
514 return mpImpl->mpObjectContact != nullptr;
515}
516
517// #i26631#
519{
520 if (mpImpl->mpObjectContact)
521 {
522 delete mpImpl->mpObjectContact;
523 mpImpl->mpObjectContact = nullptr;
524 }
525}
526
527void SdrPageWindow::SetDesignMode( bool _bDesignMode ) const
528{
530 DBG_ASSERT( pOC, "SdrPageWindow::SetDesignMode: invalid object contact!" );
531 if ( pOC )
532 pOC->SetUNOControlsDesignMode( _bDesignMode );
533}
534
535/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
void RemoveControlContainer(const css::uno::Reference< css::awt::XControlContainer > &xCC)
Definition: fmview.cxx:426
void InsertControlContainer(const css::uno::Reference< css::awt::XControlContainer > &xCC)
Definition: fmview.cxx:404
const Point & GetOrigin() const
void EnableMapMode(bool bEnable=true)
basegfx::B2DHomMatrix GetViewTransformation() const
Size GetOutputSizePixel() const
void DrawLine(const Point &rStartPt, const Point &rEndPt)
void SetLineColor()
void SetFillColor()
const MapMode & GetMapMode() const
virtual vcl::Window * GetOwnerWindow() const
bool IsMapModeEnabled() const
constexpr tools::Long Y() const
constexpr tools::Long X() const
const OUString & GetControlLayerName() const
Definition: svdlayer.hxx:149
SdrLayerID GetLayerID(const OUString &rName) const
Definition: svdlayer.cxx:231
void Set(SdrLayerID a)
Definition: svdsob.hxx:47
void Clear(SdrLayerID a)
Definition: svdsob.hxx:54
bool IsEmpty() const
Definition: svdlayer.cxx:28
bool IsSet(SdrLayerID a) const
Definition: svdsob.hxx:69
void ClearAll()
Definition: svdsob.hxx:80
const SdrLayerAdmin & GetLayerAdmin() const
Definition: svdmodel.hxx:315
SdrObject * GetObj(size_t nNum) const
Definition: svdpage.cxx:785
size_t GetObjCount() const
Definition: svdpage.cxx:779
Abstract DrawObject.
Definition: svdobj.hxx:260
SdrView & GetView()
Definition: svdpagv.hxx:130
SdrPage * GetPage() const
Definition: svdpagv.hxx:166
void unpatchPaintWindow(SdrPaintWindow *pPreviousPaintWindow)
std::unique_ptr< Impl > mpImpl
rtl::Reference< sdr::overlay::OverlayManager > const & GetOverlayManager() const
bool HasObjectContact() const
determines whether there already exists an ObjectContact
SdrPaintWindow * patchPaintWindow(SdrPaintWindow &rPaintWindow)
css::uno::Reference< css::awt::XControlContainer > const & GetControlContainer(bool _bCreateIfNecessary=true) const
void PrepareRedraw(const vcl::Region &rReg)
void InvalidatePageWindow(const basegfx::B2DRange &rRange)
void SetDesignMode(bool _bDesignMode) const
sets all elements in the view which support a design and an alive mode into the given mode
SdrPaintWindow & GetPaintWindow() const
SdrPageWindow(const SdrPageWindow &)=delete
void RedrawLayer(const SdrLayerID *pId, sdr::contact::ViewObjectContactRedirector *pRedirector, basegfx::B2IRectangle const *)
const sdr::contact::ObjectContact & GetObjectContact() const
void RedrawAll(sdr::contact::ViewObjectContactRedirector *pRedirector)
void ResetObjectContact()
const SdrPaintWindow * GetOriginalPaintWindow() const
SdrPageView & GetPageView() const
A SdrPage contains exactly one SdrObjList and a description of the physical page dimensions (size / m...
Definition: svdpage.hxx:379
bool IsPrintPreview() const
Definition: svdpntv.hxx:510
virtual void InvalidateOneWin(OutputDevice &rWin)
If the View should not call Invalidate() on the windows, override the following 2 methods and do some...
Definition: svdpntv.cxx:865
void SetMasterPageVisualizationAllowed(bool bNew)
Definition: svdpntv.cxx:1194
SdrModel & GetModel() const
Definition: svdpntv.hxx:282
void SetPageDecorationAllowed(bool bNew)
Definition: svdpntv.cxx:1186
const vcl::Region & GetRedrawRegion() const
rtl::Reference< sdr::overlay::OverlayManager > const & GetOverlayManager() const
OutputDevice & GetOutputDevice() const
bool OutputToWindow() const
void SetRedrawRegion(const vcl::Region &rNew)
virtual sdr::contact::ObjectContact * createViewSpecificObjectContact(SdrPageWindow &rPageWindow, const char *pDebugName) const
Definition: svdview.cxx:1546
static void notifyInvalidation(SfxViewShell const *pThisView, tools::Rectangle const *)
static SAL_WARN_UNUSED_RESULT SfxViewShell * Current()
constexpr tools::Long Height() const
constexpr tools::Long Width() const
static css::uno::Reference< css::awt::XControlContainer > CreateControlContainer(vcl::Window *pWindow)
void append(const B2DPolygon &rPolygon, sal_uInt32 nCount=1)
sal_uInt32 count() const
BASEGFX_DLLPUBLIC void transform(const B2DHomMatrix &rMatrix)
TYPE getMaxX() const
void grow(TYPE fValue)
TYPE getMinX() const
TYPE getMinY() const
TYPE getMaxY() const
void SetWriterPageFrame(basegfx::B2IRectangle const &rPageFrame)
Definition: displayinfo.cxx:45
void SetProcessLayers(const SdrLayerIDSet &rSet)
Definition: displayinfo.cxx:34
void SetRedrawArea(const vcl::Region &rRegion)
Definition: displayinfo.cxx:40
void SetControlLayerProcessingActive(bool bDoPaint)
Definition: displayinfo.cxx:50
void SetUNOControlsDesignMode(bool _bDesignMode) const
sets all UNO controls which are associated with this ObjectContact to design or alive mode.
virtual void ProcessDisplay(DisplayInfo &rDisplayInfo)
void SetViewObjectContactRedirector(ViewObjectContactRedirector *pNew)
virtual void PrepareProcessDisplay()
#define DBG_ASSERT(sCon, aError)
Reference< XSingleServiceFactory > xFactory
tools::Long FRound(double fVal)
uno_Any a
B2DPolygon adaptiveSubdivideByAngle(const B2DPolygon &rCandidate, double fAngleBound)
B2DPolyPolygon correctOrientations(const B2DPolyPolygon &rCandidate)
B2DPolyPolygon clipPolyPolygonOnPolyPolygon(const B2DPolyPolygon &rCandidate, const B2DPolyPolygon &rClip, bool bInside, bool bStroke, size_t *pPointLimit)
int uniform_int_distribution(int a, int b)
constexpr Point convert(const Point &rPoint, o3tl::Length eFrom, o3tl::Length eTo)
long Long
SdrPaintWindow * mpPaintWindow
sdr::contact::ObjectContact * mpObjectContact
SdrPageView & mrPageView
SdrPaintWindow * mpOriginalPaintWindow
uno::Reference< awt::XControlContainer > mxControlContainer
Impl(SdrPageView &rPageView, SdrPaintWindow &rPaintWindow)
Reference< XModel > xModel