/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_chart2.hxx" #include "CommonConverters.hxx" #include <com/sun/star/drawing/DoubleSequence.hpp> #include <com/sun/star/text/WritingMode2.hpp> #include <com/sun/star/chart2/data/XNumericalDataSequence.hpp> #include <com/sun/star/chart2/data/XTextualDataSequence.hpp> #include <rtl/math.hxx> #include <basegfx/matrix/b3dhommatrix.hxx> #include <cstdarg> //............................................................................. namespace chart { //............................................................................. using namespace ::com::sun::star; //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // diverse methods for class conversions; e.g. ::basegfx::B3DHomMatrix to HomogenMatrix //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- drawing::HomogenMatrix B3DHomMatrixToHomogenMatrix( const ::basegfx::B3DHomMatrix& rM ) { drawing::HomogenMatrix aHM; aHM.Line1.Column1 = rM.get(0, 0); aHM.Line1.Column2 = rM.get(0, 1); aHM.Line1.Column3 = rM.get(0, 2); aHM.Line1.Column4 = rM.get(0, 3); aHM.Line2.Column1 = rM.get(1, 0); aHM.Line2.Column2 = rM.get(1, 1); aHM.Line2.Column3 = rM.get(1, 2); aHM.Line2.Column4 = rM.get(1, 3); aHM.Line3.Column1 = rM.get(2, 0); aHM.Line3.Column2 = rM.get(2, 1); aHM.Line3.Column3 = rM.get(2, 2); aHM.Line3.Column4 = rM.get(2, 3); aHM.Line4.Column1 = rM.get(3, 0); aHM.Line4.Column2 = rM.get(3, 1); aHM.Line4.Column3 = rM.get(3, 2); aHM.Line4.Column4 = rM.get(3, 3); return aHM; } ::basegfx::B3DHomMatrix HomogenMatrixToB3DHomMatrix( const drawing::HomogenMatrix& rHM ) { ::basegfx::B3DHomMatrix aM; aM.set(0, 0, rHM.Line1.Column1); aM.set(0, 1, rHM.Line1.Column2); aM.set(0, 2, rHM.Line1.Column3); aM.set(0, 3, rHM.Line1.Column4); aM.set(1, 0, rHM.Line2.Column1); aM.set(1, 1, rHM.Line2.Column2); aM.set(1, 2, rHM.Line2.Column3); aM.set(1, 3, rHM.Line2.Column4); aM.set(2, 0, rHM.Line3.Column1); aM.set(2, 1, rHM.Line3.Column2); aM.set(2, 2, rHM.Line3.Column3); aM.set(2, 3, rHM.Line3.Column4); aM.set(3, 0, rHM.Line4.Column1); aM.set(3, 1, rHM.Line4.Column2); aM.set(3, 2, rHM.Line4.Column3); aM.set(3, 3, rHM.Line4.Column4); return aM; } ::basegfx::B2DHomMatrix IgnoreZ( const ::basegfx::B3DHomMatrix& rM ) { ::basegfx::B2DHomMatrix aM; aM.set(0, 0, rM.get(0, 0)); aM.set(0, 1, rM.get(0, 1)); aM.set(0, 2, rM.get(0, 3)); aM.set(1, 0, rM.get(1, 0)); aM.set(1, 1, rM.get(1, 1)); aM.set(1, 2, rM.get(1, 3)); aM.set(2, 0, rM.get(3, 0)); aM.set(2, 1, rM.get(3, 1)); aM.set(2, 2, rM.get(3, 3)); return aM; } drawing::HomogenMatrix3 B2DHomMatrixToHomogenMatrix3( const ::basegfx::B2DHomMatrix& rM ) { drawing::HomogenMatrix3 aHM; aHM.Line1.Column1 = rM.get(0, 0); aHM.Line1.Column2 = rM.get(0, 1); aHM.Line1.Column3 = rM.get(0, 2); aHM.Line2.Column1 = rM.get(1, 0); aHM.Line2.Column2 = rM.get(1, 1); aHM.Line2.Column3 = rM.get(1, 2); aHM.Line3.Column1 = rM.get(2, 0); aHM.Line3.Column2 = rM.get(2, 1); aHM.Line3.Column3 = rM.get(2, 2); return aHM; } ::basegfx::B3DPoint Position3DToB3DPoint( const drawing::Position3D& rPosition ) { return ::basegfx::B3DPoint( rPosition.PositionX , rPosition.PositionY , rPosition.PositionZ ); } drawing::Direction3D B3DVectorToDirection3D( const ::basegfx::B3DVector& rVector) { return drawing::Direction3D( rVector.getX() , rVector.getY() , rVector.getZ() ); } drawing::Position3D B3DPointToPosition3D( const ::basegfx::B3DPoint& rPoint) { return drawing::Position3D( rPoint.getX() , rPoint.getY() , rPoint.getZ() ); } ::basegfx::B3DVector Direction3DToB3DVector( const drawing::Direction3D& rDirection) { return ::basegfx::B3DVector( rDirection.DirectionX , rDirection.DirectionY , rDirection.DirectionZ ); } void AddPointToPoly( drawing::PolyPolygonShape3D& rPoly, const drawing::Position3D& rPos, sal_Int32 nPolygonIndex ) { if(nPolygonIndex<0) { OSL_ENSURE( false, "The polygon index needs to be > 0"); nPolygonIndex=0; } //make sure that we have enough polygons if(nPolygonIndex >= rPoly.SequenceX.getLength() ) { rPoly.SequenceX.realloc(nPolygonIndex+1); rPoly.SequenceY.realloc(nPolygonIndex+1); rPoly.SequenceZ.realloc(nPolygonIndex+1); } drawing::DoubleSequence* pOuterSequenceX = &rPoly.SequenceX.getArray()[nPolygonIndex]; drawing::DoubleSequence* pOuterSequenceY = &rPoly.SequenceY.getArray()[nPolygonIndex]; drawing::DoubleSequence* pOuterSequenceZ = &rPoly.SequenceZ.getArray()[nPolygonIndex]; sal_Int32 nOldPointCount = pOuterSequenceX->getLength(); pOuterSequenceX->realloc(nOldPointCount+1); pOuterSequenceY->realloc(nOldPointCount+1); pOuterSequenceZ->realloc(nOldPointCount+1); double* pInnerSequenceX = pOuterSequenceX->getArray(); double* pInnerSequenceY = pOuterSequenceY->getArray(); double* pInnerSequenceZ = pOuterSequenceZ->getArray(); pInnerSequenceX[nOldPointCount] = rPos.PositionX; pInnerSequenceY[nOldPointCount] = rPos.PositionY; pInnerSequenceZ[nOldPointCount] = rPos.PositionZ; } drawing::Position3D getPointFromPoly( const drawing::PolyPolygonShape3D& rPolygon, sal_Int32 nPointIndex, sal_Int32 nPolyIndex ) { drawing::Position3D aRet(0.0,0.0,0.0); if( nPolyIndex>=0 && nPolyIndex<rPolygon.SequenceX.getLength()) { if(nPointIndex<rPolygon.SequenceX[nPolyIndex].getLength()) { aRet.PositionX = rPolygon.SequenceX[nPolyIndex][nPointIndex]; aRet.PositionY = rPolygon.SequenceY[nPolyIndex][nPointIndex]; aRet.PositionZ = rPolygon.SequenceZ[nPolyIndex][nPointIndex]; } else { ;DBG_ERROR("polygon was accessed with a wrong index"); } } else { ;DBG_ERROR("polygon was accessed with a wrong index"); } return aRet; } void addPolygon( drawing::PolyPolygonShape3D& rRet, const drawing::PolyPolygonShape3D& rAdd ) { sal_Int32 nAddOuterCount = rAdd.SequenceX.getLength(); sal_Int32 nOuterCount = rRet.SequenceX.getLength() + nAddOuterCount; rRet.SequenceX.realloc( nOuterCount ); rRet.SequenceY.realloc( nOuterCount ); rRet.SequenceZ.realloc( nOuterCount ); sal_Int32 nIndex = 0; sal_Int32 nOuter = nOuterCount - nAddOuterCount; for( ; nOuter < nOuterCount; nOuter++ ) { if( nIndex >= nAddOuterCount ) break; rRet.SequenceX[nOuter] = rAdd.SequenceX[nIndex]; rRet.SequenceY[nOuter] = rAdd.SequenceY[nIndex]; rRet.SequenceZ[nOuter] = rAdd.SequenceZ[nIndex]; nIndex++; } } void appendPoly( drawing::PolyPolygonShape3D& rRet, const drawing::PolyPolygonShape3D& rAdd ) { sal_Int32 nOuterCount = Max( rRet.SequenceX.getLength(), rAdd.SequenceX.getLength() ); rRet.SequenceX.realloc(nOuterCount); rRet.SequenceY.realloc(nOuterCount); rRet.SequenceZ.realloc(nOuterCount); for( sal_Int32 nOuter=0;nOuter<nOuterCount;nOuter++ ) { sal_Int32 nOldPointCount = rRet.SequenceX[nOuter].getLength(); sal_Int32 nAddPointCount = 0; if(nOuter<rAdd.SequenceX.getLength()) nAddPointCount = rAdd.SequenceX[nOuter].getLength(); if(!nAddPointCount) continue; sal_Int32 nNewPointCount = nOldPointCount + nAddPointCount; rRet.SequenceX[nOuter].realloc(nNewPointCount); rRet.SequenceY[nOuter].realloc(nNewPointCount); rRet.SequenceZ[nOuter].realloc(nNewPointCount); sal_Int32 nPointTarget=nOldPointCount; sal_Int32 nPointSource=nAddPointCount; for( ; nPointSource-- ; nPointTarget++ ) { rRet.SequenceX[nOuter][nPointTarget] = rAdd.SequenceX[nOuter][nPointSource]; rRet.SequenceY[nOuter][nPointTarget] = rAdd.SequenceY[nOuter][nPointSource]; rRet.SequenceZ[nOuter][nPointTarget] = rAdd.SequenceZ[nOuter][nPointSource]; } } } drawing::PolyPolygonShape3D BezierToPoly( const drawing::PolyPolygonBezierCoords& rBezier ) { const drawing::PointSequenceSequence& rPointSequence = rBezier.Coordinates; // const drawing::FlagSequenceSequence& rFlags = rBezier.Flags; drawing::PolyPolygonShape3D aRet; aRet.SequenceX.realloc( rPointSequence.getLength() ); aRet.SequenceY.realloc( rPointSequence.getLength() ); aRet.SequenceZ.realloc( rPointSequence.getLength() ); sal_Int32 nRealOuter = 0; for(sal_Int32 nN = 0; nN < rPointSequence.getLength(); nN++) { sal_Int32 nInnerLength = rPointSequence[nN].getLength(); aRet.SequenceX[nN].realloc( nInnerLength ); aRet.SequenceY[nN].realloc( nInnerLength ); aRet.SequenceZ[nN].realloc( nInnerLength ); bool bHasOuterFlags = nN < rBezier.Flags.getLength(); sal_Int32 nRealInner = 0; for( sal_Int32 nM = 0; nM < nInnerLength; nM++) { bool bHasInnerFlags = bHasOuterFlags && (nM < rBezier.Flags[nN].getLength()); if( !bHasInnerFlags || (rBezier.Flags[nN][nM] == drawing::PolygonFlags_NORMAL) ) { aRet.SequenceX[nRealOuter][nRealInner] = rPointSequence[nN][nM].X; aRet.SequenceY[nRealOuter][nRealInner] = rPointSequence[nN][nM].Y; aRet.SequenceZ[nRealOuter][nRealInner] = 0.0; nRealInner++; } } aRet.SequenceX[nRealOuter].realloc( nRealInner ); aRet.SequenceY[nRealOuter].realloc( nRealInner ); aRet.SequenceZ[nRealOuter].realloc( nRealInner ); if( nRealInner>0 ) nRealOuter++; } aRet.SequenceX.realloc( nRealOuter ); aRet.SequenceY.realloc( nRealOuter ); aRet.SequenceZ.realloc( nRealOuter ); return aRet; } drawing::PointSequenceSequence PolyToPointSequence( const drawing::PolyPolygonShape3D& rPolyPolygon ) { drawing::PointSequenceSequence aRet; aRet.realloc( rPolyPolygon.SequenceX.getLength() ); for(sal_Int32 nN = 0; nN < rPolyPolygon.SequenceX.getLength(); nN++) { sal_Int32 nInnerLength = rPolyPolygon.SequenceX[nN].getLength(); aRet[nN].realloc( nInnerLength ); for( sal_Int32 nM = 0; nM < nInnerLength; nM++) { aRet[nN][nM].X = static_cast<sal_Int32>(rPolyPolygon.SequenceX[nN][nM]); aRet[nN][nM].Y = static_cast<sal_Int32>(rPolyPolygon.SequenceY[nN][nM]); } } return aRet; } void appendPointSequence( drawing::PointSequenceSequence& rTarget , drawing::PointSequenceSequence& rAdd ) { sal_Int32 nAddCount = rAdd.getLength(); if(!nAddCount) return; sal_Int32 nOldCount = rTarget.getLength(); rTarget.realloc(nOldCount+nAddCount); for(sal_Int32 nS=0; nS<nAddCount; nS++ ) rTarget[nOldCount+nS]=rAdd[nS]; } drawing::Position3D operator+( const drawing::Position3D& rPos , const drawing::Direction3D& rDirection) { return drawing::Position3D( rPos.PositionX + rDirection.DirectionX , rPos.PositionY + rDirection.DirectionY , rPos.PositionZ + rDirection.DirectionZ ); } drawing::Direction3D operator-( const drawing::Position3D& rPos1 , const drawing::Position3D& rPos2) { return drawing::Direction3D( rPos1.PositionX - rPos2.PositionX , rPos1.PositionY - rPos2.PositionY , rPos1.PositionZ - rPos2.PositionZ ); } bool operator==( const drawing::Position3D& rPos1 , const drawing::Position3D& rPos2) { return rPos1.PositionX == rPos2.PositionX && rPos1.PositionY == rPos2.PositionY && rPos1.PositionZ == rPos2.PositionZ; } awt::Point Position3DToAWTPoint( const drawing::Position3D& rPos ) { awt::Point aRet; aRet.X = static_cast<sal_Int32>(rPos.PositionX); aRet.Y = static_cast<sal_Int32>(rPos.PositionY); return aRet; } awt::Point ToPoint( const awt::Rectangle& rRectangle ) { return awt::Point( rRectangle.X, rRectangle.Y ); } awt::Size ToSize( const awt::Rectangle& rRectangle ) { return awt::Size( rRectangle.Width, rRectangle.Height ); } awt::Size Direction3DToAWTSize( const drawing::Direction3D& rDirection ) { awt::Size aRet; aRet.Width = static_cast<sal_Int32>(rDirection.DirectionX); aRet.Height = static_cast<sal_Int32>(rDirection.DirectionY); return aRet; } uno::Sequence< double > B3DPointToSequence( const ::basegfx::B3DPoint& rPoint ) { uno::Sequence< double > aRet(3); aRet[0] = rPoint.getX(); aRet[1] = rPoint.getY(); aRet[2] = rPoint.getZ(); return aRet; } drawing::Position3D SequenceToPosition3D( const uno::Sequence< double >& rSeq ) { OSL_ENSURE(rSeq.getLength()==3,"The sequence needs to have length 3 for conversion into vector"); drawing::Position3D aRet; aRet.PositionX = rSeq.getLength()>0?rSeq[0]:0.0; aRet.PositionY = rSeq.getLength()>1?rSeq[1]:0.0; aRet.PositionZ = rSeq.getLength()>2?rSeq[2]:0.0; return aRet; } uno::Sequence< double > Position3DToSequence( const drawing::Position3D& rPosition ) { uno::Sequence< double > aRet(3); aRet[0] = rPosition.PositionX; aRet[1] = rPosition.PositionY; aRet[2] = rPosition.PositionZ; return aRet; } using namespace ::com::sun::star::chart2; uno::Sequence< double > DataSequenceToDoubleSequence( const uno::Reference< data::XDataSequence >& xDataSequence ) { uno::Sequence< double > aResult; OSL_ASSERT( xDataSequence.is()); if(!xDataSequence.is()) return aResult; uno::Reference< data::XNumericalDataSequence > xNumericalDataSequence( xDataSequence, uno::UNO_QUERY ); if( xNumericalDataSequence.is() ) { aResult = xNumericalDataSequence->getNumericalData(); } else { uno::Sequence< uno::Any > aValues = xDataSequence->getData(); aResult.realloc(aValues.getLength()); for(sal_Int32 nN=aValues.getLength();nN--;) { if( !(aValues[nN] >>= aResult[nN]) ) ::rtl::math::setNan( &aResult[nN] ); } } return aResult; } uno::Sequence< rtl::OUString > DataSequenceToStringSequence( const uno::Reference< data::XDataSequence >& xDataSequence ) { uno::Sequence< rtl::OUString > aResult; if(!xDataSequence.is()) return aResult; uno::Reference< data::XTextualDataSequence > xTextualDataSequence( xDataSequence, uno::UNO_QUERY ); if( xTextualDataSequence.is() ) { aResult = xTextualDataSequence->getTextualData(); } else { uno::Sequence< uno::Any > aValues = xDataSequence->getData(); aResult.realloc(aValues.getLength()); for(sal_Int32 nN=aValues.getLength();nN--;) aValues[nN] >>= aResult[nN]; } return aResult; } sal_Bool hasDoubleValue( const uno::Any& rAny ) { sal_Bool bRet = sal_False; double fValue = 0.0; if( rAny >>= fValue ) bRet = sal_True; return bRet; } sal_Bool hasLongOrShortValue( const uno::Any& rAny ) { sal_Bool bRet = sal_False; sal_Int32 n32 = 0; if( rAny >>= n32 ) bRet = sal_True; else { sal_Int16 n16 = 0; if( rAny >>= n16 ) bRet = sal_True; } return bRet; } sal_Int16 getShortForLongAlso( const uno::Any& rAny ) { sal_Int16 nRet = 0; if( !(rAny >>= nRet) ) { sal_Int32 n32 = 0; if( rAny >>= n32 ) nRet = static_cast<sal_Int16>(n32); } return nRet; } bool replaceParamterInString( rtl::OUString & rInOutResourceString, const rtl::OUString & rParamToReplace, const rtl::OUString & rReplaceWith ) { sal_Int32 nPos = rInOutResourceString.indexOf( rParamToReplace ); if( nPos == -1 ) return false; rInOutResourceString = rInOutResourceString.replaceAt( nPos , rParamToReplace.getLength(), rReplaceWith ); return true; } //............................................................................. } //namespace chart //.............................................................................