You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by al...@apache.org on 2013/10/29 15:11:46 UTC
svn commit: r1536730 [1/5] - in /openoffice/trunk/main:
basegfx/inc/basegfx/polygon/ basegfx/source/inc/ basegfx/source/polygon/
basegfx/source/tools/ basegfx/test/ canvas/source/tools/ sd/source/core/
sdext/source/pdfimport/test/ sdext/source/pdfimpor...
Author: alg
Date: Tue Oct 29 14:11:45 2013
New Revision: 1536730
URL: http://svn.apache.org/r1536730
Log:
i123433 Detect pseudo-vertices at svg import, unify svg:d handling, correct svg:d import for relative sub-polygons in svg import; changed default for moveto writes for svg:d in ODF to absolute
Added:
openoffice/trunk/main/basegfx/source/inc/stringconversiontools.hxx (with props)
openoffice/trunk/main/basegfx/source/tools/stringconversiontools.cxx (with props)
Modified:
openoffice/trunk/main/basegfx/inc/basegfx/polygon/b2dpolygontools.hxx
openoffice/trunk/main/basegfx/inc/basegfx/polygon/b2dpolypolygontools.hxx
openoffice/trunk/main/basegfx/inc/basegfx/polygon/b3dpolypolygontools.hxx
openoffice/trunk/main/basegfx/source/polygon/b2dpolygontools.cxx
openoffice/trunk/main/basegfx/source/polygon/b2dpolypolygontools.cxx
openoffice/trunk/main/basegfx/source/polygon/b2dsvgpolypolygon.cxx
openoffice/trunk/main/basegfx/source/polygon/b3dpolypolygontools.cxx
openoffice/trunk/main/basegfx/source/tools/makefile.mk
openoffice/trunk/main/basegfx/test/basegfx2d.cxx
openoffice/trunk/main/basegfx/test/boxclipper.cxx
openoffice/trunk/main/basegfx/test/clipstate.cxx
openoffice/trunk/main/basegfx/test/genericclipper.cxx
openoffice/trunk/main/canvas/source/tools/surfaceproxy.cxx
openoffice/trunk/main/sd/source/core/CustomAnimationEffect.cxx
openoffice/trunk/main/sdext/source/pdfimport/test/tests.cxx
openoffice/trunk/main/sdext/source/pdfimport/tree/drawtreevisiting.cxx
openoffice/trunk/main/sdext/source/pdfimport/tree/writertreevisiting.cxx
openoffice/trunk/main/slideshow/source/engine/animationfactory.cxx
openoffice/trunk/main/svgio/inc/svgio/svgreader/svgpathnode.hxx
openoffice/trunk/main/svgio/inc/svgio/svgreader/svgstyleattributes.hxx
openoffice/trunk/main/svgio/source/svgreader/svgcirclenode.cxx
openoffice/trunk/main/svgio/source/svgreader/svgellipsenode.cxx
openoffice/trunk/main/svgio/source/svgreader/svglinenode.cxx
openoffice/trunk/main/svgio/source/svgreader/svgpathnode.cxx
openoffice/trunk/main/svgio/source/svgreader/svgpolynode.cxx
openoffice/trunk/main/svgio/source/svgreader/svgrectnode.cxx
openoffice/trunk/main/svgio/source/svgreader/svgstyleattributes.cxx
openoffice/trunk/main/xmloff/inc/xexptran.hxx
openoffice/trunk/main/xmloff/source/draw/XMLImageMapContext.cxx
openoffice/trunk/main/xmloff/source/draw/XMLImageMapExport.cxx
openoffice/trunk/main/xmloff/source/draw/shapeexport2.cxx
openoffice/trunk/main/xmloff/source/draw/shapeexport3.cxx
openoffice/trunk/main/xmloff/source/draw/xexptran.cxx
openoffice/trunk/main/xmloff/source/draw/ximp3dobject.cxx
openoffice/trunk/main/xmloff/source/draw/ximpshap.cxx
openoffice/trunk/main/xmloff/source/style/MarkerStyle.cxx
openoffice/trunk/main/xmloff/source/text/XMLTextFrameContext.cxx
openoffice/trunk/main/xmloff/source/text/txtparae.cxx
Modified: openoffice/trunk/main/basegfx/inc/basegfx/polygon/b2dpolygontools.hxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/basegfx/inc/basegfx/polygon/b2dpolygontools.hxx?rev=1536730&r1=1536729&r2=1536730&view=diff
==============================================================================
--- openoffice/trunk/main/basegfx/inc/basegfx/polygon/b2dpolygontools.hxx (original)
+++ openoffice/trunk/main/basegfx/inc/basegfx/polygon/b2dpolygontools.hxx Tue Oct 29 14:11:45 2013
@@ -29,6 +29,8 @@
#include <basegfx/range/b2drectangle.hxx>
#include <basegfx/polygon/b2dpolypolygon.hxx>
#include <basegfx/polygon/b3dpolygon.hxx>
+#include <com/sun/star/drawing/PointSequence.hpp>
+#include <com/sun/star/drawing/FlagSequence.hpp>
#include <vector>
//////////////////////////////////////////////////////////////////////////////
@@ -540,6 +542,58 @@ namespace basegfx
/// polygon path data. Take into account all stuff like closed state, zero-length edges and others.
B2DVector getTangentLeavingPoint(const B2DPolygon& rCandidate, sal_uInt32 nIndex);
+ /// converters for com::sun::star::drawing::PointSequence
+ B2DPolygon UnoPointSequenceToB2DPolygon(
+ const com::sun::star::drawing::PointSequence& rPointSequenceSource,
+ bool bCheckClosed = true);
+ void B2DPolygonToUnoPointSequence(
+ const B2DPolygon& rPolygon,
+ com::sun::star::drawing::PointSequence& rPointSequenceRetval);
+
+ /* converters for com::sun::star::drawing::PointSequence and
+ com::sun::star::drawing::FlagSequence to B2DPolygon (curved polygons)
+ */
+ B2DPolygon UnoPolygonBezierCoordsToB2DPolygon(
+ const com::sun::star::drawing::PointSequence& rPointSequenceSource,
+ const com::sun::star::drawing::FlagSequence& rFlagSequenceSource,
+ bool bCheckClosed = true);
+ void B2DPolygonToUnoPolygonBezierCoords(
+ const B2DPolygon& rPolyPolygon,
+ com::sun::star::drawing::PointSequence& rPointSequenceRetval,
+ com::sun::star::drawing::FlagSequence& rFlagSequenceRetval);
+
+ /** Read poly-polygon from SVG.
+
+ This function imports a poly-polygon from an SVG points
+ attribute (a plain list of coordinate pairs).
+
+ @param o_rPoly
+ The output polygon. Note that svg:points can only define a
+ single polygon
+
+ @param rSvgPointsAttribute
+ A valid SVG points attribute string
+
+ @return true, if the string was successfully parsed
+ */
+ bool importFromSvgPoints( B2DPolygon& o_rPoly,
+ const ::rtl::OUString& rSvgPointsAttribute );
+
+ /** Write poly-polygon to SVG.
+
+ This function imports a non-bezier polygon to SVG points
+ (a plain list of coordinate pairs).
+
+ @param rPoly
+ The polygon to export
+
+ @param rSvgPointsAttribute
+ A valid SVG points attribute string
+
+ @return true, if the string was successfully parsed
+ */
+ ::rtl::OUString exportToSvgPoints( const B2DPolygon& rPoly );
+
} // end of namespace tools
} // end of namespace basegfx
Modified: openoffice/trunk/main/basegfx/inc/basegfx/polygon/b2dpolypolygontools.hxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/basegfx/inc/basegfx/polygon/b2dpolypolygontools.hxx?rev=1536730&r1=1536729&r2=1536730&view=diff
==============================================================================
--- openoffice/trunk/main/basegfx/inc/basegfx/polygon/b2dpolypolygontools.hxx (original)
+++ openoffice/trunk/main/basegfx/inc/basegfx/polygon/b2dpolypolygontools.hxx Tue Oct 29 14:11:45 2013
@@ -19,8 +19,6 @@
*
*************************************************************/
-
-
#ifndef _BGFX_POLYPOLYGON_B2DPOLYGONTOOLS_HXX
#define _BGFX_POLYPOLYGON_B2DPOLYGONTOOLS_HXX
@@ -28,7 +26,10 @@
#include <basegfx/vector/b2dvector.hxx>
#include <basegfx/polygon/b2dpolygon.hxx>
#include <basegfx/polygon/b3dpolypolygon.hxx>
+#include <com/sun/star/drawing/PointSequenceSequence.hpp>
+#include <com/sun/star/drawing/PolyPolygonBezierCoords.hpp>
#include <vector>
+#include <set>
namespace rtl
{
@@ -120,11 +121,37 @@ namespace basegfx
// with distance fDistance and rounded edges (start and end point).
bool isInEpsilonRange(const B2DPolyPolygon& rCandidate, const B2DPoint& rTestPosition, double fDistance);
+ /** Helper class to transport PointIndices to a PolyPolygon,
+ with an operator< for convenient sorting in a std::set usage
+ */
+ class PointIndex
+ {
+ private:
+ sal_uInt32 mnPolygonIndex;
+ sal_uInt32 mnPointIndex;
+
+ public:
+ PointIndex(sal_uInt32 nPolygonIndex, sal_uInt32 nPointIndex)
+ : mnPolygonIndex(nPolygonIndex),
+ mnPointIndex(nPointIndex)
+ {}
+
+ sal_uInt32 getPolygonIndex() const { return mnPolygonIndex; }
+ sal_uInt32 getPointIndex() const { return mnPointIndex; }
+ bool operator<(const PointIndex& rComp) const;
+ };
+
+ /** the PointIndexSet itself; it allows to define a 'selection'of
+ points in a PolyPolygon by giving the polygon and point index.
+ Adding points double makes no sense, hence the std::set
+ */
+ typedef std::set< PointIndex > PointIndexSet;
+
/** Read poly-polygon from SVG.
- This function imports a poly-polygon from an SVG-D
- attribute. Currently, elliptical arc elements are not yet
- supported (and ignored during parsing).
+ This function imports a poly-polygon from an SVG-D
+ attribute. Currently, elliptical arc elements are not yet
+ supported (and ignored during parsing).
@param o_rPolyPoly
The output poly-polygon
@@ -132,28 +159,30 @@ namespace basegfx
@param rSvgDAttribute
A valid SVG-D attribute string
- @return true, if the string was successfully parsed
- */
- bool importFromSvgD( B2DPolyPolygon& o_rPolyPoly,
- const ::rtl::OUString& rSvgDAttribute );
-
- /** Read poly-polygon from SVG.
-
- This function imports a poly-polygon from an SVG points
- attribute (a plain list of coordinate pairs).
-
- @param o_rPoly
- The output polygon. Note that svg:points can only define a
- single polygon
-
- @param rSvgPointsAttribute
- A valid SVG points attribute string
+ @param bHandleRelativeNextPointCompatible
+ If set to true, the old error that after a relative 'z' command
+ the current point was not reset to the first point of the current
+ polygon is kept; this is needed to read odf files.
+ If false, pure svg is used; this is needed for svg import.
+
+ @param pHelpPointIndexSet
+ If given, all points created in the target PolyPolygon
+ which are only helper points are added here using their
+ point indices; this are currently points created from
+ import of the 'a' and 'A' svg:d statements which create
+ bezier curve info as representation and maybe points
+ which are no 'real' svg:d points, but helper points. It
+ is necessary to identify these e.g. when markers need to
+ be created in the svg import
@return true, if the string was successfully parsed
*/
- bool importFromSvgPoints( B2DPolygon& o_rPoly,
- const ::rtl::OUString& rSvgPointsAttribute );
+ bool importFromSvgD(
+ B2DPolyPolygon& o_rPolyPoly,
+ const ::rtl::OUString& rSvgDAttribute,
+ bool bHandleRelativeNextPointCompatible,
+ PointIndexSet* pHelpPointIndexSet);
// grow for polyPolygon. Move all geometry in each point in the direction of the normal in that point
// with the given amount. Value may be negative.
@@ -232,12 +261,20 @@ namespace basegfx
quadratic bezier segments. Note that the generated string
causes versions prior to OOo2.0 to crash.
+ @param bHandleRelativeNextPointCompatible
+ If set to true, the old error that after a relative 'z' command
+ the current point was not reset to the first point of the current
+ polygon is kept; this is needed to read odf files.
+ If false, pure svg is used; this is needed for svg import.
+
@return the generated SVG-D statement (the XML d attribute
value alone, without any "<path ...>" or "d="...")
*/
- ::rtl::OUString exportToSvgD( const B2DPolyPolygon& rPolyPoly,
- bool bUseRelativeCoordinates=true,
- bool bDetectQuadraticBeziers=true );
+ ::rtl::OUString exportToSvgD(
+ const B2DPolyPolygon& rPolyPoly,
+ bool bUseRelativeCoordinates,
+ bool bDetectQuadraticBeziers,
+ bool bHandleRelativeNextPointCompatible);
// #i76891# Try to remove existing curve segments if they are simply edges
B2DPolyPolygon simplifyCurveSegments(const B2DPolyPolygon& rCandidate);
@@ -280,6 +317,22 @@ namespace basegfx
*/
bool containsOnlyHorizontalAndVerticalEdges(const B2DPolyPolygon& rCandidate);
+ /// converters for com::sun::star::drawing::PointSequence
+ B2DPolyPolygon UnoPointSequenceSequenceToB2DPolyPolygon(
+ const com::sun::star::drawing::PointSequenceSequence& rPointSequenceSequenceSource,
+ bool bCheckClosed = true);
+ void B2DPolyPolygonToUnoPointSequenceSequence(
+ const B2DPolyPolygon& rPolyPolygon,
+ com::sun::star::drawing::PointSequenceSequence& rPointSequenceSequenceRetval);
+
+ /// converters for com::sun::star::drawing::PolyPolygonBezierCoords (curved polygons)
+ B2DPolyPolygon UnoPolyPolygonBezierCoordsToB2DPolyPolygon(
+ const com::sun::star::drawing::PolyPolygonBezierCoords& rPolyPolygonBezierCoordsSource,
+ bool bCheckClosed = true);
+ void B2DPolyPolygonToUnoPolyPolygonBezierCoords(
+ const B2DPolyPolygon& rPolyPolygon,
+ com::sun::star::drawing::PolyPolygonBezierCoords& rPolyPolygonBezierCoordsRetval);
+
} // end of namespace tools
} // end of namespace basegfx
Modified: openoffice/trunk/main/basegfx/inc/basegfx/polygon/b3dpolypolygontools.hxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/basegfx/inc/basegfx/polygon/b3dpolypolygontools.hxx?rev=1536730&r1=1536729&r2=1536730&view=diff
==============================================================================
--- openoffice/trunk/main/basegfx/inc/basegfx/polygon/b3dpolypolygontools.hxx (original)
+++ openoffice/trunk/main/basegfx/inc/basegfx/polygon/b3dpolypolygontools.hxx Tue Oct 29 14:11:45 2013
@@ -26,9 +26,10 @@
#include <basegfx/point/b2dpoint.hxx>
#include <basegfx/vector/b2dvector.hxx>
-#include <vector>
#include <basegfx/numeric/ftools.hxx>
#include <basegfx/point/b3dpoint.hxx>
+#include <com/sun/star/drawing/PolyPolygonShape3D.hpp>
+#include <vector>
//////////////////////////////////////////////////////////////////////////////
@@ -144,7 +145,15 @@ namespace basegfx
bool equal(const B3DPolyPolygon& rCandidateA, const B3DPolyPolygon& rCandidateB, const double& rfSmallValue);
bool equal(const B3DPolyPolygon& rCandidateA, const B3DPolyPolygon& rCandidateB);
- } // end of namespace tools
+ /// converters for com::sun::star::drawing::PolyPolygonShape3D
+ B3DPolyPolygon UnoPolyPolygonShape3DToB3DPolyPolygon(
+ const com::sun::star::drawing::PolyPolygonShape3D& rPolyPolygonShape3DSource,
+ bool bCheckClosed = true);
+ void B3DPolyPolygonToUnoPolyPolygonShape3D(
+ const B3DPolyPolygon& rPolyPolygonSource,
+ com::sun::star::drawing::PolyPolygonShape3D& rPolyPolygonShape3DRetval);
+
+ } // end of namespace tools
} // end of namespace basegfx
#endif /* _BGFX_POLYPOLYGON_B3DPOLYGONTOOLS_HXX */
Added: openoffice/trunk/main/basegfx/source/inc/stringconversiontools.hxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/basegfx/source/inc/stringconversiontools.hxx?rev=1536730&view=auto
==============================================================================
--- openoffice/trunk/main/basegfx/source/inc/stringconversiontools.hxx (added)
+++ openoffice/trunk/main/basegfx/source/inc/stringconversiontools.hxx Tue Oct 29 14:11:45 2013
@@ -0,0 +1,114 @@
+/**************************************************************
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ *************************************************************/
+
+#ifndef _STRINGCONVERSIONTOOLS_HXX
+#define _STRINGCONVERSIONTOOLS_HXX
+
+#include <sal/types.h>
+#include <rtl/ustring.hxx>
+#include <rtl/ustrbuf.hxx>
+
+namespace basegfx
+{
+ namespace internal
+ {
+ void lcl_skipSpaces(sal_Int32& io_rPos,
+ const ::rtl::OUString& rStr,
+ const sal_Int32 nLen);
+
+ void lcl_skipSpacesAndCommas(sal_Int32& io_rPos,
+ const ::rtl::OUString& rStr,
+ const sal_Int32 nLen);
+
+ inline bool lcl_isOnNumberChar(const sal_Unicode aChar, bool bSignAllowed = true)
+ {
+ const bool bPredicate( (sal_Unicode('0') <= aChar && sal_Unicode('9') >= aChar)
+ || (bSignAllowed && sal_Unicode('+') == aChar)
+ || (bSignAllowed && sal_Unicode('-') == aChar) );
+
+ return bPredicate;
+ }
+
+ inline bool lcl_isOnNumberChar(const ::rtl::OUString& rStr, const sal_Int32 nPos, bool bSignAllowed = true)
+ {
+ return lcl_isOnNumberChar(rStr[nPos],
+ bSignAllowed);
+ }
+
+ bool lcl_getDoubleChar(double& o_fRetval,
+ sal_Int32& io_rPos,
+ const ::rtl::OUString& rStr);
+
+ bool lcl_importDoubleAndSpaces( double& o_fRetval,
+ sal_Int32& io_rPos,
+ const ::rtl::OUString& rStr,
+ const sal_Int32 nLen );
+
+ bool lcl_importNumberAndSpaces(sal_Int32& o_nRetval,
+ sal_Int32& io_rPos,
+ const ::rtl::OUString& rStr,
+ const sal_Int32 nLen);
+
+ void lcl_skipNumber(sal_Int32& io_rPos,
+ const ::rtl::OUString& rStr,
+ const sal_Int32 nLen);
+
+ void lcl_skipDouble(sal_Int32& io_rPos,
+ const ::rtl::OUString& rStr);
+
+ inline void lcl_skipNumberAndSpacesAndCommas(sal_Int32& io_rPos,
+ const ::rtl::OUString& rStr,
+ const sal_Int32 nLen)
+ {
+ lcl_skipNumber(io_rPos, rStr, nLen);
+ lcl_skipSpacesAndCommas(io_rPos, rStr, nLen);
+ }
+
+ // #100617# Allow to skip doubles, too.
+ inline void lcl_skipDoubleAndSpacesAndCommas(sal_Int32& io_rPos,
+ const ::rtl::OUString& rStr,
+ const sal_Int32 nLen)
+ {
+ lcl_skipDouble(io_rPos, rStr);
+ lcl_skipSpacesAndCommas(io_rPos, rStr, nLen);
+ }
+
+ inline void lcl_putNumberChar( ::rtl::OUStringBuffer& rStr,
+ double fValue )
+ {
+ rStr.append( fValue );
+ }
+
+ void lcl_putNumberCharWithSpace( ::rtl::OUStringBuffer& rStr,
+ double fValue,
+ double fOldValue,
+ bool bUseRelativeCoordinates );
+
+ inline sal_Unicode lcl_getCommand( sal_Char cUpperCaseCommand,
+ sal_Char cLowerCaseCommand,
+ bool bUseRelativeCoordinates )
+ {
+ return bUseRelativeCoordinates ? cLowerCaseCommand : cUpperCaseCommand;
+ }
+ } // namespace internal
+} // namespace basegfx
+
+#endif /* _STRINGCONVERSIONTOOLS_HXX */
Propchange: openoffice/trunk/main/basegfx/source/inc/stringconversiontools.hxx
------------------------------------------------------------------------------
svn:executable = *
Modified: openoffice/trunk/main/basegfx/source/polygon/b2dpolygontools.cxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/basegfx/source/polygon/b2dpolygontools.cxx?rev=1536730&r1=1536729&r2=1536730&view=diff
==============================================================================
--- openoffice/trunk/main/basegfx/source/polygon/b2dpolygontools.cxx (original)
+++ openoffice/trunk/main/basegfx/source/polygon/b2dpolygontools.cxx Tue Oct 29 14:11:45 2013
@@ -3742,6 +3742,349 @@ namespace basegfx
return aRetval;
}
+ //////////////////////////////////////////////////////////////////////////////
+ // converters for com::sun::star::drawing::PointSequence
+
+ B2DPolygon UnoPointSequenceToB2DPolygon(
+ const com::sun::star::drawing::PointSequence& rPointSequenceSource,
+ bool bCheckClosed)
+ {
+ B2DPolygon aRetval;
+ const sal_uInt32 nLength(rPointSequenceSource.getLength());
+
+ if(nLength)
+ {
+ aRetval.reserve(nLength);
+ const com::sun::star::awt::Point* pArray = rPointSequenceSource.getConstArray();
+ const com::sun::star::awt::Point* pArrayEnd = pArray + rPointSequenceSource.getLength();
+
+ for(;pArray != pArrayEnd; pArray++)
+ {
+ aRetval.append(B2DPoint(pArray->X, pArray->Y));
+ }
+
+ if(bCheckClosed)
+ {
+ // check for closed state flag
+ tools::checkClosed(aRetval);
+ }
+ }
+
+ return aRetval;
+ }
+
+ void B2DPolygonToUnoPointSequence(
+ const B2DPolygon& rPolygon,
+ com::sun::star::drawing::PointSequence& rPointSequenceRetval)
+ {
+ B2DPolygon aPolygon(rPolygon);
+
+ if(aPolygon.areControlPointsUsed())
+ {
+ OSL_ENSURE(false, "B2DPolygonToUnoPointSequence: Source contains bezier segments, wrong UNO API data type may be used (!)");
+ aPolygon = aPolygon.getDefaultAdaptiveSubdivision();
+ }
+
+ const sal_uInt32 nPointCount(aPolygon.count());
+
+ if(nPointCount)
+ {
+ // Take closed state into account, the API polygon still uses the old closed definition
+ // with last/first point are identical (cannot hold information about open polygons with identical
+ // first and last point, though)
+ const bool bIsClosed(aPolygon.isClosed());
+
+ rPointSequenceRetval.realloc(bIsClosed ? nPointCount + 1 : nPointCount);
+ com::sun::star::awt::Point* pSequence = rPointSequenceRetval.getArray();
+
+ for(sal_uInt32 b(0); b < nPointCount; b++)
+ {
+ const B2DPoint aPoint(aPolygon.getB2DPoint(b));
+ const com::sun::star::awt::Point aAPIPoint(fround(aPoint.getX()), fround(aPoint.getY()));
+
+ *pSequence = aAPIPoint;
+ pSequence++;
+ }
+
+ // copy first point if closed
+ if(bIsClosed)
+ {
+ *pSequence = *rPointSequenceRetval.getArray();
+ }
+ }
+ else
+ {
+ rPointSequenceRetval.realloc(0);
+ }
+ }
+
+ //////////////////////////////////////////////////////////////////////////////
+ // converters for com::sun::star::drawing::PointSequence and
+ // com::sun::star::drawing::FlagSequence to B2DPolygon (curved polygons)
+
+ B2DPolygon UnoPolygonBezierCoordsToB2DPolygon(
+ const com::sun::star::drawing::PointSequence& rPointSequenceSource,
+ const com::sun::star::drawing::FlagSequence& rFlagSequenceSource,
+ bool bCheckClosed)
+ {
+ const sal_uInt32 nCount((sal_uInt32)rPointSequenceSource.getLength());
+ OSL_ENSURE(nCount == (sal_uInt32)rFlagSequenceSource.getLength(),
+ "UnoPolygonBezierCoordsToB2DPolygon: Unequal count of Points and Flags (!)");
+
+ // prepare new polygon
+ B2DPolygon aRetval;
+ const com::sun::star::awt::Point* pPointSequence = rPointSequenceSource.getConstArray();
+ const com::sun::star::drawing::PolygonFlags* pFlagSequence = rFlagSequenceSource.getConstArray();
+
+ // get first point and flag
+ B2DPoint aNewCoordinatePair(pPointSequence->X, pPointSequence->Y); pPointSequence++;
+ com::sun::star::drawing::PolygonFlags ePolygonFlag(*pFlagSequence); pFlagSequence++;
+ B2DPoint aControlA;
+ B2DPoint aControlB;
+
+ // first point is not allowed to be a control point
+ OSL_ENSURE(com::sun::star::drawing::PolygonFlags_CONTROL != ePolygonFlag,
+ "UnoPolygonBezierCoordsToB2DPolygon: Start point is a control point, illegal input polygon (!)");
+
+ // add first point as start point
+ aRetval.append(aNewCoordinatePair);
+
+ for(sal_uInt32 b(1); b < nCount;)
+ {
+ // prepare loop
+ bool bControlA(false);
+ bool bControlB(false);
+
+ // get next point and flag
+ aNewCoordinatePair = B2DPoint(pPointSequence->X, pPointSequence->Y);
+ ePolygonFlag = *pFlagSequence;
+ pPointSequence++; pFlagSequence++; b++;
+
+ if(b < nCount && com::sun::star::drawing::PolygonFlags_CONTROL == ePolygonFlag)
+ {
+ aControlA = aNewCoordinatePair;
+ bControlA = true;
+
+ // get next point and flag
+ aNewCoordinatePair = B2DPoint(pPointSequence->X, pPointSequence->Y);
+ ePolygonFlag = *pFlagSequence;
+ pPointSequence++; pFlagSequence++; b++;
+ }
+
+ if(b < nCount && com::sun::star::drawing::PolygonFlags_CONTROL == ePolygonFlag)
+ {
+ aControlB = aNewCoordinatePair;
+ bControlB = true;
+
+ // get next point and flag
+ aNewCoordinatePair = B2DPoint(pPointSequence->X, pPointSequence->Y);
+ ePolygonFlag = *pFlagSequence;
+ pPointSequence++; pFlagSequence++; b++;
+ }
+
+ // two or no control points are consumed, another one would be an error.
+ // It's also an error if only one control point was read
+ OSL_ENSURE(com::sun::star::drawing::PolygonFlags_CONTROL != ePolygonFlag && bControlA == bControlB,
+ "UnoPolygonBezierCoordsToB2DPolygon: Illegal source polygon (!)");
+
+ // the previous writes used the B2DPolyPoygon -> PolyPolygon converter
+ // which did not create minimal PolyPolygons, but created all control points
+ // as null vectors (identical points). Because of the former P(CA)(CB)-norm of
+ // B2DPolygon and it's unused sign of being the zero-vector and CA and CB being
+ // relative to P, an empty edge was exported as P == CA == CB. Luckily, the new
+ // export format can be read without errors by the old OOo-versions, so we need only
+ // to correct here at read and do not need to export a wrong but compatible version
+ // for the future.
+ if(bControlA
+ && aControlA.equal(aControlB)
+ && aControlA.equal(aRetval.getB2DPoint(aRetval.count() - 1)))
+ {
+ bControlA = bControlB = false;
+ }
+
+ if(bControlA)
+ {
+ // add bezier edge
+ aRetval.appendBezierSegment(aControlA, aControlB, aNewCoordinatePair);
+ }
+ else
+ {
+ // add edge
+ aRetval.append(aNewCoordinatePair);
+ }
+ }
+
+ // #i72807# API import uses old line start/end-equal definition for closed,
+ // so we need to correct this to closed state here
+ if(bCheckClosed)
+ {
+ checkClosed(aRetval);
+ }
+
+ return aRetval;
+ }
+
+ void B2DPolygonToUnoPolygonBezierCoords(
+ const B2DPolygon& rPolygon,
+ com::sun::star::drawing::PointSequence& rPointSequenceRetval,
+ com::sun::star::drawing::FlagSequence& rFlagSequenceRetval)
+ {
+ const sal_uInt32 nPointCount(rPolygon.count());
+
+ if(nPointCount)
+ {
+ const bool bCurve(rPolygon.areControlPointsUsed());
+ const bool bClosed(rPolygon.isClosed());
+
+ if(nPointCount)
+ {
+ if(bCurve)
+ {
+ // calculate target point count
+ const sal_uInt32 nLoopCount(bClosed ? nPointCount : (nPointCount ? nPointCount - 1 : 0));
+
+ if(nLoopCount)
+ {
+ // prepare target data. The real needed number of target points (and flags)
+ // could only be calculated by using two loops, so use dynamic memory
+ std::vector< com::sun::star::awt::Point > aCollectPoints;
+ std::vector< com::sun::star::drawing::PolygonFlags > aCollectFlags;
+
+ // reserve maximum creatable points
+ const sal_uInt32 nMaxTargetCount((nLoopCount * 3) + 1);
+ aCollectPoints.reserve(nMaxTargetCount);
+ aCollectFlags.reserve(nMaxTargetCount);
+
+ // prepare current bezier segment by setting start point
+ B2DCubicBezier aBezierSegment;
+ aBezierSegment.setStartPoint(rPolygon.getB2DPoint(0));
+
+ for(sal_uInt32 a(0); a < nLoopCount; a++)
+ {
+ // add current point (always) and remember StartPointIndex for evtl. later corrections
+ const sal_uInt32 nStartPointIndex(aCollectPoints.size());
+ aCollectPoints.push_back(
+ com::sun::star::awt::Point(
+ fround(aBezierSegment.getStartPoint().getX()),
+ fround(aBezierSegment.getStartPoint().getY())));
+ aCollectFlags.push_back(com::sun::star::drawing::PolygonFlags_NORMAL);
+
+ // prepare next segment
+ const sal_uInt32 nNextIndex((a + 1) % nPointCount);
+ aBezierSegment.setEndPoint(rPolygon.getB2DPoint(nNextIndex));
+ aBezierSegment.setControlPointA(rPolygon.getNextControlPoint(a));
+ aBezierSegment.setControlPointB(rPolygon.getPrevControlPoint(nNextIndex));
+
+ if(aBezierSegment.isBezier())
+ {
+ // if bezier is used, add always two control points due to the old schema
+ aCollectPoints.push_back(
+ com::sun::star::awt::Point(
+ fround(aBezierSegment.getControlPointA().getX()),
+ fround(aBezierSegment.getControlPointA().getY())));
+ aCollectFlags.push_back(com::sun::star::drawing::PolygonFlags_CONTROL);
+
+ aCollectPoints.push_back(
+ com::sun::star::awt::Point(
+ fround(aBezierSegment.getControlPointB().getX()),
+ fround(aBezierSegment.getControlPointB().getY())));
+ aCollectFlags.push_back(com::sun::star::drawing::PolygonFlags_CONTROL);
+ }
+
+ // test continuity with previous control point to set flag value
+ if(aBezierSegment.getControlPointA() != aBezierSegment.getStartPoint() && (bClosed || a))
+ {
+ const B2VectorContinuity eCont(rPolygon.getContinuityInPoint(a));
+
+ if(CONTINUITY_C1 == eCont)
+ {
+ aCollectFlags[nStartPointIndex] = com::sun::star::drawing::PolygonFlags_SMOOTH;
+ }
+ else if(CONTINUITY_C2 == eCont)
+ {
+ aCollectFlags[nStartPointIndex] = com::sun::star::drawing::PolygonFlags_SYMMETRIC;
+ }
+ }
+
+ // prepare next loop
+ aBezierSegment.setStartPoint(aBezierSegment.getEndPoint());
+ }
+
+ if(bClosed)
+ {
+ // add first point again as closing point due to old definition
+ aCollectPoints.push_back(aCollectPoints[0]);
+ aCollectFlags.push_back(com::sun::star::drawing::PolygonFlags_NORMAL);
+ }
+ else
+ {
+ // add last point as closing point
+ const B2DPoint aClosingPoint(rPolygon.getB2DPoint(nPointCount - 1L));
+ aCollectPoints.push_back(
+ com::sun::star::awt::Point(
+ fround(aClosingPoint.getX()),
+ fround(aClosingPoint.getY())));
+ aCollectFlags.push_back(com::sun::star::drawing::PolygonFlags_NORMAL);
+ }
+
+ // copy collected data to target arrays
+ const sal_uInt32 nTargetCount(aCollectPoints.size());
+ OSL_ENSURE(nTargetCount == aCollectFlags.size(), "Unequal Point and Flag count (!)");
+
+ rPointSequenceRetval.realloc((sal_Int32)nTargetCount);
+ rFlagSequenceRetval.realloc((sal_Int32)nTargetCount);
+ com::sun::star::awt::Point* pPointSequence = rPointSequenceRetval.getArray();
+ com::sun::star::drawing::PolygonFlags* pFlagSequence = rFlagSequenceRetval.getArray();
+
+ for(sal_uInt32 a(0); a < nTargetCount; a++)
+ {
+ *pPointSequence = aCollectPoints[a];
+ *pFlagSequence = aCollectFlags[a];
+ pPointSequence++;
+ pFlagSequence++;
+ }
+ }
+ }
+ else
+ {
+ // straightforward point list creation
+ const sal_uInt32 nTargetCount(nPointCount + (bClosed ? 1 : 0));
+
+ rPointSequenceRetval.realloc((sal_Int32)nTargetCount);
+ rFlagSequenceRetval.realloc((sal_Int32)nTargetCount);
+
+ com::sun::star::awt::Point* pPointSequence = rPointSequenceRetval.getArray();
+ com::sun::star::drawing::PolygonFlags* pFlagSequence = rFlagSequenceRetval.getArray();
+
+ for(sal_uInt32 a(0); a < nPointCount; a++)
+ {
+ const B2DPoint aB2DPoint(rPolygon.getB2DPoint(a));
+ const com::sun::star::awt::Point aAPIPoint(
+ fround(aB2DPoint.getX()),
+ fround(aB2DPoint.getY()));
+
+ *pPointSequence = aAPIPoint;
+ *pFlagSequence = com::sun::star::drawing::PolygonFlags_NORMAL;
+ pPointSequence++;
+ pFlagSequence++;
+ }
+
+ if(bClosed)
+ {
+ // add first point as closing point
+ *pPointSequence = *rPointSequenceRetval.getConstArray();
+ *pFlagSequence = com::sun::star::drawing::PolygonFlags_NORMAL;
+ }
+ }
+ }
+ }
+ else
+ {
+ rPointSequenceRetval.realloc(0);
+ rFlagSequenceRetval.realloc(0);
+ }
+ }
+
} // end of namespace tools
} // end of namespace basegfx
Modified: openoffice/trunk/main/basegfx/source/polygon/b2dpolypolygontools.cxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/basegfx/source/polygon/b2dpolypolygontools.cxx?rev=1536730&r1=1536729&r2=1536730&view=diff
==============================================================================
--- openoffice/trunk/main/basegfx/source/polygon/b2dpolypolygontools.cxx (original)
+++ openoffice/trunk/main/basegfx/source/polygon/b2dpolypolygontools.cxx Tue Oct 29 14:11:45 2013
@@ -19,10 +19,9 @@
*
*************************************************************/
-
-
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_basegfx.hxx"
+
#include <basegfx/polygon/b2dpolypolygontools.hxx>
#include <osl/diagnose.h>
#include <basegfx/polygon/b2dpolypolygon.hxx>
@@ -30,7 +29,6 @@
#include <basegfx/polygon/b2dpolygontools.hxx>
#include <basegfx/numeric/ftools.hxx>
#include <basegfx/polygon/b2dpolypolygoncutter.hxx>
-
#include <numeric>
//////////////////////////////////////////////////////////////////////////////
@@ -611,6 +609,120 @@ namespace basegfx
return true;
}
+
+ //////////////////////////////////////////////////////////////////////////////
+ // converters for com::sun::star::drawing::PointSequence
+
+ B2DPolyPolygon UnoPointSequenceSequenceToB2DPolyPolygon(
+ const com::sun::star::drawing::PointSequenceSequence& rPointSequenceSequenceSource,
+ bool bCheckClosed)
+ {
+ B2DPolyPolygon aRetval;
+ const com::sun::star::drawing::PointSequence* pPointSequence = rPointSequenceSequenceSource.getConstArray();
+ const com::sun::star::drawing::PointSequence* pPointSeqEnd = pPointSequence + rPointSequenceSequenceSource.getLength();
+
+ for(;pPointSequence != pPointSeqEnd; pPointSequence++)
+ {
+ const B2DPolygon aNewPolygon = UnoPointSequenceToB2DPolygon(*pPointSequence, bCheckClosed);
+ aRetval.append(aNewPolygon);
+ }
+
+ return aRetval;
+ }
+
+ void B2DPolyPolygonToUnoPointSequenceSequence(
+ const B2DPolyPolygon& rPolyPolygon,
+ com::sun::star::drawing::PointSequenceSequence& rPointSequenceSequenceRetval)
+ {
+ const sal_uInt32 nCount(rPolyPolygon.count());
+
+ if(nCount)
+ {
+ rPointSequenceSequenceRetval.realloc(nCount);
+ com::sun::star::drawing::PointSequence* pPointSequence = rPointSequenceSequenceRetval.getArray();
+
+ for(sal_uInt32 a(0); a < nCount; a++)
+ {
+ const B2DPolygon aPolygon(rPolyPolygon.getB2DPolygon(a));
+
+ B2DPolygonToUnoPointSequence(aPolygon, *pPointSequence);
+ pPointSequence++;
+ }
+ }
+ else
+ {
+ rPointSequenceSequenceRetval.realloc(0);
+ }
+ }
+
+ //////////////////////////////////////////////////////////////////////////////
+ // converters for com::sun::star::drawing::PolyPolygonBezierCoords (curved polygons)
+
+ B2DPolyPolygon UnoPolyPolygonBezierCoordsToB2DPolyPolygon(
+ const com::sun::star::drawing::PolyPolygonBezierCoords& rPolyPolygonBezierCoordsSource,
+ bool bCheckClosed)
+ {
+ B2DPolyPolygon aRetval;
+ const sal_uInt32 nSequenceCount((sal_uInt32)rPolyPolygonBezierCoordsSource.Coordinates.getLength());
+
+ if(nSequenceCount)
+ {
+ OSL_ENSURE(nSequenceCount == (sal_uInt32)rPolyPolygonBezierCoordsSource.Flags.getLength(),
+ "UnoPolyPolygonBezierCoordsToB2DPolyPolygon: unequal number of Points and Flags (!)");
+ const com::sun::star::drawing::PointSequence* pPointSequence = rPolyPolygonBezierCoordsSource.Coordinates.getConstArray();
+ const com::sun::star::drawing::FlagSequence* pFlagSequence = rPolyPolygonBezierCoordsSource.Flags.getConstArray();
+
+ for(sal_uInt32 a(0); a < nSequenceCount; a++)
+ {
+ const B2DPolygon aNewPolygon(UnoPolygonBezierCoordsToB2DPolygon(
+ *pPointSequence,
+ *pFlagSequence,
+ bCheckClosed));
+
+ pPointSequence++;
+ pFlagSequence++;
+ aRetval.append(aNewPolygon);
+ }
+ }
+
+ return aRetval;
+ }
+
+ void B2DPolyPolygonToUnoPolyPolygonBezierCoords(
+ const B2DPolyPolygon& rPolyPolygon,
+ com::sun::star::drawing::PolyPolygonBezierCoords& rPolyPolygonBezierCoordsRetval)
+ {
+ const sal_uInt32 nCount(rPolyPolygon.count());
+
+ if(nCount)
+ {
+ // prepare return value memory
+ rPolyPolygonBezierCoordsRetval.Coordinates.realloc((sal_Int32)nCount);
+ rPolyPolygonBezierCoordsRetval.Flags.realloc((sal_Int32)nCount);
+
+ // get pointers to arrays
+ com::sun::star::drawing::PointSequence* pPointSequence = rPolyPolygonBezierCoordsRetval.Coordinates.getArray();
+ com::sun::star::drawing::FlagSequence* pFlagSequence = rPolyPolygonBezierCoordsRetval.Flags.getArray();
+
+ for(sal_uInt32 a(0); a < nCount; a++)
+ {
+ const B2DPolygon aSource(rPolyPolygon.getB2DPolygon(a));
+
+ B2DPolygonToUnoPolygonBezierCoords(
+ aSource,
+ *pPointSequence,
+ *pFlagSequence);
+ pPointSequence++;
+ pFlagSequence++;
+ }
+ }
+ else
+ {
+ rPolyPolygonBezierCoordsRetval.Coordinates.realloc(0);
+ rPolyPolygonBezierCoordsRetval.Flags.realloc(0);
+ }
+ }
+
} // end of namespace tools
} // end of namespace basegfx