summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cui/source/tabpages/transfrm.cxx216
-rw-r--r--filter/source/msfilter/escherex.cxx201
-rw-r--r--filter/source/msfilter/msdffimp.cxx2
-rw-r--r--include/filter/msfilter/escherex.hxx6
-rw-r--r--include/oox/export/drawingml.hxx12
-rw-r--r--include/svx/EnhancedCustomShape2d.hxx4
-rw-r--r--oox/source/export/drawingml.cxx43
-rw-r--r--oox/source/export/shapes.cxx14
-rw-r--r--svx/source/customshapes/EnhancedCustomShape2d.cxx41
-rw-r--r--svx/source/customshapes/EnhancedCustomShape3d.cxx62
-rw-r--r--svx/source/customshapes/EnhancedCustomShape3d.hxx15
-rw-r--r--svx/source/customshapes/EnhancedCustomShapeEngine.cxx259
-rw-r--r--svx/source/customshapes/EnhancedCustomShapeFontWork.cxx81
-rw-r--r--svx/source/customshapes/EnhancedCustomShapeFontWork.hxx4
-rw-r--r--svx/source/customshapes/EnhancedCustomShapeHandle.cxx31
15 files changed, 608 insertions, 383 deletions
diff --git a/cui/source/tabpages/transfrm.cxx b/cui/source/tabpages/transfrm.cxx
index 7ce63c79aa0d..bb95a7ca5153 100644
--- a/cui/source/tabpages/transfrm.cxx
+++ b/cui/source/tabpages/transfrm.cxx
@@ -24,6 +24,7 @@
#include <svx/svdobj.hxx>
#include <svx/svdpagv.hxx>
#include <svx/svdotext.hxx>
+#include <svx/svdoashp.hxx>
#include <svx/sderitm.hxx>
#include <svx/dialogs.hrc>
#include <svx/transfrmhelper.hxx>
@@ -530,42 +531,80 @@ bool SvxSlantTabPage::FillItemSet(SfxItemSet* rAttrs)
if (!bControlPointsChanged)
return bModified;
- SdrObject* pObj = pView->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj();
- SdrModel* pModel = pObj->GetModel();
- SdrUndoAction* pUndo = pModel->IsUndoEnabled() ?
- pModel->GetSdrUndoFactory().CreateUndoAttrObject(*pObj) :
- nullptr;
+ bool bSelectionIsSdrObjCustomShape(false);
- if (pUndo)
- pModel->BegUndo(pUndo->GetComment());
+ while(true)
+ {
+ if(nullptr == pView)
+ {
+ break;
+ }
+
+ if(0 == pView->GetMarkedObjectList().GetMarkCount())
+ {
+ break;
+ }
- EnhancedCustomShape2d aShape(pObj);
- ::tools::Rectangle aLogicRect = aShape.GetLogicRect();
+ SdrObject* pCandidate(pView->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj());
- for (int i = 0; i < 2; ++i)
+ if(nullptr == pCandidate)
+ {
+ break;
+ }
+
+ if(nullptr == dynamic_cast< SdrObjCustomShape* >(pCandidate))
+ {
+ break;
+ }
+
+ bSelectionIsSdrObjCustomShape = true;
+ break;
+ }
+
+ if(bSelectionIsSdrObjCustomShape)
{
- if (m_aControlX[i]->IsValueChangedFromSaved() || m_aControlY[i]->IsValueChangedFromSaved())
+ SdrObjCustomShape& rSdrObjCustomShape(
+ static_cast< SdrObjCustomShape& >(
+ *pView->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj()));
+ SdrModel* pModel(rSdrObjCustomShape.GetModel());
+ SdrUndoAction* pUndo(
+ pModel->IsUndoEnabled()
+ ? pModel->GetSdrUndoFactory().CreateUndoAttrObject(rSdrObjCustomShape)
+ : nullptr);
+
+ if(pUndo)
{
- Point aNewPosition(GetCoreValue(*m_aControlX[i], ePoolUnit),
- GetCoreValue(*m_aControlY[i], ePoolUnit));
- aNewPosition.Move(aLogicRect.Left(), aLogicRect.Top());
+ pModel->BegUndo(pUndo->GetComment());
+ }
- css::awt::Point aPosition;
- aPosition.X = aNewPosition.X();
- aPosition.Y = aNewPosition.Y();
+ EnhancedCustomShape2d aShape(rSdrObjCustomShape);
+ ::tools::Rectangle aLogicRect = aShape.GetLogicRect();
- aShape.SetHandleControllerPosition(i, aPosition);
+ for (int i = 0; i < 2; ++i)
+ {
+ if (m_aControlX[i]->IsValueChangedFromSaved() || m_aControlY[i]->IsValueChangedFromSaved())
+ {
+ Point aNewPosition(GetCoreValue(*m_aControlX[i], ePoolUnit),
+ GetCoreValue(*m_aControlY[i], ePoolUnit));
+ aNewPosition.Move(aLogicRect.Left(), aLogicRect.Top());
+
+ css::awt::Point aPosition;
+ aPosition.X = aNewPosition.X();
+ aPosition.Y = aNewPosition.Y();
+
+ aShape.SetHandleControllerPosition(i, aPosition);
+ }
}
- }
- pObj->SetChanged();
- pObj->BroadcastObjectChange();
- bModified = true;
+ rSdrObjCustomShape.SetChanged();
+ rSdrObjCustomShape.BroadcastObjectChange();
+ bModified = true;
- if (pUndo)
- {
- pModel->AddUndo(pUndo);
- pModel->EndUndo();
+ if (pUndo)
+ {
+ pModel->AddUndo(pUndo);
+ pModel->EndUndo();
+ }
}
return bModified;
@@ -622,67 +661,94 @@ void SvxSlantTabPage::Reset(const SfxItemSet* rAttrs)
m_pMtrAngle->SaveValue();
- const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
- if (rMarkList.GetMarkCount() == 1)
+ bool bSelectionIsSdrObjCustomShape(false);
+
+ while(true)
{
- SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
- SdrObjKind eKind = static_cast<SdrObjKind>(pObj->GetObjIdentifier());
- if (eKind == OBJ_CUSTOMSHAPE)
+ if(nullptr == pView)
+ {
+ break;
+ }
+
+ if(1 != pView->GetMarkedObjectList().GetMarkCount())
{
- //save geometry
- SdrCustomShapeGeometryItem aInitialGeometry =
- pObj->GetMergedItem(SDRATTR_CUSTOMSHAPE_GEOMETRY);
+ break;
+ }
- EnhancedCustomShape2d aShape(pObj);
+ SdrObject* pCandidate(pView->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj());
- for (int i = 0; i < 2; ++i)
- {
- Point aInitialPosition;
- if (!aShape.GetHandlePosition(i, aInitialPosition))
- break;
- m_aControlGroups[i]->Enable();
- css::awt::Point aPosition;
+ if(nullptr == pCandidate)
+ {
+ break;
+ }
- aPosition.X = SAL_MAX_INT32/2;
- aPosition.Y = SAL_MAX_INT32/2;
- aShape.SetHandleControllerPosition(i, aPosition);
- Point aMaxPosition;
- aShape.GetHandlePosition(i, aMaxPosition);
+ if(nullptr == dynamic_cast< SdrObjCustomShape* >(pCandidate))
+ {
+ break;
+ }
- aPosition.X = SAL_MIN_INT32/2;
- aPosition.Y = SAL_MIN_INT32/2;
- aShape.SetHandleControllerPosition(i, aPosition);
- Point aMinPosition;
- aShape.GetHandlePosition(i, aMinPosition);
+ bSelectionIsSdrObjCustomShape = true;
+ break;
+ }
- ::tools::Rectangle aLogicRect = aShape.GetLogicRect();
- aInitialPosition.Move(-aLogicRect.Left(), -aLogicRect.Top());
- aMaxPosition.Move(-aLogicRect.Left(), -aLogicRect.Top());
- aMinPosition.Move(-aLogicRect.Left(), -aLogicRect.Top());
+ if(bSelectionIsSdrObjCustomShape)
+ {
+ SdrObjCustomShape& rSdrObjCustomShape(
+ static_cast< SdrObjCustomShape& >(
+ *pView->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj()));
- SetMetricValue(*m_aControlX[i], aInitialPosition.X(), ePoolUnit);
- SetMetricValue(*m_aControlY[i], aInitialPosition.Y(), ePoolUnit);
+ //save geometry
+ SdrCustomShapeGeometryItem aInitialGeometry(rSdrObjCustomShape.GetMergedItem(SDRATTR_CUSTOMSHAPE_GEOMETRY));
+ EnhancedCustomShape2d aShape(rSdrObjCustomShape);
- if (aMaxPosition.X() == aMinPosition.X())
- m_aControlGroupX[i]->Disable();
- else
- {
- m_aControlX[i]->SetMin(aMinPosition.X(), FUNIT_MM);
- m_aControlX[i]->SetMax(aMaxPosition.X(), FUNIT_MM);
- }
- if (aMaxPosition.Y() == aMinPosition.Y())
- m_aControlGroupY[i]->Disable();
- else
- {
- m_aControlY[i]->SetMin(aMinPosition.Y(), FUNIT_MM);
- m_aControlY[i]->SetMax(aMaxPosition.Y(), FUNIT_MM);
- }
- }
+ for (int i = 0; i < 2; ++i)
+ {
+ Point aInitialPosition;
+ if (!aShape.GetHandlePosition(i, aInitialPosition))
+ break;
+ m_aControlGroups[i]->Enable();
+ css::awt::Point aPosition;
+
+ aPosition.X = SAL_MAX_INT32/2;
+ aPosition.Y = SAL_MAX_INT32/2;
+ aShape.SetHandleControllerPosition(i, aPosition);
+ Point aMaxPosition;
+ aShape.GetHandlePosition(i, aMaxPosition);
+
+ aPosition.X = SAL_MIN_INT32/2;
+ aPosition.Y = SAL_MIN_INT32/2;
+ aShape.SetHandleControllerPosition(i, aPosition);
+ Point aMinPosition;
+ aShape.GetHandlePosition(i, aMinPosition);
+
+ ::tools::Rectangle aLogicRect = aShape.GetLogicRect();
+ aInitialPosition.Move(-aLogicRect.Left(), -aLogicRect.Top());
+ aMaxPosition.Move(-aLogicRect.Left(), -aLogicRect.Top());
+ aMinPosition.Move(-aLogicRect.Left(), -aLogicRect.Top());
- //restore geometry
- pObj->SetMergedItem(aInitialGeometry);
+ SetMetricValue(*m_aControlX[i], aInitialPosition.X(), ePoolUnit);
+ SetMetricValue(*m_aControlY[i], aInitialPosition.Y(), ePoolUnit);
+
+ if (aMaxPosition.X() == aMinPosition.X())
+ m_aControlGroupX[i]->Disable();
+ else
+ {
+ m_aControlX[i]->SetMin(aMinPosition.X(), FUNIT_MM);
+ m_aControlX[i]->SetMax(aMaxPosition.X(), FUNIT_MM);
+ }
+ if (aMaxPosition.Y() == aMinPosition.Y())
+ m_aControlGroupY[i]->Disable();
+ else
+ {
+ m_aControlY[i]->SetMin(aMinPosition.Y(), FUNIT_MM);
+ m_aControlY[i]->SetMax(aMaxPosition.Y(), FUNIT_MM);
+ }
}
+
+ //restore geometry
+ rSdrObjCustomShape.SetMergedItem(aInitialGeometry);
}
+
for (int i = 0; i < 2; ++i)
{
m_aControlX[i]->SaveValue();
diff --git a/filter/source/msfilter/escherex.cxx b/filter/source/msfilter/escherex.cxx
index 9c7c01c5f0e6..228172a933c1 100644
--- a/filter/source/msfilter/escherex.cxx
+++ b/filter/source/msfilter/escherex.cxx
@@ -2400,109 +2400,109 @@ bool GetValueForEnhancedCustomShapeHandleParameter( sal_Int32& nRetValue, const
return bSpecial;
}
-void ConvertEnhancedCustomShapeEquation( SdrObjCustomShape* pCustoShape,
- std::vector< EnhancedCustomShapeEquation >& rEquations, std::vector< sal_Int32 >& rEquationOrder )
+void ConvertEnhancedCustomShapeEquation(
+ const SdrObjCustomShape& rSdrObjCustomShape,
+ std::vector< EnhancedCustomShapeEquation >& rEquations,
+ std::vector< sal_Int32 >& rEquationOrder )
{
- if ( pCustoShape )
+ uno::Sequence< OUString > sEquationSource;
+ const SdrCustomShapeGeometryItem& rGeometryItem =
+ rSdrObjCustomShape.GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY );
+ const uno::Any* pAny = rGeometryItem.GetPropertyValueByName( "Equations" );
+ if ( pAny )
+ *pAny >>= sEquationSource;
+ sal_Int32 nEquationSourceCount = sEquationSource.getLength();
+ if ( nEquationSourceCount && (nEquationSourceCount <= 128) )
{
- uno::Sequence< OUString > sEquationSource;
- const SdrCustomShapeGeometryItem& rGeometryItem =
- pCustoShape->GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY );
- const uno::Any* pAny = rGeometryItem.GetPropertyValueByName( "Equations" );
- if ( pAny )
- *pAny >>= sEquationSource;
- sal_Int32 nEquationSourceCount = sEquationSource.getLength();
- if ( nEquationSourceCount && (nEquationSourceCount <= 128) )
+ sal_Int32 i;
+ for ( i = 0; i < nEquationSourceCount; i++ )
{
- sal_Int32 i;
- for ( i = 0; i < nEquationSourceCount; i++ )
+ try
{
- EnhancedCustomShape2d aCustoShape2d( pCustoShape );
- try
+ std::shared_ptr< EnhancedCustomShape::ExpressionNode > aExpressNode(
+ EnhancedCustomShape::FunctionParser::parseFunction(
+ sEquationSource[ i ],
+ const_cast< SdrObjCustomShape& >(rSdrObjCustomShape)));
+ drawing::EnhancedCustomShapeParameter aPara( aExpressNode->fillNode( rEquations, nullptr, 0 ) );
+ if ( aPara.Type != drawing::EnhancedCustomShapeParameterType::EQUATION )
{
- std::shared_ptr< EnhancedCustomShape::ExpressionNode > aExpressNode(
- EnhancedCustomShape::FunctionParser::parseFunction( sEquationSource[ i ], aCustoShape2d ) );
- drawing::EnhancedCustomShapeParameter aPara( aExpressNode->fillNode( rEquations, nullptr, 0 ) );
- if ( aPara.Type != drawing::EnhancedCustomShapeParameterType::EQUATION )
- {
- EnhancedCustomShapeEquation aEquation;
- aEquation.nOperation = 0;
- EnhancedCustomShape::FillEquationParameter( aPara, 0, aEquation );
- rEquations.push_back( aEquation );
- }
- }
- catch ( const EnhancedCustomShape::ParseError& )
- {
- EnhancedCustomShapeEquation aEquation; // ups, we should not be here,
- aEquation.nOperation = 0; // creating a default equation with value 1
- aEquation.nPara[ 0 ] = 1; // hoping that this will not break anything
+ EnhancedCustomShapeEquation aEquation;
+ aEquation.nOperation = 0;
+ EnhancedCustomShape::FillEquationParameter( aPara, 0, aEquation );
rEquations.push_back( aEquation );
}
- catch ( ... )
- {
- EnhancedCustomShapeEquation aEquation; // #i112309# EnhancedCustomShape::Parse error
- aEquation.nOperation = 0; // not caught on linux platform
- aEquation.nPara[ 0 ] = 1;
- rEquations.push_back( aEquation );
- }
- rEquationOrder.push_back( rEquations.size() - 1 );
}
- // now updating our old equation indices, they are marked with a bit in the hiword of nOperation
- for (auto & equation : rEquations)
+ catch ( const EnhancedCustomShape::ParseError& )
+ {
+ EnhancedCustomShapeEquation aEquation; // ups, we should not be here,
+ aEquation.nOperation = 0; // creating a default equation with value 1
+ aEquation.nPara[ 0 ] = 1; // hoping that this will not break anything
+ rEquations.push_back( aEquation );
+ }
+ catch ( ... )
{
- sal_uInt32 nMask = 0x20000000;
- for( i = 0; i < 3; i++ )
+ EnhancedCustomShapeEquation aEquation; // #i112309# EnhancedCustomShape::Parse error
+ aEquation.nOperation = 0; // not caught on linux platform
+ aEquation.nPara[ 0 ] = 1;
+ rEquations.push_back( aEquation );
+ }
+ rEquationOrder.push_back( rEquations.size() - 1 );
+ }
+ // now updating our old equation indices, they are marked with a bit in the hiword of nOperation
+ for (auto & equation : rEquations)
+ {
+ sal_uInt32 nMask = 0x20000000;
+ for( i = 0; i < 3; i++ )
+ {
+ if ( equation.nOperation & nMask )
{
- if ( equation.nOperation & nMask )
- {
- equation.nOperation ^= nMask;
- const size_t nIndex(equation.nPara[ i ] & 0x3ff);
+ equation.nOperation ^= nMask;
+ const size_t nIndex(equation.nPara[ i ] & 0x3ff);
- // #i124661# check index access, there are cases where this is out of bound leading
- // to errors up to crashes when executed
- if(nIndex < rEquationOrder.size())
- {
- equation.nPara[ i ] = rEquationOrder[ nIndex ] | 0x400;
- }
- else
- {
- OSL_ENSURE(false, "Attempted out of bound access to rEquationOrder of CustomShape (!)");
- }
+ // #i124661# check index access, there are cases where this is out of bound leading
+ // to errors up to crashes when executed
+ if(nIndex < rEquationOrder.size())
+ {
+ equation.nPara[ i ] = rEquationOrder[ nIndex ] | 0x400;
+ }
+ else
+ {
+ OSL_ENSURE(false, "Attempted out of bound access to rEquationOrder of CustomShape (!)");
}
- nMask <<= 1;
}
+ nMask <<= 1;
}
}
}
}
-bool EscherPropertyContainer::IsDefaultObject( SdrObjCustomShape const * pCustoShape , const MSO_SPT eShapeType )
+bool EscherPropertyContainer::IsDefaultObject(
+ const SdrObjCustomShape& rSdrObjCustomShape,
+ const MSO_SPT eShapeType)
{
- bool bIsDefaultObject = false;
switch(eShapeType)
{
// if the custom shape is not default shape of ppt, return sal_Fasle;
case mso_sptTearDrop:
- return bIsDefaultObject;
+ return false;
default:
break;
}
- if ( pCustoShape )
+ if(rSdrObjCustomShape.IsDefaultGeometry( SdrObjCustomShape::DefaultType::Equations )
+ && rSdrObjCustomShape.IsDefaultGeometry( SdrObjCustomShape::DefaultType::Viewbox )
+ && rSdrObjCustomShape.IsDefaultGeometry( SdrObjCustomShape::DefaultType::Path )
+ && rSdrObjCustomShape.IsDefaultGeometry( SdrObjCustomShape::DefaultType::Gluepoints )
+ && rSdrObjCustomShape.IsDefaultGeometry( SdrObjCustomShape::DefaultType::Segments )
+ && rSdrObjCustomShape.IsDefaultGeometry( SdrObjCustomShape::DefaultType::StretchX )
+ && rSdrObjCustomShape.IsDefaultGeometry( SdrObjCustomShape::DefaultType::StretchY )
+ && rSdrObjCustomShape.IsDefaultGeometry( SdrObjCustomShape::DefaultType::TextFrames ) )
{
- if ( pCustoShape->IsDefaultGeometry( SdrObjCustomShape::DefaultType::Equations )
- && pCustoShape->IsDefaultGeometry( SdrObjCustomShape::DefaultType::Viewbox )
- && pCustoShape->IsDefaultGeometry( SdrObjCustomShape::DefaultType::Path )
- && pCustoShape->IsDefaultGeometry( SdrObjCustomShape::DefaultType::Gluepoints )
- && pCustoShape->IsDefaultGeometry( SdrObjCustomShape::DefaultType::Segments )
- && pCustoShape->IsDefaultGeometry( SdrObjCustomShape::DefaultType::StretchX )
- && pCustoShape->IsDefaultGeometry( SdrObjCustomShape::DefaultType::StretchY )
- && pCustoShape->IsDefaultGeometry( SdrObjCustomShape::DefaultType::TextFrames ) )
- bIsDefaultObject = true;
+ return true;
}
- return bIsDefaultObject;
+ return false;
}
void EscherPropertyContainer::LookForPolarHandles( const MSO_SPT eShapeType, sal_Int32& nAdjustmentsWhichNeedsToBeConverted )
@@ -2552,8 +2552,12 @@ void EscherPropertyContainer::CreateCustomShapeProperties( const MSO_SPT eShapeT
uno::Reference< beans::XPropertySet > aXPropSet( rXShape, uno::UNO_QUERY );
if ( aXPropSet.is() )
{
- SdrObjCustomShape* pCustoShape = static_cast<SdrObjCustomShape*>(GetSdrObjectFromXShape( rXShape ));
- if ( !pCustoShape ) return;
+ if(nullptr == dynamic_cast< SdrObjCustomShape* >(GetSdrObjectFromXShape(rXShape)))
+ {
+ return;
+ }
+
+ SdrObjCustomShape& rSdrObjCustomShape(static_cast< SdrObjCustomShape& >(*GetSdrObjectFromXShape(rXShape)));
const OUString sCustomShapeGeometry( "CustomShapeGeometry" );
uno::Any aGeoPropSet = aXPropSet->getPropertyValue( sCustomShapeGeometry );
uno::Sequence< beans::PropertyValue > aGeoPropSeq;
@@ -2576,12 +2580,18 @@ void EscherPropertyContainer::CreateCustomShapeProperties( const MSO_SPT eShapeT
sal_Int32 nAdjustmentsWhichNeedsToBeConverted = 0;
uno::Sequence< beans::PropertyValues > aHandlesPropSeq;
bool bPredefinedHandlesUsed = true;
- bool bIsDefaultObject = IsDefaultObject( pCustoShape , eShapeType);
+ const bool bIsDefaultObject(
+ IsDefaultObject(
+ rSdrObjCustomShape,
+ eShapeType));
// convert property "Equations" into std::vector< EnhancedCustomShapeEquationEquation >
std::vector< EnhancedCustomShapeEquation > aEquations;
std::vector< sal_Int32 > aEquationOrder;
- ConvertEnhancedCustomShapeEquation( pCustoShape, aEquations, aEquationOrder );
+ ConvertEnhancedCustomShapeEquation(
+ rSdrObjCustomShape,
+ aEquations,
+ aEquationOrder);
sal_Int32 i, nCount = aGeoPropSeq.getLength();
for ( i = 0; i < nCount; i++ )
@@ -3421,7 +3431,7 @@ void EscherPropertyContainer::CreateCustomShapeProperties( const MSO_SPT eShapeT
case drawing::TextHorizontalAdjust_BLOCK:
{
drawing::TextFitToSizeType const eFTS(
- pCustoShape->GetMergedItem( SDRATTR_TEXT_FITTOSIZE ).GetValue() );
+ rSdrObjCustomShape.GetMergedItem( SDRATTR_TEXT_FITTOSIZE ).GetValue() );
if (eFTS == drawing::TextFitToSizeType_ALLLINES ||
eFTS == drawing::TextFitToSizeType_PROPORTIONAL)
{
@@ -3441,7 +3451,7 @@ void EscherPropertyContainer::CreateCustomShapeProperties( const MSO_SPT eShapeT
}
if((nTextPathFlags & 0x4000) != 0) // Is Font work
{
- OutlinerParaObject* pOutlinerParaObject = pCustoShape->GetOutlinerParaObject();
+ OutlinerParaObject* pOutlinerParaObject(rSdrObjCustomShape.GetOutlinerParaObject());
if ( pOutlinerParaObject && pOutlinerParaObject->IsVertical() )
nTextPathFlags |= 0x2000;
}
@@ -4538,11 +4548,13 @@ sal_uInt32 EscherConnectorListEntry::GetConnectorRule( bool bFirst )
if (aType == "drawing.Custom")
{
- SdrObject* pCustoShape(GetSdrObjectFromXShape(aXShape));
- if (dynamic_cast<const SdrObjCustomShape*>(pCustoShape) != nullptr)
+ const bool bIsSdrObjCustomShape(nullptr != dynamic_cast< SdrObjCustomShape* >(GetSdrObjectFromXShape(aXShape)));
+
+ if(bIsSdrObjCustomShape)
{
+ SdrObjCustomShape& rSdrObjCustomShape(static_cast< SdrObjCustomShape& >(*GetSdrObjectFromXShape(aXShape)));
const SdrCustomShapeGeometryItem& rGeometryItem =
- pCustoShape->GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY );
+ rSdrObjCustomShape.GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY );
const OUString sPath( "Path" );
const OUString sType( "Type" );
@@ -4563,7 +4575,7 @@ sal_uInt32 EscherConnectorListEntry::GetConnectorRule( bool bFirst )
if ( nGluePointType == drawing::EnhancedCustomShapeGluePointType::CUSTOM )
{
- const SdrGluePointList* pList = pCustoShape->GetGluePointList();
+ const SdrGluePointList* pList = rSdrObjCustomShape.GetGluePointList();
if ( pList )
{
tools::Polygon aPoly;
@@ -4573,7 +4585,7 @@ sal_uInt32 EscherConnectorListEntry::GetConnectorRule( bool bFirst )
for ( nNum = 0; nNum < nCnt; nNum++ )
{
const SdrGluePoint& rGP = (*pList)[ nNum ];
- Point aPt( rGP.GetAbsolutePos( *pCustoShape ) );
+ Point aPt(rGP.GetAbsolutePos(rSdrObjCustomShape));
aPoly.Insert( POLY_APPEND, aPt );
}
nRule = GetClosestPoint( aPoly, aRefPoint );
@@ -4583,15 +4595,25 @@ sal_uInt32 EscherConnectorListEntry::GetConnectorRule( bool bFirst )
}
else if ( nGluePointType == drawing::EnhancedCustomShapeGluePointType::SEGMENTS )
{
- SdrObject* pObject = pCustoShape->DoConvertToPolyObj(true, true);
- if (auto pSdrPathObj = dynamic_cast<const SdrPathObj*>(pObject))
- {
- sal_Int16 a, b, nIndex = 0;
- sal_uInt32 nDistance = 0xffffffff;
+ tools::PolyPolygon aPolyPoly;
+ SdrObject* pTemporyryConvertResultObject(rSdrObjCustomShape.DoConvertToPolyObj(true, true));
+ SdrPathObj* pSdrPathObj(dynamic_cast< SdrPathObj* >(pTemporyryConvertResultObject));
+ if(pSdrPathObj)
+ {
// #i74631# use explicit constructor here. Also XPolyPolygon is not necessary,
// reducing to PolyPolygon
- const tools::PolyPolygon aPolyPoly(pSdrPathObj->GetPathPoly());
+ aPolyPoly = tools::PolyPolygon(pSdrPathObj->GetPathPoly());
+ }
+
+ // do *not* forget to delete the temporary used SdrObject - possible memory leak (!)
+ SdrObject::Free(pTemporyryConvertResultObject);
+ pSdrPathObj = nullptr;
+
+ if(0 != aPolyPoly.Count())
+ {
+ sal_Int16 a, b, nIndex = 0;
+ sal_uInt32 nDistance = 0xffffffff;
for ( a = 0; a < aPolyPoly.Count(); a++ )
{
@@ -4610,6 +4632,7 @@ sal_uInt32 EscherConnectorListEntry::GetConnectorRule( bool bFirst )
nIndex++;
}
}
+
if ( nDistance != 0xffffffff )
bRectangularConnection = false;
}
diff --git a/filter/source/msfilter/msdffimp.cxx b/filter/source/msfilter/msdffimp.cxx
index 7c77dff78824..ac281e0bfdd1 100644
--- a/filter/source/msfilter/msdffimp.cxx
+++ b/filter/source/msfilter/msdffimp.cxx
@@ -4706,7 +4706,7 @@ SdrObject* SvxMSDffManager::ImportShape( const DffRecordHeader& rHd, SvStream& r
static_cast<SdrObjCustomShape*>(pRet)->MergeDefaultAttributes();
pRet->SetSnapRect( aObjData.aBoundRect );
- EnhancedCustomShape2d aCustomShape2d( pRet );
+ EnhancedCustomShape2d aCustomShape2d(static_cast<SdrObjCustomShape&>(*pRet));
aTextRect = aCustomShape2d.GetTextRect();
if( bIsConnector )
diff --git a/include/filter/msfilter/escherex.hxx b/include/filter/msfilter/escherex.hxx
index d9f83294b5a7..58d492402ac2 100644
--- a/include/filter/msfilter/escherex.hxx
+++ b/include/filter/msfilter/escherex.hxx
@@ -848,7 +848,11 @@ public:
sal_Int32& rnArrowLength,
sal_Int32& rnArrowWidth
);
- static bool IsDefaultObject( SdrObjCustomShape const * pCustoShape, const MSO_SPT eShapeType );
+
+ static bool IsDefaultObject(
+ const SdrObjCustomShape& rSdrObjCustomShape,
+ const MSO_SPT eShapeType);
+
static void LookForPolarHandles(
const MSO_SPT eShapeType,
sal_Int32& nAdjustmentsWhichNeedsToBeConverted
diff --git a/include/oox/export/drawingml.hxx b/include/oox/export/drawingml.hxx
index aa99c95c82e3..597874778bde 100644
--- a/include/oox/export/drawingml.hxx
+++ b/include/oox/export/drawingml.hxx
@@ -235,9 +235,15 @@ public:
void WritePresetShape( const char* pShape , std::vector< std::pair<sal_Int32,sal_Int32>> & rAvList );
void WritePresetShape( const char* pShape );
void WritePresetShape( const char* pShape, MSO_SPT eShapeType, bool bPredefinedHandlesUsed, sal_Int32 nAdjustmentsWhichNeedsToBeConverted, const css::beans::PropertyValue& rProp );
- bool WriteCustomGeometry( const css::uno::Reference<css::drawing::XShape>& rXShape, const SdrObjCustomShape* pShape );
- void WriteCustomGeometryPoint(const css::drawing::EnhancedCustomShapeParameterPair& rParamPair, const SdrObjCustomShape* pShape);
- static sal_Int32 GetCustomGeometryPointValue(const css::drawing::EnhancedCustomShapeParameter& rParam, const SdrObjCustomShape* pShape);
+ bool WriteCustomGeometry(
+ const css::uno::Reference<css::drawing::XShape>& rXShape,
+ const SdrObjCustomShape& rSdrObjCustomShape);
+ void WriteCustomGeometryPoint(
+ const css::drawing::EnhancedCustomShapeParameterPair& rParamPair,
+ const SdrObjCustomShape& rSdrObjCustomShape);
+ static sal_Int32 GetCustomGeometryPointValue(
+ const css::drawing::EnhancedCustomShapeParameter& rParam,
+ const SdrObjCustomShape& rSdrObjCustomShape);
void WritePolyPolygon( const tools::PolyPolygon& rPolyPolygon );
void WriteFill( const css::uno::Reference< css::beans::XPropertySet >& xPropSet );
void WriteShapeStyle( const css::uno::Reference< css::beans::XPropertySet >& rXPropSet );
diff --git a/include/svx/EnhancedCustomShape2d.hxx b/include/svx/EnhancedCustomShape2d.hxx
index 074ecfa0a124..8eb5021b3bad 100644
--- a/include/svx/EnhancedCustomShape2d.hxx
+++ b/include/svx/EnhancedCustomShape2d.hxx
@@ -72,7 +72,7 @@ namespace o3tl
class SVX_DLLPUBLIC EnhancedCustomShape2d : public SfxItemSet
{
- SdrObject* pCustomShapeObj;
+ SdrObjCustomShape& mrSdrObjCustomShape;
MSO_SPT eSpType;
sal_Int32 nCoordLeft;
@@ -189,7 +189,7 @@ class SVX_DLLPUBLIC EnhancedCustomShape2d : public SfxItemSet
bool GetHandlePosition( const sal_uInt32 nIndex, Point& rReturnPosition ) const;
bool SetHandleControllerPosition( const sal_uInt32 nIndex, const css::awt::Point& rPosition );
- EnhancedCustomShape2d( SdrObject* pSdrObjCustomShape );
+ EnhancedCustomShape2d(SdrObjCustomShape& rSdrObjCustomShape);
virtual ~EnhancedCustomShape2d() override;
SAL_DLLPRIVATE double GetEnumFunc( const EnhancedCustomShape::ExpressionFunct eVal ) const;
diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx
index 931f77e91a31..bf10bf23febc 100644
--- a/oox/source/export/drawingml.cxx
+++ b/oox/source/export/drawingml.cxx
@@ -2601,7 +2601,9 @@ void DrawingML::WritePresetShape( const char* pShape, MSO_SPT eShapeType, bool b
mpFS->endElementNS( XML_a, XML_prstGeom );
}
-bool DrawingML::WriteCustomGeometry( const Reference< XShape >& rXShape, const SdrObjCustomShape* pShape )
+bool DrawingML::WriteCustomGeometry(
+ const Reference< XShape >& rXShape,
+ const SdrObjCustomShape& rSdrObjCustomShape)
{
uno::Reference< beans::XPropertySet > aXPropSet;
uno::Any aAny( rXShape->queryInterface(cppu::UnoType<beans::XPropertySet>::get()));
@@ -2701,8 +2703,8 @@ bool DrawingML::WriteCustomGeometry( const Reference< XShape >& rXShape, const S
for ( int j = 0; j < aPairs.getLength(); ++j )
{
- sal_Int32 nX = GetCustomGeometryPointValue(aPairs[j].First, pShape);
- sal_Int32 nY = GetCustomGeometryPointValue(aPairs[j].Second, pShape);
+ sal_Int32 nX = GetCustomGeometryPointValue(aPairs[j].First, rSdrObjCustomShape);
+ sal_Int32 nY = GetCustomGeometryPointValue(aPairs[j].Second, rSdrObjCustomShape);
if (nX < nXMin)
nXMin = nX;
if (nY < nYMin)
@@ -2733,7 +2735,7 @@ bool DrawingML::WriteCustomGeometry( const Reference< XShape >& rXShape, const S
case drawing::EnhancedCustomShapeSegmentCommand::MOVETO :
{
mpFS->startElementNS( XML_a, XML_moveTo, FSEND );
- WriteCustomGeometryPoint(aPairs[nPairIndex], pShape);
+ WriteCustomGeometryPoint(aPairs[nPairIndex], rSdrObjCustomShape);
mpFS->endElementNS( XML_a, XML_moveTo );
nPairIndex++;
break;
@@ -2741,7 +2743,7 @@ bool DrawingML::WriteCustomGeometry( const Reference< XShape >& rXShape, const S
case drawing::EnhancedCustomShapeSegmentCommand::LINETO :
{
mpFS->startElementNS( XML_a, XML_lnTo, FSEND );
- WriteCustomGeometryPoint(aPairs[nPairIndex], pShape);
+ WriteCustomGeometryPoint(aPairs[nPairIndex], rSdrObjCustomShape);
mpFS->endElementNS( XML_a, XML_lnTo );
nPairIndex++;
break;
@@ -2751,7 +2753,7 @@ bool DrawingML::WriteCustomGeometry( const Reference< XShape >& rXShape, const S
mpFS->startElementNS( XML_a, XML_cubicBezTo, FSEND );
for( sal_uInt8 l = 0; l <= 2; ++l )
{
- WriteCustomGeometryPoint(aPairs[nPairIndex+l], pShape);
+ WriteCustomGeometryPoint(aPairs[nPairIndex+l], rSdrObjCustomShape);
}
mpFS->endElementNS( XML_a, XML_cubicBezTo );
nPairIndex += 3;
@@ -2782,7 +2784,7 @@ bool DrawingML::WriteCustomGeometry( const Reference< XShape >& rXShape, const S
mpFS->startElementNS( XML_a, XML_quadBezTo, FSEND );
for( sal_uInt8 l = 0; l < 2; ++l )
{
- WriteCustomGeometryPoint(aPairs[nPairIndex+l], pShape);
+ WriteCustomGeometryPoint(aPairs[nPairIndex+l], rSdrObjCustomShape);
}
mpFS->endElementNS( XML_a, XML_quadBezTo );
nPairIndex += 2;
@@ -2809,10 +2811,12 @@ bool DrawingML::WriteCustomGeometry( const Reference< XShape >& rXShape, const S
return false;
}
-void DrawingML::WriteCustomGeometryPoint(const drawing::EnhancedCustomShapeParameterPair& rParamPair, const SdrObjCustomShape* pShape)
+void DrawingML::WriteCustomGeometryPoint(
+ const drawing::EnhancedCustomShapeParameterPair& rParamPair,
+ const SdrObjCustomShape& rSdrObjCustomShape)
{
- sal_Int32 nX = GetCustomGeometryPointValue(rParamPair.First, pShape);
- sal_Int32 nY = GetCustomGeometryPointValue(rParamPair.Second, pShape);
+ sal_Int32 nX = GetCustomGeometryPointValue(rParamPair.First, rSdrObjCustomShape);
+ sal_Int32 nY = GetCustomGeometryPointValue(rParamPair.Second, rSdrObjCustomShape);
mpFS->singleElementNS( XML_a, XML_pt,
XML_x, OString::number(nX).getStr(),
@@ -2820,18 +2824,15 @@ void DrawingML::WriteCustomGeometryPoint(const drawing::EnhancedCustomShapeParam
FSEND );
}
-sal_Int32 DrawingML::GetCustomGeometryPointValue(const css::drawing::EnhancedCustomShapeParameter& rParam, const SdrObjCustomShape* pShape)
+sal_Int32 DrawingML::GetCustomGeometryPointValue(
+ const css::drawing::EnhancedCustomShapeParameter& rParam,
+ const SdrObjCustomShape& rSdrObjCustomShape)
{
- sal_Int32 nValue = 0;
- if(pShape)
- {
- const EnhancedCustomShape2d aCustoShape2d (const_cast<SdrObjCustomShape*>(pShape));
- double fValue = 0.0;
- aCustoShape2d.GetParameter(fValue, rParam, false, false);
- nValue = std::lround(fValue);
- }
- else
- rParam.Value >>= nValue;
+ const EnhancedCustomShape2d aCustoShape2d(const_cast< SdrObjCustomShape& >(rSdrObjCustomShape));
+ double fValue = 0.0;
+ aCustoShape2d.GetParameter(fValue, rParam, false, false);
+ sal_Int32 nValue(std::lround(fValue));
+
return nValue;
}
diff --git a/oox/source/export/shapes.cxx b/oox/source/export/shapes.cxx
index 97e1368f4368..c52c6a62b3cb 100644
--- a/oox/source/export/shapes.cxx
+++ b/oox/source/export/shapes.cxx
@@ -729,8 +729,12 @@ ShapeExport& ShapeExport::WriteCustomShape( const Reference< XShape >& xShape )
OUString sShapeType;
ShapeFlag nMirrorFlags = ShapeFlag::NONE;
MSO_SPT eShapeType = EscherPropertyContainer::GetCustomShapeType( xShape, nMirrorFlags, sShapeType );
- SdrObjCustomShape* pShape = static_cast<SdrObjCustomShape*>( GetSdrObjectFromXShape( xShape ) );
- bool bIsDefaultObject = EscherPropertyContainer::IsDefaultObject( pShape, eShapeType );
+ OSL_ENSURE(nullptr != dynamic_cast< SdrObjCustomShape* >(GetSdrObjectFromXShape(xShape)), "Not a SdrObjCustomShape (!)");
+ SdrObjCustomShape& rSdrObjCustomShape(static_cast< SdrObjCustomShape& >(*GetSdrObjectFromXShape(xShape)));
+ const bool bIsDefaultObject(
+ EscherPropertyContainer::IsDefaultObject(
+ rSdrObjCustomShape,
+ eShapeType));
const char* sPresetShape = msfilter::util::GetOOXMLPresetGeometry( USS( sShapeType ) );
SAL_INFO("oox.shape", "custom shape type: " << sShapeType << " ==> " << sPresetShape);
Sequence< PropertyValue > aGeometrySeq;
@@ -845,10 +849,10 @@ ShapeExport& ShapeExport::WriteCustomShape( const Reference< XShape >& xShape )
else if( bHasHandles )
bCustGeom = true;
- if (bHasHandles && bCustGeom && pShape)
+ if (bHasHandles && bCustGeom)
{
WriteShapeTransformation( xShape, XML_a, bFlipH, bFlipV, false, true );// do not flip, polypolygon coordinates are flipped already
- tools::PolyPolygon aPolyPolygon( pShape->GetLineGeometry(true) );
+ tools::PolyPolygon aPolyPolygon( rSdrObjCustomShape.GetLineGeometry(true) );
sal_Int32 nRotation = 0;
// The RotateAngle property's value is independent from any flipping, and that's exactly what we need here.
uno::Reference<beans::XPropertySet> xPropertySet(xShape, uno::UNO_QUERY);
@@ -864,7 +868,7 @@ ShapeExport& ShapeExport::WriteCustomShape( const Reference< XShape >& xShape )
else if (bCustGeom)
{
WriteShapeTransformation( xShape, XML_a, bFlipH, bFlipV );
- bool bSuccess = WriteCustomGeometry( xShape, pShape );
+ bool bSuccess = WriteCustomGeometry(xShape, rSdrObjCustomShape);
if (!bSuccess)
WritePresetShape( sPresetShape );
}
diff --git a/svx/source/customshapes/EnhancedCustomShape2d.cxx b/svx/source/customshapes/EnhancedCustomShape2d.cxx
index 39d694b112a8..17fe098ff3fe 100644
--- a/svx/source/customshapes/EnhancedCustomShape2d.cxx
+++ b/svx/source/customshapes/EnhancedCustomShape2d.cxx
@@ -690,9 +690,9 @@ void EnhancedCustomShape2d::SetPathSize( sal_Int32 nIndex )
fYRatio = 1.0;
}
-EnhancedCustomShape2d::EnhancedCustomShape2d( SdrObject* pAObj ) :
- SfxItemSet ( pAObj->GetMergedItemSet() ),
- pCustomShapeObj ( pAObj ),
+EnhancedCustomShape2d::EnhancedCustomShape2d(SdrObjCustomShape& rSdrObjCustomShape)
+: SfxItemSet ( rSdrObjCustomShape.GetMergedItemSet() ),
+ mrSdrObjCustomShape ( rSdrObjCustomShape ),
eSpType ( mso_sptNil ),
nCoordLeft ( 0 ),
nCoordTop ( 0 ),
@@ -702,8 +702,8 @@ EnhancedCustomShape2d::EnhancedCustomShape2d( SdrObject* pAObj ) :
nXRef ( 0x80000000 ),
nYRef ( 0x80000000 ),
nColorData ( 0 ),
- bFilled ( pAObj->GetMergedItem( XATTR_FILLSTYLE ).GetValue() != drawing::FillStyle_NONE ),
- bStroked ( pAObj->GetMergedItem( XATTR_LINESTYLE ).GetValue() != drawing::LineStyle_NONE ),
+ bFilled ( rSdrObjCustomShape.GetMergedItem( XATTR_FILLSTYLE ).GetValue() != drawing::FillStyle_NONE ),
+ bStroked ( rSdrObjCustomShape.GetMergedItem( XATTR_LINESTYLE ).GetValue() != drawing::LineStyle_NONE ),
bFlipH ( false ),
bFlipV ( false )
{
@@ -723,14 +723,14 @@ EnhancedCustomShape2d::EnhancedCustomShape2d( SdrObject* pAObj ) :
// 2D helper shape.
ClearItem(SDRATTR_SHADOW);
- Point aP( pCustomShapeObj->GetSnapRect().Center() );
- Size aS( pCustomShapeObj->GetLogicRect().GetSize() );
+ Point aP( mrSdrObjCustomShape.GetSnapRect().Center() );
+ Size aS( mrSdrObjCustomShape.GetLogicRect().GetSize() );
aP.AdjustX( -(aS.Width() / 2) );
aP.AdjustY( -(aS.Height() / 2) );
aLogicRect = tools::Rectangle( aP, aS );
OUString sShapeType;
- const SdrCustomShapeGeometryItem& rGeometryItem = pCustomShapeObj->GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY );
+ const SdrCustomShapeGeometryItem& rGeometryItem(mrSdrObjCustomShape.GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY ));
const Any* pAny = rGeometryItem.GetPropertyValueByName( "Type" );
if ( pAny ) {
*pAny >>= sShapeType;
@@ -746,10 +746,7 @@ EnhancedCustomShape2d::EnhancedCustomShape2d( SdrObject* pAObj ) :
if ( pAny )
*pAny >>= bFlipV;
- if ( dynamic_cast<const SdrObjCustomShape*>( pCustomShapeObj) != nullptr ) // should always be a SdrObjCustomShape, but you don't know
- nRotateAngle = static_cast<sal_Int32>(static_cast<SdrObjCustomShape*>(pCustomShapeObj)->GetObjectRotation() * 100.0);
- else
- nRotateAngle = pCustomShapeObj->GetRotateAngle();
+ nRotateAngle = static_cast<sal_Int32>(static_cast< SdrObjCustomShape& >(mrSdrObjCustomShape).GetObjectRotation() * 100.0);
/*const sal_Int32* pDefData =*/ ApplyShapeAttributes( rGeometryItem );
SetPathSize();
@@ -1170,7 +1167,7 @@ bool EnhancedCustomShape2d::GetHandlePosition( const sal_uInt32 nIndex, Point& r
}
rReturnPosition = GetPoint( aHandle.aPosition );
}
- const GeoStat aGeoStat( static_cast<SdrObjCustomShape*>(pCustomShapeObj)->GetGeoStat() );
+ const GeoStat aGeoStat(mrSdrObjCustomShape.GetGeoStat());
if ( aGeoStat.nShearAngle )
{
double nTan = aGeoStat.nTan;
@@ -1215,7 +1212,7 @@ bool EnhancedCustomShape2d::SetHandleControllerPosition( const sal_uInt32 nIndex
double a = -nRotateAngle * F_PI18000;
RotatePoint( aP, Point( aLogicRect.GetWidth() / 2, aLogicRect.GetHeight() / 2 ), sin( a ), cos( a ) );
}
- const GeoStat aGeoStat( static_cast<SdrObjCustomShape*>(pCustomShapeObj)->GetGeoStat() );
+ const GeoStat aGeoStat(mrSdrObjCustomShape.GetGeoStat());
if ( aGeoStat.nShearAngle )
{
double nTan = -aGeoStat.nTan;
@@ -1372,13 +1369,12 @@ bool EnhancedCustomShape2d::SetHandleControllerPosition( const sal_uInt32 nIndex
}
}
// and writing them back into the GeometryItem
- SdrCustomShapeGeometryItem aGeometryItem(
- pCustomShapeObj->GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY ));
+ SdrCustomShapeGeometryItem aGeometryItem(mrSdrObjCustomShape.GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY ));
css::beans::PropertyValue aPropVal;
aPropVal.Name = "AdjustmentValues";
aPropVal.Value <<= seqAdjustmentValues;
aGeometryItem.SetPropertyValue( aPropVal );
- pCustomShapeObj->SetMergedItem( aGeometryItem );
+ mrSdrObjCustomShape.SetMergedItem( aGeometryItem );
bRetValue = true;
}
}
@@ -1610,7 +1606,7 @@ void EnhancedCustomShape2d::CreateSubPath(
bIsDefaultPath = true;
OUString sShpType;
- SdrCustomShapeGeometryItem& rGeometryItem = const_cast<SdrCustomShapeGeometryItem&>(pCustomShapeObj->GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY ));
+ SdrCustomShapeGeometryItem& rGeometryItem = const_cast<SdrCustomShapeGeometryItem&>(mrSdrObjCustomShape.GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY ));
Any* pAny = rGeometryItem.GetPropertyValueByName( "Type" );
if ( pAny )
*pAny >>= sShpType;
@@ -1642,7 +1638,7 @@ void EnhancedCustomShape2d::CreateSubPath(
aPropVal.Name = "ViewBox";
aPropVal.Value <<= aViewBox;
rGeometryItem.SetPropertyValue( aPropVal );
- pCustomShapeObj->SetMergedItem( rGeometryItem );
+ mrSdrObjCustomShape.SetMergedItem( rGeometryItem );
}else{
_aCenter = GetPoint( seqCoordinates[ rSrcPt ], true, true );
GetParameter( fWidth, seqCoordinates[ rSrcPt + 1 ].First, true, false);
@@ -2257,7 +2253,7 @@ SdrObject* EnhancedCustomShape2d::CreatePathObj( bool bLineGeometryNeededOnly )
if ( !vObjectList.empty() )
{
- const SfxItemSet& rCustomShapeSet(pCustomShapeObj->GetMergedItemSet());
+ const SfxItemSet& rCustomShapeSet(mrSdrObjCustomShape.GetMergedItemSet());
const sal_uInt32 nColorCount(nColorData >> 28);
sal_uInt32 nColorIndex(0);
@@ -2325,10 +2321,7 @@ SdrObject* EnhancedCustomShape2d::CreatePathObj( bool bLineGeometryNeededOnly )
// to define that all helper geometites defined here (SdrObjects currently)
// will use the same FillGeometryDefinition (from the referenced SdrObjCustomShape).
// This will all same-filled objects look like filled smoothly with the same style.
- if(pCustomShapeObj)
- {
- pObj->setFillGeometryDefiningShape(pCustomShapeObj);
- }
+ pObj->setFillGeometryDefiningShape(&mrSdrObjCustomShape);
}
}
diff --git a/svx/source/customshapes/EnhancedCustomShape3d.cxx b/svx/source/customshapes/EnhancedCustomShape3d.cxx
index 820430b83435..60177fc9fbe8 100644
--- a/svx/source/customshapes/EnhancedCustomShape3d.cxx
+++ b/svx/source/customshapes/EnhancedCustomShape3d.cxx
@@ -175,8 +175,10 @@ drawing::Direction3D GetDirection3D( const SdrCustomShapeGeometryItem& rItem, co
}
-EnhancedCustomShape3d::Transformation2D::Transformation2D( const SdrObject* pCustomShape, const double *pM )
- : aCenter( pCustomShape->GetSnapRect().Center() )
+EnhancedCustomShape3d::Transformation2D::Transformation2D(
+ const SdrObjCustomShape& rSdrObjCustomShape,
+ const double *pM)
+: aCenter(rSdrObjCustomShape.GetSnapRect().Center())
, eProjectionMode( drawing::ProjectionMode_PARALLEL )
, fSkewAngle(0.0)
, fSkew(0.0)
@@ -185,7 +187,7 @@ EnhancedCustomShape3d::Transformation2D::Transformation2D( const SdrObject* pCus
, fOriginY(0.0)
, pMap( pM )
{
- const SdrCustomShapeGeometryItem& rGeometryItem = pCustomShape->GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY );
+ const SdrCustomShapeGeometryItem& rGeometryItem(rSdrObjCustomShape.GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY ));
const Any* pAny = rGeometryItem.GetPropertyValueByName( "Extrusion", "ProjectionMode" );
if ( pAny )
*pAny >>= eProjectionMode;
@@ -195,8 +197,8 @@ EnhancedCustomShape3d::Transformation2D::Transformation2D( const SdrObject* pCus
else
{
GetOrigin( rGeometryItem, fOriginX, fOriginY );
- fOriginX = fOriginX * pCustomShape->GetLogicRect().GetWidth();
- fOriginY = fOriginY * pCustomShape->GetLogicRect().GetHeight();
+ fOriginX = fOriginX * rSdrObjCustomShape.GetLogicRect().GetWidth();
+ fOriginY = fOriginY * rSdrObjCustomShape.GetLogicRect().GetHeight();
drawing::Position3D aViewPointDefault( 3472, -3472, 25000 );
drawing::Position3D aViewPoint( GetPosition3D( rGeometryItem, "ViewPoint", aViewPointDefault, pMap ) );
@@ -249,11 +251,13 @@ bool EnhancedCustomShape3d::Transformation2D::IsParallel() const
return eProjectionMode == css::drawing::ProjectionMode_PARALLEL;
}
-SdrObject* EnhancedCustomShape3d::Create3DObject( const SdrObject* pShape2d, const SdrObject* pCustomShape )
+SdrObject* EnhancedCustomShape3d::Create3DObject(
+ const SdrObject* pShape2d,
+ const SdrObjCustomShape& rSdrObjCustomShape)
{
SdrObject* pRet = nullptr;
- SdrModel* pModel = pCustomShape->GetModel();
- const SdrCustomShapeGeometryItem& rGeometryItem = pCustomShape->GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY );
+ SdrModel* pModel = rSdrObjCustomShape.GetModel();
+ const SdrCustomShapeGeometryItem& rGeometryItem = rSdrObjCustomShape.GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY );
double fMap, *pMap = nullptr;
if ( pModel )
@@ -274,17 +278,17 @@ SdrObject* EnhancedCustomShape3d::Create3DObject( const SdrObject* pShape2d, con
}
if ( GetBool( rGeometryItem, "Extrusion", false ) )
{
- bool bIsMirroredX = static_cast<const SdrObjCustomShape*>(pCustomShape)->IsMirroredX();
- bool bIsMirroredY = static_cast<const SdrObjCustomShape*>(pCustomShape)->IsMirroredY();
- tools::Rectangle aSnapRect( pCustomShape->GetLogicRect() );
- long nObjectRotation = pCustomShape->GetRotateAngle();
+ bool bIsMirroredX(rSdrObjCustomShape.IsMirroredX());
+ bool bIsMirroredY(rSdrObjCustomShape.IsMirroredY());
+ tools::Rectangle aSnapRect(rSdrObjCustomShape.GetLogicRect());
+ long nObjectRotation(rSdrObjCustomShape.GetRotateAngle());
if ( nObjectRotation )
{
double a = ( 36000 - nObjectRotation ) * nPi180;
long dx = aSnapRect.Right() - aSnapRect.Left();
long dy = aSnapRect.Bottom()- aSnapRect.Top();
Point aP( aSnapRect.TopLeft() );
- RotatePoint( aP, pCustomShape->GetSnapRect().Center(), sin( a ), cos( a ) );
+ RotatePoint( aP, rSdrObjCustomShape.GetSnapRect().Center(), sin( a ), cos( a ) );
aSnapRect.SetLeft( aP.X() );
aSnapRect.SetTop( aP.Y() );
aSnapRect.SetRight( aSnapRect.Left() + dx );
@@ -292,7 +296,7 @@ SdrObject* EnhancedCustomShape3d::Create3DObject( const SdrObject* pShape2d, con
}
Point aCenter( aSnapRect.Center() );
- SfxItemSet aSet( pCustomShape->GetMergedItemSet() );
+ SfxItemSet aSet( rSdrObjCustomShape.GetMergedItemSet() );
//SJ: vertical writing is not required, by removing this item no outliner is created
aSet.ClearItem( SDRATTR_TEXTDIRECTION );
@@ -530,7 +534,7 @@ SdrObject* EnhancedCustomShape3d::Create3DObject( const SdrObject* pShape2d, con
p3DObj->NbcSetLayer( pShape2d->GetLayer() );
p3DObj->SetMergedItemSet( aLocalSet );
if ( bUseExtrusionColor )
- p3DObj->SetMergedItem( XFillColorItem( "", pCustomShape->GetMergedItem( XATTR_SECONDARYFILLCOLOR ).GetColorValue() ) );
+ p3DObj->SetMergedItem( XFillColorItem( "", rSdrObjCustomShape.GetMergedItem( XATTR_SECONDARYFILLCOLOR ).GetColorValue() ) );
p3DObj->SetMergedItem( XFillStyleItem( drawing::FillStyle_SOLID ) );
p3DObj->SetMergedItem( Svx3DCloseFrontItem( false ) );
p3DObj->SetMergedItem( Svx3DCloseBackItem( false ) );
@@ -599,7 +603,7 @@ SdrObject* EnhancedCustomShape3d::Create3DObject( const SdrObject* pShape2d, con
double fXRotate, fYRotate;
GetRotateAngle( rGeometryItem, fXRotate, fYRotate );
- double fZRotate = static_cast<const SdrObjCustomShape*>(pCustomShape)->GetObjectRotation() * F_PI180;
+ double fZRotate(rSdrObjCustomShape.GetObjectRotation() * F_PI180);
if ( fZRotate != 0.0 )
aNewTransform.rotate( 0.0, 0.0, fZRotate );
if ( bIsMirroredX )
@@ -717,7 +721,12 @@ SdrObject* EnhancedCustomShape3d::Create3DObject( const SdrObject* pShape2d, con
pScene->GetProperties().SetObjectItem( makeSvx3DMaterialSpecularItem( aSpecularCol ) );
pScene->GetProperties().SetObjectItem( makeSvx3DMaterialSpecularIntensityItem( static_cast<sal_uInt16>(nIntensity) ) );
- pScene->SetLogicRect( CalculateNewSnapRect( pCustomShape, aSnapRect, aBoundRect2d, pMap ) );
+ pScene->SetLogicRect(
+ CalculateNewSnapRect(
+ rSdrObjCustomShape,
+ aSnapRect,
+ aBoundRect2d,
+ pMap));
// removing placeholder objects
for (std::vector< E3dCompoundObject* >::iterator aObjectListIter( aPlaceholderObjectList.begin() ); aObjectListIter != aPlaceholderObjectList.end(); )
@@ -732,9 +741,13 @@ SdrObject* EnhancedCustomShape3d::Create3DObject( const SdrObject* pShape2d, con
return pRet;
}
-tools::Rectangle EnhancedCustomShape3d::CalculateNewSnapRect( const SdrObject* pCustomShape, const tools::Rectangle& rSnapRect, const tools::Rectangle& rBoundRect, const double* pMap )
+tools::Rectangle EnhancedCustomShape3d::CalculateNewSnapRect(
+ const SdrObjCustomShape& rSdrObjCustomShape,
+ const tools::Rectangle& rSnapRect,
+ const tools::Rectangle& rBoundRect,
+ const double* pMap)
{
- const SdrCustomShapeGeometryItem& rGeometryItem = pCustomShape->GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY );
+ const SdrCustomShapeGeometryItem& rGeometryItem(rSdrObjCustomShape.GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY ));
const Point aCenter( rSnapRect.Center() );
double fExtrusionBackward, fExtrusionForward;
GetExtrusionDepth( rGeometryItem, pMap, fExtrusionBackward, fExtrusionForward );
@@ -759,16 +772,16 @@ tools::Rectangle EnhancedCustomShape3d::CalculateNewSnapRect( const SdrObject* p
double fXRotate, fYRotate;
GetRotateAngle( rGeometryItem, fXRotate, fYRotate );
- double fZRotate = - static_cast<const SdrObjCustomShape*>(pCustomShape)->GetObjectRotation() * F_PI180;
+ double fZRotate(rSdrObjCustomShape.GetObjectRotation() * F_PI180);
// rotating bound volume
basegfx::B3DHomMatrix aMatrix;
aMatrix.translate(-aRotationCenter.DirectionX, -aRotationCenter.DirectionY, -aRotationCenter.DirectionZ);
if ( fZRotate != 0.0 )
aMatrix.rotate( 0.0, 0.0, fZRotate );
- if ( static_cast<const SdrObjCustomShape*>(pCustomShape)->IsMirroredX() )
+ if (rSdrObjCustomShape.IsMirroredX())
aMatrix.scale( -1.0, 1, 1 );
- if ( static_cast<const SdrObjCustomShape*>(pCustomShape)->IsMirroredY() )
+ if (rSdrObjCustomShape.IsMirroredY())
aMatrix.scale( 1, -1.0, 1 );
if( fYRotate != 0.0 )
aMatrix.rotate( 0.0, fYRotate, 0.0 );
@@ -777,7 +790,10 @@ tools::Rectangle EnhancedCustomShape3d::CalculateNewSnapRect( const SdrObject* p
aMatrix.translate(aRotationCenter.DirectionX, aRotationCenter.DirectionY, aRotationCenter.DirectionZ);
aBoundVolume.transform(aMatrix);
- Transformation2D aTransformation2D( pCustomShape, pMap );
+ Transformation2D aTransformation2D(
+ rSdrObjCustomShape,
+ pMap);
+
if ( aTransformation2D.IsParallel() )
aBoundVolume = aTransformation2D.ApplySkewSettings( aBoundVolume );
diff --git a/svx/source/customshapes/EnhancedCustomShape3d.hxx b/svx/source/customshapes/EnhancedCustomShape3d.hxx
index 011d92ccc639..1c8290846b12 100644
--- a/svx/source/customshapes/EnhancedCustomShape3d.hxx
+++ b/svx/source/customshapes/EnhancedCustomShape3d.hxx
@@ -49,8 +49,9 @@ class EnhancedCustomShape3d final
const double* pMap;
public:
-
- Transformation2D( const SdrObject* pCustomShape, const double* pMap );
+ Transformation2D(
+ const SdrObjCustomShape& rSdrObjCustomShape,
+ const double* pMap);
basegfx::B3DPolygon ApplySkewSettings( const basegfx::B3DPolygon& rPolygon3D ) const;
Point Transform2D( const basegfx::B3DPoint& rPoint ) const;
@@ -59,10 +60,16 @@ class EnhancedCustomShape3d final
friend class Transformation2D;
- static tools::Rectangle CalculateNewSnapRect( const SdrObject* pCustomShape, const tools::Rectangle& rSnapRect, const tools::Rectangle& rBoundRect, const double* pMap );
+ static tools::Rectangle CalculateNewSnapRect(
+ const SdrObjCustomShape& rSdrObjCustomShape,
+ const tools::Rectangle& rSnapRect,
+ const tools::Rectangle& rBoundRect,
+ const double* pMap);
public:
- static SdrObject* Create3DObject( const SdrObject* pShape2d, const SdrObject* pCustomShape );
+ static SdrObject* Create3DObject(
+ const SdrObject* pShape2d,
+ const SdrObjCustomShape& rSdrObjCustomShape);
};
#endif
diff --git a/svx/source/customshapes/EnhancedCustomShapeEngine.cxx b/svx/source/customshapes/EnhancedCustomShapeEngine.cxx
index 30e7be880d3e..899ea6e03c26 100644
--- a/svx/source/customshapes/EnhancedCustomShapeEngine.cxx
+++ b/svx/source/customshapes/EnhancedCustomShapeEngine.cxx
@@ -72,7 +72,9 @@ class EnhancedCustomShapeEngine : public cppu::WeakImplHelper
css::uno::Reference< css::drawing::XShape > mxShape;
bool mbForceGroupWithText;
- SdrObject* ImplForceGroupWithText( const SdrObjCustomShape* pCustoObj, SdrObject* pRenderedShape );
+ SdrObject* ImplForceGroupWithText(
+ const SdrObjCustomShape& rSdrObjCustomShape,
+ SdrObject* pRenderedShape);
public:
EnhancedCustomShapeEngine();
@@ -147,13 +149,17 @@ Sequence< OUString > SAL_CALL EnhancedCustomShapeEngine::getSupportedServiceName
}
// XCustomShapeEngine
-SdrObject* EnhancedCustomShapeEngine::ImplForceGroupWithText( const SdrObjCustomShape* pCustoObj, SdrObject* pRenderedShape )
+SdrObject* EnhancedCustomShapeEngine::ImplForceGroupWithText(
+ const SdrObjCustomShape& rSdrObjCustomShape,
+ SdrObject* pRenderedShape)
{
- bool bHasText = pCustoObj->HasText();
+ const bool bHasText(rSdrObjCustomShape.HasText());
+
if ( pRenderedShape || bHasText )
{
// applying shadow
- const SdrObject* pShadowGeometry = pCustoObj->GetSdrObjectShadowFromCustomShape();
+ const SdrObject* pShadowGeometry(rSdrObjCustomShape.GetSdrObjectShadowFromCustomShape());
+
if ( pShadowGeometry )
{
if ( pRenderedShape )
@@ -175,37 +181,48 @@ SdrObject* EnhancedCustomShapeEngine::ImplForceGroupWithText( const SdrObjCustom
{
// #i37011# also create a text object and add at rPos + 1
SdrObject* pTextObj = SdrObjFactory::MakeNewObject(
- pCustoObj->GetObjInventor(), OBJ_TEXT, nullptr, pCustoObj->GetModel());
+ rSdrObjCustomShape.GetObjInventor(),
+ OBJ_TEXT,
+ nullptr,
+ rSdrObjCustomShape.GetModel());
// Copy text content
- OutlinerParaObject* pParaObj = pCustoObj->GetOutlinerParaObject();
+ OutlinerParaObject* pParaObj(rSdrObjCustomShape.GetOutlinerParaObject());
+
if( pParaObj )
pTextObj->NbcSetOutlinerParaObject( new OutlinerParaObject(*pParaObj) );
// copy all attributes
- SfxItemSet aTargetItemSet( pCustoObj->GetMergedItemSet() );
+ SfxItemSet aTargetItemSet(rSdrObjCustomShape.GetMergedItemSet());
// clear fill and line style
aTargetItemSet.Put(XLineStyleItem(drawing::LineStyle_NONE));
aTargetItemSet.Put(XFillStyleItem(drawing::FillStyle_NONE));
// get the text bounds and set at text object
- tools::Rectangle aTextBounds = pCustoObj->GetSnapRect();
- SdrObject* pSdrObjCustomShape( GetSdrObjectFromXShape( mxShape ) );
- if ( pSdrObjCustomShape )
+ tools::Rectangle aTextBounds(rSdrObjCustomShape.GetSnapRect());
+ const bool bIsSdrObjCustomShape(nullptr != dynamic_cast< SdrObjCustomShape* >(GetSdrObjectFromXShape(mxShape)));
+
+ if(bIsSdrObjCustomShape)
{
- EnhancedCustomShape2d aCustomShape2d( pSdrObjCustomShape );
+ SdrObjCustomShape& rSdrObjCustomShape(
+ static_cast< SdrObjCustomShape& >(
+ *GetSdrObjectFromXShape(mxShape)));
+ EnhancedCustomShape2d aCustomShape2d(rSdrObjCustomShape);
aTextBounds = aCustomShape2d.GetTextRect();
}
+
pTextObj->SetSnapRect( aTextBounds );
// if rotated, copy GeoStat, too.
- const GeoStat& rSourceGeo = pCustoObj->GetGeoStat();
+ const GeoStat& rSourceGeo(rSdrObjCustomShape.GetGeoStat());
if ( rSourceGeo.nRotationAngle )
{
pTextObj->NbcRotate(
- pCustoObj->GetSnapRect().Center(), rSourceGeo.nRotationAngle,
- rSourceGeo.nSin, rSourceGeo.nCos);
+ rSdrObjCustomShape.GetSnapRect().Center(),
+ rSourceGeo.nRotationAngle,
+ rSourceGeo.nSin,
+ rSourceGeo.nCos);
}
// set modified ItemSet at text object
@@ -234,10 +251,12 @@ SdrObject* EnhancedCustomShapeEngine::ImplForceGroupWithText( const SdrObjCustom
pRenderedShape = new SdrObjGroup();
static_cast<SdrObjGroup*>(pRenderedShape)->GetSubList()->NbcInsertObject( pTmp );
}
- pRenderedShape->SetPage( pCustoObj->GetPage() );
- pRenderedShape->SetModel( pCustoObj->GetModel() );
+
+ pRenderedShape->SetPage(rSdrObjCustomShape.GetPage());
+ pRenderedShape->SetModel(rSdrObjCustomShape.GetModel());
}
}
+
return pRenderedShape;
}
@@ -253,104 +272,130 @@ void SetTemporary( uno::Reference< drawing::XShape > const & xShape )
Reference< drawing::XShape > SAL_CALL EnhancedCustomShapeEngine::render()
{
- Reference< drawing::XShape > xShape;
- SdrObject* pSdrObjCustomShape( dynamic_cast<SdrObjCustomShape*>( GetSdrObjectFromXShape( mxShape ) ) );
- if ( pSdrObjCustomShape )
+ const bool bIsSdrObjCustomShape(nullptr != dynamic_cast< SdrObjCustomShape* >(GetSdrObjectFromXShape(mxShape)));
+
+ if(!bIsSdrObjCustomShape)
{
- // retrieving the TextPath property to check if feature is enabled
- const SdrCustomShapeGeometryItem& rGeometryItem =
- pSdrObjCustomShape->GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY );
- bool bTextPathOn = false;
- const uno::Any* pAny = rGeometryItem.GetPropertyValueByName( "TextPath", "TextPath" );
- if ( pAny )
- *pAny >>= bTextPathOn;
-
- EnhancedCustomShape2d aCustomShape2d( pSdrObjCustomShape );
- sal_Int32 nRotateAngle = aCustomShape2d.GetRotateAngle();
-
- bool bFlipV = aCustomShape2d.IsFlipVert();
- bool bFlipH = aCustomShape2d.IsFlipHorz();
- bool bLineGeometryNeededOnly = bTextPathOn;
-
- SdrObject* pRenderedShape = aCustomShape2d.CreateObject( bLineGeometryNeededOnly );
- if ( pRenderedShape )
+ return Reference< drawing::XShape >();
+ }
+
+ SdrObjCustomShape& rSdrObjCustomShape(
+ static_cast< SdrObjCustomShape& >(
+ *GetSdrObjectFromXShape(mxShape)));
+
+ // retrieving the TextPath property to check if feature is enabled
+ const SdrCustomShapeGeometryItem& rGeometryItem(rSdrObjCustomShape.GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY ));
+ bool bTextPathOn = false;
+ const uno::Any* pAny = rGeometryItem.GetPropertyValueByName( "TextPath", "TextPath" );
+ if ( pAny )
+ *pAny >>= bTextPathOn;
+
+ EnhancedCustomShape2d aCustomShape2d(rSdrObjCustomShape);
+ sal_Int32 nRotateAngle = aCustomShape2d.GetRotateAngle();
+
+ bool bFlipV = aCustomShape2d.IsFlipVert();
+ bool bFlipH = aCustomShape2d.IsFlipHorz();
+ bool bLineGeometryNeededOnly = bTextPathOn;
+
+ SdrObject* pRenderedShape = aCustomShape2d.CreateObject( bLineGeometryNeededOnly );
+ if ( pRenderedShape )
+ {
+ if ( bTextPathOn )
{
- if ( bTextPathOn )
- {
- SdrObject* pRenderedFontWork = EnhancedCustomShapeFontWork::CreateFontWork( pRenderedShape, pSdrObjCustomShape );
- if ( pRenderedFontWork )
- {
- SdrObject::Free( pRenderedShape );
- pRenderedShape = pRenderedFontWork;
- }
- }
- SdrObject* pRenderedShape3d = EnhancedCustomShape3d::Create3DObject( pRenderedShape, pSdrObjCustomShape );
- if ( pRenderedShape3d )
+ SdrObject* pRenderedFontWork(
+ EnhancedCustomShapeFontWork::CreateFontWork(
+ pRenderedShape,
+ rSdrObjCustomShape));
+
+ if ( pRenderedFontWork )
{
- bFlipV = bFlipH = false;
- nRotateAngle = 0;
SdrObject::Free( pRenderedShape );
- pRenderedShape = pRenderedShape3d;
+ pRenderedShape = pRenderedFontWork;
}
- tools::Rectangle aRect( pSdrObjCustomShape->GetSnapRect() );
+ }
+ SdrObject* pRenderedShape3d = EnhancedCustomShape3d::Create3DObject(pRenderedShape, rSdrObjCustomShape);
+ if ( pRenderedShape3d )
+ {
+ bFlipV = bFlipH = false;
+ nRotateAngle = 0;
+ SdrObject::Free( pRenderedShape );
+ pRenderedShape = pRenderedShape3d;
+ }
- const GeoStat& rGeoStat = static_cast<SdrObjCustomShape*>(pSdrObjCustomShape)->GetGeoStat();
- if ( rGeoStat.nShearAngle )
- {
- long nShearAngle = rGeoStat.nShearAngle;
- double nTan = rGeoStat.nTan;
- if ((bFlipV&&!bFlipH )||(bFlipH&&!bFlipV))
- {
- nShearAngle = -nShearAngle;
- nTan = -nTan;
- }
- pRenderedShape->Shear( pSdrObjCustomShape->GetSnapRect().Center(), nShearAngle, nTan, false);
- }
- if(nRotateAngle )
- {
- double a = nRotateAngle * F_PI18000;
- pRenderedShape->NbcRotate( pSdrObjCustomShape->GetSnapRect().Center(), nRotateAngle, sin( a ), cos( a ) );
- }
- if ( bFlipV )
+ tools::Rectangle aRect(rSdrObjCustomShape.GetSnapRect());
+ const GeoStat& rGeoStat(rSdrObjCustomShape.GetGeoStat());
+
+ if ( rGeoStat.nShearAngle )
+ {
+ long nShearAngle = rGeoStat.nShearAngle;
+ double nTan = rGeoStat.nTan;
+ if ((bFlipV&&!bFlipH )||(bFlipH&&!bFlipV))
{
- Point aLeft( aRect.Left(), ( aRect.Top() + aRect.Bottom() ) >> 1 );
- Point aRight( aLeft.X() + 1000, aLeft.Y() );
- pRenderedShape->NbcMirror( aLeft, aRight );
+ nShearAngle = -nShearAngle;
+ nTan = -nTan;
}
- if ( bFlipH )
- {
- Point aTop( ( aRect.Left() + aRect.Right() ) >> 1, aRect.Top() );
- Point aBottom( aTop.X(), aTop.Y() + 1000 );
- pRenderedShape->NbcMirror( aTop, aBottom );
- }
- pRenderedShape->NbcSetStyleSheet( pSdrObjCustomShape->GetStyleSheet(), true );
- pRenderedShape->RecalcSnapRect();
- }
- if ( mbForceGroupWithText )
- pRenderedShape = ImplForceGroupWithText( static_cast<SdrObjCustomShape*>(pSdrObjCustomShape), pRenderedShape );
+ pRenderedShape->Shear(rSdrObjCustomShape.GetSnapRect().Center(), nShearAngle, nTan, false);
+ }
+ if(nRotateAngle )
+ {
+ double a = nRotateAngle * F_PI18000;
- if ( pRenderedShape )
+ pRenderedShape->NbcRotate(rSdrObjCustomShape.GetSnapRect().Center(), nRotateAngle, sin( a ), cos( a ));
+ }
+ if ( bFlipV )
+ {
+ Point aLeft( aRect.Left(), ( aRect.Top() + aRect.Bottom() ) >> 1 );
+ Point aRight( aLeft.X() + 1000, aLeft.Y() );
+ pRenderedShape->NbcMirror( aLeft, aRight );
+ }
+ if ( bFlipH )
{
- aCustomShape2d.ApplyGluePoints( pRenderedShape );
- xShape = SvxDrawPage::CreateShapeByTypeAndInventor( pRenderedShape->GetObjIdentifier(),
- pRenderedShape->GetObjInventor(), pRenderedShape );
+ Point aTop( ( aRect.Left() + aRect.Right() ) >> 1, aRect.Top() );
+ Point aBottom( aTop.X(), aTop.Y() + 1000 );
+ pRenderedShape->NbcMirror( aTop, aBottom );
}
- SetTemporary( xShape );
+
+ pRenderedShape->NbcSetStyleSheet(rSdrObjCustomShape.GetStyleSheet(), true);
+ pRenderedShape->RecalcSnapRect();
}
+
+ if ( mbForceGroupWithText )
+ {
+ pRenderedShape = ImplForceGroupWithText(
+ rSdrObjCustomShape,
+ pRenderedShape);
+ }
+
+ Reference< drawing::XShape > xShape;
+
+ if ( pRenderedShape )
+ {
+ aCustomShape2d.ApplyGluePoints( pRenderedShape );
+ xShape = SvxDrawPage::CreateShapeByTypeAndInventor( pRenderedShape->GetObjIdentifier(),
+ pRenderedShape->GetObjInventor(), pRenderedShape );
+ }
+
+ SetTemporary( xShape );
+
return xShape;
}
awt::Rectangle SAL_CALL EnhancedCustomShapeEngine::getTextBounds()
{
awt::Rectangle aTextRect;
- SdrObject* pSdrObjCustomShape( GetSdrObjectFromXShape( mxShape ) );
- uno::Reference< document::XActionLockable > xLockable( mxShape, uno::UNO_QUERY );
- if ( pSdrObjCustomShape && pSdrObjCustomShape->GetModel() && xLockable.is() && !xLockable->isActionLocked() )
+ const bool bIsSdrObjCustomShape(nullptr != dynamic_cast< SdrObjCustomShape* >(GetSdrObjectFromXShape(mxShape)));
+
+ if(bIsSdrObjCustomShape)
{
- if ( pSdrObjCustomShape )
+ SdrObjCustomShape& rSdrObjCustomShape(static_cast< SdrObjCustomShape& >(*GetSdrObjectFromXShape(mxShape)));
+ uno::Reference< document::XActionLockable > xLockable( mxShape, uno::UNO_QUERY );
+
+ if(rSdrObjCustomShape.GetModel()
+ && xLockable.is()
+ && !xLockable->isActionLocked())
{
- EnhancedCustomShape2d aCustomShape2d( pSdrObjCustomShape );
+ EnhancedCustomShape2d aCustomShape2d(rSdrObjCustomShape);
tools::Rectangle aRect( aCustomShape2d.GetTextRect() );
aTextRect.X = aRect.Left();
aTextRect.Y = aRect.Top();
@@ -358,24 +403,30 @@ awt::Rectangle SAL_CALL EnhancedCustomShapeEngine::getTextBounds()
aTextRect.Height = aRect.GetHeight();
}
}
+
return aTextRect;
}
drawing::PolyPolygonBezierCoords SAL_CALL EnhancedCustomShapeEngine::getLineGeometry()
{
drawing::PolyPolygonBezierCoords aPolyPolygonBezierCoords;
- SdrObject* pSdrObjCustomShape( GetSdrObjectFromXShape( mxShape ) );
- if ( pSdrObjCustomShape )
+ const bool bIsSdrObjCustomShape(nullptr != dynamic_cast< SdrObjCustomShape* >(GetSdrObjectFromXShape(mxShape)));
+
+ if(bIsSdrObjCustomShape)
{
- EnhancedCustomShape2d aCustomShape2d( pSdrObjCustomShape );
+ SdrObjCustomShape& rSdrObjCustomShape(
+ static_cast< SdrObjCustomShape& >(
+ *GetSdrObjectFromXShape(mxShape)));
+ EnhancedCustomShape2d aCustomShape2d(rSdrObjCustomShape);
SdrObject* pObj = aCustomShape2d.CreateLineGeometry();
+
if ( pObj )
{
- tools::Rectangle aRect( pSdrObjCustomShape->GetSnapRect() );
+ tools::Rectangle aRect(rSdrObjCustomShape.GetSnapRect());
bool bFlipV = aCustomShape2d.IsFlipVert();
bool bFlipH = aCustomShape2d.IsFlipHorz();
+ const GeoStat& rGeoStat(rSdrObjCustomShape.GetGeoStat());
- const GeoStat& rGeoStat = static_cast<SdrObjCustomShape*>(pSdrObjCustomShape)->GetGeoStat();
if ( rGeoStat.nShearAngle )
{
long nShearAngle = rGeoStat.nShearAngle;
@@ -444,13 +495,19 @@ drawing::PolyPolygonBezierCoords SAL_CALL EnhancedCustomShapeEngine::getLineGeom
Sequence< Reference< drawing::XCustomShapeHandle > > SAL_CALL EnhancedCustomShapeEngine::getInteraction()
{
sal_uInt32 i, nHdlCount = 0;
- SdrObject* pSdrObjCustomShape = GetSdrObjectFromXShape( mxShape );
- if ( pSdrObjCustomShape )
+ const bool bIsSdrObjCustomShape(nullptr != dynamic_cast< SdrObjCustomShape* >(GetSdrObjectFromXShape(mxShape)));
+
+ if(bIsSdrObjCustomShape)
{
- EnhancedCustomShape2d aCustomShape2d( pSdrObjCustomShape );
+ SdrObjCustomShape& rSdrObjCustomShape(
+ static_cast< SdrObjCustomShape& >(
+ *GetSdrObjectFromXShape(mxShape)));
+ EnhancedCustomShape2d aCustomShape2d(rSdrObjCustomShape);
nHdlCount = aCustomShape2d.GetHdlCount();
}
+
Sequence< Reference< drawing::XCustomShapeHandle > > aSeq( nHdlCount );
+
for ( i = 0; i < nHdlCount; i++ )
aSeq[ i ] = new EnhancedCustomShapeHandle( mxShape, i );
return aSeq;
diff --git a/svx/source/customshapes/EnhancedCustomShapeFontWork.cxx b/svx/source/customshapes/EnhancedCustomShapeFontWork.cxx
index c6d45574a9e4..71dc441f1727 100644
--- a/svx/source/customshapes/EnhancedCustomShapeFontWork.cxx
+++ b/svx/source/customshapes/EnhancedCustomShapeFontWork.cxx
@@ -85,7 +85,10 @@ struct FWData // representing the whole text
};
-static bool InitializeFontWorkData( const SdrObject* pCustomShape, const sal_uInt16 nOutlinesCount2d, FWData& rFWData )
+static bool InitializeFontWorkData(
+ const SdrObjCustomShape& rSdrObjCustomShape,
+ const sal_uInt16 nOutlinesCount2d,
+ FWData& rFWData)
{
bool bNoErr = false;
bool bSingleLineMode = false;
@@ -100,7 +103,8 @@ static bool InitializeFontWorkData( const SdrObject* pCustomShape, const sal_uIn
rFWData.bSingleLineMode = bSingleLineMode;
// setting the strings
- OutlinerParaObject* pParaObj = static_cast<const SdrObjCustomShape*>(pCustomShape)->GetOutlinerParaObject();
+ OutlinerParaObject* pParaObj(rSdrObjCustomShape.GetOutlinerParaObject());
+
if ( pParaObj )
{
const EditTextObject& rTextObj = pParaObj->GetTextObject();
@@ -146,8 +150,10 @@ double GetLength( const tools::Polygon& rPolygon )
/* CalculateHorizontalScalingFactor returns the horizontal scaling factor for
the whole text object, so that each text will match its corresponding 2d Outline */
-void CalculateHorizontalScalingFactor( const SdrObject* pCustomShape,
- FWData& rFWData, const tools::PolyPolygon& rOutline2d )
+void CalculateHorizontalScalingFactor(
+ const SdrObjCustomShape& rSdrObjCustomShape,
+ FWData& rFWData,
+ const tools::PolyPolygon& rOutline2d)
{
double fScalingFactor = 1.0;
bool bScalingFactorDefined = false;
@@ -157,8 +163,8 @@ void CalculateHorizontalScalingFactor( const SdrObject* pCustomShape,
sal_uInt16 nOutlinesCount2d = rOutline2d.Count();
vcl::Font aFont;
- const SvxFontItem& rFontItem = pCustomShape->GetMergedItem( EE_CHAR_FONTINFO );
- aFont.SetFontHeight( pCustomShape->GetLogicRect().GetHeight() / rFWData.nMaxParagraphsPerTextArea );
+ const SvxFontItem& rFontItem(rSdrObjCustomShape.GetMergedItem( EE_CHAR_FONTINFO ));
+ aFont.SetFontHeight(rSdrObjCustomShape.GetLogicRect().GetHeight() / rFWData.nMaxParagraphsPerTextArea);
aFont.SetAlignment( ALIGN_TOP );
aFont.SetFamilyName( rFontItem.GetFamilyName() );
aFont.SetFamily( rFontItem.GetFamily() );
@@ -210,9 +216,13 @@ void CalculateHorizontalScalingFactor( const SdrObject* pCustomShape,
rFWData.fHorizontalTextScaling = fScalingFactor;
}
-void GetTextAreaOutline( const FWData& rFWData, const SdrObject* pCustomShape, FWTextArea& rTextArea, bool bSameLetterHeights )
+void GetTextAreaOutline(
+ const FWData& rFWData,
+ const SdrObjCustomShape& rSdrObjCustomShape,
+ FWTextArea& rTextArea,
+ bool bSameLetterHeights)
{
- bool bIsVertical = static_cast<const SdrObjCustomShape*>(pCustomShape)->IsVerticalWriting();
+ bool bIsVertical(rSdrObjCustomShape.IsVerticalWriting());
sal_Int32 nVerticalOffset = rFWData.nMaxParagraphsPerTextArea > rTextArea.vParagraphs.size()
? rFWData.nSingleLineHeight / 2 : 0;
@@ -243,7 +253,7 @@ void GetTextAreaOutline( const FWData& rFWData, const SdrObject* pCustomShape, F
nFntItm = EE_CHAR_FONTINFO_CTL;
else if ( nScriptType == i18n::ScriptType::ASIAN )
nFntItm = EE_CHAR_FONTINFO_CJK;
- const SvxFontItem& rFontItem = static_cast<const SvxFontItem&>(pCustomShape->GetMergedItem( nFntItm ));
+ const SvxFontItem& rFontItem = static_cast<const SvxFontItem&>(rSdrObjCustomShape.GetMergedItem( nFntItm ));
vcl::Font aFont;
aFont.SetFontHeight( rFWData.nSingleLineHeight );
aFont.SetAlignment( ALIGN_TOP );
@@ -253,10 +263,10 @@ void GetTextAreaOutline( const FWData& rFWData, const SdrObject* pCustomShape, F
aFont.SetStyleName( rFontItem.GetStyleName() );
aFont.SetOrientation( 0 );
- const SvxPostureItem& rPostureItem = pCustomShape->GetMergedItem( EE_CHAR_ITALIC );
+ const SvxPostureItem& rPostureItem = rSdrObjCustomShape.GetMergedItem( EE_CHAR_ITALIC );
aFont.SetItalic( rPostureItem.GetPosture() );
- const SvxWeightItem& rWeightItem = pCustomShape->GetMergedItem( EE_CHAR_WEIGHT );
+ const SvxWeightItem& rWeightItem = rSdrObjCustomShape.GetMergedItem( EE_CHAR_WEIGHT );
aFont.SetWeight( rWeightItem.GetWeight() );
// initializing virtual device
@@ -267,7 +277,7 @@ void GetTextAreaOutline( const FWData& rFWData, const SdrObject* pCustomShape, F
if ( aParagraphIter->nFrameDirection == SvxFrameDirection::Horizontal_RL_TB )
pVirDev->SetLayoutMode( ComplexTextLayoutFlags::BiDiRtl );
- const SvxCharScaleWidthItem& rCharScaleWidthItem = pCustomShape->GetMergedItem( EE_CHAR_FONTWIDTH );
+ const SvxCharScaleWidthItem& rCharScaleWidthItem = rSdrObjCustomShape.GetMergedItem( EE_CHAR_FONTWIDTH );
sal_uInt16 nCharScaleWidth = rCharScaleWidthItem.GetValue();
std::unique_ptr<long[]> pDXArry;
sal_Int32 nWidth = 0;
@@ -413,29 +423,36 @@ void GetTextAreaOutline( const FWData& rFWData, const SdrObject* pCustomShape, F
}
}
-bool GetFontWorkOutline(FWData& rFWData, const SdrObject* pCustomShape)
+bool GetFontWorkOutline(
+ FWData& rFWData,
+ const SdrObjCustomShape& rSdrObjCustomShape)
{
- SdrTextHorzAdjust eHorzAdjust( pCustomShape->GetMergedItem( SDRATTR_TEXT_HORZADJUST ).GetValue() );
- drawing::TextFitToSizeType const eFTS( pCustomShape->GetMergedItem( SDRATTR_TEXT_FITTOSIZE ).GetValue() );
+ SdrTextHorzAdjust eHorzAdjust(rSdrObjCustomShape.GetMergedItem( SDRATTR_TEXT_HORZADJUST ).GetValue());
+ drawing::TextFitToSizeType const eFTS(rSdrObjCustomShape.GetMergedItem( SDRATTR_TEXT_FITTOSIZE ).GetValue());
std::vector< FWTextArea >::iterator aTextAreaIter = rFWData.vTextAreas.begin();
std::vector< FWTextArea >::const_iterator aTextAreaIEnd = rFWData.vTextAreas.end();
- rFWData.nSingleLineHeight = static_cast<sal_Int32>( ( static_cast<double>(pCustomShape->GetLogicRect().GetHeight())
+ rFWData.nSingleLineHeight = static_cast<sal_Int32>( ( static_cast<double>(rSdrObjCustomShape.GetLogicRect().GetHeight())
/ rFWData.nMaxParagraphsPerTextArea ) * rFWData.fHorizontalTextScaling );
if (rFWData.nSingleLineHeight == SAL_MIN_INT32)
return false;
bool bSameLetterHeights = false;
- const SdrCustomShapeGeometryItem& rGeometryItem = pCustomShape->GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY );
+ const SdrCustomShapeGeometryItem& rGeometryItem(rSdrObjCustomShape.GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY ));
const css::uno::Any* pAny = rGeometryItem.GetPropertyValueByName( "TextPath", "SameLetterHeights" );
if ( pAny )
*pAny >>= bSameLetterHeights;
while ( aTextAreaIter != aTextAreaIEnd )
{
- GetTextAreaOutline( rFWData, pCustomShape, *aTextAreaIter, bSameLetterHeights );
+ GetTextAreaOutline(
+ rFWData,
+ rSdrObjCustomShape,
+ *aTextAreaIter,
+ bSameLetterHeights);
+
if (eFTS == drawing::TextFitToSizeType_ALLLINES ||
// tdf#97630 interpret PROPORTIONAL same as ALLLINES so we don't
// need another ODF attribute!
@@ -802,7 +819,9 @@ void FitTextOutlinesToShapeOutlines( const tools::PolyPolygon& aOutlines2d, FWDa
}
}
-SdrObject* CreateSdrObjectFromParagraphOutlines( const FWData& rFWData, const SdrObject* pCustomShape )
+SdrObject* CreateSdrObjectFromParagraphOutlines(
+ const FWData& rFWData,
+ const SdrObjCustomShape& rSdrObjCustomShape)
{
SdrObject* pRet = nullptr;
basegfx::B2DPolyPolygon aPolyPoly;
@@ -836,7 +855,7 @@ SdrObject* CreateSdrObjectFromParagraphOutlines( const FWData& rFWData, const Sd
pRet = new SdrPathObj( OBJ_POLY, aPolyPoly );
- SfxItemSet aSet( pCustomShape->GetMergedItemSet() );
+ SfxItemSet aSet(rSdrObjCustomShape.GetMergedItemSet());
aSet.ClearItem( SDRATTR_TEXTDIRECTION ); //SJ: vertical writing is not required, by removing this item no outliner is created
aSet.Put(makeSdrShadowItem(false)); // #i37011# NO shadow for FontWork geometry
pRet->SetMergedItemSet( aSet ); // * otherwise we would crash, because the outliner tries to create a Paraobject, but there is no model
@@ -856,7 +875,9 @@ Reference < i18n::XBreakIterator > const & EnhancedCustomShapeFontWork::GetBreak
return mxBreakIterator;
}
-SdrObject* EnhancedCustomShapeFontWork::CreateFontWork( const SdrObject* pShape2d, const SdrObject* pCustomShape )
+SdrObject* EnhancedCustomShapeFontWork::CreateFontWork(
+ const SdrObject* pShape2d,
+ const SdrObjCustomShape& rSdrObjCustomShape)
{
SdrObject* pRet = nullptr;
@@ -865,19 +886,29 @@ SdrObject* EnhancedCustomShapeFontWork::CreateFontWork( const SdrObject* pShape2
if ( nOutlinesCount2d )
{
FWData aFWData;
- if ( InitializeFontWorkData( pCustomShape, nOutlinesCount2d, aFWData ) )
+
+ if(InitializeFontWorkData(rSdrObjCustomShape, nOutlinesCount2d, aFWData))
{
/* retrieves the horizontal scaling factor that has to be used
to fit each paragraph text into its corresponding 2d outline */
- CalculateHorizontalScalingFactor( pCustomShape, aFWData, aOutlines2d );
+ CalculateHorizontalScalingFactor(
+ rSdrObjCustomShape,
+ aFWData,
+ aOutlines2d);
/* retrieving the Outlines for the each Paragraph. */
- if (!GetFontWorkOutline(aFWData, pCustomShape))
+ if(!GetFontWorkOutline(
+ aFWData,
+ rSdrObjCustomShape))
+ {
return nullptr;
+ }
FitTextOutlinesToShapeOutlines( aOutlines2d, aFWData );
- pRet = CreateSdrObjectFromParagraphOutlines( aFWData, pCustomShape );
+ pRet = CreateSdrObjectFromParagraphOutlines(
+ aFWData,
+ rSdrObjCustomShape);
}
}
return pRet;
diff --git a/svx/source/customshapes/EnhancedCustomShapeFontWork.hxx b/svx/source/customshapes/EnhancedCustomShapeFontWork.hxx
index d86388cb75fc..9fd954cd7034 100644
--- a/svx/source/customshapes/EnhancedCustomShapeFontWork.hxx
+++ b/svx/source/customshapes/EnhancedCustomShapeFontWork.hxx
@@ -30,7 +30,9 @@ class EnhancedCustomShapeFontWork
public:
static css::uno::Reference < css::i18n::XBreakIterator > const & GetBreakIterator();
- static SdrObject* CreateFontWork( const SdrObject* pShape2d, const SdrObject* pCustomShape );
+ static SdrObject* CreateFontWork(
+ const SdrObject* pShape2d,
+ const SdrObjCustomShape& rSdrObjCustomShape);
};
#endif
diff --git a/svx/source/customshapes/EnhancedCustomShapeHandle.cxx b/svx/source/customshapes/EnhancedCustomShapeHandle.cxx
index b541eb410978..d4975c41f4db 100644
--- a/svx/source/customshapes/EnhancedCustomShapeHandle.cxx
+++ b/svx/source/customshapes/EnhancedCustomShapeHandle.cxx
@@ -48,26 +48,41 @@ void SAL_CALL EnhancedCustomShapeHandle::release() throw()
// XCustomShapeHandle
css::awt::Point SAL_CALL EnhancedCustomShapeHandle::getPosition()
{
- SdrObject* pSdrObjCustomShape( GetSdrObjectFromXShape( mxCustomShape ) );
- if ( !pSdrObjCustomShape )
+ const bool bIsSdrObjCustomShape(nullptr != dynamic_cast< SdrObjCustomShape* >(GetSdrObjectFromXShape(mxCustomShape)));
+
+ if(!bIsSdrObjCustomShape)
+ {
throw css::uno::RuntimeException();
+ }
+ SdrObjCustomShape& rSdrObjCustomShape(static_cast< SdrObjCustomShape& >(*GetSdrObjectFromXShape(mxCustomShape)));
Point aPosition;
- EnhancedCustomShape2d aCustomShape2d( pSdrObjCustomShape );
- if ( !aCustomShape2d.GetHandlePosition( mnIndex, aPosition ) )
+ EnhancedCustomShape2d aCustomShape2d(rSdrObjCustomShape);
+
+ if(!aCustomShape2d.GetHandlePosition(mnIndex, aPosition))
+ {
throw css::uno::RuntimeException();
+ }
+
return css::awt::Point( aPosition.X(), aPosition.Y() );
}
void SAL_CALL EnhancedCustomShapeHandle::setControllerPosition( const css::awt::Point& aPnt )
{
- SdrObject* pSdrObjCustomShape( GetSdrObjectFromXShape( mxCustomShape ) );
- if ( !pSdrObjCustomShape )
+ const bool bIsSdrObjCustomShape(nullptr != dynamic_cast< SdrObjCustomShape* >(GetSdrObjectFromXShape(mxCustomShape)));
+
+ if(!bIsSdrObjCustomShape)
+ {
throw css::uno::RuntimeException();
+ }
+
+ SdrObjCustomShape& rSdrObjCustomShape(static_cast< SdrObjCustomShape& >(*GetSdrObjectFromXShape(mxCustomShape)));
+ EnhancedCustomShape2d aCustomShape2d(rSdrObjCustomShape);
- EnhancedCustomShape2d aCustomShape2d( pSdrObjCustomShape );
- if ( !aCustomShape2d.SetHandleControllerPosition( mnIndex, aPnt ) )
+ if(!aCustomShape2d.SetHandleControllerPosition(mnIndex, aPnt))
+ {
throw css::uno::RuntimeException();
+ }
}
// XInitialization