summaryrefslogtreecommitdiff
path: root/drawinglayer/source/geometry/viewinformation2d.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'drawinglayer/source/geometry/viewinformation2d.cxx')
-rw-r--r--drawinglayer/source/geometry/viewinformation2d.cxx267
1 files changed, 267 insertions, 0 deletions
diff --git a/drawinglayer/source/geometry/viewinformation2d.cxx b/drawinglayer/source/geometry/viewinformation2d.cxx
new file mode 100644
index 000000000000..0ad71b94dd80
--- /dev/null
+++ b/drawinglayer/source/geometry/viewinformation2d.cxx
@@ -0,0 +1,267 @@
+/*************************************************************************
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: viewinformation2d.cxx,v $
+ *
+ * $Revision: 1.1 $
+ *
+ * last change: $Author: aw $ $Date: 2006-10-19 10:40:02 $
+ *
+ * The Contents of this file are made available subject to
+ * the terms of GNU Lesser General Public License Version 2.1.
+ *
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2005 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_DRAWINGLAYER_GEOMETRY_VIEWINFORMATION2D_HXX
+#include <drawinglayer/geometry/viewinformation2d.hxx>
+#endif
+
+#ifndef _BGFX_MATRIX_B2DHOMMATRIX_HXX
+#include <basegfx/matrix/b2dhommatrix.hxx>
+#endif
+
+#ifndef _BGFX_RANGE_B2DRANGE_HXX
+#include <basegfx/range/b2drange.hxx>
+#endif
+
+#ifndef _OSL_MUTEX_HXX_
+#include <osl/mutex.hxx>
+#endif
+
+#ifndef _BGFX_TOOLS_CANVASTOOLS_HXX
+#include <basegfx/tools/canvastools.hxx>
+#endif
+
+#ifndef _COM_SUN_STAR_GRAPHIC_PRIMITIVE2DPARAMETERS_HPP_
+#include "com/sun/star/graphic/Primitive2DParameters.hpp"
+#endif
+
+//////////////////////////////////////////////////////////////////////////////
+
+namespace drawinglayer
+{
+ namespace
+ {
+ class ImpViewInformation2D
+ {
+ private:
+ // ViewInformation2D implementation can change refcount, so we have only
+ // two memory regions for pairs of ViewInformation2D/ImpViewInformation2D
+ friend class ::drawinglayer::geometry::ViewInformation2D;
+
+ // the refcounter
+ sal_uInt32 mnRefCount;
+
+ protected:
+ // the view transformation
+ ::basegfx::B2DHomMatrix maViewTransformation;
+ ::basegfx::B2DHomMatrix maInverseViewTransformation;
+
+ // the visible ranges
+ ::basegfx::B2DRange maViewport;
+ ::basegfx::B2DRange maDiscreteViewport;
+
+ // the point in time
+ double mfViewTime;
+
+ // bitfield
+ unsigned mbInverseValid : 1;
+ unsigned mbDiscreteViewportValid : 1;
+
+ public:
+ ImpViewInformation2D(
+ const ::basegfx::B2DHomMatrix& rViewTransformation,
+ const ::basegfx::B2DRange& rViewport,
+ double fViewTime)
+ : mnRefCount(0L),
+ maViewTransformation(rViewTransformation),
+ maInverseViewTransformation(maViewTransformation),
+ maViewport(rViewport),
+ maDiscreteViewport(),
+ mfViewTime(fViewTime),
+ mbInverseValid(false),
+ mbDiscreteViewportValid(false)
+ {
+ }
+
+ ImpViewInformation2D(
+ const ::com::sun::star::graphic::Primitive2DParameters& rParams)
+ : mnRefCount(0L),
+ maViewTransformation(basegfx::unotools::homMatrixFromAffineMatrix(rParams.ViewTransformation)),
+ maInverseViewTransformation(maViewTransformation),
+ maViewport(basegfx::unotools::b2DRectangleFromRealRectangle2D(rParams.Viewport)),
+ maDiscreteViewport(),
+ mfViewTime(rParams.Time),
+ mbInverseValid(false),
+ mbDiscreteViewportValid(false)
+ {
+ }
+
+ 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::B2DRange& getViewport() const { return maViewport; }
+
+ const ::basegfx::B2DRange& getDiscreteViewport() const
+ {
+ ::osl::Mutex m_mutex;
+
+ if(!mbDiscreteViewportValid)
+ {
+ ::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
+ {
+ ::osl::Mutex m_mutex;
+
+ if(!mbInverseValid)
+ {
+ const_cast< ImpViewInformation2D* >(this)->maInverseViewTransformation.invert();
+ const_cast< ImpViewInformation2D* >(this)->mbInverseValid = true;
+ }
+
+ return maInverseViewTransformation;
+ }
+
+ double getViewTime() const { return mfViewTime; }
+ };
+ } // end of anonymous namespace
+} // end of namespace drawinglayer
+
+//////////////////////////////////////////////////////////////////////////////
+
+namespace drawinglayer
+{
+ namespace geometry
+ {
+ ViewInformation2D::ViewInformation2D(
+ const ::basegfx::B2DHomMatrix& rViewTransformation,
+ const ::basegfx::B2DRange& rViewport,
+ double fViewTime)
+ : mpViewInformation2D(new ImpViewInformation2D(rViewTransformation, rViewport, fViewTime))
+ {
+ }
+
+ ViewInformation2D::ViewInformation2D(
+ const ::com::sun::star::graphic::Primitive2DParameters& rParams)
+ : mpViewInformation2D(new ImpViewInformation2D(rParams))
+ {
+ }
+
+ ViewInformation2D::ViewInformation2D(
+ const ViewInformation2D& rCandidate)
+ : mpViewInformation2D(rCandidate.mpViewInformation2D)
+ {
+ ::osl::Mutex m_mutex;
+ mpViewInformation2D->mnRefCount++;
+ }
+
+ ViewInformation2D::~ViewInformation2D()
+ {
+ ::osl::Mutex m_mutex;
+
+ if(mpViewInformation2D->mnRefCount)
+ {
+ mpViewInformation2D->mnRefCount--;
+ }
+ else
+ {
+ delete mpViewInformation2D;
+ }
+ }
+
+ ViewInformation2D& ViewInformation2D::operator=(const ViewInformation2D& rCandidate)
+ {
+ ::osl::Mutex m_mutex;
+
+ if(rCandidate.mpViewInformation2D != mpViewInformation2D)
+ {
+ if(mpViewInformation2D->mnRefCount)
+ {
+ mpViewInformation2D->mnRefCount--;
+ }
+ else
+ {
+ delete mpViewInformation2D;
+ }
+
+ mpViewInformation2D = rCandidate.mpViewInformation2D;
+ mpViewInformation2D->mnRefCount++;
+ }
+
+ return *this;
+ }
+
+ bool ViewInformation2D::operator==(const ViewInformation2D& rCandidate) const
+ {
+ if(rCandidate.mpViewInformation2D == mpViewInformation2D)
+ {
+ return true;
+ }
+
+ return (*rCandidate.mpViewInformation2D == *mpViewInformation2D);
+ }
+
+ const ::basegfx::B2DHomMatrix& ViewInformation2D::getViewTransformation() const
+ {
+ return mpViewInformation2D->getViewTransformation();
+ }
+
+ const ::basegfx::B2DRange& ViewInformation2D::getViewport() const
+ {
+ return mpViewInformation2D->getViewport();
+ }
+
+ const ::basegfx::B2DRange& ViewInformation2D::getDiscreteViewport() const
+ {
+ return mpViewInformation2D->getDiscreteViewport();
+ }
+
+ const ::basegfx::B2DHomMatrix& ViewInformation2D::getInverseViewTransformation() const
+ {
+ return mpViewInformation2D->getInverseViewTransformation();
+ }
+
+ double ViewInformation2D::getViewTime() const
+ {
+ return mpViewInformation2D->getViewTime();
+ }
+ } // end of namespace geometry
+} // end of namespace drawinglayer
+
+//////////////////////////////////////////////////////////////////////////////
+// eof