tdf#159805 Printing line style dotted lines (horizontal) turns into dashes.

I could not find a good place to distinguish between the dragging
visualisation (where we could safely use approximation), and the
non-dragging case, so just revert.

Revert
    commit 9f4ccc6334
    Author: Noel Grandin <noel.grandin@collabora.co.uk>
    Date:   Wed Sep 13 14:27:02 2023 +0200
    tdf#156995 speed up dragging complex group objects

Change-Id: I2ba52f07ea7299643c0f145459038e368a17dea8
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165332
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
This commit is contained in:
Noel Grandin 2024-03-26 13:35:53 +02:00
parent feb4e0890b
commit fc5d84681d
2 changed files with 14 additions and 41 deletions

View file

@ -475,7 +475,7 @@ namespace basegfx::utils
return fRetval;
}
double getLength(const B2DPolygon& rCandidate, bool bApproximateBezierLength)
double getLength(const B2DPolygon& rCandidate)
{
double fRetval(0.0);
const sal_uInt32 nPointCount(rCandidate.count());
@ -486,45 +486,18 @@ namespace basegfx::utils
if(rCandidate.areControlPointsUsed())
{
if (bApproximateBezierLength)
B2DCubicBezier aEdge;
aEdge.setStartPoint(rCandidate.getB2DPoint(0));
for(sal_uInt32 a(0); a < nEdgeCount; a++)
{
B2DPoint aStartPoint = rCandidate.getB2DPoint(0);
const sal_uInt32 nNextIndex((a + 1) % nPointCount);
aEdge.setControlPointA(rCandidate.getNextControlPoint(a));
aEdge.setControlPointB(rCandidate.getPrevControlPoint(nNextIndex));
aEdge.setEndPoint(rCandidate.getB2DPoint(nNextIndex));
for(sal_uInt32 a(0); a < nEdgeCount; a++)
{
// An approximate length of a cubic Bezier curve is the average
// of its chord length and the sum of the lengths of its control net sides.
const sal_uInt32 nNextIndex((a + 1) % nPointCount);
const B2DPoint& aControlPoint1 = rCandidate.getNextControlPoint(a);
const B2DPoint& aControlPoint2 = rCandidate.getPrevControlPoint(nNextIndex);
const B2DPoint& aEndPoint = rCandidate.getB2DPoint(nNextIndex);
double chord_length = B2DVector(aEndPoint - aStartPoint).getLength();
double control_net_length = B2DVector(aStartPoint - aControlPoint1).getLength()
+ B2DVector(aControlPoint2 - aControlPoint1).getLength()
+ B2DVector(aEndPoint - aControlPoint2).getLength();
double approximate_arc_length = (control_net_length + chord_length) / 2;
fRetval += approximate_arc_length;
aStartPoint = aEndPoint;
}
}
else
{
B2DCubicBezier aEdge;
aEdge.setStartPoint(rCandidate.getB2DPoint(0));
for(sal_uInt32 a(0); a < nEdgeCount; a++)
{
const sal_uInt32 nNextIndex((a + 1) % nPointCount);
aEdge.setControlPointA(rCandidate.getNextControlPoint(a));
aEdge.setControlPointB(rCandidate.getPrevControlPoint(nNextIndex));
aEdge.setEndPoint(rCandidate.getB2DPoint(nNextIndex));
fRetval += aEdge.getLength();
aEdge.setStartPoint(aEdge.getEndPoint());
}
fRetval += aEdge.getLength();
aEdge.setStartPoint(aEdge.getEndPoint());
}
}
else
@ -1259,9 +1232,9 @@ namespace basegfx::utils
// precalculate maximal acceptable length of candidate polygon assuming
// we want to create a maximum of fNumberOfAllowedSnippets. For
// fNumberOfAllowedSnippets use ca. 65536, double due to line & gap.
static const double fNumberOfAllowedSnippets(100.0 * 2.0);
static const double fNumberOfAllowedSnippets(65535.0 * 2.0);
const double fAllowedLength((fNumberOfAllowedSnippets * fDotDashLength) / double(rDotDashArray.size()));
const double fCandidateLength(basegfx::utils::getLength(rCandidate, /*bApproximateBezierLength*/true));
const double fCandidateLength(basegfx::utils::getLength(rCandidate));
std::vector<double> aDotDashArray(rDotDashArray);
if(fCandidateLength > fAllowedLength)

View file

@ -113,7 +113,7 @@ namespace basegfx::utils
BASEGFX_DLLPUBLIC double getEdgeLength(const B2DPolygon& rCandidate, sal_uInt32 nIndex);
/** get length of polygon */
BASEGFX_DLLPUBLIC double getLength(const B2DPolygon& rCandidate, bool bApproximateBezierLength = false);
BASEGFX_DLLPUBLIC double getLength(const B2DPolygon& rCandidate);
// get position on polygon for absolute given distance. If
// length is given, it is assumed the correct polygon length, if 0.0 it is calculated