LibreOffice Module basegfx (master) 1
b2dpolypolygontools.hxx
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#pragma once
21
24#include <com/sun/star/drawing/PointSequenceSequence.hpp>
25#include <vector>
28
29namespace com::sun::star::drawing { struct PolyPolygonBezierCoords; }
30
31namespace basegfx
32{
33 class B2DPolyPolygon;
34 class B2DRange;
35}
36
37namespace basegfx::utils
38{
39 // B2DPolyPolygon tools
40
41 // Check and evtl. correct orientations of all contained Polygons so that
42 // the orientations of contained polygons will variate to express areas and
43 // holes
44 BASEGFX_DLLPUBLIC B2DPolyPolygon correctOrientations(const B2DPolyPolygon& rCandidate);
45
46 // make sure polygon with index 0L is not a hole. This may evtl. change the
47 // sequence of polygons, but allows to use polygon with index 0L to
48 // get the correct normal for the whole polyPolygon
49 BASEGFX_DLLPUBLIC B2DPolyPolygon correctOutmostPolygon(const B2DPolyPolygon& rCandidate);
50
51 // Subdivide all contained curves. Use distanceBound value if given.
52 BASEGFX_DLLPUBLIC B2DPolyPolygon adaptiveSubdivideByDistance(const B2DPolyPolygon& rCandidate, double fDistanceBound, int nRecurseLimit = 30);
53
54 // Subdivide all contained curves. Use distanceBound value if given. Else, a convenient one
55 // is created.
56 BASEGFX_DLLPUBLIC B2DPolyPolygon adaptiveSubdivideByAngle(const B2DPolyPolygon& rCandidate, double fAngleBound = 0.0);
57
58 // isInside test for B2dPoint. On border is not inside as long as not true is given
59 // in bWithBorder flag. It is assumed that the orientations of the given polygon are correct.
60 BASEGFX_DLLPUBLIC bool isInside(const B2DPolyPolygon& rCandidate, const B2DPoint& rPoint, bool bWithBorder = false);
61
73 BASEGFX_DLLPUBLIC B2DRange getRange(const B2DPolyPolygon& rCandidate);
74
75 // get signed area of polygon
76 BASEGFX_DLLPUBLIC double getSignedArea(const B2DPolyPolygon& rCandidate);
77
78 // get area of polygon
79 BASEGFX_DLLPUBLIC double getArea(const B2DPolyPolygon& rCandidate);
80
86 const B2DPolyPolygon& rCandidate,
87 const ::std::vector<double>& rDotDashArray,
88 B2DPolyPolygon* pLineTarget,
89 double fFullDashDotLen = 0.0);
90
91 // test if point is inside epsilon-range around the given PolyPolygon. Can be used
92 // for HitTesting. The epsilon-range is defined to be the tube around the PolyPolygon
93 // with distance fDistance and rounded edges (start and end point).
94 BASEGFX_DLLPUBLIC bool isInEpsilonRange(const B2DPolyPolygon& rCandidate, const B2DPoint& rTestPosition, double fDistance);
95
100 {
101 private:
102 sal_uInt32 mnPolygonIndex;
103 sal_uInt32 mnPointIndex;
104
105 public:
106 PointIndex(sal_uInt32 nPolygonIndex, sal_uInt32 nPointIndex)
107 : mnPolygonIndex(nPolygonIndex),
108 mnPointIndex(nPointIndex)
109 {}
110
111 sal_uInt32 getPolygonIndex() const { return mnPolygonIndex; }
112 sal_uInt32 getPointIndex() const { return mnPointIndex; }
113 bool operator<(const PointIndex& rComp) const;
114 };
115
121
152 B2DPolyPolygon& o_rPolyPoly,
153 std::u16string_view rSvgDAttribute,
154 bool bHandleRelativeNextPointCompatible,
155 PointIndexSet* pHelpPointIndexSet);
156
157 // grow for polyPolygon. Move all geometry in each point in the direction of the normal in that point
158 // with the given amount. Value may be negative.
160
161 // force all sub-polygons to a point count of nSegments
162 BASEGFX_DLLPUBLIC B2DPolyPolygon reSegmentPolyPolygon(const B2DPolyPolygon& rCandidate, sal_uInt32 nSegments);
163
164 // create polygon state at t from 0.0 to 1.0 between the two polygons. Both polygons must have the same
165 // organisation, e.g. same amount of polygons
166 BASEGFX_DLLPUBLIC B2DPolyPolygon interpolate(const B2DPolyPolygon& rOld1, const B2DPolyPolygon& rOld2, double t);
167
168 // create 3d tools::PolyPolygon from given 2d PolyPolygon. The given fZCoordinate is used to expand the
169 // third coordinate.
171
172 // create 2d tools::PolyPolygon from given 3d PolyPolygon. All coordinates are transformed using the given
173 // matrix and the resulting x,y is used to form the new polygon.
175
176 // for each contained edge in each contained polygon calculate the smallest distance. Return the index to the smallest
177 // edge in rEdgeIndex and the index to the polygon in rPolygonIndex. The relative position on the edge is returned in rCut.
178 // If nothing was found (e.g. empty input plygon), DBL_MAX is returned.
179 BASEGFX_DLLPUBLIC double getSmallestDistancePointToPolyPolygon(const B2DPolyPolygon& rCandidate, const B2DPoint& rTestPoint, sal_uInt32& rPolygonIndex, sal_uInt32& rEdgeIndex, double& rCut);
180
181 // distort PolyPolygon. rOriginal describes the original range, where the given points describe the distorted
182 // corresponding points.
183 BASEGFX_DLLPUBLIC B2DPolyPolygon distort(const B2DPolyPolygon& rCandidate, const B2DRange& rOriginal, const B2DPoint& rTopLeft, const B2DPoint& rTopRight, const B2DPoint& rBottomLeft, const B2DPoint& rBottomRight);
184
185 // expand all segments (which are not yet) to curve segments. This is done with setting the control
186 // vectors on the 1/3 resp. 2/3 distances on each segment.
188
200 BASEGFX_DLLPUBLIC bool isRectangle( const B2DPolyPolygon& rPoly );
201
238 const B2DPolyPolygon& rPolyPoly,
239 bool bUseRelativeCoordinates,
240 bool bDetectQuadraticBeziers,
241 bool bHandleRelativeNextPointCompatible,
242 bool bOOXMLMotionPath = false);
243
244 // #i76891# Try to remove existing curve segments if they are simply edges
246
265 B2DPolyPolygon createSevenSegmentPolyPolygon(char cNumber, bool bLitSegments);
266
280
283 const css::drawing::PointSequenceSequence& rPointSequenceSequenceSource);
285 const B2DPolyPolygon& rPolyPolygon,
286 css::drawing::PointSequenceSequence& rPointSequenceSequenceRetval);
287
290 const css::drawing::PolyPolygonBezierCoords& rPolyPolygonBezierCoordsSource);
292 const B2DPolyPolygon& rPolyPolygon,
293 css::drawing::PolyPolygonBezierCoords& rPolyPolygonBezierCoordsRetval);
294
295} // end of namespace basegfx::utils
296
297/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
#define BASEGFX_DLLPUBLIC
Definition: basegfxdllapi.h:35
Base Point class with two double values.
Definition: b2dpoint.hxx:42
A two-dimensional interval over doubles.
Definition: b2drange.hxx:54
Helper class to transport PointIndices to a PolyPolygon, with an operator< for convenient sorting in ...
PointIndex(sal_uInt32 nPolygonIndex, sal_uInt32 nPointIndex)
double getArea(const B2DPolygon &rCandidate)
B2DPolyPolygon reSegmentPolyPolygon(const B2DPolyPolygon &rCandidate, sal_uInt32 nSegments)
void B2DPolyPolygonToUnoPointSequenceSequence(const B2DPolyPolygon &rPolyPolygon, css::drawing::PointSequenceSequence &rPointSequenceSequenceRetval)
o3tl::sorted_vector< PointIndex > PointIndexSet
the PointIndexSet itself; it allows to define a 'selection'of points in a tools::PolyPolygon by givin...
B3DPolyPolygon createB3DPolyPolygonFromB2DPolyPolygon(const B2DPolyPolygon &rCandidate, double fZCoordinate)
B2DPolygon interpolate(const B2DPolygon &rOld1, const B2DPolygon &rOld2, double t)
B2DPolygon expandToCurve(const B2DPolygon &rCandidate)
B2DPolygon growInNormalDirection(const B2DPolygon &rCandidate, double fValue)
B2DPolygon adaptiveSubdivideByDistance(const B2DPolygon &rCandidate, double fDistanceBound, int nRecurseLimit)
void applyLineDashing(const B2DPolygon &rCandidate, const std::vector< double > &rDotDashArray, B2DPolyPolygon *pLineTarget, B2DPolyPolygon *pGapTarget, double fDotDashLength)
B2DPolyPolygon createB2DPolyPolygonFromB3DPolyPolygon(const B3DPolyPolygon &rCandidate, const B3DHomMatrix &rMat)
double getSignedArea(const B2DPolygon &rCandidate)
bool isInside(const B2DPolygon &rCandidate, const B2DPoint &rPoint, bool bWithBorder)
B2DPolyPolygon correctOutmostPolygon(const B2DPolyPolygon &rCandidate)
B2DPoint distort(const B2DPoint &rCandidate, const B2DRange &rOriginal, const B2DPoint &rTopLeft, const B2DPoint &rTopRight, const B2DPoint &rBottomLeft, const B2DPoint &rBottomRight)
B2DPolygon adaptiveSubdivideByAngle(const B2DPolygon &rCandidate, double fAngleBound)
B2DPolyPolygon correctOrientations(const B2DPolyPolygon &rCandidate)
B2DPolygon snapPointsOfHorizontalOrVerticalEdges(const B2DPolygon &rCandidate)
snap some polygon coordinates to discrete coordinates
bool isInEpsilonRange(const B2DPoint &rEdgeStart, const B2DPoint &rEdgeEnd, const B2DPoint &rTestPosition, double fDistance)
bool isRectangle(const B2DPolygon &rPoly)
Predicate whether a given polygon is a rectangle.
OUString exportToSvgD(const B2DPolyPolygon &rPolyPolygon, bool bUseRelativeCoordinates, bool bDetectQuadraticBeziers, bool bHandleRelativeNextPointCompatible, bool bOOXMLMotionPath)
Export poly-polygon to SVG.
B2DPolyPolygon createSevenSegmentPolyPolygon(char nNumber, bool bLitSegments)
Creates polypolygon for seven-segment display number.
B2DPolyPolygon UnoPointSequenceSequenceToB2DPolyPolygon(const css::drawing::PointSequenceSequence &rPointSequenceSequenceSource)
converters for css::drawing::PointSequence
bool importFromSvgD(B2DPolyPolygon &o_rPolyPolygon, std::u16string_view rSvgDStatement, bool bHandleRelativeNextPointCompatible, PointIndexSet *pHelpPointIndexSet)
Read poly-polygon from SVG.
B2DPolygon simplifyCurveSegments(const B2DPolygon &rCandidate)
void B2DPolyPolygonToUnoPolyPolygonBezierCoords(const B2DPolyPolygon &rPolyPolygon, css::drawing::PolyPolygonBezierCoords &rPolyPolygonBezierCoordsRetval)
B2DPolyPolygon UnoPolyPolygonBezierCoordsToB2DPolyPolygon(const css::drawing::PolyPolygonBezierCoords &rPolyPolygonBezierCoordsSource)
converters for css::drawing::PolyPolygonBezierCoords (curved polygons)
B2DRange getRange(const B2DPolygon &rCandidate)
Get the range of a polygon.
double getSmallestDistancePointToPolyPolygon(const B2DPolyPolygon &rCandidate, const B2DPoint &rTestPoint, sal_uInt32 &rPolygonIndex, sal_uInt32 &rEdgeIndex, double &rCut)
#define SAL_WARN_UNUSED
bool operator<(const wwFont &r1, const wwFont &r2)