summaryrefslogtreecommitdiff
path: root/basegfx/source/matrix
diff options
context:
space:
mode:
Diffstat (limited to 'basegfx/source/matrix')
-rw-r--r--basegfx/source/matrix/b2dhommatrix.cxx457
-rw-r--r--basegfx/source/matrix/b2dhommatrixtools.cxx404
-rw-r--r--basegfx/source/matrix/b3dhommatrix.cxx540
3 files changed, 0 insertions, 1401 deletions
diff --git a/basegfx/source/matrix/b2dhommatrix.cxx b/basegfx/source/matrix/b2dhommatrix.cxx
deleted file mode 100644
index ca21f627c5..0000000000
--- a/basegfx/source/matrix/b2dhommatrix.cxx
+++ /dev/null
@@ -1,457 +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 <osl/diagnose.h>
-#include <rtl/instance.hxx>
-#include <basegfx/matrix/b2dhommatrix.hxx>
-#include <hommatrixtemplate.hxx>
-#include <basegfx/tuple/b2dtuple.hxx>
-#include <basegfx/vector/b2dvector.hxx>
-#include <basegfx/matrix/b2dhommatrixtools.hxx>
-
-///////////////////////////////////////////////////////////////////////////////
-
-namespace basegfx
-{
- class Impl2DHomMatrix : public ::basegfx::internal::ImplHomMatrixTemplate< 3 >
- {
- };
-
- namespace { struct IdentityMatrix : public rtl::Static< B2DHomMatrix::ImplType,
- IdentityMatrix > {}; }
-
- B2DHomMatrix::B2DHomMatrix() :
- mpImpl( IdentityMatrix::get() ) // use common identity matrix
- {
- }
-
- B2DHomMatrix::B2DHomMatrix(const B2DHomMatrix& rMat) :
- mpImpl(rMat.mpImpl)
- {
- }
-
- B2DHomMatrix::~B2DHomMatrix()
- {
- }
-
- B2DHomMatrix::B2DHomMatrix(double f_0x0, double f_0x1, double f_0x2, double f_1x0, double f_1x1, double f_1x2)
- : mpImpl( IdentityMatrix::get() ) // use common identity matrix, will be made unique with 1st set-call
- {
- mpImpl->set(0, 0, f_0x0);
- mpImpl->set(0, 1, f_0x1);
- mpImpl->set(0, 2, f_0x2);
- mpImpl->set(1, 0, f_1x0);
- mpImpl->set(1, 1, f_1x1);
- mpImpl->set(1, 2, f_1x2);
- }
-
- B2DHomMatrix& B2DHomMatrix::operator=(const B2DHomMatrix& rMat)
- {
- mpImpl = rMat.mpImpl;
- return *this;
- }
-
- void B2DHomMatrix::makeUnique()
- {
- mpImpl.make_unique();
- }
-
- double B2DHomMatrix::get(sal_uInt16 nRow, sal_uInt16 nColumn) const
- {
- return mpImpl->get(nRow, nColumn);
- }
-
- void B2DHomMatrix::set(sal_uInt16 nRow, sal_uInt16 nColumn, double fValue)
- {
- mpImpl->set(nRow, nColumn, fValue);
- }
-
- void B2DHomMatrix::set3x2(double f_0x0, double f_0x1, double f_0x2, double f_1x0, double f_1x1, double f_1x2)
- {
- mpImpl->set(0, 0, f_0x0);
- mpImpl->set(0, 1, f_0x1);
- mpImpl->set(0, 2, f_0x2);
- mpImpl->set(1, 0, f_1x0);
- mpImpl->set(1, 1, f_1x1);
- mpImpl->set(1, 2, f_1x2);
- }
-
- bool B2DHomMatrix::isLastLineDefault() const
- {
- return mpImpl->isLastLineDefault();
- }
-
- bool B2DHomMatrix::isIdentity() const
- {
- if(mpImpl.same_object(IdentityMatrix::get()))
- return true;
-
- return mpImpl->isIdentity();
- }
-
- void B2DHomMatrix::identity()
- {
- mpImpl = IdentityMatrix::get();
- }
-
- bool B2DHomMatrix::isInvertible() const
- {
- return mpImpl->isInvertible();
- }
-
- bool B2DHomMatrix::invert()
- {
- Impl2DHomMatrix aWork(*mpImpl);
- sal_uInt16* pIndex = new sal_uInt16[mpImpl->getEdgeLength()];
- sal_Int16 nParity;
-
- if(aWork.ludcmp(pIndex, nParity))
- {
- mpImpl->doInvert(aWork, pIndex);
- delete[] pIndex;
-
- return true;
- }
-
- delete[] pIndex;
- return false;
- }
-
- bool B2DHomMatrix::isNormalized() const
- {
- return mpImpl->isNormalized();
- }
-
- void B2DHomMatrix::normalize()
- {
- if(!const_cast<const B2DHomMatrix*>(this)->mpImpl->isNormalized())
- mpImpl->doNormalize();
- }
-
- double B2DHomMatrix::determinant() const
- {
- return mpImpl->doDeterminant();
- }
-
- double B2DHomMatrix::trace() const
- {
- return mpImpl->doTrace();
- }
-
- void B2DHomMatrix::transpose()
- {
- mpImpl->doTranspose();
- }
-
- B2DHomMatrix& B2DHomMatrix::operator+=(const B2DHomMatrix& rMat)
- {
- mpImpl->doAddMatrix(*rMat.mpImpl);
- return *this;
- }
-
- B2DHomMatrix& B2DHomMatrix::operator-=(const B2DHomMatrix& rMat)
- {
- mpImpl->doSubMatrix(*rMat.mpImpl);
- return *this;
- }
-
- B2DHomMatrix& B2DHomMatrix::operator*=(double fValue)
- {
- const double fOne(1.0);
-
- if(!fTools::equal(fOne, fValue))
- mpImpl->doMulMatrix(fValue);
-
- return *this;
- }
-
- B2DHomMatrix& B2DHomMatrix::operator/=(double fValue)
- {
- const double fOne(1.0);
-
- if(!fTools::equal(fOne, fValue))
- mpImpl->doMulMatrix(1.0 / fValue);
-
- return *this;
- }
-
- B2DHomMatrix& B2DHomMatrix::operator*=(const B2DHomMatrix& rMat)
- {
- if(!rMat.isIdentity())
- mpImpl->doMulMatrix(*rMat.mpImpl);
-
- return *this;
- }
-
- bool B2DHomMatrix::operator==(const B2DHomMatrix& rMat) const
- {
- if(mpImpl.same_object(rMat.mpImpl))
- return true;
-
- return mpImpl->isEqual(*rMat.mpImpl);
- }
-
- bool B2DHomMatrix::operator!=(const B2DHomMatrix& rMat) const
- {
- return !(*this == rMat);
- }
-
- void B2DHomMatrix::rotate(double fRadiant)
- {
- if(!fTools::equalZero(fRadiant))
- {
- double fSin(0.0);
- double fCos(1.0);
-
- tools::createSinCosOrthogonal(fSin, fCos, fRadiant);
- Impl2DHomMatrix aRotMat;
-
- aRotMat.set(0, 0, fCos);
- aRotMat.set(1, 1, fCos);
- aRotMat.set(1, 0, fSin);
- aRotMat.set(0, 1, -fSin);
-
- mpImpl->doMulMatrix(aRotMat);
- }
- }
-
- void B2DHomMatrix::translate(double fX, double fY)
- {
- if(!fTools::equalZero(fX) || !fTools::equalZero(fY))
- {
- Impl2DHomMatrix aTransMat;
-
- aTransMat.set(0, 2, fX);
- aTransMat.set(1, 2, fY);
-
- mpImpl->doMulMatrix(aTransMat);
- }
- }
-
- void B2DHomMatrix::scale(double fX, double fY)
- {
- const double fOne(1.0);
-
- if(!fTools::equal(fOne, fX) || !fTools::equal(fOne, fY))
- {
- Impl2DHomMatrix aScaleMat;
-
- aScaleMat.set(0, 0, fX);
- aScaleMat.set(1, 1, fY);
-
- mpImpl->doMulMatrix(aScaleMat);
- }
- }
-
- void B2DHomMatrix::shearX(double fSx)
- {
- // #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))
- {
- Impl2DHomMatrix aShearXMat;
-
- aShearXMat.set(0, 1, fSx);
-
- mpImpl->doMulMatrix(aShearXMat);
- }
- }
-
- void B2DHomMatrix::shearY(double fSy)
- {
- // #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))
- {
- Impl2DHomMatrix aShearYMat;
-
- aShearYMat.set(1, 0, fSy);
-
- mpImpl->doMulMatrix(aShearYMat);
- }
- }
-
- /** Decomposition
-
- New, optimized version with local shearX detection. Old version (keeping
- below, is working well, too) used the 3D matrix decomposition when
- shear was used. Keeping old version as comment below since it may get
- necessary to add the determinant() test from there here, too.
- */
- bool B2DHomMatrix::decompose(B2DTuple& rScale, B2DTuple& rTranslate, double& rRotate, double& rShearX) const
- {
- // when perspective is used, decompose is not made here
- if(!mpImpl->isLastLineDefault())
- {
- return false;
- }
-
- // reset rotate and shear and copy translation values in every case
- rRotate = rShearX = 0.0;
- rTranslate.setX(get(0, 2));
- rTranslate.setY(get(1, 2));
-
- // test for rotation and shear
- if(fTools::equalZero(get(0, 1)) && fTools::equalZero(get(1, 0)))
- {
- // no rotation and shear, copy scale values
- rScale.setX(get(0, 0));
- rScale.setY(get(1, 1));
- }
- else
- {
- // get the unit vectors of the transformation -> the perpendicular vectors
- B2DVector aUnitVecX(get(0, 0), get(1, 0));
- B2DVector aUnitVecY(get(0, 1), get(1, 1));
- const double fScalarXY(aUnitVecX.scalar(aUnitVecY));
-
- // Test if shear is zero. That's the case if the unit vectors in the matrix
- // are perpendicular -> scalar is zero. This is also the case when one of
- // the unit vectors is zero.
- if(fTools::equalZero(fScalarXY))
- {
- // calculate unsigned scale values
- rScale.setX(aUnitVecX.getLength());
- rScale.setY(aUnitVecY.getLength());
-
- // check unit vectors for zero lengths
- const bool bXIsZero(fTools::equalZero(rScale.getX()));
- const bool bYIsZero(fTools::equalZero(rScale.getY()));
-
- if(bXIsZero || bYIsZero)
- {
- // still extract as much as possible. Scalings are already set
- if(!bXIsZero)
- {
- // get rotation of X-Axis
- rRotate = atan2(aUnitVecX.getY(), aUnitVecX.getX());
- }
- else if(!bYIsZero)
- {
- // get rotation of X-Axis. When assuming X and Y perpendicular
- // and correct rotation, it's the Y-Axis rotation minus 90 degrees
- rRotate = atan2(aUnitVecY.getY(), aUnitVecY.getX()) - M_PI_2;
- }
-
- // one or both unit vectors do not extist, determinant is zero, no decomposition possible.
- // Eventually used rotations or shears are lost
- return false;
- }
- else
- {
- // no shear
- // calculate rotation of X unit vector relative to (1, 0)
- rRotate = atan2(aUnitVecX.getY(), aUnitVecX.getX());
-
- // use orientation to evtl. correct sign of Y-Scale
- const double fCrossXY(aUnitVecX.cross(aUnitVecY));
-
- if(fCrossXY < 0.0)
- {
- rScale.setY(-rScale.getY());
- }
- }
- }
- else
- {
- // fScalarXY is not zero, thus both unit vectors exist. No need to handle that here
- // shear, extract it
- double fCrossXY(aUnitVecX.cross(aUnitVecY));
-
- // get rotation by calculating angle of X unit vector relative to (1, 0).
- // This is before the parallell test following the motto to extract
- // as much as possible
- rRotate = atan2(aUnitVecX.getY(), aUnitVecX.getX());
-
- // get unsigned scale value for X. It will not change and is useful
- // for further corrections
- rScale.setX(aUnitVecX.getLength());
-
- if(fTools::equalZero(fCrossXY))
- {
- // extract as much as possible
- rScale.setY(aUnitVecY.getLength());
-
- // unit vectors are parallel, thus not linear independent. No
- // useful decomposition possible. This should not happen since
- // the only way to get the unit vectors nearly parallell is
- // a very big shearing. Anyways, be prepared for hand-filled
- // matrices
- // Eventually used rotations or shears are lost
- return false;
- }
- else
- {
- // calculate the contained shear
- rShearX = fScalarXY / fCrossXY;
-
- if(!fTools::equalZero(rRotate))
- {
- // To be able to correct the shear for aUnitVecY, rotation needs to be
- // removed first. Correction of aUnitVecX is easy, it will be rotated back to (1, 0).
- aUnitVecX.setX(rScale.getX());
- aUnitVecX.setY(0.0);
-
- // for Y correction we rotate the UnitVecY back about -rRotate
- const double fNegRotate(-rRotate);
- const double fSin(sin(fNegRotate));
- const double fCos(cos(fNegRotate));
-
- const double fNewX(aUnitVecY.getX() * fCos - aUnitVecY.getY() * fSin);
- const double fNewY(aUnitVecY.getX() * fSin + aUnitVecY.getY() * fCos);
-
- aUnitVecY.setX(fNewX);
- aUnitVecY.setY(fNewY);
- }
-
- // Correct aUnitVecY and fCrossXY to fShear=0. Rotation is already removed.
- // Shear correction can only work with removed rotation
- aUnitVecY.setX(aUnitVecY.getX() - (aUnitVecY.getY() * rShearX));
- fCrossXY = aUnitVecX.cross(aUnitVecY);
-
- // calculate unsigned scale value for Y, after the corrections since
- // the shear correction WILL change the length of aUnitVecY
- rScale.setY(aUnitVecY.getLength());
-
- // use orientation to set sign of Y-Scale
- if(fCrossXY < 0.0)
- {
- rScale.setY(-rScale.getY());
- }
- }
- }
- }
-
- return true;
- }
-} // end of namespace basegfx
-
-///////////////////////////////////////////////////////////////////////////////
-// eof
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/basegfx/source/matrix/b2dhommatrixtools.cxx b/basegfx/source/matrix/b2dhommatrixtools.cxx
deleted file mode 100644
index 48517acfa1..0000000000
--- a/basegfx/source/matrix/b2dhommatrixtools.cxx
+++ /dev/null
@@ -1,404 +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/matrix/b2dhommatrixtools.hxx>
-#include <rtl/ustring.hxx>
-#include <rtl/ustrbuf.hxx>
-
-///////////////////////////////////////////////////////////////////////////////
-
-namespace basegfx
-{
- ::rtl::OUString exportToSvg( const B2DHomMatrix& rMatrix )
- {
- rtl::OUStringBuffer aStrBuf;
- aStrBuf.appendAscii("matrix(");
-
- aStrBuf.append(rMatrix.get(0,0));
- aStrBuf.appendAscii(", ");
-
- aStrBuf.append(rMatrix.get(1,0));
- aStrBuf.appendAscii(", ");
-
- aStrBuf.append(rMatrix.get(0,1));
- aStrBuf.appendAscii(", ");
-
- aStrBuf.append(rMatrix.get(1,1));
- aStrBuf.appendAscii(", ");
-
- aStrBuf.append(rMatrix.get(0,2));
- aStrBuf.appendAscii(", ");
-
- aStrBuf.append(rMatrix.get(1,2));
- aStrBuf.appendAscii(")");
-
- return aStrBuf.makeStringAndClear();
- }
-
- namespace tools
- {
- void createSinCosOrthogonal(double& o_rSin, double& o_rCos, double fRadiant)
- {
- if( fTools::equalZero( fmod( fRadiant, F_PI2 ) ) )
- {
- // determine quadrant
- const sal_Int32 nQuad(
- (4 + fround( 4/F_2PI*fmod( fRadiant, F_2PI ) )) % 4 );
- switch( nQuad )
- {
- case 0: // -2pi,0,2pi
- o_rSin = 0.0;
- o_rCos = 1.0;
- break;
-
- case 1: // -3/2pi,1/2pi
- o_rSin = 1.0;
- o_rCos = 0.0;
- break;
-
- case 2: // -pi,pi
- o_rSin = 0.0;
- o_rCos = -1.0;
- break;
-
- case 3: // -1/2pi,3/2pi
- o_rSin = -1.0;
- o_rCos = 0.0;
- break;
-
- default:
- OSL_FAIL( "createSinCos: Impossible case reached" );
- }
- }
- else
- {
- // TODO(P1): Maybe use glibc's sincos here (though
- // that's kinda non-portable...)
- o_rSin = sin(fRadiant);
- o_rCos = cos(fRadiant);
- }
- }
-
- B2DHomMatrix createScaleB2DHomMatrix(double fScaleX, double fScaleY)
- {
- B2DHomMatrix aRetval;
- const double fOne(1.0);
-
- if(!fTools::equal(fScaleX, fOne))
- {
- aRetval.set(0, 0, fScaleX);
- }
-
- if(!fTools::equal(fScaleY, fOne))
- {
- aRetval.set(1, 1, fScaleY);
- }
-
- return aRetval;
- }
-
- B2DHomMatrix createShearXB2DHomMatrix(double fShearX)
- {
- B2DHomMatrix aRetval;
-
- if(!fTools::equalZero(fShearX))
- {
- aRetval.set(0, 1, fShearX);
- }
-
- return aRetval;
- }
-
- B2DHomMatrix createShearYB2DHomMatrix(double fShearY)
- {
- B2DHomMatrix aRetval;
-
- if(!fTools::equalZero(fShearY))
- {
- aRetval.set(1, 0, fShearY);
- }
-
- return aRetval;
- }
-
- B2DHomMatrix createRotateB2DHomMatrix(double fRadiant)
- {
- B2DHomMatrix aRetval;
-
- if(!fTools::equalZero(fRadiant))
- {
- double fSin(0.0);
- double fCos(1.0);
-
- createSinCosOrthogonal(fSin, fCos, fRadiant);
- aRetval.set(0, 0, fCos);
- aRetval.set(1, 1, fCos);
- aRetval.set(1, 0, fSin);
- aRetval.set(0, 1, -fSin);
- }
-
- return aRetval;
- }
-
- B2DHomMatrix createTranslateB2DHomMatrix(double fTranslateX, double fTranslateY)
- {
- B2DHomMatrix aRetval;
-
- if(!(fTools::equalZero(fTranslateX) && fTools::equalZero(fTranslateY)))
- {
- aRetval.set(0, 2, fTranslateX);
- aRetval.set(1, 2, fTranslateY);
- }
-
- return aRetval;
- }
-
- B2DHomMatrix createScaleShearXRotateTranslateB2DHomMatrix(
- double fScaleX, double fScaleY,
- double fShearX,
- double fRadiant,
- double fTranslateX, double fTranslateY)
- {
- const double fOne(1.0);
-
- if(fTools::equal(fScaleX, fOne) && fTools::equal(fScaleY, fOne))
- {
- /// no scale, take shortcut
- return createShearXRotateTranslateB2DHomMatrix(fShearX, fRadiant, fTranslateX, fTranslateY);
- }
- else
- {
- /// scale used
- if(fTools::equalZero(fShearX))
- {
- /// no shear
- if(fTools::equalZero(fRadiant))
- {
- /// no rotate, take shortcut
- return createScaleTranslateB2DHomMatrix(fScaleX, fScaleY, fTranslateX, fTranslateY);
- }
- else
- {
- /// rotate and scale used, no shear
- double fSin(0.0);
- double fCos(1.0);
-
- createSinCosOrthogonal(fSin, fCos, fRadiant);
-
- B2DHomMatrix aRetval(
- /* Row 0, Column 0 */ fCos * fScaleX,
- /* Row 0, Column 1 */ fScaleY * -fSin,
- /* Row 0, Column 2 */ fTranslateX,
- /* Row 1, Column 0 */ fSin * fScaleX,
- /* Row 1, Column 1 */ fScaleY * fCos,
- /* Row 1, Column 2 */ fTranslateY);
-
- return aRetval;
- }
- }
- else
- {
- /// scale and shear used
- if(fTools::equalZero(fRadiant))
- {
- /// scale and shear, but no rotate
- B2DHomMatrix aRetval(
- /* Row 0, Column 0 */ fScaleX,
- /* Row 0, Column 1 */ fScaleY * fShearX,
- /* Row 0, Column 2 */ fTranslateX,
- /* Row 1, Column 0 */ 0.0,
- /* Row 1, Column 1 */ fScaleY,
- /* Row 1, Column 2 */ fTranslateY);
-
- return aRetval;
- }
- else
- {
- /// scale, shear and rotate used
- double fSin(0.0);
- double fCos(1.0);
-
- createSinCosOrthogonal(fSin, fCos, fRadiant);
-
- B2DHomMatrix aRetval(
- /* Row 0, Column 0 */ fCos * fScaleX,
- /* Row 0, Column 1 */ fScaleY * ((fCos * fShearX) - fSin),
- /* Row 0, Column 2 */ fTranslateX,
- /* Row 1, Column 0 */ fSin * fScaleX,
- /* Row 1, Column 1 */ fScaleY * ((fSin * fShearX) + fCos),
- /* Row 1, Column 2 */ fTranslateY);
-
- return aRetval;
- }
- }
- }
- }
-
- B2DHomMatrix createShearXRotateTranslateB2DHomMatrix(
- double fShearX,
- double fRadiant,
- double fTranslateX, double fTranslateY)
- {
- if(fTools::equalZero(fShearX))
- {
- /// no shear
- if(fTools::equalZero(fRadiant))
- {
- /// no shear, no rotate, take shortcut
- return createTranslateB2DHomMatrix(fTranslateX, fTranslateY);
- }
- else
- {
- /// no shear, but rotate used
- double fSin(0.0);
- double fCos(1.0);
-
- createSinCosOrthogonal(fSin, fCos, fRadiant);
-
- B2DHomMatrix aRetval(
- /* Row 0, Column 0 */ fCos,
- /* Row 0, Column 1 */ -fSin,
- /* Row 0, Column 2 */ fTranslateX,
- /* Row 1, Column 0 */ fSin,
- /* Row 1, Column 1 */ fCos,
- /* Row 1, Column 2 */ fTranslateY);
-
- return aRetval;
- }
- }
- else
- {
- /// shear used
- if(fTools::equalZero(fRadiant))
- {
- /// no rotate, but shear used
- B2DHomMatrix aRetval(
- /* Row 0, Column 0 */ 1.0,
- /* Row 0, Column 1 */ fShearX,
- /* Row 0, Column 2 */ fTranslateX,
- /* Row 1, Column 0 */ 0.0,
- /* Row 1, Column 1 */ 1.0,
- /* Row 1, Column 2 */ fTranslateY);
-
- return aRetval;
- }
- else
- {
- /// shear and rotate used
- double fSin(0.0);
- double fCos(1.0);
-
- createSinCosOrthogonal(fSin, fCos, fRadiant);
-
- B2DHomMatrix aRetval(
- /* Row 0, Column 0 */ fCos,
- /* Row 0, Column 1 */ (fCos * fShearX) - fSin,
- /* Row 0, Column 2 */ fTranslateX,
- /* Row 1, Column 0 */ fSin,
- /* Row 1, Column 1 */ (fSin * fShearX) + fCos,
- /* Row 1, Column 2 */ fTranslateY);
-
- return aRetval;
- }
- }
- }
-
- B2DHomMatrix createScaleTranslateB2DHomMatrix(
- double fScaleX, double fScaleY,
- double fTranslateX, double fTranslateY)
- {
- const double fOne(1.0);
-
- if(fTools::equal(fScaleX, fOne) && fTools::equal(fScaleY, fOne))
- {
- /// no scale, take shortcut
- return createTranslateB2DHomMatrix(fTranslateX, fTranslateY);
- }
- else
- {
- /// scale used
- if(fTools::equalZero(fTranslateX) && fTools::equalZero(fTranslateY))
- {
- /// no translate, but scale.
- B2DHomMatrix aRetval;
-
- aRetval.set(0, 0, fScaleX);
- aRetval.set(1, 1, fScaleY);
-
- return aRetval;
- }
- else
- {
- /// translate and scale
- B2DHomMatrix aRetval(
- /* Row 0, Column 0 */ fScaleX,
- /* Row 0, Column 1 */ 0.0,
- /* Row 0, Column 2 */ fTranslateX,
- /* Row 1, Column 0 */ 0.0,
- /* Row 1, Column 1 */ fScaleY,
- /* Row 1, Column 2 */ fTranslateY);
-
- return aRetval;
- }
- }
- }
-
- B2DHomMatrix createRotateAroundPoint(
- double fPointX, double fPointY,
- double fRadiant)
- {
- B2DHomMatrix aRetval;
-
- if(!fTools::equalZero(fRadiant))
- {
- double fSin(0.0);
- double fCos(1.0);
-
- createSinCosOrthogonal(fSin, fCos, fRadiant);
-
- aRetval.set3x2(
- /* Row 0, Column 0 */ fCos,
- /* Row 0, Column 1 */ -fSin,
- /* Row 0, Column 2 */ (fPointX * (1.0 - fCos)) + (fSin * fPointY),
- /* Row 1, Column 0 */ fSin,
- /* Row 1, Column 1 */ fCos,
- /* Row 1, Column 2 */ (fPointY * (1.0 - fCos)) - (fSin * fPointX));
- }
-
- return aRetval;
- }
- } // end of namespace tools
-} // end of namespace basegfx
-
-///////////////////////////////////////////////////////////////////////////////
-// eof
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/basegfx/source/matrix/b3dhommatrix.cxx b/basegfx/source/matrix/b3dhommatrix.cxx
deleted file mode 100644
index 0b88e02a74..0000000000
--- a/basegfx/source/matrix/b3dhommatrix.cxx
+++ /dev/null
@@ -1,540 +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 <rtl/instance.hxx>
-#include <basegfx/matrix/b3dhommatrix.hxx>
-#include <hommatrixtemplate.hxx>
-#include <basegfx/vector/b3dvector.hxx>
-
-namespace basegfx
-{
- class Impl3DHomMatrix : public ::basegfx::internal::ImplHomMatrixTemplate< 4 >
- {
- };
-
- namespace { struct IdentityMatrix : public rtl::Static< B3DHomMatrix::ImplType,
- IdentityMatrix > {}; }
-
- B3DHomMatrix::B3DHomMatrix() :
- mpImpl( IdentityMatrix::get() ) // use common identity matrix
- {
- }
-
- B3DHomMatrix::B3DHomMatrix(const B3DHomMatrix& rMat) :
- mpImpl(rMat.mpImpl)
- {
- }
-
- B3DHomMatrix::~B3DHomMatrix()
- {
- }
-
- B3DHomMatrix& B3DHomMatrix::operator=(const B3DHomMatrix& rMat)
- {
- mpImpl = rMat.mpImpl;
- return *this;
- }
-
- double B3DHomMatrix::get(sal_uInt16 nRow, sal_uInt16 nColumn) const
- {
- return mpImpl->get(nRow, nColumn);
- }
-
- void B3DHomMatrix::set(sal_uInt16 nRow, sal_uInt16 nColumn, double fValue)
- {
- mpImpl->set(nRow, nColumn, fValue);
- }
-
- bool B3DHomMatrix::isLastLineDefault() const
- {
- return mpImpl->isLastLineDefault();
- }
-
- bool B3DHomMatrix::isIdentity() const
- {
- if(mpImpl.same_object(IdentityMatrix::get()))
- return true;
-
- return mpImpl->isIdentity();
- }
-
- void B3DHomMatrix::identity()
- {
- mpImpl = IdentityMatrix::get();
- }
-
- bool B3DHomMatrix::invert()
- {
- Impl3DHomMatrix aWork(*mpImpl);
- sal_uInt16* pIndex = new sal_uInt16[mpImpl->getEdgeLength()];
- sal_Int16 nParity;
-
- if(aWork.ludcmp(pIndex, nParity))
- {
- mpImpl->doInvert(aWork, pIndex);
- delete[] pIndex;
-
- return true;
- }
-
- delete[] pIndex;
- return false;
- }
-
- double B3DHomMatrix::determinant() const
- {
- return mpImpl->doDeterminant();
- }
-
- B3DHomMatrix& B3DHomMatrix::operator+=(const B3DHomMatrix& rMat)
- {
- mpImpl->doAddMatrix(*rMat.mpImpl);
- return *this;
- }
-
- B3DHomMatrix& B3DHomMatrix::operator-=(const B3DHomMatrix& rMat)
- {
- mpImpl->doSubMatrix(*rMat.mpImpl);
- return *this;
- }
-
- B3DHomMatrix& B3DHomMatrix::operator*=(double fValue)
- {
- const double fOne(1.0);
-
- if(!fTools::equal(fOne, fValue))
- mpImpl->doMulMatrix(fValue);
-
- return *this;
- }
-
- B3DHomMatrix& B3DHomMatrix::operator/=(double fValue)
- {
- const double fOne(1.0);
-
- if(!fTools::equal(fOne, fValue))
- mpImpl->doMulMatrix(1.0 / fValue);
-
- return *this;
- }
-
- B3DHomMatrix& B3DHomMatrix::operator*=(const B3DHomMatrix& rMat)
- {
- if(!rMat.isIdentity())
- mpImpl->doMulMatrix(*rMat.mpImpl);
-
- return *this;
- }
-
- bool B3DHomMatrix::operator==(const B3DHomMatrix& rMat) const
- {
- if(mpImpl.same_object(rMat.mpImpl))
- return true;
-
- return mpImpl->isEqual(*rMat.mpImpl);
- }
-
- bool B3DHomMatrix::operator!=(const B3DHomMatrix& rMat) const
- {
- return !(*this == rMat);
- }
-
- void B3DHomMatrix::rotate(double fAngleX,double fAngleY,double fAngleZ)
- {
- if(!fTools::equalZero(fAngleX) || !fTools::equalZero(fAngleY) || !fTools::equalZero(fAngleZ))
- {
- if(!fTools::equalZero(fAngleX))
- {
- Impl3DHomMatrix aRotMatX;
- double fSin(sin(fAngleX));
- double fCos(cos(fAngleX));
-
- aRotMatX.set(1, 1, fCos);
- aRotMatX.set(2, 2, fCos);
- aRotMatX.set(2, 1, fSin);
- aRotMatX.set(1, 2, -fSin);
-
- mpImpl->doMulMatrix(aRotMatX);
- }
-
- if(!fTools::equalZero(fAngleY))
- {
- Impl3DHomMatrix aRotMatY;
- double fSin(sin(fAngleY));
- double fCos(cos(fAngleY));
-
- aRotMatY.set(0, 0, fCos);
- aRotMatY.set(2, 2, fCos);
- aRotMatY.set(0, 2, fSin);
- aRotMatY.set(2, 0, -fSin);
-
- mpImpl->doMulMatrix(aRotMatY);
- }
-
- if(!fTools::equalZero(fAngleZ))
- {
- Impl3DHomMatrix aRotMatZ;
- double fSin(sin(fAngleZ));
- double fCos(cos(fAngleZ));
-
- aRotMatZ.set(0, 0, fCos);
- aRotMatZ.set(1, 1, fCos);
- aRotMatZ.set(1, 0, fSin);
- aRotMatZ.set(0, 1, -fSin);
-
- mpImpl->doMulMatrix(aRotMatZ);
- }
- }
- }
-
- void B3DHomMatrix::translate(double fX, double fY, double fZ)
- {
- if(!fTools::equalZero(fX) || !fTools::equalZero(fY) || !fTools::equalZero(fZ))
- {
- Impl3DHomMatrix aTransMat;
-
- aTransMat.set(0, 3, fX);
- aTransMat.set(1, 3, fY);
- aTransMat.set(2, 3, fZ);
-
- mpImpl->doMulMatrix(aTransMat);
- }
- }
-
- void B3DHomMatrix::scale(double fX, double fY, double fZ)
- {
- const double fOne(1.0);
-
- if(!fTools::equal(fOne, fX) || !fTools::equal(fOne, fY) ||!fTools::equal(fOne, fZ))
- {
- Impl3DHomMatrix aScaleMat;
-
- aScaleMat.set(0, 0, fX);
- aScaleMat.set(1, 1, fY);
- aScaleMat.set(2, 2, fZ);
-
- mpImpl->doMulMatrix(aScaleMat);
- }
- }
-
- void B3DHomMatrix::shearXY(double fSx, double fSy)
- {
- // #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(fSy))
- {
- Impl3DHomMatrix aShearXYMat;
-
- aShearXYMat.set(0, 2, fSx);
- aShearXYMat.set(1, 2, fSy);
-
- mpImpl->doMulMatrix(aShearXYMat);
- }
- }
-
- void B3DHomMatrix::frustum(double fLeft, double fRight, double fBottom, double fTop, double fNear, double fFar)
- {
- const double fZero(0.0);
- const double fOne(1.0);
-
- if(!fTools::more(fNear, fZero))
- {
- fNear = 0.001;
- }
-
- if(!fTools::more(fFar, fZero))
- {
- fFar = fOne;
- }
-
- if(fTools::equal(fNear, fFar))
- {
- fFar = fNear + fOne;
- }
-
- if(fTools::equal(fLeft, fRight))
- {
- fLeft -= fOne;
- fRight += fOne;
- }
-
- if(fTools::equal(fTop, fBottom))
- {
- fBottom -= fOne;
- fTop += fOne;
- }
-
- Impl3DHomMatrix aFrustumMat;
-
- aFrustumMat.set(0, 0, 2.0 * fNear / (fRight - fLeft));
- aFrustumMat.set(1, 1, 2.0 * fNear / (fTop - fBottom));
- aFrustumMat.set(0, 2, (fRight + fLeft) / (fRight - fLeft));
- aFrustumMat.set(1, 2, (fTop + fBottom) / (fTop - fBottom));
- aFrustumMat.set(2, 2, -fOne * ((fFar + fNear) / (fFar - fNear)));
- aFrustumMat.set(3, 2, -fOne);
- aFrustumMat.set(2, 3, -fOne * ((2.0 * fFar * fNear) / (fFar - fNear)));
- aFrustumMat.set(3, 3, fZero);
-
- mpImpl->doMulMatrix(aFrustumMat);
- }
-
- void B3DHomMatrix::ortho(double fLeft, double fRight, double fBottom, double fTop, double fNear, double fFar)
- {
- if(fTools::equal(fNear, fFar))
- {
- fFar = fNear + 1.0;
- }
-
- if(fTools::equal(fLeft, fRight))
- {
- fLeft -= 1.0;
- fRight += 1.0;
- }
-
- if(fTools::equal(fTop, fBottom))
- {
- fBottom -= 1.0;
- fTop += 1.0;
- }
-
- Impl3DHomMatrix aOrthoMat;
-
- aOrthoMat.set(0, 0, 2.0 / (fRight - fLeft));
- aOrthoMat.set(1, 1, 2.0 / (fTop - fBottom));
- aOrthoMat.set(2, 2, -1.0 * (2.0 / (fFar - fNear)));
- aOrthoMat.set(0, 3, -1.0 * ((fRight + fLeft) / (fRight - fLeft)));
- aOrthoMat.set(1, 3, -1.0 * ((fTop + fBottom) / (fTop - fBottom)));
- aOrthoMat.set(2, 3, -1.0 * ((fFar + fNear) / (fFar - fNear)));
-
- mpImpl->doMulMatrix(aOrthoMat);
- }
-
- void B3DHomMatrix::orientation(B3DPoint aVRP, B3DVector aVPN, B3DVector aVUV)
- {
- Impl3DHomMatrix aOrientationMat;
-
- // translate -VRP
- aOrientationMat.set(0, 3, -aVRP.getX());
- aOrientationMat.set(1, 3, -aVRP.getY());
- aOrientationMat.set(2, 3, -aVRP.getZ());
-
- // build rotation
- aVUV.normalize();
- aVPN.normalize();
-
- // build x-axis as peroendicular fron aVUV and aVPN
- B3DVector aRx(aVUV.getPerpendicular(aVPN));
- aRx.normalize();
-
- // y-axis perpendicular to that
- B3DVector aRy(aVPN.getPerpendicular(aRx));
- aRy.normalize();
-
- // the calculated normals are the line vectors of the rotation matrix,
- // set them to create rotation
- aOrientationMat.set(0, 0, aRx.getX());
- aOrientationMat.set(0, 1, aRx.getY());
- aOrientationMat.set(0, 2, aRx.getZ());
- aOrientationMat.set(1, 0, aRy.getX());
- aOrientationMat.set(1, 1, aRy.getY());
- aOrientationMat.set(1, 2, aRy.getZ());
- aOrientationMat.set(2, 0, aVPN.getX());
- aOrientationMat.set(2, 1, aVPN.getY());
- aOrientationMat.set(2, 2, aVPN.getZ());
-
- mpImpl->doMulMatrix(aOrientationMat);
- }
-
- bool B3DHomMatrix::decompose(B3DTuple& rScale, B3DTuple& rTranslate, B3DTuple& rRotate, B3DTuple& rShear) const
- {
- // when perspective is used, decompose is not made here
- if(!mpImpl->isLastLineDefault())
- return false;
-
- // If determinant is zero, decomposition is not possible
- if(0.0 == determinant())
- return false;
-
- // isolate translation
- rTranslate.setX(mpImpl->get(0, 3));
- rTranslate.setY(mpImpl->get(1, 3));
- rTranslate.setZ(mpImpl->get(2, 3));
-
- // correct translate values
- rTranslate.correctValues();
-
- // get scale and shear
- B3DVector aCol0(mpImpl->get(0, 0), mpImpl->get(1, 0), mpImpl->get(2, 0));
- B3DVector aCol1(mpImpl->get(0, 1), mpImpl->get(1, 1), mpImpl->get(2, 1));
- B3DVector aCol2(mpImpl->get(0, 2), mpImpl->get(1, 2), mpImpl->get(2, 2));
- B3DVector aTemp;
-
- // get ScaleX
- rScale.setX(aCol0.getLength());
- aCol0.normalize();
-
- // get ShearXY
- rShear.setX(aCol0.scalar(aCol1));
-
- if(fTools::equalZero(rShear.getX()))
- {
- rShear.setX(0.0);
- }
- else
- {
- aTemp.setX(aCol1.getX() - rShear.getX() * aCol0.getX());
- aTemp.setY(aCol1.getY() - rShear.getX() * aCol0.getY());
- aTemp.setZ(aCol1.getZ() - rShear.getX() * aCol0.getZ());
- aCol1 = aTemp;
- }
-
- // get ScaleY
- rScale.setY(aCol1.getLength());
- aCol1.normalize();
-
- const double fShearX(rShear.getX());
-
- if(!fTools::equalZero(fShearX))
- {
- rShear.setX(rShear.getX() / rScale.getY());
- }
-
- // get ShearXZ
- rShear.setY(aCol0.scalar(aCol2));
-
- if(fTools::equalZero(rShear.getY()))
- {
- rShear.setY(0.0);
- }
- else
- {
- aTemp.setX(aCol2.getX() - rShear.getY() * aCol0.getX());
- aTemp.setY(aCol2.getY() - rShear.getY() * aCol0.getY());
- aTemp.setZ(aCol2.getZ() - rShear.getY() * aCol0.getZ());
- aCol2 = aTemp;
- }
-
- // get ShearYZ
- rShear.setZ(aCol1.scalar(aCol2));
-
- if(fTools::equalZero(rShear.getZ()))
- {
- rShear.setZ(0.0);
- }
- else
- {
- aTemp.setX(aCol2.getX() - rShear.getZ() * aCol1.getX());
- aTemp.setY(aCol2.getY() - rShear.getZ() * aCol1.getY());
- aTemp.setZ(aCol2.getZ() - rShear.getZ() * aCol1.getZ());
- aCol2 = aTemp;
- }
-
- // get ScaleZ
- rScale.setZ(aCol2.getLength());
- aCol2.normalize();
-
- const double fShearY(rShear.getY());
-
- if(!fTools::equalZero(fShearY))
- {
- rShear.setY(rShear.getY() / rScale.getZ());
- }
-
- const double fShearZ(rShear.getZ());
-
- if(!fTools::equalZero(fShearZ))
- {
- rShear.setZ(rShear.getZ() / rScale.getZ());
- }
-
- // correct shear values
- rShear.correctValues();
-
- // Coordinate system flip?
- if(0.0 > aCol0.scalar(aCol1.getPerpendicular(aCol2)))
- {
- rScale = -rScale;
- aCol0 = -aCol0;
- aCol1 = -aCol1;
- aCol2 = -aCol2;
- }
-
- // correct scale values
- rScale.correctValues(1.0);
-
- // Get rotations
- {
- double fy=0;
- double cy=0;
-
- if( ::basegfx::fTools::equal( aCol0.getZ(), 1.0 )
- || aCol0.getZ() > 1.0 )
- {
- fy = -F_PI/2.0;
- cy = 0.0;
- }
- else if( ::basegfx::fTools::equal( aCol0.getZ(), -1.0 )
- || aCol0.getZ() < -1.0 )
- {
- fy = F_PI/2.0;
- cy = 0.0;
- }
- else
- {
- fy = asin( -aCol0.getZ() );
- cy = cos(fy);
- }
-
- rRotate.setY(fy);
- if( ::basegfx::fTools::equalZero( cy ) )
- {
- if( aCol0.getZ() > 0.0 )
- rRotate.setX(atan2(-1.0*aCol1.getX(), aCol1.getY()));
- else
- rRotate.setX(atan2(aCol1.getX(), aCol1.getY()));
- rRotate.setZ(0.0);
- }
- else
- {
- rRotate.setX(atan2(aCol1.getZ(), aCol2.getZ()));
- rRotate.setZ(atan2(aCol0.getY(), aCol0.getX()));
- }
-
- // corrcet rotate values
- rRotate.correctValues();
- }
-
- return true;
- }
-} // end of namespace basegfx
-
-// eof
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */