summaryrefslogtreecommitdiff
path: root/basegfx
diff options
context:
space:
mode:
authorBjoern Michaelsen <bjoern.michaelsen@canonical.com>2011-07-21 18:56:16 +0200
committerBjoern Michaelsen <bjoern.michaelsen@canonical.com>2011-07-21 18:56:16 +0200
commita233dac0653f3f3054f7ad2da114ed989747e89a (patch)
treebf1e11438321c06125a94308649c496648061ccb /basegfx
parentacb6133d89abe071108577f821d7eaa381378879 (diff)
parente5647de7dd26775e45af24f11ac4f82a5518bd9e (diff)
resyncing to master
Diffstat (limited to 'basegfx')
-rw-r--r--basegfx/inc/basegfx/matrix/b3dhommatrix.hxx13
-rw-r--r--basegfx/inc/basegfx/point/b3dhompoint.hxx409
-rw-r--r--basegfx/inc/basegfx/tools/unotools.hxx55
-rw-r--r--basegfx/prj/build.lst2
-rw-r--r--basegfx/prj/d.lst1
-rw-r--r--basegfx/source/matrix/b3dhommatrix.cxx54
-rw-r--r--basegfx/source/point/b3dhompoint.cxx47
-rw-r--r--basegfx/source/polygon/b2dpolypolygon.cxx19
-rw-r--r--basegfx/source/polygon/b2dsvgpolypolygon.cxx7
-rw-r--r--basegfx/source/tools/unotools.cxx264
-rw-r--r--basegfx/test/basegfx3d.cxx28
11 files changed, 327 insertions, 572 deletions
diff --git a/basegfx/inc/basegfx/matrix/b3dhommatrix.hxx b/basegfx/inc/basegfx/matrix/b3dhommatrix.hxx
index ccd4cfe707a8..a3eb8d311ec4 100644
--- a/basegfx/inc/basegfx/matrix/b3dhommatrix.hxx
+++ b/basegfx/inc/basegfx/matrix/b3dhommatrix.hxx
@@ -53,9 +53,6 @@ namespace basegfx
B3DHomMatrix(const B3DHomMatrix& rMat);
~B3DHomMatrix();
- /// unshare this matrix with all internally shared instances
- void makeUnique();
-
double get(sal_uInt16 nRow, sal_uInt16 nColumn) const;
void set(sal_uInt16 nRow, sal_uInt16 nColumn, double fValue);
@@ -67,20 +64,12 @@ namespace basegfx
/// Reset to the identity matrix
void identity();
- bool isInvertible() const;
/// Invert the matrix (if possible)
bool invert();
- bool isNormalized() const;
- /// Normalize (i.e. force w=1) the matrix
- void normalize();
-
/// Calc the matrix determinant
double determinant() const;
- /// Calc the matrix trace
- double trace() const;
-
/// Transpose the matrix
void transpose();
@@ -95,8 +84,6 @@ namespace basegfx
// Shearing-Matrices
void shearXY(double fSx, double fSy);
- void shearYZ(double fSy, double fSz);
- void shearXZ(double fSx, double fSz);
// Projection matrices, used for converting between eye and
// clip coordinates
diff --git a/basegfx/inc/basegfx/point/b3dhompoint.hxx b/basegfx/inc/basegfx/point/b3dhompoint.hxx
deleted file mode 100644
index 1b43afc03b38..000000000000
--- a/basegfx/inc/basegfx/point/b3dhompoint.hxx
+++ /dev/null
@@ -1,409 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#ifndef _BGFX_POINT_B3DHOMPOINT_HXX
-#define _BGFX_POINT_B3DHOMPOINT_HXX
-
-#include <basegfx/point/b3dpoint.hxx>
-#include <basegfx/basegfxdllapi.h>
-
-namespace basegfx
-{
- /** Basic homogen Point class with three double values and one homogen factor
-
- This class provides access to homogen coordinates in 3D.
- For this purpose all the operators which need to do specific
- action due to their homogenity are implemented here.
- The only caveat are member methods which are declared as const
- but do change the content. These are documented for that reason.
- The class is designed to provide homogenous coordinates without
- direct access to the homogen part (mfW). This is also the reason
- for leaving out the [] operators which return references to members.
-
- @see B3DTuple
- */
- class BASEGFX_DLLPUBLIC B3DHomPoint
- {
- protected:
- /// This member contains the coordinate part of the point
- ::basegfx::B3DTuple maTuple;
-
- /// This Member holds the homogenous part of the point
- double mfW;
-
- /** Test if this homogen point does have a homogenous part
-
- @return Returns true if this point has no homogenous part
- */
- bool implIsHomogenized() const
- {
- const double fOne(1.0);
- return ::basegfx::fTools::equal(mfW, fOne);
- }
-
- /** Remove homogenous part of this Point
-
- This method does necessary calculations to remove
- the evtl. homogenous part of this Point. This may
- change all members.
- */
- void implHomogenize();
-
- /** Test and on demand remove homogenous part
-
- This method tests if this Point does have a homogenous part
- and then evtl. takes actions to remove that part.
-
- @attention Even when this method is const it may change all
- members of this instance. This is due to the fact that changing
- the homogenous part of a homogenous point does from a mathematical
- point of view not change the point at all.
- */
- void implTestAndHomogenize() const
- {
- if(!implIsHomogenized())
- ((B3DHomPoint*)this)->implHomogenize();
- }
-
- public:
- /** Create a homogen point
-
- The point is initialized to (0.0, 0.0, 0.0)
- */
- B3DHomPoint()
- : maTuple(),
- mfW(1.0)
- {}
-
- /** Create a homogen point
-
- @param fX
- This parameter is used to initialize the X-coordinate
- of the Point. The homogenous part is initialized to 1.0.
-
- @param fY
- This parameter is used to initialize the Y-coordinate
- of the Point. The homogenous part is initialized to 1.0.
-
- @param fZ
- This parameter is used to initialize the Z-coordinate
- of the Point. The homogenous part is initialized to 1.0.
- */
- B3DHomPoint(double fX, double fY, double fZ)
- : maTuple(fX, fY, fZ),
- mfW(1.0)
- {}
-
- /** Create a copy of a 3D Point
-
- @param rVec
- The 3D point which will be copied. The homogenous part
- is initialized to 1.0.
- */
- B3DHomPoint(const B3DPoint& rVec)
- : maTuple(rVec),
- mfW(1.0)
- {}
-
- /** Create a copy of a homogen point
-
- @param rVec
- The homogen point which will be copied. The homogenous part
- is copied, too.
- */
- B3DHomPoint(const B3DHomPoint& rVec)
- : maTuple(rVec.maTuple.getX(), rVec.maTuple.getY(), rVec.maTuple.getZ()),
- mfW(rVec.mfW)
- {}
-
- ~B3DHomPoint()
- {}
-
- /** get a 3D point from this homogenous point
-
- This method normalizes this homogen point if necessary and
- returns the corresponding 3D point for this homogen point.
-
- @attention Even when this method is const it may change all
- members of this instance.
- */
- B3DPoint getB3DPoint() const
- {
- implTestAndHomogenize();
- return B3DPoint(maTuple.getX(), maTuple.getY(), maTuple.getZ());
- }
-
- /** get X-coordinate
-
- This method normalizes this homogen point if necessary and
- returns the corresponding X-coordinate for this homogen point.
-
- @attention Even when this method is const it may change all
- members of this instance.
- */
- double getX() const
- {
- implTestAndHomogenize();
- return maTuple.getX();
- }
-
- /** get Y-coordinate
-
- This method normalizes this homogen point if necessary and
- returns the corresponding Y-coordinate for this homogen point.
-
- @attention Even when this method is const it may change all
- members of this instance.
- */
- double getY() const
- {
- implTestAndHomogenize();
- return maTuple.getY();
- }
-
- /** get Z-coordinate
-
- This method normalizes this homogen point if necessary and
- returns the corresponding Z-coordinate for this homogen point.
-
- @attention Even when this method is const it may change all
- members of this instance.
- */
- double getZ() const
- {
- implTestAndHomogenize();
- return maTuple.getY();
- }
-
- /** Set X-coordinate of the homogen point.
-
- This method sets the X-coordinate of the homogen point. If
- the point does have a homogenous part this is taken into account.
-
- @param fX
- The to-be-set X-coordinate without homogenous part.
- */
- void setX(double fX)
- {
- maTuple.setX(implIsHomogenized() ? fX : fX * mfW );
- }
-
- /** Set Y-coordinate of the homogen point.
-
- This method sets the Y-coordinate of the homogen point. If
- the point does have a homogenous part this is taken into account.
-
- @param fY
- The to-be-set Y-coordinate without homogenous part.
- */
- void setY(double fY)
- {
- maTuple.setY(implIsHomogenized() ? fY : fY * mfW );
- }
-
- /** Set Z-coordinate of the homogen point.
-
- This method sets the Z-coordinate of the homogen point. If
- the point does have a homogenous part this is taken into account.
-
- @param fZ
- The to-be-set Z-coordinate without homogenous part.
- */
- void setZ(double fZ)
- {
- maTuple.setZ(implIsHomogenized() ? fZ : fZ * mfW );
- }
-
- // operators
- //////////////////////////////////////////////////////////////////////
-
- B3DHomPoint& operator+=( const B3DHomPoint& rPnt )
- {
- maTuple.setX(getX() * rPnt.mfW + rPnt.getX() * mfW);
- maTuple.setY(getY() * rPnt.mfW + rPnt.getY() * mfW);
- maTuple.setZ(getZ() * rPnt.mfW + rPnt.getZ() * mfW);
- mfW = mfW * rPnt.mfW;
-
- return *this;
- }
-
- B3DHomPoint& operator-=( const B3DHomPoint& rPnt )
- {
- maTuple.setX(getX() * rPnt.mfW - rPnt.getX() * mfW);
- maTuple.setY(getY() * rPnt.mfW - rPnt.getY() * mfW);
- maTuple.setZ(getZ() * rPnt.mfW - rPnt.getZ() * mfW);
- mfW = mfW * rPnt.mfW;
-
- return *this;
- }
-
- B3DHomPoint& operator*=(double t)
- {
- if(!::basegfx::fTools::equalZero(t))
- {
- mfW /= t;
- }
-
- return *this;
- }
-
- B3DHomPoint& operator/=(double t)
- {
- mfW *= t;
- return *this;
- }
-
- B3DHomPoint& operator-(void)
- {
- mfW = -mfW;
- return *this;
- }
-
- bool operator==( const B3DHomPoint& rPnt ) const
- {
- implTestAndHomogenize();
- return (maTuple == rPnt.maTuple);
- }
-
- bool operator!=( const B3DHomPoint& rPnt ) const
- {
- implTestAndHomogenize();
- return (maTuple != rPnt.maTuple);
- }
-
- B3DHomPoint& operator=( const B3DHomPoint& rPnt )
- {
- maTuple = rPnt.maTuple;
- mfW = rPnt.mfW;
- return *this;
- }
- };
-
- // external operators
- //////////////////////////////////////////////////////////////////////////
-
- inline B3DHomPoint minimum(const B3DHomPoint& rVecA, const B3DHomPoint& rVecB)
- {
- B3DHomPoint aMin(
- (rVecB.getX() < rVecA.getX()) ? rVecB.getX() : rVecA.getX(),
- (rVecB.getY() < rVecA.getY()) ? rVecB.getY() : rVecA.getY(),
- (rVecB.getZ() < rVecA.getZ()) ? rVecB.getZ() : rVecA.getZ());
- return aMin;
- }
-
- inline B3DHomPoint maximum(const B3DHomPoint& rVecA, const B3DHomPoint& rVecB)
- {
- B3DHomPoint aMax(
- (rVecB.getX() > rVecA.getX()) ? rVecB.getX() : rVecA.getX(),
- (rVecB.getY() > rVecA.getY()) ? rVecB.getY() : rVecA.getY(),
- (rVecB.getZ() > rVecA.getZ()) ? rVecB.getZ() : rVecA.getZ());
- return aMax;
- }
-
- inline B3DHomPoint absolute(const B3DHomPoint& rVec)
- {
- B3DHomPoint aAbs(
- (0.0 > rVec.getX()) ? -rVec.getX() : rVec.getX(),
- (0.0 > rVec.getY()) ? -rVec.getY() : rVec.getY(),
- (0.0 > rVec.getZ()) ? -rVec.getZ() : rVec.getZ());
- return aAbs;
- }
-
- inline B3DHomPoint interpolate(B3DHomPoint& rOld1, B3DHomPoint& rOld2, double t)
- {
- B3DHomPoint aInt(
- ((rOld2.getX() - rOld1.getX()) * t) + rOld1.getX(),
- ((rOld2.getY() - rOld1.getY()) * t) + rOld1.getY(),
- ((rOld2.getZ() - rOld1.getZ()) * t) + rOld1.getZ());
- return aInt;
- }
-
- inline B3DHomPoint average(B3DHomPoint& rOld1, B3DHomPoint& rOld2)
- {
- B3DHomPoint aAvg(
- (rOld1.getX() + rOld2.getX()) * 0.5,
- (rOld1.getY() + rOld2.getY()) * 0.5,
- (rOld1.getZ() + rOld2.getZ()) * 0.5);
- return aAvg;
- }
-
- inline B3DHomPoint average(B3DHomPoint& rOld1, B3DHomPoint& rOld2, B3DHomPoint& rOld3)
- {
- B3DHomPoint aAvg(
- (rOld1.getX() + rOld2.getX() + rOld3.getX()) * (1.0 / 3.0),
- (rOld1.getY() + rOld2.getY() + rOld3.getY()) * (1.0 / 3.0),
- (rOld1.getZ() + rOld2.getZ() + rOld3.getZ()) * (1.0 / 3.0));
- return aAvg;
- }
-
- inline B3DHomPoint operator+(const B3DHomPoint& rVecA, const B3DHomPoint& rVecB)
- {
- B3DHomPoint aSum(rVecA);
- aSum += rVecB;
- return aSum;
- }
-
- inline B3DHomPoint operator-(const B3DHomPoint& rVecA, const B3DHomPoint& rVecB)
- {
- B3DHomPoint aSub(rVecA);
- aSub -= rVecB;
- return aSub;
- }
-
- inline B3DHomPoint operator*(const B3DHomPoint& rVec, double t)
- {
- B3DHomPoint aNew(rVec);
- aNew *= t;
- return aNew;
- }
-
- inline B3DHomPoint operator*(double t, const B3DHomPoint& rVec)
- {
- B3DHomPoint aNew(rVec);
- aNew *= t;
- return aNew;
- }
-
- inline B3DHomPoint operator/(const B3DHomPoint& rVec, double t)
- {
- B3DHomPoint aNew(rVec);
- aNew /= t;
- return aNew;
- }
-
- inline B3DHomPoint operator/(double t, const B3DHomPoint& rVec)
- {
- B3DHomPoint aNew(rVec);
- aNew /= t;
- return aNew;
- }
-} // end of namespace basegfx
-
-#endif /* _BGFX_POINT_B3DHOMPOINT_HXX */
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/basegfx/inc/basegfx/tools/unotools.hxx b/basegfx/inc/basegfx/tools/unotools.hxx
new file mode 100644
index 000000000000..e7bcc27fb561
--- /dev/null
+++ b/basegfx/inc/basegfx/tools/unotools.hxx
@@ -0,0 +1,55 @@
+/*
+ * Version: MPL 1.1 / GPLv3+ / LGPLv3+
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License or as specified alternatively below. You may obtain a copy of
+ * the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Initial Developer of the Original Code is
+ * Thorsten Behrens <tbehrens@novell.com>
+ * Portions created by the Initial Developer are Copyright (C) 2011 the
+ * Initial Developer. All Rights Reserved.
+ *
+ * For minor contributions see the git repository.
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 3 or later (the "GPLv3+"), or
+ * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"),
+ * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable
+ * instead of those above.
+ */
+
+#ifndef INCLUDED_BASEGFX_UNOTOOLS_HXX
+#define INCLUDED_BASEGFX_UNOTOOLS_HXX
+
+#include <cppuhelper/basemutex.hxx>
+#include <cppuhelper/compbase3.hxx>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/rendering/FillRule.hpp>
+#include <com/sun/star/rendering/XLinePolyPolygon2D.hpp>
+#include <com/sun/star/rendering/XBezierPolyPolygon2D.hpp>
+#include <basegfx/polygon/b2dpolypolygon.hxx>
+
+
+namespace basegfx
+{
+class B2DPolyPolygon;
+
+namespace unotools
+{
+
+ B2DPolyPolygon polyPolygonBezierToB2DPolyPolygon(const ::com::sun::star::drawing::PolyPolygonBezierCoords& rSourcePolyPolygon)
+ throw( ::com::sun::star::lang::IllegalArgumentException );
+
+ void b2DPolyPolygonToPolyPolygonBezier( const B2DPolyPolygon& rPolyPoly,
+ ::com::sun::star::drawing::PolyPolygonBezierCoords& rRetval );
+}
+}
+
+#endif /* INCLUDED_BASEGFX_UNOTOOLS_HXX */
diff --git a/basegfx/prj/build.lst b/basegfx/prj/build.lst
index ed12d718c12d..ab5cf9bda8e4 100644
--- a/basegfx/prj/build.lst
+++ b/basegfx/prj/build.lst
@@ -1,3 +1,3 @@
-fx basegfx : o3tl sal offuh cppuhelper cppu CPPUNIT:cppunit NULL
+fx basegfx : o3tl sal offapi comphelper cppuhelper cppu CPPUNIT:cppunit NULL
fx basegfx\prj nmake - all fx_prj NULL
diff --git a/basegfx/prj/d.lst b/basegfx/prj/d.lst
index e69de29bb2d1..997a23399ff6 100644
--- a/basegfx/prj/d.lst
+++ b/basegfx/prj/d.lst
@@ -0,0 +1 @@
+..\inc\basegfx\tools\unotools.hxx %_DEST%\inc\basegfx\tools\unotools.hxx
diff --git a/basegfx/source/matrix/b3dhommatrix.cxx b/basegfx/source/matrix/b3dhommatrix.cxx
index e665b47d58a6..80a5024893b4 100644
--- a/basegfx/source/matrix/b3dhommatrix.cxx
+++ b/basegfx/source/matrix/b3dhommatrix.cxx
@@ -63,11 +63,6 @@ namespace basegfx
return *this;
}
- void B3DHomMatrix::makeUnique()
- {
- mpImpl.make_unique();
- }
-
double B3DHomMatrix::get(sal_uInt16 nRow, sal_uInt16 nColumn) const
{
return mpImpl->get(nRow, nColumn);
@@ -96,11 +91,6 @@ namespace basegfx
mpImpl = IdentityMatrix::get();
}
- bool B3DHomMatrix::isInvertible() const
- {
- return mpImpl->isInvertible();
- }
-
bool B3DHomMatrix::invert()
{
Impl3DHomMatrix aWork(*mpImpl);
@@ -119,27 +109,11 @@ namespace basegfx
return false;
}
- bool B3DHomMatrix::isNormalized() const
- {
- return mpImpl->isNormalized();
- }
-
- void B3DHomMatrix::normalize()
- {
- if(!const_cast<const B3DHomMatrix*>(this)->mpImpl->isNormalized())
- mpImpl->doNormalize();
- }
-
double B3DHomMatrix::determinant() const
{
return mpImpl->doDeterminant();
}
- double B3DHomMatrix::trace() const
- {
- return mpImpl->doTrace();
- }
-
void B3DHomMatrix::transpose()
{
mpImpl->doTranspose();
@@ -290,34 +264,6 @@ namespace basegfx
}
}
- void B3DHomMatrix::shearYZ(double fSy, double fSz)
- {
- // #i76239# do not test againt 1.0, but against 0.0. We are talking about a value not on the diagonal (!)
- if(!fTools::equalZero(fSy) || !fTools::equalZero(fSz))
- {
- Impl3DHomMatrix aShearYZMat;
-
- aShearYZMat.set(1, 0, fSy);
- aShearYZMat.set(2, 0, fSz);
-
- mpImpl->doMulMatrix(aShearYZMat);
- }
- }
-
- void B3DHomMatrix::shearXZ(double fSx, double fSz)
- {
- // #i76239# do not test againt 1.0, but against 0.0. We are talking about a value not on the diagonal (!)
- if(!fTools::equalZero(fSx) || !fTools::equalZero(fSz))
- {
- Impl3DHomMatrix aShearXZMat;
-
- aShearXZMat.set(0, 1, fSx);
- aShearXZMat.set(2, 1, fSz);
-
- mpImpl->doMulMatrix(aShearXZMat);
- }
- }
-
void B3DHomMatrix::frustum(double fLeft, double fRight, double fBottom, double fTop, double fNear, double fFar)
{
const double fZero(0.0);
diff --git a/basegfx/source/point/b3dhompoint.cxx b/basegfx/source/point/b3dhompoint.cxx
deleted file mode 100644
index 3a6c33a50262..000000000000
--- a/basegfx/source/point/b3dhompoint.cxx
+++ /dev/null
@@ -1,47 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_basegfx.hxx"
-#include <basegfx/point/b3dhompoint.hxx>
-
-namespace basegfx
-{
- void B3DHomPoint::implHomogenize()
- {
- const double fFactor(1.0 / mfW);
- maTuple.setX(maTuple.getX() * fFactor);
- maTuple.setY(maTuple.getY() * fFactor);
- maTuple.setZ(maTuple.getZ() * fFactor);
- mfW = 1.0;
- }
-} // end of namespace basegfx
-
-// eof
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/basegfx/source/polygon/b2dpolypolygon.cxx b/basegfx/source/polygon/b2dpolypolygon.cxx
index 4c8ab7b44a45..b55af03e9575 100644
--- a/basegfx/source/polygon/b2dpolypolygon.cxx
+++ b/basegfx/source/polygon/b2dpolypolygon.cxx
@@ -93,21 +93,10 @@ public:
void insert(sal_uInt32 nIndex, const basegfx::B2DPolyPolygon& rPolyPolygon)
{
- const sal_uInt32 nCount = rPolyPolygon.count();
-
- if(nCount)
- {
- // add nCount polygons from rPolyPolygon
- maPolygons.reserve(maPolygons.size() + nCount);
- PolygonVector::iterator aIndex(maPolygons.begin());
- aIndex += nIndex;
-
- for(sal_uInt32 a(0L); a < nCount; a++)
- {
- aIndex = maPolygons.insert(aIndex, rPolyPolygon.getB2DPolygon(a));
- ++aIndex;
- }
- }
+ // add all polygons from rPolyPolygon
+ PolygonVector::iterator aIndex(maPolygons.begin());
+ aIndex += nIndex;
+ maPolygons.insert(aIndex, rPolyPolygon.begin(), rPolyPolygon.end());
}
void remove(sal_uInt32 nIndex, sal_uInt32 nCount)
diff --git a/basegfx/source/polygon/b2dsvgpolypolygon.cxx b/basegfx/source/polygon/b2dsvgpolypolygon.cxx
index 50a04dbaa075..074cfd9e25d5 100644
--- a/basegfx/source/polygon/b2dsvgpolypolygon.cxx
+++ b/basegfx/source/polygon/b2dsvgpolypolygon.cxx
@@ -787,10 +787,7 @@ namespace basegfx
// (since
// createPolygonFromEllipseSegment()
// normalizes to e.g. cw arc)
- const bool bLessThanPi(fmod(fTheta2+2*M_PI-fTheta1,
- 2*M_PI)<M_PI);
- const bool bFlipSegment( (bLargeArcFlag!=0) == bLessThanPi );
- if( bFlipSegment )
+ if( !bSweepFlag )
std::swap(fTheta1,fTheta2);
// finally, create bezier polygon from this
@@ -812,7 +809,7 @@ namespace basegfx
// always creates arcs that are
// positively oriented - flip polygon
// if we swapped angles above
- if( bFlipSegment )
+ if( !bSweepFlag )
aSegment.flip();
aCurrPoly.append(aSegment);
}
diff --git a/basegfx/source/tools/unotools.cxx b/basegfx/source/tools/unotools.cxx
new file mode 100644
index 000000000000..710568b8d737
--- /dev/null
+++ b/basegfx/source/tools/unotools.cxx
@@ -0,0 +1,264 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * Portions Copright 2011 Thorsten Behrens <tbehrens@novell.com>
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_basegfx.hxx"
+
+#include <com/sun/star/drawing/PolyPolygonBezierCoords.hpp>
+#include <com/sun/star/drawing/PointSequence.hpp>
+#include <com/sun/star/drawing/FlagSequence.hpp>
+#include <basegfx/polygon/b2dpolypolygontools.hxx>
+#include <basegfx/polygon/b2dpolygontools.hxx>
+#include <basegfx/polygon/b2dpolygon.hxx>
+#include <basegfx/curve/b2dcubicbezier.hxx>
+
+#include <basegfx/tools/unotools.hxx>
+#include <comphelper/sequence.hxx>
+
+
+using namespace ::com::sun::star;
+
+namespace basegfx
+{
+namespace unotools
+{
+
+ B2DPolyPolygon polyPolygonBezierToB2DPolyPolygon(const drawing::PolyPolygonBezierCoords& rSourcePolyPolygon)
+ throw( lang::IllegalArgumentException )
+ {
+ const sal_Int32 nOuterSequenceCount(rSourcePolyPolygon.Coordinates.getLength());
+ B2DPolyPolygon aNewPolyPolygon;
+
+ if(rSourcePolyPolygon.Flags.getLength() != nOuterSequenceCount)
+ throw lang::IllegalArgumentException();
+
+ // get pointers to inner sequence
+ const drawing::PointSequence* pInnerSequence = rSourcePolyPolygon.Coordinates.getConstArray();
+ const drawing::FlagSequence* pInnerSequenceFlags = rSourcePolyPolygon.Flags.getConstArray();
+
+ for(sal_Int32 a(0); a < nOuterSequenceCount; a++)
+ {
+ const sal_Int32 nInnerSequenceCount(pInnerSequence->getLength());
+
+ if(pInnerSequenceFlags->getLength() != nInnerSequenceCount)
+ throw lang::IllegalArgumentException();
+
+ // prepare new polygon
+ basegfx::B2DPolygon aNewPolygon;
+ const awt::Point* pArray = pInnerSequence->getConstArray();
+ const drawing::PolygonFlags* pArrayFlags = pInnerSequenceFlags->getConstArray();
+
+ // get first point and flag
+ basegfx::B2DPoint aNewCoordinatePair(pArray->X, pArray->Y); pArray++;
+ drawing::PolygonFlags ePolyFlag(*pArrayFlags); pArrayFlags++;
+ basegfx::B2DPoint aControlA;
+ basegfx::B2DPoint aControlB;
+
+ // first point is not allowed to be a control point
+ if(drawing::PolygonFlags_CONTROL == ePolyFlag)
+ throw lang::IllegalArgumentException();
+
+ // add first point as start point
+ aNewPolygon.append(aNewCoordinatePair);
+ for(sal_Int32 b(1); b < nInnerSequenceCount;)
+ {
+ // prepare loop
+ bool bControlA(false);
+ bool bControlB(false);
+
+ // get next point and flag
+ aNewCoordinatePair = basegfx::B2DPoint(pArray->X, pArray->Y);
+ ePolyFlag = *pArrayFlags;
+ pArray++; pArrayFlags++; b++;
+
+ if(b < nInnerSequenceCount && drawing::PolygonFlags_CONTROL == ePolyFlag)
+ {
+ aControlA = aNewCoordinatePair;
+ bControlA = true;
+
+ // get next point and flag
+ aNewCoordinatePair = basegfx::B2DPoint(pArray->X, pArray->Y);
+ ePolyFlag = *pArrayFlags;
+ pArray++; pArrayFlags++; b++;
+ }
+
+ if(b < nInnerSequenceCount && drawing::PolygonFlags_CONTROL == ePolyFlag)
+ {
+ aControlB = aNewCoordinatePair;
+ bControlB = true;
+
+ // get next point and flag
+ aNewCoordinatePair = basegfx::B2DPoint(pArray->X, pArray->Y);
+ ePolyFlag = *pArrayFlags;
+ pArray++; pArrayFlags++; 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
+ if(drawing::PolygonFlags_CONTROL == ePolyFlag || bControlA != bControlB)
+ throw lang::IllegalArgumentException();
+
+ // 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(aNewPolygon.getB2DPoint(aNewPolygon.count() - 1)))
+ {
+ bControlA = bControlB = false;
+ }
+
+ if(bControlA)
+ {
+ // add bezier edge
+ aNewPolygon.appendBezierSegment(aControlA, aControlB, aNewCoordinatePair);
+ }
+ else
+ {
+ // add edge
+ aNewPolygon.append(aNewCoordinatePair);
+ }
+ }
+
+ // next sequence
+ pInnerSequence++;
+ pInnerSequenceFlags++;
+
+ // #i72807# API import uses old line start/end-equal definition for closed,
+ // so we need to correct this to closed state here
+ basegfx::tools::checkClosed(aNewPolygon);
+
+ // add new subpolygon
+ aNewPolyPolygon.append(aNewPolygon);
+ }
+
+ return aNewPolyPolygon;
+ }
+
+ /////////////////////////////////////////////////////////////////////////////////
+
+ void b2DPolyPolygonToPolyPolygonBezier( const basegfx::B2DPolyPolygon& rPolyPoly,
+ drawing::PolyPolygonBezierCoords& rRetval )
+ {
+ rRetval.Coordinates.realloc(rPolyPoly.count());
+ rRetval.Flags.realloc(rPolyPoly.count());
+
+ drawing::PointSequence* pOuterSequence = rRetval.Coordinates.getArray();
+ drawing::FlagSequence* pOuterFlags = rRetval.Flags.getArray();
+
+ for(sal_uInt32 a=0;a<rPolyPoly.count();a++)
+ {
+ const B2DPolygon& rPoly = rPolyPoly.getB2DPolygon(a);
+ sal_uInt32 nCount(rPoly.count());
+ const bool bClosed(rPoly.isClosed());
+
+ // calculate input vertex count
+ const sal_uInt32 nLoopCount(bClosed ? nCount : (nCount ? nCount - 1L : 0L ));
+
+ std::vector<awt::Point> aPoints; aPoints.reserve(nLoopCount);
+ std::vector<drawing::PolygonFlags> aFlags; aFlags.reserve(nLoopCount);
+
+ // prepare insert index and current point
+ basegfx::B2DCubicBezier aBezier;
+ aBezier.setStartPoint(rPoly.getB2DPoint(0));
+
+ for(sal_uInt32 b(0L); b<nLoopCount; b++)
+ {
+ // add current point (always) and remember StartPointIndex for evtl. later corrections
+ const awt::Point aStartPoint(fround(aBezier.getStartPoint().getX()),
+ fround(aBezier.getStartPoint().getY()));
+ const sal_uInt32 nStartPointIndex(aPoints.size());
+ aPoints.push_back(aStartPoint);
+ aFlags.push_back(drawing::PolygonFlags_NORMAL);
+
+ // prepare next segment
+ const sal_uInt32 nNextIndex((b + 1) % nCount);
+ aBezier.setEndPoint(rPoly.getB2DPoint(nNextIndex));
+ aBezier.setControlPointA(rPoly.getNextControlPoint(b));
+ aBezier.setControlPointB(rPoly.getPrevControlPoint(nNextIndex));
+
+ if(aBezier.isBezier())
+ {
+ // if one is used, add always two control points due to the old schema
+ aPoints.push_back( awt::Point(fround(aBezier.getControlPointA().getX()),
+ fround(aBezier.getControlPointA().getY())) );
+ aFlags.push_back(drawing::PolygonFlags_CONTROL);
+
+ aPoints.push_back( awt::Point(fround(aBezier.getControlPointB().getX()),
+ fround(aBezier.getControlPointB().getY())) );
+ aFlags.push_back(drawing::PolygonFlags_CONTROL);
+ }
+
+ // test continuity with previous control point to set flag value
+ if(aBezier.getControlPointA() != aBezier.getStartPoint() && (bClosed || b))
+ {
+ const basegfx::B2VectorContinuity eCont(rPoly.getContinuityInPoint(b));
+
+ if(basegfx::CONTINUITY_C1 == eCont)
+ {
+ aFlags[nStartPointIndex] = drawing::PolygonFlags_SMOOTH;
+ }
+ else if(basegfx::CONTINUITY_C2 == eCont)
+ {
+ aFlags[nStartPointIndex] = drawing::PolygonFlags_SYMMETRIC;
+ }
+ }
+
+ // prepare next polygon step
+ aBezier.setStartPoint(aBezier.getEndPoint());
+ }
+
+ if(bClosed)
+ {
+ // add first point again as closing point due to old definition
+ aPoints.push_back( aPoints[0] );
+ aFlags.push_back(drawing::PolygonFlags_NORMAL);
+ }
+ else
+ {
+ // add last point as closing point
+ const basegfx::B2DPoint aClosingPoint(rPoly.getB2DPoint(nCount - 1L));
+ const awt::Point aEnd(fround(aClosingPoint.getX()),
+ fround(aClosingPoint.getY()));
+ aPoints.push_back(aEnd);
+ aFlags.push_back(drawing::PolygonFlags_NORMAL);
+ }
+
+ *pOuterSequence++ = comphelper::containerToSequence(aPoints);
+ *pOuterFlags++ = comphelper::containerToSequence(aFlags);
+ }
+ }
+
+}
+}
diff --git a/basegfx/test/basegfx3d.cxx b/basegfx/test/basegfx3d.cxx
index 5ac16fafc6a4..691b51a5f981 100644
--- a/basegfx/test/basegfx3d.cxx
+++ b/basegfx/test/basegfx3d.cxx
@@ -67,33 +67,6 @@ public:
}; // class b3dhommatrix
-class b3dhompoint : public CppUnit::TestFixture
-{
-public:
- // initialise your test code values here.
- void setUp()
- {
- }
-
- void tearDown()
- {
- }
-
- // insert your test code here.
- void EmptyMethod()
- {
- }
-
- // Change the following lines only, if you add, remove or rename
- // member functions of the current class,
- // because these macros are need by auto register mechanism.
-
- CPPUNIT_TEST_SUITE(b3dhompoint);
- CPPUNIT_TEST(EmptyMethod);
- CPPUNIT_TEST_SUITE_END();
-}; // class b3dhompoint
-
-
class b3dpoint : public CppUnit::TestFixture
{
public:
@@ -207,7 +180,6 @@ public:
// -----------------------------------------------------------------------------
CPPUNIT_TEST_SUITE_REGISTRATION(basegfx3d::b3dhommatrix);
-CPPUNIT_TEST_SUITE_REGISTRATION(basegfx3d::b3dhompoint);
CPPUNIT_TEST_SUITE_REGISTRATION(basegfx3d::b3dpoint);
CPPUNIT_TEST_SUITE_REGISTRATION(basegfx3d::b3drange);
CPPUNIT_TEST_SUITE_REGISTRATION(basegfx3d::b3dtuple);