summaryrefslogtreecommitdiff
path: root/chart2/source/view/main/PlottingPositionHelper.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'chart2/source/view/main/PlottingPositionHelper.cxx')
-rw-r--r--chart2/source/view/main/PlottingPositionHelper.cxx73
1 files changed, 44 insertions, 29 deletions
diff --git a/chart2/source/view/main/PlottingPositionHelper.cxx b/chart2/source/view/main/PlottingPositionHelper.cxx
index 300ecaddb68b..dfbf38bbd90e 100644
--- a/chart2/source/view/main/PlottingPositionHelper.cxx
+++ b/chart2/source/view/main/PlottingPositionHelper.cxx
@@ -27,9 +27,7 @@
#include <com/sun/star/chart/TimeUnit.hpp>
#include <com/sun/star/chart2/AxisType.hpp>
-#include <com/sun/star/drawing/DoubleSequence.hpp>
#include <com/sun/star/drawing/Position3D.hpp>
-#include <com/sun/star/drawing/XShapes.hpp>
#include <rtl/math.hxx>
@@ -38,6 +36,8 @@ namespace chart
using namespace ::com::sun::star;
using namespace ::com::sun::star::chart2;
+XTransformation2::~XTransformation2() {}
+
PlottingPositionHelper::PlottingPositionHelper()
: m_bSwapXAndY( false )
, m_nXResolution( 1000 )
@@ -100,7 +100,7 @@ void PlottingPositionHelper::setScales( std::vector< ExplicitScaleData >&& rScal
m_xTransformationLogicToScene = nullptr;
}
-uno::Reference< XTransformation > PlottingPositionHelper::getTransformationScaledLogicToScene() const
+::chart::XTransformation2* PlottingPositionHelper::getTransformationScaledLogicToScene() const
{
//this is a standard transformation for a cartesian coordinate system
@@ -108,7 +108,7 @@ uno::Reference< XTransformation > PlottingPositionHelper::getTransformationScale
//we need to apply this transformation to each geometric object because of a bug/problem
//of the old drawing layer (the UNO_NAME_3D_EXTRUDE_DEPTH is an integer value instead of a double )
- if(!m_xTransformationLogicToScene.is())
+ if(!m_xTransformationLogicToScene)
{
::basegfx::B3DHomMatrix aMatrix;
double MinX = getLogicMinX();
@@ -162,9 +162,9 @@ uno::Reference< XTransformation > PlottingPositionHelper::getTransformationScale
aMatrix = m_aMatrixScreenToScene*aMatrix;
- m_xTransformationLogicToScene = new Linear3DTransformation(B3DHomMatrixToHomogenMatrix( aMatrix ),m_bSwapXAndY);
+ m_xTransformationLogicToScene.reset(new Linear3DTransformation(B3DHomMatrixToHomogenMatrix( aMatrix ), m_bSwapXAndY));
}
- return m_xTransformationLogicToScene;
+ return m_xTransformationLogicToScene.get();
}
drawing::Position3D PlottingPositionHelper::transformLogicToScene(
@@ -185,16 +185,13 @@ drawing::Position3D PlottingPositionHelper::transformScaledLogicToScene(
drawing::Position3D aPos( fX, fY, fZ);
- uno::Reference< XTransformation > xTransformation =
+ ::chart::XTransformation2* pTransformation =
getTransformationScaledLogicToScene();
- uno::Sequence< double > aSeq =
- xTransformation->transform( Position3DToSequence(aPos) );
- return SequenceToPosition3D(aSeq);
+ return pTransformation->transform( aPos );
}
awt::Point PlottingPositionHelper::transformSceneToScreenPosition( const drawing::Position3D& rScenePosition3D
- , const uno::Reference< drawing::XShapes >& xSceneTarget
- , ShapeFactory* pShapeFactory
+ , const rtl::Reference<SvxShapeGroupAnyD>& xSceneTarget
, sal_Int32 nDimensionCount )
{
//@todo would like to have a cheaper method to do this transformation
@@ -205,7 +202,7 @@ awt::Point PlottingPositionHelper::transformSceneToScreenPosition( const drawing
{
//create 3D anchor shape
tPropertyNameMap aDummyPropertyNameMap;
- uno::Reference< drawing::XShape > xShape3DAnchor = pShapeFactory->createCube( xSceneTarget
+ rtl::Reference<Svx3DExtrudeObject> xShape3DAnchor = ShapeFactory::createCube( xSceneTarget
, rScenePosition3D,drawing::Direction3D(1,1,1)
, 0, nullptr, aDummyPropertyNameMap);
//get 2D position from xShape3DAnchor
@@ -218,16 +215,38 @@ awt::Point PlottingPositionHelper::transformSceneToScreenPosition( const drawing
void PlottingPositionHelper::transformScaledLogicToScene( drawing::PolyPolygonShape3D& rPolygon ) const
{
drawing::Position3D aScenePosition;
+ auto SequenceXRange = asNonConstRange(rPolygon.SequenceX);
+ auto SequenceYRange = asNonConstRange(rPolygon.SequenceY);
+ auto SequenceZRange = asNonConstRange(rPolygon.SequenceZ);
for( sal_Int32 nS = rPolygon.SequenceX.getLength(); nS--;)
{
- drawing::DoubleSequence& xValues = rPolygon.SequenceX[nS];
- drawing::DoubleSequence& yValues = rPolygon.SequenceY[nS];
- drawing::DoubleSequence& zValues = rPolygon.SequenceZ[nS];
- for( sal_Int32 nP = xValues.getLength(); nP--; )
+ auto xValuesRange = asNonConstRange(SequenceXRange[nS]);
+ auto yValuesRange = asNonConstRange(SequenceYRange[nS]);
+ auto zValuesRange = asNonConstRange(SequenceZRange[nS]);
+ for( sal_Int32 nP = SequenceXRange[nS].getLength(); nP--; )
{
- double& fX = xValues[nP];
- double& fY = yValues[nP];
- double& fZ = zValues[nP];
+ double& fX = xValuesRange[nP];
+ double& fY = yValuesRange[nP];
+ double& fZ = zValuesRange[nP];
+ aScenePosition = transformScaledLogicToScene( fX,fY,fZ,true );
+ fX = aScenePosition.PositionX;
+ fY = aScenePosition.PositionY;
+ fZ = aScenePosition.PositionZ;
+ }
+ }
+}
+
+void PlottingPositionHelper::transformScaledLogicToScene( std::vector<std::vector<css::drawing::Position3D>>& rPolygon ) const
+{
+ drawing::Position3D aScenePosition;
+ for( sal_Int32 nS = static_cast<sal_Int32>(rPolygon.size()); nS--;)
+ {
+ auto valuesRange = rPolygon[nS].data();
+ for( sal_Int32 nP = rPolygon[nS].size(); nP--; )
+ {
+ double& fX = valuesRange[nP].PositionX;
+ double& fY = valuesRange[nP].PositionY;
+ double& fZ = valuesRange[nP].PositionZ;
aScenePosition = transformScaledLogicToScene( fX,fY,fZ,true );
fX = aScenePosition.PositionX;
fY = aScenePosition.PositionY;
@@ -388,22 +407,18 @@ void PolarPlottingPositionHelper::setScales( std::vector< ExplicitScaleData >&&
return aRet;
}
-uno::Reference< XTransformation > PolarPlottingPositionHelper::getTransformationScaledLogicToScene() const
+::chart::XTransformation2* PolarPlottingPositionHelper::getTransformationScaledLogicToScene() const
{
- if( !m_xTransformationLogicToScene.is() )
- m_xTransformationLogicToScene = new VPolarTransformation(*this);
- return m_xTransformationLogicToScene;
+ if( !m_xTransformationLogicToScene )
+ m_xTransformationLogicToScene.reset(new VPolarTransformation(*this));
+ return m_xTransformationLogicToScene.get();
}
double PolarPlottingPositionHelper::getWidthAngleDegree( double& fStartLogicValueOnAngleAxis, double& fEndLogicValueOnAngleAxis ) const
{
const ExplicitScaleData& rAngleScale = m_bSwapXAndY ? m_aScales[1] : m_aScales[0];
if( rAngleScale.Orientation != AxisOrientation_MATHEMATICAL )
- {
- double fHelp = fEndLogicValueOnAngleAxis;
- fEndLogicValueOnAngleAxis = fStartLogicValueOnAngleAxis;
- fStartLogicValueOnAngleAxis = fHelp;
- }
+ std::swap( fStartLogicValueOnAngleAxis, fEndLogicValueOnAngleAxis );
double fStartAngleDegree = transformToAngleDegree( fStartLogicValueOnAngleAxis );
double fEndAngleDegree = transformToAngleDegree( fEndLogicValueOnAngleAxis );