diff options
Diffstat (limited to 'drawinglayer/source/geometry/viewinformation2d.cxx')
-rw-r--r-- | drawinglayer/source/geometry/viewinformation2d.cxx | 316 |
1 files changed, 247 insertions, 69 deletions
diff --git a/drawinglayer/source/geometry/viewinformation2d.cxx b/drawinglayer/source/geometry/viewinformation2d.cxx index 0ad71b94dd80..4fc008067608 100644 --- a/drawinglayer/source/geometry/viewinformation2d.cxx +++ b/drawinglayer/source/geometry/viewinformation2d.cxx @@ -4,9 +4,9 @@ * * $RCSfile: viewinformation2d.cxx,v $ * - * $Revision: 1.1 $ + * $Revision: 1.2 $ * - * last change: $Author: aw $ $Date: 2006-10-19 10:40:02 $ + * last change: $Author: aw $ $Date: 2008-02-07 13:41:58 $ * * The Contents of this file are made available subject to * the terms of GNU Lesser General Public License Version 2.1. @@ -53,10 +53,18 @@ #include <basegfx/tools/canvastools.hxx> #endif -#ifndef _COM_SUN_STAR_GRAPHIC_PRIMITIVE2DPARAMETERS_HPP_ -#include "com/sun/star/graphic/Primitive2DParameters.hpp" +#ifndef _COM_SUN_STAR_GEOMETRY_AFFINEMATRIX2D_HPP_ +#include <com/sun/star/geometry/AffineMatrix2D.hpp> #endif +#ifndef _COM_SUN_STAR_GEOMETRY_REALRECTANGLE2D_HPP__ +#include <com/sun/star/geometry/RealRectangle2D.hpp> +#endif + +////////////////////////////////////////////////////////////////////////////// + +using namespace com::sun::star; + ////////////////////////////////////////////////////////////////////////////// namespace drawinglayer @@ -74,77 +82,225 @@ namespace drawinglayer sal_uInt32 mnRefCount; protected: - // the view transformation - ::basegfx::B2DHomMatrix maViewTransformation; - ::basegfx::B2DHomMatrix maInverseViewTransformation; + // the view transformation and the on-demand inverse of it + basegfx::B2DHomMatrix maViewTransformation; + basegfx::B2DHomMatrix maInverseViewTransformation; + + // the visible range and the on-demand one in ViewCoordinates + basegfx::B2DRange maViewport; + basegfx::B2DRange maDiscreteViewport; - // the visible ranges - ::basegfx::B2DRange maViewport; - ::basegfx::B2DRange maDiscreteViewport; + // the DrawPage which is target of visualisation. This is needed e.g. for + // the view-dependent decomposition of PageNumber TextFields + uno::Reference< drawing::XDrawPage > mxVisualizedPage; // the point in time double mfViewTime; + // the complete PropertyValue representation (if already created) + uno::Sequence< beans::PropertyValue > mxViewInformation; + + // the extra PropertyValues; not represented by ViewTransformation, + // Viewport or ViewTime + uno::Sequence< beans::PropertyValue > mxExtendedInformation; + // bitfield unsigned mbInverseValid : 1; unsigned mbDiscreteViewportValid : 1; + // the local UNO API strings + const ::rtl::OUString& getNamePropertyTransformation() + { + static ::rtl::OUString s_sNamePropertyTransformation(RTL_CONSTASCII_USTRINGPARAM("Transformation")); + return s_sNamePropertyTransformation; + } + + const ::rtl::OUString& getNamePropertyViewport() + { + static ::rtl::OUString s_sNamePropertyViewport(RTL_CONSTASCII_USTRINGPARAM("Viewport")); + return s_sNamePropertyViewport; + } + + const ::rtl::OUString& getNamePropertyTime() + { + static ::rtl::OUString s_sNamePropertyTime(RTL_CONSTASCII_USTRINGPARAM("Time")); + return s_sNamePropertyTime; + } + + const ::rtl::OUString& getNamePropertyVisualizedPage() + { + static ::rtl::OUString s_sNamePropertyXDrawPage(RTL_CONSTASCII_USTRINGPARAM("VisualizedPage")); + return s_sNamePropertyXDrawPage; + } + + void impInterpretPropertyValues(const uno::Sequence< beans::PropertyValue >& rViewParameters) + { + if(rViewParameters.hasElements()) + { + const sal_Int32 nCount(rViewParameters.getLength()); + sal_Int32 nExtendedInsert(0); + + // prepare extended information for filtering. Maximum size is nCount + mxExtendedInformation.realloc(nCount); + + for(sal_Int32 a(0); a < nCount; a++) + { + const beans::PropertyValue& rProp = rViewParameters[a]; + + if(rProp.Name == getNamePropertyTransformation()) + { + com::sun::star::geometry::AffineMatrix2D aAffineMatrix2D; + rProp.Value >>= aAffineMatrix2D; + basegfx::unotools::homMatrixFromAffineMatrix(maViewTransformation, aAffineMatrix2D); + } + else if(rProp.Name == getNamePropertyViewport()) + { + com::sun::star::geometry::RealRectangle2D aViewport; + rProp.Value >>= aViewport; + maViewport = basegfx::unotools::b2DRectangleFromRealRectangle2D(aViewport); + } + else if(rProp.Name == getNamePropertyTime()) + { + rProp.Value >>= mfViewTime; + } + else if(rProp.Name == getNamePropertyVisualizedPage()) + { + rProp.Value >>= mxVisualizedPage; + } + else + { + // extra information; add to filtered information + mxExtendedInformation[nExtendedInsert++] = rProp; + } + } + + // extra information size is now known; realloc to final size + mxExtendedInformation.realloc(nExtendedInsert); + } + } + + void impFillViewInformationFromContent() + { + uno::Sequence< beans::PropertyValue > xRetval; + const bool bViewTransformationUsed(!maViewTransformation.isIdentity()); + const bool bViewportUsed(!maViewport.isEmpty()); + const bool bTimeUsed(0.0 < mfViewTime); + const bool bVisualizedPageUsed(mxVisualizedPage.is()); + const bool bExtraInformation(mxExtendedInformation.hasElements()); + sal_uInt32 nIndex(0); + const sal_uInt32 nCount( + (bViewTransformationUsed ? 1 : 0) + + (bViewportUsed ? 1 : 0) + + (bTimeUsed ? 1 : 0) + + (bVisualizedPageUsed ? 1 : 0) + + (bExtraInformation ? mxExtendedInformation.getLength() : 0)); + + mxViewInformation.realloc(nCount); + + if(bViewTransformationUsed) + { + com::sun::star::geometry::AffineMatrix2D aAffineMatrix2D; + basegfx::unotools::affineMatrixFromHomMatrix(aAffineMatrix2D, maViewTransformation); + mxViewInformation[nIndex].Name = getNamePropertyTransformation(); + mxViewInformation[nIndex].Value <<= aAffineMatrix2D; + nIndex++; + } + + if(bViewportUsed) + { + const com::sun::star::geometry::RealRectangle2D aViewport(basegfx::unotools::rectangle2DFromB2DRectangle(maViewport)); + mxViewInformation[nIndex].Name = getNamePropertyViewport(); + mxViewInformation[nIndex].Value <<= aViewport; + nIndex++; + } + + if(bTimeUsed) + { + mxViewInformation[nIndex].Name = getNamePropertyTime(); + mxViewInformation[nIndex].Value <<= mfViewTime; + nIndex++; + } + + if(bVisualizedPageUsed) + { + mxViewInformation[nIndex].Name = getNamePropertyVisualizedPage(); + mxViewInformation[nIndex].Value <<= mxVisualizedPage; + nIndex++; + } + + if(bExtraInformation) + { + const sal_Int32 nExtra(mxExtendedInformation.getLength()); + + for(sal_Int32 a(0); a < nExtra; a++) + { + mxViewInformation[nIndex++] = mxExtendedInformation[a]; + } + } + } + public: ImpViewInformation2D( - const ::basegfx::B2DHomMatrix& rViewTransformation, - const ::basegfx::B2DRange& rViewport, - double fViewTime) - : mnRefCount(0L), + const basegfx::B2DHomMatrix& rViewTransformation, + const basegfx::B2DRange& rViewport, + const uno::Reference< drawing::XDrawPage >& rxDrawPage, + double fViewTime, + const uno::Sequence< beans::PropertyValue >& rExtendedParameters) + : mnRefCount(0), maViewTransformation(rViewTransformation), maInverseViewTransformation(maViewTransformation), maViewport(rViewport), maDiscreteViewport(), mfViewTime(fViewTime), + mxVisualizedPage(rxDrawPage), + mxViewInformation(), + mxExtendedInformation(), mbInverseValid(false), mbDiscreteViewportValid(false) { + impInterpretPropertyValues(rExtendedParameters); } - ImpViewInformation2D( - const ::com::sun::star::graphic::Primitive2DParameters& rParams) - : mnRefCount(0L), - maViewTransformation(basegfx::unotools::homMatrixFromAffineMatrix(rParams.ViewTransformation)), - maInverseViewTransformation(maViewTransformation), - maViewport(basegfx::unotools::b2DRectangleFromRealRectangle2D(rParams.Viewport)), + ImpViewInformation2D(const uno::Sequence< beans::PropertyValue >& rViewParameters) + : mnRefCount(0), + maViewTransformation(), + maInverseViewTransformation(), + maViewport(), maDiscreteViewport(), - mfViewTime(rParams.Time), + mfViewTime(), + mxVisualizedPage(), + mxViewInformation(rViewParameters), + mxExtendedInformation(), mbInverseValid(false), mbDiscreteViewportValid(false) { + impInterpretPropertyValues(rViewParameters); } - bool operator==(const ImpViewInformation2D& rCandidate) const - { - return (maViewTransformation == rCandidate.maViewTransformation - && mfViewTime == rCandidate.mfViewTime - && maViewport == rCandidate.maViewport); - } - - const ::basegfx::B2DHomMatrix& getViewTransformation() const { return maViewTransformation; } + const basegfx::B2DHomMatrix& getViewTransformation() const { return maViewTransformation; } - const ::basegfx::B2DRange& getViewport() const { return maViewport; } + const basegfx::B2DRange& getViewport() const { return maViewport; } - const ::basegfx::B2DRange& getDiscreteViewport() const + const basegfx::B2DRange& getDiscreteViewport() const { ::osl::Mutex m_mutex; if(!mbDiscreteViewportValid) { - ::basegfx::B2DRange aDiscreteViewport(maViewport); - aDiscreteViewport.transform(getViewTransformation()); - const_cast< ImpViewInformation2D* >(this)->maDiscreteViewport = aDiscreteViewport; + if(!maViewport.isEmpty()) + { + basegfx::B2DRange aDiscreteViewport(maViewport); + aDiscreteViewport.transform(getViewTransformation()); + const_cast< ImpViewInformation2D* >(this)->maDiscreteViewport = aDiscreteViewport; + } + const_cast< ImpViewInformation2D* >(this)->mbDiscreteViewportValid = true; } return maDiscreteViewport; } - const ::basegfx::B2DHomMatrix& getInverseViewTransformation() const + const basegfx::B2DHomMatrix& getInverseViewTransformation() const { ::osl::Mutex m_mutex; @@ -158,6 +314,26 @@ namespace drawinglayer } double getViewTime() const { return mfViewTime; } + + const uno::Reference< drawing::XDrawPage >& getVisualizedPage() const + { + return mxVisualizedPage; + } + + const uno::Sequence< beans::PropertyValue >& getViewInformationSequence() const + { + if(!mxViewInformation.hasElements()) + { + const_cast< ImpViewInformation2D* >(this)->impFillViewInformationFromContent(); + } + + return mxViewInformation; + } + + const uno::Sequence< beans::PropertyValue >& getExtendedInformationSequence() const + { + return mxExtendedInformation; + } }; } // end of anonymous namespace } // end of namespace drawinglayer @@ -169,21 +345,21 @@ namespace drawinglayer namespace geometry { ViewInformation2D::ViewInformation2D( - const ::basegfx::B2DHomMatrix& rViewTransformation, - const ::basegfx::B2DRange& rViewport, - double fViewTime) - : mpViewInformation2D(new ImpViewInformation2D(rViewTransformation, rViewport, fViewTime)) + const basegfx::B2DHomMatrix& rViewTransformation, + const basegfx::B2DRange& rViewport, + const uno::Reference< drawing::XDrawPage >& rxDrawPage, + double fViewTime, + const uno::Sequence< beans::PropertyValue >& rExtendedParameters) + : mpViewInformation2D(new ImpViewInformation2D(rViewTransformation, rViewport, rxDrawPage, fViewTime, rExtendedParameters)) { } - ViewInformation2D::ViewInformation2D( - const ::com::sun::star::graphic::Primitive2DParameters& rParams) - : mpViewInformation2D(new ImpViewInformation2D(rParams)) + ViewInformation2D::ViewInformation2D(const uno::Sequence< beans::PropertyValue >& rViewParameters) + : mpViewInformation2D(new ImpViewInformation2D(rViewParameters)) { } - ViewInformation2D::ViewInformation2D( - const ViewInformation2D& rCandidate) + ViewInformation2D::ViewInformation2D(const ViewInformation2D& rCandidate) : mpViewInformation2D(rCandidate.mpViewInformation2D) { ::osl::Mutex m_mutex; @@ -208,50 +384,37 @@ namespace drawinglayer { ::osl::Mutex m_mutex; - if(rCandidate.mpViewInformation2D != mpViewInformation2D) + if(mpViewInformation2D->mnRefCount) { - if(mpViewInformation2D->mnRefCount) - { - mpViewInformation2D->mnRefCount--; - } - else - { - delete mpViewInformation2D; - } - - mpViewInformation2D = rCandidate.mpViewInformation2D; - mpViewInformation2D->mnRefCount++; + mpViewInformation2D->mnRefCount--; } - - return *this; - } - - bool ViewInformation2D::operator==(const ViewInformation2D& rCandidate) const - { - if(rCandidate.mpViewInformation2D == mpViewInformation2D) + else { - return true; + delete mpViewInformation2D; } - return (*rCandidate.mpViewInformation2D == *mpViewInformation2D); + mpViewInformation2D = rCandidate.mpViewInformation2D; + mpViewInformation2D->mnRefCount++; + + return *this; } - const ::basegfx::B2DHomMatrix& ViewInformation2D::getViewTransformation() const + const basegfx::B2DHomMatrix& ViewInformation2D::getViewTransformation() const { return mpViewInformation2D->getViewTransformation(); } - const ::basegfx::B2DRange& ViewInformation2D::getViewport() const + const basegfx::B2DRange& ViewInformation2D::getViewport() const { return mpViewInformation2D->getViewport(); } - const ::basegfx::B2DRange& ViewInformation2D::getDiscreteViewport() const + const basegfx::B2DRange& ViewInformation2D::getDiscreteViewport() const { return mpViewInformation2D->getDiscreteViewport(); } - const ::basegfx::B2DHomMatrix& ViewInformation2D::getInverseViewTransformation() const + const basegfx::B2DHomMatrix& ViewInformation2D::getInverseViewTransformation() const { return mpViewInformation2D->getInverseViewTransformation(); } @@ -260,6 +423,21 @@ namespace drawinglayer { return mpViewInformation2D->getViewTime(); } + + const uno::Reference< drawing::XDrawPage >& ViewInformation2D::getVisualizedPage() const + { + return mpViewInformation2D->getVisualizedPage(); + } + + const uno::Sequence< beans::PropertyValue >& ViewInformation2D::getViewInformationSequence() const + { + return mpViewInformation2D->getViewInformationSequence(); + } + + const uno::Sequence< beans::PropertyValue >& ViewInformation2D::getExtendedInformationSequence() const + { + return mpViewInformation2D->getExtendedInformationSequence(); + } } // end of namespace geometry } // end of namespace drawinglayer |