diff options
Diffstat (limited to 'chart2/source/tools/CommonConverters.cxx')
-rw-r--r-- | chart2/source/tools/CommonConverters.cxx | 206 |
1 files changed, 146 insertions, 60 deletions
diff --git a/chart2/source/tools/CommonConverters.cxx b/chart2/source/tools/CommonConverters.cxx index 4993c749f2ca..293fa7b11ddf 100644 --- a/chart2/source/tools/CommonConverters.cxx +++ b/chart2/source/tools/CommonConverters.cxx @@ -24,9 +24,12 @@ #include <com/sun/star/chart2/data/XDataSequence.hpp> #include <com/sun/star/chart2/data/XNumericalDataSequence.hpp> #include <com/sun/star/chart2/data/XTextualDataSequence.hpp> +#include <o3tl/safeint.hxx> #include <osl/diagnose.h> #include <basegfx/matrix/b3dhommatrix.hxx> +#include <basegfx/polygon/b2dpolygontools.hxx> +#include <cstddef> #include <limits> namespace chart @@ -89,9 +92,10 @@ drawing::HomogenMatrix B3DHomMatrixToHomogenMatrix( const ::basegfx::B3DHomMatri 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)); + // For this to be a valid 2D transform matrix, the last row must be [0,0,1] + assert( rM.get(3, 0) == 0 ); + assert( rM.get(3, 1) == 0 ); + assert( rM.get(3, 3) == 1 ); return aM; } @@ -104,9 +108,9 @@ drawing::HomogenMatrix3 B2DHomMatrixToHomogenMatrix3( const ::basegfx::B2DHomMat 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); + aHM.Line3.Column1 = 0; + aHM.Line3.Column2 = 0; + aHM.Line3.Column3 = 1; return aHM; } @@ -180,6 +184,24 @@ void AddPointToPoly( drawing::PolyPolygonShape3D& rPoly, const drawing::Position pInnerSequenceZ[nOldPointCount] = rPos.PositionZ; } +void AddPointToPoly( std::vector<std::vector<css::drawing::Position3D>>& rPoly, const drawing::Position3D& rPos, sal_Int32 nPolygonIndex ) +{ + if(nPolygonIndex<0) + { + OSL_FAIL( "The polygon index needs to be > 0"); + nPolygonIndex=0; + } + + //make sure that we have enough polygons + if(o3tl::make_unsigned(nPolygonIndex) >= rPoly.size() ) + { + rPoly.resize(nPolygonIndex+1); + } + + std::vector<css::drawing::Position3D>* pOuterSequence = &rPoly[nPolygonIndex]; + pOuterSequence->push_back(rPos); +} + drawing::Position3D getPointFromPoly( const drawing::PolyPolygonShape3D& rPolygon, sal_Int32 nPointIndex, sal_Int32 nPolyIndex ) { drawing::Position3D aRet(0.0,0.0,0.0); @@ -204,13 +226,34 @@ drawing::Position3D getPointFromPoly( const drawing::PolyPolygonShape3D& rPolygo return aRet; } -void addPolygon( drawing::PolyPolygonShape3D& rRet, const drawing::PolyPolygonShape3D& rAdd ) +drawing::Position3D getPointFromPoly( const std::vector<std::vector<css::drawing::Position3D>>& rPolygon, sal_Int32 nPointIndex, sal_Int32 nPolyIndex ) { - 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 ); + drawing::Position3D aRet(0.0,0.0,0.0); + + if( nPolyIndex>=0 && o3tl::make_unsigned(nPolyIndex)<rPolygon.size()) + { + if(nPointIndex<static_cast<sal_Int32>(rPolygon[nPolyIndex].size())) + { + aRet = rPolygon[nPolyIndex][nPointIndex]; + } + else + { + OSL_FAIL("polygon was accessed with a wrong index"); + } + } + else + { + OSL_FAIL("polygon was accessed with a wrong index"); + } + return aRet; +} + +void addPolygon( std::vector<std::vector<css::drawing::Position3D>>& rRet, const std::vector<std::vector<css::drawing::Position3D>>& rAdd ) +{ + sal_Int32 nAddOuterCount = rAdd.size(); + sal_Int32 nOuterCount = rRet.size() + nAddOuterCount; + rRet.resize( nOuterCount ); + auto pSequence = rRet.data(); sal_Int32 nIndex = 0; sal_Int32 nOuter = nOuterCount - nAddOuterCount; @@ -219,43 +262,37 @@ void addPolygon( drawing::PolyPolygonShape3D& rRet, const drawing::PolyPolygonSh if( nIndex >= nAddOuterCount ) break; - rRet.SequenceX[nOuter] = rAdd.SequenceX[nIndex]; - rRet.SequenceY[nOuter] = rAdd.SequenceY[nIndex]; - rRet.SequenceZ[nOuter] = rAdd.SequenceZ[nIndex]; + pSequence[nOuter] = rAdd[nIndex]; nIndex++; } } -void appendPoly( drawing::PolyPolygonShape3D& rRet, const drawing::PolyPolygonShape3D& rAdd ) +void appendPoly( std::vector<std::vector<css::drawing::Position3D>>& rRet, const std::vector<std::vector<css::drawing::Position3D>>& rAdd ) { - sal_Int32 nOuterCount = std::max( rRet.SequenceX.getLength(), rAdd.SequenceX.getLength() ); - rRet.SequenceX.realloc(nOuterCount); - rRet.SequenceY.realloc(nOuterCount); - rRet.SequenceZ.realloc(nOuterCount); + std::size_t nOuterCount = std::max( rRet.size(), rAdd.size() ); + rRet.resize(nOuterCount); + auto pSequence = rRet.data(); - for( sal_Int32 nOuter=0;nOuter<nOuterCount;nOuter++ ) + for( std::size_t nOuter=0;nOuter<nOuterCount;nOuter++ ) { - sal_Int32 nOldPointCount = rRet.SequenceX[nOuter].getLength(); + sal_Int32 nOldPointCount = rRet[nOuter].size(); sal_Int32 nAddPointCount = 0; - if(nOuter<rAdd.SequenceX.getLength()) - nAddPointCount = rAdd.SequenceX[nOuter].getLength(); + if(nOuter<rAdd.size()) + nAddPointCount = rAdd[nOuter].size(); if(!nAddPointCount) continue; sal_Int32 nNewPointCount = nOldPointCount + nAddPointCount; - rRet.SequenceX[nOuter].realloc(nNewPointCount); - rRet.SequenceY[nOuter].realloc(nNewPointCount); - rRet.SequenceZ[nOuter].realloc(nNewPointCount); + pSequence[nOuter].resize(nNewPointCount); + auto pSequence_nOuter = pSequence[nOuter].data(); 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]; + pSequence_nOuter[nPointTarget] = rAdd[nOuter][nPointSource]; } } } @@ -267,16 +304,22 @@ drawing::PolyPolygonShape3D BezierToPoly( drawing::PolyPolygonShape3D aRet; aRet.SequenceX.realloc( rPointSequence.getLength() ); + auto pSequenceX = aRet.SequenceX.getArray(); aRet.SequenceY.realloc( rPointSequence.getLength() ); + auto pSequenceY = aRet.SequenceY.getArray(); aRet.SequenceZ.realloc( rPointSequence.getLength() ); + auto pSequenceZ = aRet.SequenceZ.getArray(); 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 ); + pSequenceX[nRealOuter].realloc( nInnerLength ); + auto pSequenceX_nRealOuter = pSequenceX[nRealOuter].getArray(); + pSequenceY[nRealOuter].realloc( nInnerLength ); + auto pSequenceY_nRealOuter = pSequenceY[nRealOuter].getArray(); + pSequenceZ[nRealOuter].realloc( nInnerLength ); + auto pSequenceZ_nRealOuter = pSequenceZ[nRealOuter].getArray(); bool bHasOuterFlags = nN < rBezier.Flags.getLength(); @@ -287,16 +330,16 @@ drawing::PolyPolygonShape3D BezierToPoly( 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; + pSequenceX_nRealOuter[nRealInner] = rPointSequence[nN][nM].X; + pSequenceY_nRealOuter[nRealInner] = rPointSequence[nN][nM].Y; + pSequenceZ_nRealOuter[nRealInner] = 0.0; nRealInner++; } } - aRet.SequenceX[nRealOuter].realloc( nRealInner ); - aRet.SequenceY[nRealOuter].realloc( nRealInner ); - aRet.SequenceZ[nRealOuter].realloc( nRealInner ); + pSequenceX[nRealOuter].realloc( nRealInner ); + pSequenceY[nRealOuter].realloc( nRealInner ); + pSequenceZ[nRealOuter].realloc( nRealInner ); if( nRealInner>0 ) nRealOuter++; @@ -314,22 +357,72 @@ drawing::PointSequenceSequence PolyToPointSequence( { drawing::PointSequenceSequence aRet; aRet.realloc( rPolyPolygon.SequenceX.getLength() ); + auto pRet = aRet.getArray(); for(sal_Int32 nN = 0; nN < rPolyPolygon.SequenceX.getLength(); nN++) { sal_Int32 nInnerLength = rPolyPolygon.SequenceX[nN].getLength(); - aRet[nN].realloc( nInnerLength ); + pRet[nN].realloc( nInnerLength ); + auto pRet_nN = pRet[nN].getArray(); + for( sal_Int32 nM = 0; nM < nInnerLength; nM++) + { + pRet_nN[nM].X = static_cast<sal_Int32>(rPolyPolygon.SequenceX[nN][nM]); + pRet_nN[nM].Y = static_cast<sal_Int32>(rPolyPolygon.SequenceY[nN][nM]); + } + } + return aRet; +} + +drawing::PointSequenceSequence PolyToPointSequence( + const std::vector<std::vector<css::drawing::Position3D>>& rPolyPolygon ) +{ + drawing::PointSequenceSequence aRet; + aRet.realloc( rPolyPolygon.size() ); + auto pRet = aRet.getArray(); + + for(std::size_t nN = 0; nN < rPolyPolygon.size(); nN++) + { + sal_Int32 nInnerLength = rPolyPolygon[nN].size(); + pRet[nN].realloc( nInnerLength ); + auto pRet_nN = pRet[nN].getArray(); 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]); + pRet_nN[nM].X = static_cast<sal_Int32>(rPolyPolygon[nN][nM].PositionX); + pRet_nN[nM].Y = static_cast<sal_Int32>(rPolyPolygon[nN][nM].PositionY); } } return aRet; } +basegfx::B2DPolyPolygon PolyToB2DPolyPolygon( + const std::vector<std::vector<css::drawing::Position3D>>& rPolyPolygon ) +{ + basegfx::B2DPolyPolygon aRetval; + + for(auto const & nN: rPolyPolygon) + { + basegfx::B2DPolygon aNewPolygon; + sal_Int32 nInnerLength = nN.size(); + if(nInnerLength) + { + aNewPolygon.reserve(nInnerLength); + for( sal_Int32 nM = 0; nM < nInnerLength; nM++) + { + auto X = static_cast<sal_Int32>(nN[nM].PositionX); + auto Y = static_cast<sal_Int32>(nN[nM].PositionY); + aNewPolygon.append(basegfx::B2DPoint(X, Y)); + } + // check for closed state flag + basegfx::utils::checkClosed(aNewPolygon); + } + aRetval.append(std::move(aNewPolygon)); + } + + return aRetval; +} + void appendPointSequence( drawing::PointSequenceSequence& rTarget - , drawing::PointSequenceSequence& rAdd ) + , const drawing::PointSequenceSequence& rAdd ) { sal_Int32 nAddCount = rAdd.getLength(); if(!nAddCount) @@ -337,8 +430,9 @@ void appendPointSequence( drawing::PointSequenceSequence& rTarget sal_Int32 nOldCount = rTarget.getLength(); rTarget.realloc(nOldCount+nAddCount); + auto pTarget = rTarget.getArray(); for(sal_Int32 nS=0; nS<nAddCount; nS++ ) - rTarget[nOldCount+nS]=rAdd[nS]; + pTarget[nOldCount+nS]=rAdd[nS]; } drawing::Position3D operator+( const drawing::Position3D& rPos @@ -387,11 +481,6 @@ awt::Size Direction3DToAWTSize( const drawing::Direction3D& rDirection ) return aRet; } -uno::Sequence< double > B3DPointToSequence( const ::basegfx::B3DPoint& rPoint ) -{ - return { rPoint.getX(), rPoint.getY(), rPoint.getZ() }; -} - drawing::Position3D SequenceToPosition3D( const uno::Sequence< double >& rSeq ) { OSL_ENSURE(rSeq.getLength()==3,"The sequence needs to have length 3 for conversion into vector"); @@ -403,11 +492,6 @@ drawing::Position3D SequenceToPosition3D( const uno::Sequence< double >& rSeq ) return aRet; } -uno::Sequence< double > Position3DToSequence( const drawing::Position3D& rPosition ) -{ - return { rPosition.PositionX, rPosition.PositionY, rPosition.PositionZ }; -} - using namespace ::com::sun::star::chart2; uno::Sequence< double > DataSequenceToDoubleSequence( @@ -427,10 +511,11 @@ uno::Sequence< double > DataSequenceToDoubleSequence( { uno::Sequence< uno::Any > aValues = xDataSequence->getData(); aResult.realloc(aValues.getLength()); + auto pResult = aResult.getArray(); for(sal_Int32 nN=aValues.getLength();nN--;) { - if( !(aValues[nN] >>= aResult[nN]) ) - aResult[nN] = std::numeric_limits<double>::quiet_NaN(); + if( !(aValues[nN] >>= pResult[nN]) ) + pResult[nN] = std::numeric_limits<double>::quiet_NaN(); } } @@ -453,9 +538,10 @@ uno::Sequence< OUString > DataSequenceToStringSequence( { uno::Sequence< uno::Any > aValues = xDataSequence->getData(); aResult.realloc(aValues.getLength()); + auto pResult = aResult.getArray(); for(sal_Int32 nN=aValues.getLength();nN--;) - aValues[nN] >>= aResult[nN]; + aValues[nN] >>= pResult[nN]; } return aResult; @@ -498,15 +584,15 @@ sal_Int16 getShortForLongAlso( const uno::Any& rAny ) } bool replaceParamterInString( OUString & rInOutResourceString, - const OUString & rParamToReplace, - const OUString & rReplaceWith ) + std::u16string_view rParamToReplace, + std::u16string_view rReplaceWith ) { sal_Int32 nPos = rInOutResourceString.indexOf( rParamToReplace ); if( nPos == -1 ) return false; rInOutResourceString = rInOutResourceString.replaceAt( nPos - , rParamToReplace.getLength(), rReplaceWith ); + , rParamToReplace.size(), rReplaceWith ); return true; } |