diff options
Diffstat (limited to 'svx/source/unodraw/unoshap2.cxx')
-rw-r--r-- | svx/source/unodraw/unoshap2.cxx | 323 |
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()) ) { |