diff options
author | Caolán McNamara <caolanm@redhat.com> | 2015-07-15 10:10:25 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2015-07-15 12:11:14 +0000 |
commit | d1046e7c3f66e5f3384ee1ef534ef28346702fc6 (patch) | |
tree | 489a30028d5895b286e4c610cf3794a433a4dc5a /svx | |
parent | 536051f8862203e0e115a5394a6379acd83cc8fe (diff) |
Resolves: tdf#63955 clip 19km long line to some sane limit
Change-Id: If9757a5fa2bb93b56b9cf9f566972f687a4a3a45
Reviewed-on: https://gerrit.libreoffice.org/17036
Reviewed-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'svx')
-rw-r--r-- | svx/source/sdr/contact/viewcontactofsdrpathobj.cxx | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/svx/source/sdr/contact/viewcontactofsdrpathobj.cxx b/svx/source/sdr/contact/viewcontactofsdrpathobj.cxx index c0e48b94df7f..b86a9f4bf78b 100644 --- a/svx/source/sdr/contact/viewcontactofsdrpathobj.cxx +++ b/svx/source/sdr/contact/viewcontactofsdrpathobj.cxx @@ -20,13 +20,14 @@ #include <sdr/contact/viewcontactofsdrpathobj.hxx> #include <svx/svdopath.hxx> +#include <svx/svdpage.hxx> #include <svx/sdr/primitive2d/sdrattributecreator.hxx> #include <basegfx/polygon/b2dpolypolygontools.hxx> +#include <basegfx/polygon/b2dpolygonclipper.hxx> #include <sdr/primitive2d/sdrpathprimitive2d.hxx> #include <basegfx/matrix/b2dhommatrixtools.hxx> - namespace sdr { namespace contact @@ -82,13 +83,40 @@ namespace sdr // prepare object transformation and unit polygon (direct model data) basegfx::B2DHomMatrix aObjectMatrix; - const bool bIsLine( + bool bIsLine( !aUnitPolyPolygon.areControlPointsUsed() && 1 == nPolyCount && 2 == aUnitPolyPolygon.getB2DPolygon(0).count()); if(bIsLine) { + const SdrPage* pPage = GetPathObj().GetPage(); + if (pPage) + { + //tdf#63955 if we have an extremely long line then clip it + //to a very generous range of -1 page width/height vs +1 + //page width/height to avoid oom and massive churn + //generating a huge polygon chain to cover the length in + //applyLineDashing if this line is dashed + double fPageWidth = pPage->GetWdt(); + double fPageHeight = pPage->GetHgt(); + basegfx::B2DRange aClipRange(-fPageWidth, -fPageHeight, + fPageWidth*2, fPageHeight*2); + aUnitPolyPolygon = basegfx::tools::clipPolyPolygonOnRange(aUnitPolyPolygon, + aClipRange, true, true); + nPolyCount = ensureGeometry(aUnitPolyPolygon); + + // re-check that we have't been clipped out to oblivion + bIsLine = + !aUnitPolyPolygon.areControlPointsUsed() + && 1 == nPolyCount + && 2 == aUnitPolyPolygon.getB2DPolygon(0).count(); + } + } + + if(bIsLine) + { + // special handling for single line mode (2 points) const basegfx::B2DPolygon aSubPolygon(aUnitPolyPolygon.getB2DPolygon(0)); const basegfx::B2DPoint aStart(aSubPolygon.getB2DPoint(0)); |