basegfx/source/curve/b2dcubicbezier.cxx | 4 ++-- basegfx/source/polygon/b2dpolygontools.cxx | 4 ++-- basegfx/source/polygon/b2dpolypolygontools.cxx | 4 ++-- include/basegfx/curve/b2dcubicbezier.hxx | 5 ++++- include/basegfx/polygon/b2dpolygontools.hxx | 2 +- include/basegfx/polygon/b2dpolypolygontools.hxx | 2 +- vcl/source/outdev/line.cxx | 4 +++- 7 files changed, 15 insertions(+), 10 deletions(-)
New commits: commit 8ab54ac42ca2516c333a49fb23f6d27196122c22 Author: Caolán McNamara <caol...@redhat.com> AuthorDate: Sun Jul 17 15:26:16 2022 +0100 Commit: Caolán McNamara <caol...@redhat.com> CommitDate: Sun Jul 17 17:23:44 2022 +0200 ofz#48585 Out-of-memory Change-Id: If6bb603cc78863df88d5630b4bd5b1198b4050de Reviewed-on: https://gerrit.libreoffice.org/c/core/+/137148 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caol...@redhat.com> diff --git a/basegfx/source/curve/b2dcubicbezier.cxx b/basegfx/source/curve/b2dcubicbezier.cxx index 6528e1492a32..d33cd82b194d 100644 --- a/basegfx/source/curve/b2dcubicbezier.cxx +++ b/basegfx/source/curve/b2dcubicbezier.cxx @@ -610,12 +610,12 @@ namespace basegfx } // adaptive subdivide by distance - void B2DCubicBezier::adaptiveSubdivideByDistance(B2DPolygon& rTarget, double fDistanceBound) const + void B2DCubicBezier::adaptiveSubdivideByDistance(B2DPolygon& rTarget, double fDistanceBound, int nRecurseLimit) const { if(isBezier()) { ImpSubDivDistance(maStartPoint, maControlPointA, maControlPointB, maEndPoint, rTarget, - fDistanceBound * fDistanceBound, std::numeric_limits<double>::max(), 30); + fDistanceBound * fDistanceBound, std::numeric_limits<double>::max(), nRecurseLimit); } else { diff --git a/basegfx/source/polygon/b2dpolygontools.cxx b/basegfx/source/polygon/b2dpolygontools.cxx index 4b8550546e5c..03f5299ca505 100644 --- a/basegfx/source/polygon/b2dpolygontools.cxx +++ b/basegfx/source/polygon/b2dpolygontools.cxx @@ -157,7 +157,7 @@ namespace basegfx::utils return rCandidate.getContinuityInPoint(nIndex); } - B2DPolygon adaptiveSubdivideByDistance(const B2DPolygon& rCandidate, double fDistanceBound) + B2DPolygon adaptiveSubdivideByDistance(const B2DPolygon& rCandidate, double fDistanceBound, int nRecurseLimit) { if(rCandidate.areControlPointsUsed()) { @@ -213,7 +213,7 @@ namespace basegfx::utils } // call adaptive subdivide which adds edges to aRetval accordingly - aBezier.adaptiveSubdivideByDistance(aRetval, fBound); + aBezier.adaptiveSubdivideByDistance(aRetval, fBound, nRecurseLimit); } else { diff --git a/basegfx/source/polygon/b2dpolypolygontools.cxx b/basegfx/source/polygon/b2dpolypolygontools.cxx index 3f8f51c52404..faf734f6e79e 100644 --- a/basegfx/source/polygon/b2dpolypolygontools.cxx +++ b/basegfx/source/polygon/b2dpolypolygontools.cxx @@ -113,7 +113,7 @@ namespace basegfx::utils return rCandidate; } - B2DPolyPolygon adaptiveSubdivideByDistance(const B2DPolyPolygon& rCandidate, double fDistanceBound) + B2DPolyPolygon adaptiveSubdivideByDistance(const B2DPolyPolygon& rCandidate, double fDistanceBound, int nRecurseLimit) { if(rCandidate.areControlPointsUsed()) { @@ -123,7 +123,7 @@ namespace basegfx::utils { if(rPolygon.areControlPointsUsed()) { - aRetval.append(utils::adaptiveSubdivideByDistance(rPolygon, fDistanceBound)); + aRetval.append(utils::adaptiveSubdivideByDistance(rPolygon, fDistanceBound, nRecurseLimit)); } else { diff --git a/include/basegfx/curve/b2dcubicbezier.hxx b/include/basegfx/curve/b2dcubicbezier.hxx index 4d8d9406e930..fe81ed523d97 100644 --- a/include/basegfx/curve/b2dcubicbezier.hxx +++ b/include/basegfx/curve/b2dcubicbezier.hxx @@ -143,8 +143,11 @@ namespace basegfx @param fDistanceBound Bound on the maximal distance of the approximation to the true curve. + + @param nRecurseLimit + Bound on recursion for the bezier case. */ - void adaptiveSubdivideByDistance(B2DPolygon& rTarget, double fDistanceBound) const; + void adaptiveSubdivideByDistance(B2DPolygon& rTarget, double fDistanceBound, int nRecurseLimit = 30) const; // get point at given relative position B2DPoint interpolatePoint(double t) const; diff --git a/include/basegfx/polygon/b2dpolygontools.hxx b/include/basegfx/polygon/b2dpolygontools.hxx index 8f3ef342f3bc..d5aa092ed9cb 100644 --- a/include/basegfx/polygon/b2dpolygontools.hxx +++ b/include/basegfx/polygon/b2dpolygontools.hxx @@ -135,7 +135,7 @@ namespace basegfx::utils BASEGFX_DLLPUBLIC B2VectorContinuity getContinuityInPoint(const B2DPolygon& rCandidate, sal_uInt32 nIndex); // Subdivide all contained curves. Use distanceBound value if given. - BASEGFX_DLLPUBLIC B2DPolygon adaptiveSubdivideByDistance(const B2DPolygon& rCandidate, double fDistanceBound); + BASEGFX_DLLPUBLIC B2DPolygon adaptiveSubdivideByDistance(const B2DPolygon& rCandidate, double fDistanceBound, int nRecurseLimit = 30); // Subdivide all contained curves. Use angleBound value if given. BASEGFX_DLLPUBLIC B2DPolygon adaptiveSubdivideByAngle(const B2DPolygon& rCandidate, double fAngleBound = 0.0); diff --git a/include/basegfx/polygon/b2dpolypolygontools.hxx b/include/basegfx/polygon/b2dpolypolygontools.hxx index d253531f6ac9..896094633230 100644 --- a/include/basegfx/polygon/b2dpolypolygontools.hxx +++ b/include/basegfx/polygon/b2dpolypolygontools.hxx @@ -49,7 +49,7 @@ namespace basegfx::utils BASEGFX_DLLPUBLIC B2DPolyPolygon correctOutmostPolygon(const B2DPolyPolygon& rCandidate); // Subdivide all contained curves. Use distanceBound value if given. - BASEGFX_DLLPUBLIC B2DPolyPolygon adaptiveSubdivideByDistance(const B2DPolyPolygon& rCandidate, double fDistanceBound); + BASEGFX_DLLPUBLIC B2DPolyPolygon adaptiveSubdivideByDistance(const B2DPolyPolygon& rCandidate, double fDistanceBound, int nRecurseLimit = 30); // Subdivide all contained curves. Use distanceBound value if given. Else, a convenient one // is created. diff --git a/vcl/source/outdev/line.cxx b/vcl/source/outdev/line.cxx index 2556a09bff82..305484792736 100644 --- a/vcl/source/outdev/line.cxx +++ b/vcl/source/outdev/line.cxx @@ -22,6 +22,7 @@ #include <basegfx/polygon/b2dpolypolygontools.hxx> #include <basegfx/polygon/b2dlinegeometry.hxx> #include <tools/debug.hxx> +#include <unotools/configmgr.hxx> #include <vcl/lineinfo.hxx> #include <vcl/metaact.hxx> @@ -264,7 +265,8 @@ void OutputDevice::drawLine( basegfx::B2DPolyPolygon aLinePolyPolygon, const Lin // but one that is at least as good as ImplSubdivideBezier was. // There, Polygon::AdaptiveSubdivide was used with default parameter // 1.0 as quality index. - aLinePolyPolygon = basegfx::utils::adaptiveSubdivideByDistance(aLinePolyPolygon, 1.0); + static int nRecurseLimit = utl::ConfigManager::IsFuzzing() ? 15 : 30; + aLinePolyPolygon = basegfx::utils::adaptiveSubdivideByDistance(aLinePolyPolygon, 1.0, nRecurseLimit); } for(auto const& rPolygon : std::as_const(aLinePolyPolygon))