diff options
Diffstat (limited to 'basegfx/source/matrix')
-rw-r--r-- | basegfx/source/matrix/b2dhommatrix.cxx | 457 | ||||
-rw-r--r-- | basegfx/source/matrix/b2dhommatrixtools.cxx | 404 | ||||
-rw-r--r-- | basegfx/source/matrix/b3dhommatrix.cxx | 540 |
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: */ |