summaryrefslogtreecommitdiff
path: root/svx
diff options
context:
space:
mode:
authorMichael Stahl <mstahl@redhat.com>2016-12-06 22:59:40 +0100
committerMichael Stahl <mstahl@redhat.com>2016-12-07 14:46:07 +0100
commit689cead9e0837dc932e3a4cd765f7d319b529018 (patch)
treecd6cdcd77f017ef1e60ec11556617da5b1c39721 /svx
parentb346439637b7d03a3eb1d6e67dfb585b357567f4 (diff)
tdf#91260 svx, sw: don't paint off-page part of drawing object
Since commit a4dee94afed9ade6ac50237c8d99a6e49d3bebc1 Writer no longer forces drawing objects to be entirely on one page. However since there is only one SdrPage for the entire document, a drawing object dangleing off the bottom of one page will be painted again on the next page, which is clearly undesirable since Word doesn't do that (and it also destroys the nice invariant that a fly on page N never overlaps a fly on page N+1). So force the SdrPageView code to ignore the drawing object on the next page, by passing in the area of the page frame so that ViewObjectContactOfSdrObj::isPrimitiveVisible() can verify that the anchor position of the SdrObject is actually on the painted page. This requires passing in another parameter; in the usual case the DisplayInfo::maRedrawArea already contains the page frame since commit 8af09bf33291df2fb2bfbbd6e42f9bf074fcc4fc, but there are special cases in SwFrame::Retouch() and SwFlyFrameFormat::MakeGraphic() where some sub-area is passed in, which cannot be used to check the anchor. Change-Id: Ia0476216ca41dbdaa3de1063fa18cb94fe2e5ae8
Diffstat (limited to 'svx')
-rw-r--r--svx/source/sdr/contact/displayinfo.cxx5
-rw-r--r--svx/source/sdr/contact/viewobjectcontactofsdrobj.cxx17
-rw-r--r--svx/source/svdraw/sdrpagewindow.cxx9
-rw-r--r--svx/source/svdraw/svdpagv.cxx14
4 files changed, 38 insertions, 7 deletions
diff --git a/svx/source/sdr/contact/displayinfo.cxx b/svx/source/sdr/contact/displayinfo.cxx
index fd6fc102ae61..7904fa11a7bf 100644
--- a/svx/source/sdr/contact/displayinfo.cxx
+++ b/svx/source/sdr/contact/displayinfo.cxx
@@ -50,6 +50,11 @@ namespace sdr
maRedrawArea = rRegion;
}
+ void DisplayInfo::SetWriterPageFrame(basegfx::B2IRectangle const& rPageFrame)
+ {
+ m_WriterPageFrame = rPageFrame;
+ }
+
void DisplayInfo::SetControlLayerProcessingActive(bool bDoProcess)
{
if((bool)mbControlLayerProcessingActive != bDoProcess)
diff --git a/svx/source/sdr/contact/viewobjectcontactofsdrobj.cxx b/svx/source/sdr/contact/viewobjectcontactofsdrobj.cxx
index 836925c0f5e0..fca9e8d4017b 100644
--- a/svx/source/sdr/contact/viewobjectcontactofsdrobj.cxx
+++ b/svx/source/sdr/contact/viewobjectcontactofsdrobj.cxx
@@ -30,6 +30,7 @@
#include <svx/svdoole2.hxx>
#include <svx/svdview.hxx>
#include <vcl/outdev.hxx>
+#include <vcl/canvastools.hxx>
#include "fmobj.hxx"
@@ -139,6 +140,22 @@ bool ViewObjectContactOfSdrObj::isPrimitiveVisible(const DisplayInfo& rDisplayIn
}
}
+ // tdf#91260 check if the object is anchored on a different Writer page
+ // than the one being painted, and if so ignore it (Writer has only one
+ // SdrPage, so the part of the object that should be visible will be
+ // painted on the page where it is anchored)
+ // Note that we cannot check the ViewInformation2D ViewPort for this
+ // because it is only the part of the page that is currently visible.
+ basegfx::B2IPoint const& rAnchor(vcl::unotools::b2IPointFromPoint(getSdrObject().GetAnchorPos()));
+ if (rAnchor.getX() || rAnchor.getY()) // only Writer sets anchor position
+ {
+ if (!rDisplayInfo.GetWriterPageFrame().isEmpty() &&
+ !rDisplayInfo.GetWriterPageFrame().isInside(rAnchor))
+ {
+ return false;
+ }
+ }
+
// Check if this object is in the visible range.
const drawinglayer::geometry::ViewInformation2D& rViewInfo = GetObjectContact().getViewInformation2D();
basegfx::B2DRange aObjRange = GetViewContact().getRange(rViewInfo);
diff --git a/svx/source/svdraw/sdrpagewindow.cxx b/svx/source/svdraw/sdrpagewindow.cxx
index e6db45293c4a..292bbde38678 100644
--- a/svx/source/svdraw/sdrpagewindow.cxx
+++ b/svx/source/svdraw/sdrpagewindow.cxx
@@ -352,7 +352,9 @@ void SdrPageWindow::RedrawAll( sdr::contact::ViewObjectContactRedirector* pRedir
#endif // CLIPPER_TEST
}
-void SdrPageWindow::RedrawLayer( const SdrLayerID* pId, sdr::contact::ViewObjectContactRedirector* pRedirector )
+void SdrPageWindow::RedrawLayer(const SdrLayerID* pId,
+ sdr::contact::ViewObjectContactRedirector* pRedirector,
+ basegfx::B2IRectangle const*const pPageFrame)
{
// set redirector
GetObjectContact().SetViewObjectContactRedirector(pRedirector);
@@ -395,6 +397,11 @@ void SdrPageWindow::RedrawLayer( const SdrLayerID* pId, sdr::contact::ViewObject
// #i72889# no page painting for layer painting
aDisplayInfo.SetPageProcessingActive(false);
+ if (pPageFrame) // Writer page frame for anchor based clipping
+ {
+ aDisplayInfo.SetWriterPageFrame(*pPageFrame);
+ }
+
// paint page
GetObjectContact().ProcessDisplay(aDisplayInfo);
}
diff --git a/svx/source/svdraw/svdpagv.cxx b/svx/source/svdraw/svdpagv.cxx
index fabe609f5cee..544bf48ca788 100644
--- a/svx/source/svdraw/svdpagv.cxx
+++ b/svx/source/svdraw/svdpagv.cxx
@@ -45,6 +45,7 @@
#include <svx/sdrpagewindow.hxx>
#include <svx/sdrpaintwindow.hxx>
#include <comphelper/lok.hxx>
+#include <basegfx/range/b2irectangle.hxx>
using namespace ::com::sun::star;
@@ -305,7 +306,9 @@ void SdrPageView::setPreparedPageWindow(SdrPageWindow* pKnownTarget)
mpPreparedPageWindow = pKnownTarget;
}
-void SdrPageView::DrawLayer( SdrLayerID nID, OutputDevice* pGivenTarget, sdr::contact::ViewObjectContactRedirector* pRedirector, const Rectangle& rRect )
+void SdrPageView::DrawLayer(SdrLayerID nID, OutputDevice* pGivenTarget,
+ sdr::contact::ViewObjectContactRedirector* pRedirector,
+ const Rectangle& rRect, basegfx::B2IRectangle const*const pPageFrame)
{
if(GetPage())
{
@@ -316,7 +319,7 @@ void SdrPageView::DrawLayer( SdrLayerID nID, OutputDevice* pGivenTarget, sdr::co
if(pKnownTarget)
{
// paint known target
- pKnownTarget->RedrawLayer(&nID, pRedirector);
+ pKnownTarget->RedrawLayer(&nID, pRedirector, nullptr);
}
else
{
@@ -346,12 +349,11 @@ void SdrPageView::DrawLayer( SdrLayerID nID, OutputDevice* pGivenTarget, sdr::co
aTemporaryPaintWindow.SetRedrawRegion(rExistingRegion);
else
aTemporaryPaintWindow.SetRedrawRegion(vcl::Region(rRect));
-
// patch the ExistingPageWindow
pPreparedTarget->patchPaintWindow(aTemporaryPaintWindow);
// redraw the layer
- pPreparedTarget->RedrawLayer(&nID, pRedirector);
+ pPreparedTarget->RedrawLayer(&nID, pRedirector, pPageFrame);
// restore the ExistingPageWindow
pPreparedTarget->unpatchPaintWindow();
@@ -377,7 +379,7 @@ void SdrPageView::DrawLayer( SdrLayerID nID, OutputDevice* pGivenTarget, sdr::co
aTemporaryPaintWindow.SetRedrawRegion(rExistingRegion);
}
- aTemporaryPageWindow.RedrawLayer(&nID, pRedirector);
+ aTemporaryPageWindow.RedrawLayer(&nID, pRedirector, nullptr);
}
}
}
@@ -387,7 +389,7 @@ void SdrPageView::DrawLayer( SdrLayerID nID, OutputDevice* pGivenTarget, sdr::co
for(sal_uInt32 a(0L); a < PageWindowCount(); a++)
{
SdrPageWindow* pTarget = GetPageWindow(a);
- pTarget->RedrawLayer(&nID, pRedirector);
+ pTarget->RedrawLayer(&nID, pRedirector, nullptr);
}
}
}