summaryrefslogtreecommitdiff
path: root/svx/source/unodraw/unoshap2.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'svx/source/unodraw/unoshap2.cxx')
-rw-r--r--svx/source/unodraw/unoshap2.cxx323
1 files changed, 112 insertions, 211 deletions
diff --git a/svx/source/unodraw/unoshap2.cxx b/svx/source/unodraw/unoshap2.cxx
index 9de0da13904f..4aad6e1ec6ee 100644
--- a/svx/source/unodraw/unoshap2.cxx
+++ b/svx/source/unodraw/unoshap2.cxx
@@ -29,6 +29,7 @@
#include <com/sun/star/style/ParagraphAdjust.hpp>
#include <com/sun/star/drawing/PointSequenceSequence.hpp>
#include <com/sun/star/drawing/PointSequence.hpp>
+#include <com/sun/star/drawing/PolygonKind.hpp>
#include <com/sun/star/graphic/XGraphic.hpp>
#include <o3tl/any.hxx>
#include <tools/urlobj.hxx>
@@ -59,7 +60,7 @@
#include <basegfx/polygon/b2dpolygon.hxx>
#include <basegfx/point/b2dpoint.hxx>
#include <basegfx/polygon/b2dpolygontools.hxx>
-#include <basegfx/utils/unotools.hxx>
+#include <basegfx/polygon/b2dpolypolygontools.hxx>
#include <com/sun/star/awt/XBitmap.hpp>
#include <svx/svdograf.hxx>
#include <sfx2/docfile.hxx>
@@ -916,59 +917,50 @@ SvxShapeCircle::~SvxShapeCircle() throw()
{
}
-SvxShapePolyPolygon::SvxShapePolyPolygon( SdrObject* pObj , drawing::PolygonKind eNew )
-: SvxShapeText( pObj, getSvxMapProvider().GetMap(SVXMAP_POLYPOLYGON), getSvxMapProvider().GetPropertySet(SVXMAP_POLYPOLYGON, SdrObject::GetGlobalDrawObjectItemPool()) )
-, mePolygonKind( eNew )
+//////////////////////////////////////////////////////////////////////////////
+
+SvxShapePolyPolygon::SvxShapePolyPolygon(
+ SdrObject* pObj)
+: SvxShapeText(
+ pObj,
+ getSvxMapProvider().GetMap(SVXMAP_POLYPOLYGON),
+ getSvxMapProvider().GetPropertySet(SVXMAP_POLYPOLYGON, SdrObject::GetGlobalDrawObjectItemPool()))
{
}
-
SvxShapePolyPolygon::~SvxShapePolyPolygon() throw()
{
}
-basegfx::B2DPolyPolygon ImplSvxPointSequenceSequenceToB2DPolyPolygon( const drawing::PointSequenceSequence* pOuterSequence) throw()
+bool SvxShapePolyPolygon::setPropertyValueImpl( const OUString& rName, const SfxItemPropertySimpleEntry* pProperty, const css::uno::Any& rValue )
{
- basegfx::B2DPolyPolygon aRetval;
-
- // get pointer to internal sequences
- const drawing::PointSequence* pInnerSequence = pOuterSequence->getConstArray();
- const drawing::PointSequence* pInnerSeqEnd = pInnerSequence + pOuterSequence->getLength();
-
- for(;pInnerSequence != pInnerSeqEnd; ++pInnerSequence)
+ switch( pProperty->nWID )
{
- // prepare new polygon
- basegfx::B2DPolygon aNewPolygon;
-
- // get pointer to arrays
- const awt::Point* pArray = pInnerSequence->getConstArray();
- const awt::Point* pArrayEnd = pArray + pInnerSequence->getLength();
-
- for(;pArray != pArrayEnd;++pArray)
+ case OWN_ATTR_VALUE_POLYPOLYGONBEZIER:
+ {
+ if( auto s = o3tl::tryAccess<drawing::PolyPolygonBezierCoords>(rValue) )
{
- aNewPolygon.append(basegfx::B2DPoint(pArray->X, pArray->Y));
- }
+ basegfx::B2DPolyPolygon aNewPolyPolygon(
+ basegfx::utils::UnoPolyPolygonBezierCoordsToB2DPolyPolygon(*s));
- // check for closed state flag
- basegfx::utils::checkClosed(aNewPolygon);
+ // tdf#117145 metric of SdrModel is app-specific, metric of UNO API is 100thmm
+ ForceMetricToItemPoolMetric(aNewPolyPolygon);
- // add new subpolygon
- aRetval.append(aNewPolygon);
+ SetPolygon(aNewPolyPolygon);
+ return true;
+ }
+ break;
}
-
- return aRetval;
-}
-
-
-bool SvxShapePolyPolygon::setPropertyValueImpl( const OUString& rName, const SfxItemPropertySimpleEntry* pProperty, const css::uno::Any& rValue )
-{
- switch( pProperty->nWID )
- {
case OWN_ATTR_VALUE_POLYPOLYGON:
{
if( auto s = o3tl::tryAccess<drawing::PointSequenceSequence>(rValue) )
{
- basegfx::B2DPolyPolygon aNewPolyPolygon(ImplSvxPointSequenceSequenceToB2DPolyPolygon(s));
+ basegfx::B2DPolyPolygon aNewPolyPolygon(
+ basegfx::utils::UnoPointSequenceSequenceToB2DPolyPolygon(*s));
+
+ // tdf#117145 metric of SdrModel is app-specific, metric of UNO API is 100thmm
+ ForceMetricToItemPoolMetric(aNewPolyPolygon);
+
SetPolygon(aNewPolyPolygon);
return true;
}
@@ -976,7 +968,10 @@ bool SvxShapePolyPolygon::setPropertyValueImpl( const OUString& rName, const Sfx
}
case OWN_ATTR_BASE_GEOMETRY:
{
- if( auto s = o3tl::tryAccess<drawing::PointSequenceSequence>(rValue) )
+ drawing::PointSequenceSequence aPointSequenceSequence;
+ drawing::PolyPolygonBezierCoords aPolyPolygonBezierCoords;
+
+ if( rValue >>= aPointSequenceSequence)
{
if( HasSdrObject() )
{
@@ -984,7 +979,7 @@ bool SvxShapePolyPolygon::setPropertyValueImpl( const OUString& rName, const Sfx
basegfx::B2DHomMatrix aNewHomogenMatrix;
GetSdrObject()->TRGetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon);
- aNewPolyPolygon = ImplSvxPointSequenceSequenceToB2DPolyPolygon(s);
+ aNewPolyPolygon = basegfx::utils::UnoPointSequenceSequenceToB2DPolyPolygon(aPointSequenceSequence);
// tdf#117145 metric of SdrModel is app-specific, metric of UNO API is 100thmm
// Need to adapt aNewPolyPolygon from 100thmm to app-specific
@@ -994,6 +989,23 @@ bool SvxShapePolyPolygon::setPropertyValueImpl( const OUString& rName, const Sfx
}
return true;
}
+ else if( rValue >>= aPolyPolygonBezierCoords)
+ {
+ if( HasSdrObject() )
+ {
+ basegfx::B2DPolyPolygon aNewPolyPolygon;
+ basegfx::B2DHomMatrix aNewHomogenMatrix;
+
+ GetSdrObject()->TRGetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon);
+ aNewPolyPolygon = basegfx::utils::UnoPolyPolygonBezierCoordsToB2DPolyPolygon(aPolyPolygonBezierCoords);
+
+ // tdf#117145 metric of SdrModel is app-specific, metric of UNO API is 100thmm
+ ForceMetricToItemPoolMetric(aNewPolyPolygon);
+
+ GetSdrObject()->TRSetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon);
+ }
+ return true;
+ }
break;
}
case OWN_ATTR_VALUE_POLYGON:
@@ -1015,8 +1027,12 @@ bool SvxShapePolyPolygon::setPropertyValueImpl( const OUString& rName, const Sfx
// check for closed state flag
basegfx::utils::checkClosed(aNewPolygon);
+ // tdf#117145 metric of SdrModel is app-specific, metric of UNO API is 100thmm
+ basegfx::B2DPolyPolygon aNewPolyPolygon(aNewPolygon);
+ ForceMetricToItemPoolMetric(aNewPolyPolygon);
+
// set polygon
- SetPolygon(basegfx::B2DPolyPolygon(aNewPolygon));
+ SetPolygon(aNewPolyPolygon);
return true;
}
break;
@@ -1028,61 +1044,35 @@ bool SvxShapePolyPolygon::setPropertyValueImpl( const OUString& rName, const Sfx
throw lang::IllegalArgumentException();
}
-void B2DPolyPolygonToSvxPointSequenceSequence( const basegfx::B2DPolyPolygon& rPolyPoly, drawing::PointSequenceSequence& rRetval )
+bool SvxShapePolyPolygon::getPropertyValueImpl( const OUString& rName, const SfxItemPropertySimpleEntry* pProperty,
+ css::uno::Any& rValue )
{
- if( static_cast<sal_uInt32>(rRetval.getLength()) != rPolyPoly.count() )
- rRetval.realloc( rPolyPoly.count() );
-
- // get pointer to external arrays
- drawing::PointSequence* pOuterSequence = rRetval.getArray();
-
- for(sal_uInt32 a(0); a < rPolyPoly.count(); a++)
+ switch( pProperty->nWID )
{
- // get single polygon
- const basegfx::B2DPolygon aPoly(rPolyPoly.getB2DPolygon(a));
-
- // #i75974# take closed state into account, the API polygon still uses the old closed definition
- // with last/first point are identical (cannot hold information about open polygons with identical
- // first and last point, though)
- const sal_uInt32 nPointCount(aPoly.count());
- const bool bIsClosed(aPoly.isClosed());
-
- // create space in arrays
- pOuterSequence->realloc(bIsClosed ? nPointCount + 1 : nPointCount);
-
- // get pointer to arrays
- awt::Point* pInnerSequence = pOuterSequence->getArray();
+ case OWN_ATTR_VALUE_POLYPOLYGONBEZIER:
+ {
+ // pack a tools::PolyPolygon in a struct tools::PolyPolygon
+ basegfx::B2DPolyPolygon aPolyPoly(GetPolygon());
- for(sal_uInt32 b(0); b < nPointCount; b++)
- {
- const basegfx::B2DPoint aPoint(aPoly.getB2DPoint(b));
- *pInnerSequence = awt::Point( basegfx::fround(aPoint.getX()), basegfx::fround(aPoint.getY()) );
- pInnerSequence++;
- }
+ // tdf#117145 metric of SdrModel is app-specific, metric of UNO API is 100thmm
+ ForceMetricTo100th_mm(aPolyPoly);
- // #i75974# copy first point
- if(bIsClosed)
- {
- *pInnerSequence = *pOuterSequence->getArray();
- }
+ drawing::PolyPolygonBezierCoords aRetval;
+ basegfx::utils::B2DPolyPolygonToUnoPolyPolygonBezierCoords(aPolyPoly, aRetval);
- pOuterSequence++;
+ rValue <<= aRetval;
+ break;
}
-}
-
-
-bool SvxShapePolyPolygon::getPropertyValueImpl( const OUString& rName, const SfxItemPropertySimpleEntry* pProperty,
- css::uno::Any& rValue )
-{
- switch( pProperty->nWID )
- {
case OWN_ATTR_VALUE_POLYPOLYGON:
{
// pack a tools::PolyPolygon in a struct tools::PolyPolygon
- const basegfx::B2DPolyPolygon& rPolyPoly = GetPolygon();
- drawing::PointSequenceSequence aRetval( rPolyPoly.count() );
+ basegfx::B2DPolyPolygon aPolyPoly(GetPolygon());
+
+ // tdf#117145 metric of SdrModel is app-specific, metric of UNO API is 100thmm
+ ForceMetricTo100th_mm(aPolyPoly);
- B2DPolyPolygonToSvxPointSequenceSequence( rPolyPoly, aRetval );
+ drawing::PointSequenceSequence aRetval( aPolyPoly.count() );
+ basegfx::utils::B2DPolyPolygonToUnoPointSequenceSequence(aPolyPoly, aRetval);
rValue <<= aRetval;
break;
@@ -1090,38 +1080,46 @@ bool SvxShapePolyPolygon::getPropertyValueImpl( const OUString& rName, const Sfx
case OWN_ATTR_BASE_GEOMETRY:
{
// pack a tools::PolyPolygon in struct PolyPolygon
- basegfx::B2DPolyPolygon aNewPolyPolygon;
+ basegfx::B2DPolyPolygon aPolyPoly;
basegfx::B2DHomMatrix aNewHomogenMatrix;
if(HasSdrObject())
{
- GetSdrObject()->TRGetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon);
+ GetSdrObject()->TRGetBaseGeometry(aNewHomogenMatrix, aPolyPoly);
// tdf#117145 metric of SdrModel is app-specific, metric of UNO API is 100thmm
- // Need to adapt aNewPolyPolygon from app-specific to 100thmm
- ForceMetricTo100th_mm(aNewPolyPolygon);
+ ForceMetricTo100th_mm(aPolyPoly);
}
- drawing::PointSequenceSequence aRetval(aNewPolyPolygon.count());
- B2DPolyPolygonToSvxPointSequenceSequence(aNewPolyPolygon, aRetval);
- rValue <<= aRetval;
+ if(aPolyPoly.areControlPointsUsed())
+ {
+ drawing::PolyPolygonBezierCoords aRetval;
+ basegfx::utils::B2DPolyPolygonToUnoPolyPolygonBezierCoords(aPolyPoly, aRetval);
+ rValue <<= aRetval;
+ }
+ else
+ {
+ drawing::PointSequenceSequence aRetval(aPolyPoly.count());
+ basegfx::utils::B2DPolyPolygonToUnoPointSequenceSequence(aPolyPoly, aRetval);
+ rValue <<= aRetval;
+ }
break;
}
case OWN_ATTR_VALUE_POLYGON:
{
// pack a tools::PolyPolygon in a struct tools::PolyPolygon
- const basegfx::B2DPolyPolygon& rPolyPoly = GetPolygon();
+ basegfx::B2DPolyPolygon aPolyPoly(GetPolygon());
- sal_Int32 nCount = 0;
- if( rPolyPoly.count() > 0 )
- nCount = rPolyPoly.getB2DPolygon(0).count();
+ // tdf#117145 metric of SdrModel is app-specific, metric of UNO API is 100thmm
+ ForceMetricTo100th_mm(aPolyPoly);
+ const sal_Int32 nCount(0 == aPolyPoly.count() ? 0 : aPolyPoly.getB2DPolygon(0).count());
drawing::PointSequence aRetval( nCount );
if( nCount > 0 )
{
// get single polygon
- const basegfx::B2DPolygon aPoly(rPolyPoly.getB2DPolygon(0));
+ const basegfx::B2DPolygon aPoly(aPolyPoly.getB2DPolygon(0));
// get pointer to arrays
awt::Point* pSequence = aRetval.getArray();
@@ -1138,7 +1136,7 @@ bool SvxShapePolyPolygon::getPropertyValueImpl( const OUString& rName, const Sfx
}
case OWN_ATTR_VALUE_POLYGONKIND:
{
- rValue <<= mePolygonKind;
+ rValue <<= GetPolygonKind();
break;
}
default:
@@ -1148,129 +1146,30 @@ bool SvxShapePolyPolygon::getPropertyValueImpl( const OUString& rName, const Sfx
return true;
}
-
-void SvxShapePolyPolygon::SetPolygon(const basegfx::B2DPolyPolygon& rNew)
+drawing::PolygonKind SvxShapePolyPolygon::GetPolygonKind() const
{
::SolarMutexGuard aGuard;
+ drawing::PolygonKind aRetval(drawing::PolygonKind_LINE);
if(HasSdrObject())
- static_cast<SdrPathObj*>(GetSdrObject())->SetPathPoly(rNew);
-}
-
-
-basegfx::B2DPolyPolygon SvxShapePolyPolygon::GetPolygon() const throw()
-{
- ::SolarMutexGuard aGuard;
-
- if(HasSdrObject())
- {
- return static_cast<SdrPathObj*>(GetSdrObject())->GetPathPoly();
- }
- else
- {
- return basegfx::B2DPolyPolygon();
- }
-}
-
-SvxShapePolyPolygonBezier::SvxShapePolyPolygonBezier(SdrObject* pObj , drawing::PolygonKind eNew)
- : SvxShapeText(pObj, getSvxMapProvider().GetMap(SVXMAP_POLYPOLYGONBEZIER), getSvxMapProvider().GetPropertySet(SVXMAP_POLYPOLYGONBEZIER, SdrObject::GetGlobalDrawObjectItemPool()))
- , mePolygonKind(eNew)
-{
-}
-
-SvxShapePolyPolygonBezier::~SvxShapePolyPolygonBezier() throw()
-{
-}
-
-bool SvxShapePolyPolygonBezier::setPropertyValueImpl( const OUString& rName, const SfxItemPropertySimpleEntry* pProperty, const css::uno::Any& rValue )
-{
- switch( pProperty->nWID )
- {
- case OWN_ATTR_VALUE_POLYPOLYGONBEZIER:
- {
- if( auto s = o3tl::tryAccess<drawing::PolyPolygonBezierCoords>(rValue) )
- {
- basegfx::B2DPolyPolygon aNewPolyPolygon(
- basegfx::unotools::polyPolygonBezierToB2DPolyPolygon(*s));
- SetPolygon(aNewPolyPolygon);
- return true;
- }
- break;
- }
- case OWN_ATTR_BASE_GEOMETRY:
{
- if( auto s = o3tl::tryAccess<drawing::PolyPolygonBezierCoords>(rValue) )
+ switch(GetSdrObject()->GetObjIdentifier())
{
- if( HasSdrObject() )
- {
- basegfx::B2DPolyPolygon aNewPolyPolygon;
- basegfx::B2DHomMatrix aNewHomogenMatrix;
-
- GetSdrObject()->TRGetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon);
- aNewPolyPolygon = basegfx::unotools::polyPolygonBezierToB2DPolyPolygon(*s);
-
- // tdf#117145 metric of SdrModel is app-specific, metric of UNO API is 100thmm
- // Need to adapt aNewPolyPolygon from 100thmm to app-specific
- ForceMetricToItemPoolMetric(aNewPolyPolygon);
-
- GetSdrObject()->TRSetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon);
- }
- return true;
+ case OBJ_POLY: aRetval = drawing::PolygonKind_POLY; break;
+ case OBJ_PLIN: aRetval = drawing::PolygonKind_PLIN; break;
+ case OBJ_SPLNLINE:
+ case OBJ_PATHLINE: aRetval = drawing::PolygonKind_PATHLINE; break;
+ case OBJ_SPLNFILL:
+ case OBJ_PATHFILL: aRetval = drawing::PolygonKind_PATHFILL; break;
+ case OBJ_FREELINE: aRetval = drawing::PolygonKind_FREELINE; break;
+ case OBJ_FREEFILL: aRetval = drawing::PolygonKind_FREEFILL; break;
}
- break;
- }
- default:
- return SvxShapeText::setPropertyValueImpl( rName, pProperty, rValue );
}
- throw IllegalArgumentException();
-}
-
-
-bool SvxShapePolyPolygonBezier::getPropertyValueImpl( const OUString& rName, const SfxItemPropertySimpleEntry* pProperty, css::uno::Any& rValue )
-{
- switch( pProperty->nWID )
- {
- case OWN_ATTR_VALUE_POLYPOLYGONBEZIER:
- {
- // pack a tools::PolyPolygon in a struct tools::PolyPolygon
- const basegfx::B2DPolyPolygon& rPolyPoly = GetPolygon();
- drawing::PolyPolygonBezierCoords aRetval;
- basegfx::unotools::b2DPolyPolygonToPolyPolygonBezier(rPolyPoly, aRetval);
-
- rValue <<= aRetval;
- break;
- }
- case OWN_ATTR_BASE_GEOMETRY:
- {
- // pack a tools::PolyPolygon in a struct tools::PolyPolygon
- basegfx::B2DPolyPolygon aNewPolyPolygon;
- basegfx::B2DHomMatrix aNewHomogenMatrix;
- GetSdrObject()->TRGetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon);
-
- // tdf#117145 metric of SdrModel is app-specific, metric of UNO API is 100thmm
- // Need to adapt aNewPolyPolygon from app-specific to 100thmm
- ForceMetricTo100th_mm(aNewPolyPolygon);
-
- drawing::PolyPolygonBezierCoords aRetval;
- basegfx::unotools::b2DPolyPolygonToPolyPolygonBezier(aNewPolyPolygon, aRetval);
-
- rValue <<= aRetval;
- break;
- }
- case OWN_ATTR_VALUE_POLYGONKIND:
- {
- rValue <<= mePolygonKind;
- break;
- }
- default:
- return SvxShapeText::getPropertyValueImpl( rName, pProperty, rValue );
- }
- return true;
+ return aRetval;
}
-
-void SvxShapePolyPolygonBezier::SetPolygon(const basegfx::B2DPolyPolygon& rNew)
+void SvxShapePolyPolygon::SetPolygon(const basegfx::B2DPolyPolygon& rNew)
{
::SolarMutexGuard aGuard;
@@ -1279,7 +1178,7 @@ void SvxShapePolyPolygonBezier::SetPolygon(const basegfx::B2DPolyPolygon& rNew)
}
-basegfx::B2DPolyPolygon SvxShapePolyPolygonBezier::GetPolygon() const throw()
+basegfx::B2DPolyPolygon SvxShapePolyPolygon::GetPolygon() const throw()
{
::SolarMutexGuard aGuard;
@@ -1293,6 +1192,8 @@ basegfx::B2DPolyPolygon SvxShapePolyPolygonBezier::GetPolygon() const throw()
}
}
+//////////////////////////////////////////////////////////////////////////////
+
SvxGraphicObject::SvxGraphicObject(SdrObject* pObj)
: SvxShapeText( pObj, getSvxMapProvider().GetMap(SVXMAP_GRAPHICOBJECT), getSvxMapProvider().GetPropertySet(SVXMAP_GRAPHICOBJECT, SdrObject::GetGlobalDrawObjectItemPool()) )
{