diff options
author | Bjoern Michaelsen <bjoern.michaelsen@canonical.com> | 2011-07-21 18:56:16 +0200 |
---|---|---|
committer | Bjoern Michaelsen <bjoern.michaelsen@canonical.com> | 2011-07-21 18:56:16 +0200 |
commit | a233dac0653f3f3054f7ad2da114ed989747e89a (patch) | |
tree | bf1e11438321c06125a94308649c496648061ccb /basegfx | |
parent | acb6133d89abe071108577f821d7eaa381378879 (diff) | |
parent | e5647de7dd26775e45af24f11ac4f82a5518bd9e (diff) |
resyncing to master
Diffstat (limited to 'basegfx')
-rw-r--r-- | basegfx/inc/basegfx/matrix/b3dhommatrix.hxx | 13 | ||||
-rw-r--r-- | basegfx/inc/basegfx/point/b3dhompoint.hxx | 409 | ||||
-rw-r--r-- | basegfx/inc/basegfx/tools/unotools.hxx | 55 | ||||
-rw-r--r-- | basegfx/prj/build.lst | 2 | ||||
-rw-r--r-- | basegfx/prj/d.lst | 1 | ||||
-rw-r--r-- | basegfx/source/matrix/b3dhommatrix.cxx | 54 | ||||
-rw-r--r-- | basegfx/source/point/b3dhompoint.cxx | 47 | ||||
-rw-r--r-- | basegfx/source/polygon/b2dpolypolygon.cxx | 19 | ||||
-rw-r--r-- | basegfx/source/polygon/b2dsvgpolypolygon.cxx | 7 | ||||
-rw-r--r-- | basegfx/source/tools/unotools.cxx | 264 | ||||
-rw-r--r-- | basegfx/test/basegfx3d.cxx | 28 |
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); |