update emoji autocorrect entries from po-files
[LibreOffice.git] / include / basegfx / polygon / b2dpolygontools.hxx
blobdc0cf11f9d6b7bb3f8069a27cff7352490cd28c0
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
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 .
20 #ifndef INCLUDED_BASEGFX_POLYGON_B2DPOLYGONTOOLS_HXX
21 #define INCLUDED_BASEGFX_POLYGON_B2DPOLYGONTOOLS_HXX
23 #include <basegfx/point/b2dpoint.hxx>
24 #include <basegfx/vector/b2dvector.hxx>
25 #include <basegfx/range/b2drectangle.hxx>
26 #include <basegfx/polygon/b2dpolypolygon.hxx>
27 #include <basegfx/polygon/b3dpolygon.hxx>
28 #include <com/sun/star/drawing/PointSequence.hpp>
29 #include <com/sun/star/drawing/FlagSequence.hpp>
30 #include <vector>
31 #include <basegfx/basegfxdllapi.h>
32 #include <o3tl/typed_flags_set.hxx>
36 // Definitions for the cut flags used from the findCut methods
37 enum class CutFlagValue
39 NONE = 0x0000,
40 LINE = 0x0001,
41 START1 = 0x0002,
42 START2 = 0x0004,
43 END1 = 0x0008,
44 END2 = 0x0010,
45 ALL = LINE|START1|START2|END1|END2,
46 DEFAULT = LINE|START2|END2,
48 namespace o3tl
50 template<> struct typed_flags<CutFlagValue> : is_typed_flags<CutFlagValue, 0x1f> {};
53 namespace basegfx
55 // predefinitions
56 class B2DPolygon;
57 class B2DRange;
59 namespace tools
61 // B2DPolygon tools
63 // open/close with point add/remove and control point corrections
64 BASEGFX_DLLPUBLIC void openWithGeometryChange(B2DPolygon& rCandidate);
65 BASEGFX_DLLPUBLIC void closeWithGeometryChange(B2DPolygon& rCandidate);
67 /** Check if given polygon is closed.
69 This is kind of a 'classic' method to support old polygon
70 definitions. Those old polygon definitions define the
71 closed state of the polygon using identical start and
72 endpoints. This method corrects this (removes double
73 start/end points) and sets the Closed()-state of the
74 polygon correctly.
76 BASEGFX_DLLPUBLIC void checkClosed(B2DPolygon& rCandidate);
78 // Get successor and predecessor indices. Returning the same index means there
79 // is none. Same for successor.
80 BASEGFX_DLLPUBLIC sal_uInt32 getIndexOfPredecessor(sal_uInt32 nIndex, const B2DPolygon& rCandidate);
81 BASEGFX_DLLPUBLIC sal_uInt32 getIndexOfSuccessor(sal_uInt32 nIndex, const B2DPolygon& rCandidate);
83 // Get orientation of Polygon
84 BASEGFX_DLLPUBLIC B2VectorOrientation getOrientation(const B2DPolygon& rCandidate);
86 // isInside tests for B2dPoint and other B2dPolygon. On border is not inside as long as
87 // not true is given in bWithBorder flag.
88 BASEGFX_DLLPUBLIC bool isInside(const B2DPolygon& rCandidate, const B2DPoint& rPoint, bool bWithBorder = false);
89 BASEGFX_DLLPUBLIC bool isInside(const B2DPolygon& rCandidate, const B2DPolygon& rPolygon, bool bWithBorder = false);
91 /** Get the range of a polygon
93 This method creates the outer range of the subdivided bezier curve.
94 For detailed discussion see B2DPolygon::getB2DRange()
96 @param rCandidate
97 The B2DPolygon eventually containing bezier segments
99 @return
100 The outer range of the bezier curve
102 BASEGFX_DLLPUBLIC B2DRange getRange(const B2DPolygon& rCandidate);
104 // get signed area of polygon
105 BASEGFX_DLLPUBLIC double getSignedArea(const B2DPolygon& rCandidate);
107 // get area of polygon
108 BASEGFX_DLLPUBLIC double getArea(const B2DPolygon& rCandidate);
110 /** get length of polygon edge from point nIndex to nIndex + 1 */
111 BASEGFX_DLLPUBLIC double getEdgeLength(const B2DPolygon& rCandidate, sal_uInt32 nIndex);
113 /** get length of polygon */
114 BASEGFX_DLLPUBLIC double getLength(const B2DPolygon& rCandidate);
116 // get position on polygon for absolute given distance. If
117 // length is given, it is assumed the correct polygon length, if 0.0 it is calculated
118 // using getLength(...)
119 BASEGFX_DLLPUBLIC B2DPoint getPositionAbsolute(const B2DPolygon& rCandidate, double fDistance, double fLength = 0.0);
121 // get position on polygon for relative given distance in range [0.0 .. 1.0]. If
122 // length is given, it is assumed the correct polygon length, if 0.0 it is calculated
123 // using getLength(...)
124 BASEGFX_DLLPUBLIC B2DPoint getPositionRelative(const B2DPolygon& rCandidate, double fDistance, double fLength = 0.0);
126 // get a snippet from given polygon for absolute distances. The polygon is assumed
127 // to be opened (not closed). fFrom and fTo need to be in range [0.0 .. fLength], where
128 // fTo >= fFrom. If length is given, it is assumed the correct polygon length,
129 // if 0.0 it is calculated using getLength(...)
130 BASEGFX_DLLPUBLIC B2DPolygon getSnippetAbsolute(const B2DPolygon& rCandidate, double fFrom, double fTo, double fLength = 0.0);
132 // Continuity check for point with given index
133 BASEGFX_DLLPUBLIC B2VectorContinuity getContinuityInPoint(const B2DPolygon& rCandidate, sal_uInt32 nIndex);
135 // Subdivide all contained curves. Use distanceBound value if given.
136 BASEGFX_DLLPUBLIC B2DPolygon adaptiveSubdivideByDistance(const B2DPolygon& rCandidate, double fDistanceBound = 0.0);
138 // Subdivide all contained curves. Use angleBound value if given.
139 BASEGFX_DLLPUBLIC B2DPolygon adaptiveSubdivideByAngle(const B2DPolygon& rCandidate, double fAngleBound = 0.0);
141 // #i37443# Subdivide all contained curves.
142 BASEGFX_DLLPUBLIC B2DPolygon adaptiveSubdivideByCount(const B2DPolygon& rCandidate, sal_uInt32 nCount = 0L);
144 // This version works with two points and vectors to define the
145 // edges for the cut test.
146 BASEGFX_DLLPUBLIC CutFlagValue findCut(
147 const B2DPoint& rEdge1Start, const B2DVector& rEdge1Delta,
148 const B2DPoint& rEdge2Start, const B2DVector& rEdge2Delta,
149 CutFlagValue aCutFlags = CutFlagValue::DEFAULT,
150 double* pCut1 = 0L, double* pCut2 = 0L);
152 // test if point is on the given edge in range ]0.0..1.0[ without
153 // the start/end points. If so, return true and put the parameter
154 // value in pCut (if provided)
155 BASEGFX_DLLPUBLIC bool isPointOnEdge(
156 const B2DPoint& rPoint,
157 const B2DPoint& rEdgeStart,
158 const B2DVector& rEdgeDelta,
159 double* pCut = 0L);
161 /** Apply given LineDashing to given polygon
163 This method is used to cut down line polygons to the needed
164 pieces when a dashing needs to be applied.
165 It is now capable of keeping contained bezier segments.
166 It is also capable of delivering line and non-line portions
167 depending on what target polygons You provide. This is useful
168 e.g. for dashed lines with two colors.
169 If the last and the first snippet in one of the results have
170 a common start/end ppoint, they will be merged to achieve as
171 view as needed result line snippets. This is also relevant for
172 further processing the results.
174 @param rCandidate
175 The polygon based on which the snippets will be created.
177 @param rDotDashArray
178 The line pattern given as array of length values
180 @param pLineTarget
181 The target for line snippets, e.g. the first entry will be
182 a line segment with length rDotDashArray[0]. The given
183 polygon will be emptied as preparation.
185 @param pGapTarget
186 The target for gap snippets, e.g. the first entry will be
187 a line segment with length rDotDashArray[1]. The given
188 polygon will be emptied as preparation.
190 @param fFullDashDotLen
191 The sumed-up length of the rDotDashArray. If zero, it will
192 be calculated internally.
194 BASEGFX_DLLPUBLIC void applyLineDashing(
195 const B2DPolygon& rCandidate,
196 const ::std::vector<double>& rDotDashArray,
197 B2DPolyPolygon* pLineTarget,
198 B2DPolyPolygon* pGapTarget = 0,
199 double fFullDashDotLen = 0.0);
201 // test if point is inside epsilon-range around an edge defined
202 // by the two given points. Can be used for HitTesting. The epsilon-range
203 // is defined to be the rectangle centered to the given edge, using height
204 // 2 x fDistance, and the circle around both points with radius fDistance.
205 BASEGFX_DLLPUBLIC bool isInEpsilonRange(const B2DPoint& rEdgeStart, const B2DPoint& rEdgeEnd, const B2DPoint& rTestPosition, double fDistance);
207 // test if point is inside epsilon-range around the given Polygon. Can be used
208 // for HitTesting. The epsilon-range is defined to be the rectangle centered
209 // to the given edge, using height 2 x fDistance, and the circle around both points
210 // with radius fDistance.
211 BASEGFX_DLLPUBLIC bool isInEpsilonRange(const B2DPolygon& rCandidate, const B2DPoint& rTestPosition, double fDistance);
213 /** Create a polygon from a rectangle.
215 @param rRect
216 The rectangle which describes the polygon size
218 @param fRadiusX
219 @param fRadiusY
220 Radius of the edge rounding, relative to the rectangle size. 0.0 means no
221 rounding, 1.0 will lead to an ellipse
223 BASEGFX_DLLPUBLIC B2DPolygon createPolygonFromRect( const B2DRectangle& rRect, double fRadiusX, double fRadiusY );
225 /** Create a polygon from a rectangle.
227 BASEGFX_DLLPUBLIC B2DPolygon createPolygonFromRect( const B2DRectangle& rRect );
229 /** Create the unit polygon
231 BASEGFX_DLLPUBLIC B2DPolygon createUnitPolygon();
233 /** Create a circle polygon with given radius.
235 This method creates a circle approximation consisting of
236 four cubic bezier segments, which approximate the given
237 circle with an error of less than 0.5 percent.
239 @param rCenter
240 Center point of the circle
242 @param fRadius
243 Radius of the circle
245 BASEGFX_DLLPUBLIC B2DPolygon createPolygonFromCircle( const B2DPoint& rCenter, double fRadius );
247 /// create half circle centered on (0,0) from [0 .. F_PI]
248 B2DPolygon createHalfUnitCircle();
250 /** create a polygon which describes the unit circle and close it
252 @param nStartQuadrant
253 To be able to rebuild the old behaviour where the circles started at bottom,
254 this parameter is used. Default is 0 which is the first quadrant and the
255 polygon's start point will be the rightmost one. When using e.g. 1, the
256 first created quadrant will start at the YMax-position (with Y down on screens,
257 this is the lowest one). This is needed since when lines are dashed, toe old
258 geometry started at bottom point, else it would look different.
260 BASEGFX_DLLPUBLIC B2DPolygon createPolygonFromUnitCircle(sal_uInt32 nStartQuadrant = 0);
262 /** Create an ellipse polygon with given radii.
264 This method creates an ellipse approximation consisting of
265 four cubic bezier segments, which approximate the given
266 ellipse with an error of less than 0.5 percent.
268 @param rCenter
269 Center point of the circle
271 @param fRadiusX
272 Radius of the ellipse in X direction
274 @param fRadiusY
275 Radius of the ellipse in Y direction
277 BASEGFX_DLLPUBLIC B2DPolygon createPolygonFromEllipse( const B2DPoint& rCenter, double fRadiusX, double fRadiusY );
279 /** Create an unit ellipse polygon with the given angles, from start to end
281 BASEGFX_DLLPUBLIC B2DPolygon createPolygonFromEllipseSegment( const B2DPoint& rCenter, double fRadiusX, double fRadiusY, double fStart, double fEnd );
283 BASEGFX_DLLPUBLIC B2DPolygon createPolygonFromUnitEllipseSegment( double fStart, double fEnd );
285 /** Predicate whether a given polygon is a rectangle.
287 @param rPoly
288 Polygon to check
290 @return true, if the polygon describes a rectangle
291 (polygon is closed, and the points are either cw or ccw
292 enumerations of a rectangle's vertices). Note that
293 intermediate points and duplicate points are ignored.
295 BASEGFX_DLLPUBLIC bool isRectangle( const B2DPolygon& rPoly );
297 // create 3d polygon from given 2d polygon. The given fZCoordinate is used to expand the
298 // third coordinate.
299 BASEGFX_DLLPUBLIC B3DPolygon createB3DPolygonFromB2DPolygon(const B2DPolygon& rCandidate, double fZCoordinate = 0.0);
301 // create 2d tools::PolyPolygon from given 3d PolyPolygon. All coordinates are transformed using the given
302 // matrix and the resulting x,y is used to form the new polygon.
303 BASEGFX_DLLPUBLIC B2DPolygon createB2DPolygonFromB3DPolygon(const B3DPolygon& rCandidate, const B3DHomMatrix& rMat);
305 // calculate the smallest distance to given edge and return. The relative position on the edge is returned in Cut.
306 // That position is in the range [0.0 .. 1.0] and the returned distance is adapted accordingly to the start or end
307 // point of the edge
308 BASEGFX_DLLPUBLIC double getSmallestDistancePointToEdge(const B2DPoint& rPointA, const B2DPoint& rPointB, const B2DPoint& rTestPoint, double& rCut);
310 // for each contained edge calculate the smallest distance. Return the index to the smallest
311 // edge in rEdgeIndex. The relative position on the edge is returned in rCut.
312 // If nothing was found (e.g. empty input plygon), DBL_MAX is returned.
313 BASEGFX_DLLPUBLIC double getSmallestDistancePointToPolygon(const B2DPolygon& rCandidate, const B2DPoint& rTestPoint, sal_uInt32& rEdgeIndex, double& rCut);
315 // distort single point. rOriginal describes the original range, where the given points describe the distorted corresponding points.
316 BASEGFX_DLLPUBLIC B2DPoint distort(const B2DPoint& rCandidate, const B2DRange& rOriginal, const B2DPoint& rTopLeft, const B2DPoint& rTopRight, const B2DPoint& rBottomLeft, const B2DPoint& rBottomRight);
318 // distort polygon. rOriginal describes the original range, where the given points describe the distorted corresponding points.
319 BASEGFX_DLLPUBLIC B2DPolygon distort(const B2DPolygon& rCandidate, const B2DRange& rOriginal, const B2DPoint& rTopLeft, const B2DPoint& rTopRight, const B2DPoint& rBottomLeft, const B2DPoint& rBottomRight);
321 // expand all segments (which are not yet) to curve segments. This is done with setting the control
322 // vectors on the 1/3 resp. 2/3 distances on each segment.
323 BASEGFX_DLLPUBLIC B2DPolygon expandToCurve(const B2DPolygon& rCandidate);
325 // expand given segment to curve segment. This is done with setting the control
326 // vectors on the 1/3 resp. 2/3 distances. The return value describes if a change took place.
327 BASEGFX_DLLPUBLIC bool expandToCurveInPoint(B2DPolygon& rCandidate, sal_uInt32 nIndex);
329 // set continuity for given index. If not a curve, nothing will change. Non-curve points are not changed, too.
330 // The return value describes if a change took place.
331 BASEGFX_DLLPUBLIC bool setContinuityInPoint(B2DPolygon& rCandidate, sal_uInt32 nIndex, B2VectorContinuity eContinuity);
333 // test if polygon contains neutral points. A neutral point is one whos orientation is neutral
334 // e.g. positioned on the edge of it's predecessor and successor
335 BASEGFX_DLLPUBLIC bool hasNeutralPoints(const B2DPolygon& rCandidate);
337 // remove neutral points. A neutral point is one whos orientation is neutral
338 // e.g. positioned on the edge of it's predecessor and successor
339 BASEGFX_DLLPUBLIC B2DPolygon removeNeutralPoints(const B2DPolygon& rCandidate);
341 // tests if polygon is convex
342 BASEGFX_DLLPUBLIC bool isConvex(const B2DPolygon& rCandidate);
344 // calculates the orientation at edge nIndex
345 BASEGFX_DLLPUBLIC B2VectorOrientation getOrientationForIndex(const B2DPolygon& rCandidate, sal_uInt32 nIndex);
347 // calculates if given point is on given line, taking care of the numerical epsilon
348 BASEGFX_DLLPUBLIC bool isPointOnLine(const B2DPoint& rStart, const B2DPoint& rEnd, const B2DPoint& rCandidate, bool bWithPoints = false);
350 // calculates if given point is on given polygon, taking care of the numerical epsilon. Uses
351 // isPointOnLine internally
352 BASEGFX_DLLPUBLIC bool isPointOnPolygon(const B2DPolygon& rCandidate, const B2DPoint& rPoint, bool bWithPoints = true);
354 // test if candidate is inside triangle
355 BASEGFX_DLLPUBLIC bool isPointInTriangle(const B2DPoint& rA, const B2DPoint& rB, const B2DPoint& rC, const B2DPoint& rCandidate, bool bWithBorder = false);
357 // test if candidateA and candidateB are on the same side of the given line
358 BASEGFX_DLLPUBLIC bool arePointsOnSameSideOfLine(const B2DPoint& rStart, const B2DPoint& rEnd, const B2DPoint& rCandidateA, const B2DPoint& rCandidateB, bool bWithLine = false);
360 // add triangles for given rCandidate to rTarget. For each triangle, 3 points will be added to rCandidate.
361 // All triangles will go from the start point of rCandidate to two consecutive points, building (rCandidate.count() - 2)
362 // triangles.
363 BASEGFX_DLLPUBLIC void addTriangleFan(const B2DPolygon& rCandidate, B2DPolygon& rTarget);
365 // grow for polygon. Move all geometry in each point in the direction of the normal in that point
366 // with the given amount. Value may be negative.
367 BASEGFX_DLLPUBLIC B2DPolygon growInNormalDirection(const B2DPolygon& rCandidate, double fValue);
369 // force all sub-polygons to a point count of nSegments
370 BASEGFX_DLLPUBLIC B2DPolygon reSegmentPolygon(const B2DPolygon& rCandidate, sal_uInt32 nSegments);
372 // create polygon state at t from 0.0 to 1.0 between the two polygons. Both polygons must have the same
373 // organisation, e.g. same amount of points
374 BASEGFX_DLLPUBLIC B2DPolygon interpolate(const B2DPolygon& rOld1, const B2DPolygon& rOld2, double t);
376 // #i76891# Try to remove existing curve segments if they are simply edges
377 BASEGFX_DLLPUBLIC B2DPolygon simplifyCurveSegments(const B2DPolygon& rCandidate);
379 // makes the given indexed point the new polygon start point. To do that, the points in the
380 // polygon will be rotated. This is only valid for closed polygons, for non-closed ones
381 // an assertion will be triggered
382 BASEGFX_DLLPUBLIC B2DPolygon makeStartPoint(const B2DPolygon& rCandidate, sal_uInt32 nIndexOfNewStatPoint);
384 /** create edges of given length along given B2DPolygon
386 @param rCandidate
387 The polygon to move along. Points at the given polygon are created, starting
388 at position fStart and stopping at less or equal to fEnd. The closed state is
389 preserved.
390 The polygon is subdivided if curve segments are included. That subdivision is the base
391 for the newly created points.
392 If the source is closed, the indirectly existing last edge may NOT have the
393 given length.
394 If the source is open, all edges will have the given length. You may use the last
395 point of the original when You want to add the last edge Yourself.
397 @param fLength
398 The length of the created edges. If less or equal zero, an empty polygon is returned.
400 @param fStart
401 The start distance for the first to be generated point. Use 0.0 to get the
402 original start point. Negative values are truncated to 0.0.
404 @param fEnd
405 The maximum distance for the last point. No more points behind this distance will be created.
406 Use 0.0 to process the whole polygon. Negative values are truncated to 0.0. It also
407 needs to be more or equal to fStart, else it is truncated to fStart.
409 @return
410 The newly created polygon
412 BASEGFX_DLLPUBLIC B2DPolygon createEdgesOfGivenLength(const B2DPolygon& rCandidate, double fLength, double fStart = 0.0, double fEnd = 0.0);
414 /** Create Waveline along given polygon
415 The implementation is based on createEdgesOfGivenLength and creates a curve
416 segment with the given dimensions for each created line segment. The polygon
417 is treated as if opened (closed state will be ignored) and only for whole
418 edges a curve segment will be created (no rest handling)
420 @param rCandidate
421 The polygon along which the waveline will be created
423 @param fWaveWidth
424 The length of a single waveline curve segment
426 @param fgWaveHeight
427 The height of the waveline (amplitude)
429 BASEGFX_DLLPUBLIC B2DPolygon createWaveline(const B2DPolygon& rCandidate, double fWaveWidth, double fWaveHeight);
431 /** snap some polygon coordinates to discrete coordinates
433 This method allows to snap some polygon points to discrete (integer) values
434 which equals e.g. a snap to discrete coordinates. It will snap points of
435 horizontal and vertical edges
437 @param rCandidate
438 The source polygon
440 @return
441 The modified version of the source polygon
443 BASEGFX_DLLPUBLIC B2DPolygon snapPointsOfHorizontalOrVerticalEdges(const B2DPolygon& rCandidate);
445 /** returns true if the Polygon only contains horizontal or vertical edges
446 so that it could be represented by RegionBands
448 bool containsOnlyHorizontalAndVerticalEdges(const B2DPolygon& rCandidate);
450 /// get the tangent with which the given point is entered seen from the previous
451 /// polygon path data. Take into account all stuff like closed state, zero-length edges and others.
452 BASEGFX_DLLPUBLIC B2DVector getTangentEnteringPoint(const B2DPolygon& rCandidate, sal_uInt32 nIndex);
454 /// get the tangent with which the given point is left seen from the following
455 /// polygon path data. Take into account all stuff like closed state, zero-length edges and others.
456 BASEGFX_DLLPUBLIC B2DVector getTangentLeavingPoint(const B2DPolygon& rCandidate, sal_uInt32 nIndex);
458 /// converters for com::sun::star::drawing::PointSequence
459 BASEGFX_DLLPUBLIC B2DPolygon UnoPointSequenceToB2DPolygon(
460 const com::sun::star::drawing::PointSequence& rPointSequenceSource,
461 bool bCheckClosed = true);
462 BASEGFX_DLLPUBLIC void B2DPolygonToUnoPointSequence(
463 const B2DPolygon& rPolygon,
464 com::sun::star::drawing::PointSequence& rPointSequenceRetval);
466 /* converters for com::sun::star::drawing::PointSequence and
467 com::sun::star::drawing::FlagSequence to B2DPolygon (curved polygons)
469 B2DPolygon UnoPolygonBezierCoordsToB2DPolygon(
470 const com::sun::star::drawing::PointSequence& rPointSequenceSource,
471 const com::sun::star::drawing::FlagSequence& rFlagSequenceSource,
472 bool bCheckClosed = true);
473 void B2DPolygonToUnoPolygonBezierCoords(
474 const B2DPolygon& rPolyPolygon,
475 com::sun::star::drawing::PointSequence& rPointSequenceRetval,
476 com::sun::star::drawing::FlagSequence& rFlagSequenceRetval);
478 /** Read poly-polygon from SVG.
480 This function imports a poly-polygon from an SVG points
481 attribute (a plain list of coordinate pairs).
483 @param o_rPoly
484 The output polygon. Note that svg:points can only define a
485 single polygon
487 @param rSvgPointsAttribute
488 A valid SVG points attribute string
490 @return true, if the string was successfully parsed
492 BASEGFX_DLLPUBLIC bool importFromSvgPoints( B2DPolygon& o_rPoly,
493 const OUString& rSvgPointsAttribute );
495 /** Write poly-polygon to SVG.
497 This function imports a non-bezier polygon to SVG points
498 (a plain list of coordinate pairs).
500 @param rPoly
501 The polygon to export
503 @param rSvgPointsAttribute
504 A valid SVG points attribute string
506 @return true, if the string was successfully parsed
508 BASEGFX_DLLPUBLIC OUString exportToSvgPoints( const B2DPolygon& rPoly );
510 } // end of namespace tools
511 } // end of namespace basegfx
513 #endif // INCLUDED_BASEGFX_POLYGON_B2DPOLYGONTOOLS_HXX
515 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */