1*464702f4SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*464702f4SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*464702f4SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*464702f4SAndrew Rist  * distributed with this work for additional information
6*464702f4SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*464702f4SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*464702f4SAndrew Rist  * "License"); you may not use this file except in compliance
9*464702f4SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*464702f4SAndrew Rist  *
11*464702f4SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*464702f4SAndrew Rist  *
13*464702f4SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*464702f4SAndrew Rist  * software distributed under the License is distributed on an
15*464702f4SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*464702f4SAndrew Rist  * KIND, either express or implied.  See the License for the
17*464702f4SAndrew Rist  * specific language governing permissions and limitations
18*464702f4SAndrew Rist  * under the License.
19*464702f4SAndrew Rist  *
20*464702f4SAndrew Rist  *************************************************************/
21*464702f4SAndrew Rist 
22*464702f4SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_drawinglayer.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <drawinglayer/geometry/viewinformation2d.hxx>
28cdf0e10cSrcweir #include <basegfx/matrix/b2dhommatrix.hxx>
29cdf0e10cSrcweir #include <basegfx/range/b2drange.hxx>
30cdf0e10cSrcweir #include <osl/mutex.hxx>
31cdf0e10cSrcweir #include <basegfx/tools/canvastools.hxx>
32cdf0e10cSrcweir #include <com/sun/star/geometry/AffineMatrix2D.hpp>
33cdf0e10cSrcweir #include <com/sun/star/geometry/RealRectangle2D.hpp>
34cdf0e10cSrcweir 
35cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
36cdf0e10cSrcweir 
37cdf0e10cSrcweir using namespace com::sun::star;
38cdf0e10cSrcweir 
39cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
40cdf0e10cSrcweir 
41cdf0e10cSrcweir namespace drawinglayer
42cdf0e10cSrcweir {
43cdf0e10cSrcweir 	namespace geometry
44cdf0e10cSrcweir 	{
45cdf0e10cSrcweir 		class ImpViewInformation2D
46cdf0e10cSrcweir 		{
47cdf0e10cSrcweir 		private:
48cdf0e10cSrcweir 			// ViewInformation2D implementation can change refcount, so we have only
49cdf0e10cSrcweir 			// two memory regions for pairs of ViewInformation2D/ImpViewInformation2D
50cdf0e10cSrcweir 			friend class ::drawinglayer::geometry::ViewInformation2D;
51cdf0e10cSrcweir 
52cdf0e10cSrcweir 			// the refcounter. 0 means exclusively used
53cdf0e10cSrcweir 			sal_uInt32									mnRefCount;
54cdf0e10cSrcweir 
55cdf0e10cSrcweir 		protected:
56cdf0e10cSrcweir             // the object transformation
57cdf0e10cSrcweir 			basegfx::B2DHomMatrix						maObjectTransformation;
58cdf0e10cSrcweir 
59cdf0e10cSrcweir             // the view transformation
60cdf0e10cSrcweir 			basegfx::B2DHomMatrix						maViewTransformation;
61cdf0e10cSrcweir 
62cdf0e10cSrcweir             // the ObjectToView and it's inverse, both on demand from ObjectTransformation
63cdf0e10cSrcweir             // and ViewTransformation
64cdf0e10cSrcweir 			basegfx::B2DHomMatrix						maObjectToViewTransformation;
65cdf0e10cSrcweir 			basegfx::B2DHomMatrix						maInverseObjectToViewTransformation;
66cdf0e10cSrcweir 
67cdf0e10cSrcweir             // the visible range and the on-demand one in ViewCoordinates
68cdf0e10cSrcweir 			basegfx::B2DRange							maViewport;
69cdf0e10cSrcweir 			basegfx::B2DRange							maDiscreteViewport;
70cdf0e10cSrcweir 
71cdf0e10cSrcweir 			// the DrawPage which is target of visualisation. This is needed e.g. for
72cdf0e10cSrcweir 			// the view-dependent decomposition of PageNumber TextFields.
73cdf0e10cSrcweir             // This parameter is buffered here, but mainly resides in mxExtendedInformation,
74cdf0e10cSrcweir             // so it will be interpreted, but held there. It will also not be added
75cdf0e10cSrcweir             // to mxExtendedInformation in impFillViewInformationFromContent (it's there already)
76cdf0e10cSrcweir 			uno::Reference< drawing::XDrawPage >		mxVisualizedPage;
77cdf0e10cSrcweir 
78cdf0e10cSrcweir 			// the point in time
79cdf0e10cSrcweir 			double										mfViewTime;
80cdf0e10cSrcweir 
81cdf0e10cSrcweir             // bitfield
82cdf0e10cSrcweir             bool                                        mbReducedDisplayQuality : 1;
83cdf0e10cSrcweir 
84cdf0e10cSrcweir 			// the complete PropertyValue representation (if already created)
85cdf0e10cSrcweir 			uno::Sequence< beans::PropertyValue >		mxViewInformation;
86cdf0e10cSrcweir 
87cdf0e10cSrcweir 			// the extra PropertyValues; not represented by ViewTransformation,
88cdf0e10cSrcweir 			// Viewport, VisualizedPage or ViewTime
89cdf0e10cSrcweir 			uno::Sequence< beans::PropertyValue >		mxExtendedInformation;
90cdf0e10cSrcweir 
91cdf0e10cSrcweir 			// the local UNO API strings
getNamePropertyObjectTransformation()92cdf0e10cSrcweir 			const ::rtl::OUString& getNamePropertyObjectTransformation()
93cdf0e10cSrcweir 			{
94cdf0e10cSrcweir 				static ::rtl::OUString s_sNameProperty(RTL_CONSTASCII_USTRINGPARAM("ObjectTransformation"));
95cdf0e10cSrcweir 				return s_sNameProperty;
96cdf0e10cSrcweir 			}
97cdf0e10cSrcweir 
getNamePropertyViewTransformation()98cdf0e10cSrcweir 			const ::rtl::OUString& getNamePropertyViewTransformation()
99cdf0e10cSrcweir 			{
100cdf0e10cSrcweir 				static ::rtl::OUString s_sNameProperty(RTL_CONSTASCII_USTRINGPARAM("ViewTransformation"));
101cdf0e10cSrcweir 				return s_sNameProperty;
102cdf0e10cSrcweir 			}
103cdf0e10cSrcweir 
getNamePropertyViewport()104cdf0e10cSrcweir 			const ::rtl::OUString& getNamePropertyViewport()
105cdf0e10cSrcweir 			{
106cdf0e10cSrcweir 				static ::rtl::OUString s_sNameProperty(RTL_CONSTASCII_USTRINGPARAM("Viewport"));
107cdf0e10cSrcweir 				return s_sNameProperty;
108cdf0e10cSrcweir 			}
109cdf0e10cSrcweir 
getNamePropertyTime()110cdf0e10cSrcweir 			const ::rtl::OUString& getNamePropertyTime()
111cdf0e10cSrcweir 			{
112cdf0e10cSrcweir 				static ::rtl::OUString s_sNameProperty(RTL_CONSTASCII_USTRINGPARAM("Time"));
113cdf0e10cSrcweir 				return s_sNameProperty;
114cdf0e10cSrcweir 			}
115cdf0e10cSrcweir 
getNamePropertyVisualizedPage()116cdf0e10cSrcweir 			const ::rtl::OUString& getNamePropertyVisualizedPage()
117cdf0e10cSrcweir 			{
118cdf0e10cSrcweir 				static ::rtl::OUString s_sNameProperty(RTL_CONSTASCII_USTRINGPARAM("VisualizedPage"));
119cdf0e10cSrcweir 				return s_sNameProperty;
120cdf0e10cSrcweir 			}
121cdf0e10cSrcweir 
getNamePropertyReducedDisplayQuality()122cdf0e10cSrcweir 			const ::rtl::OUString& getNamePropertyReducedDisplayQuality()
123cdf0e10cSrcweir 			{
124cdf0e10cSrcweir 				static ::rtl::OUString s_sNameProperty(RTL_CONSTASCII_USTRINGPARAM("ReducedDisplayQuality"));
125cdf0e10cSrcweir 				return s_sNameProperty;
126cdf0e10cSrcweir 			}
127cdf0e10cSrcweir 
impInterpretPropertyValues(const uno::Sequence<beans::PropertyValue> & rViewParameters)128cdf0e10cSrcweir 			void impInterpretPropertyValues(const uno::Sequence< beans::PropertyValue >& rViewParameters)
129cdf0e10cSrcweir 			{
130cdf0e10cSrcweir 				if(rViewParameters.hasElements())
131cdf0e10cSrcweir 				{
132cdf0e10cSrcweir 					const sal_Int32 nCount(rViewParameters.getLength());
133cdf0e10cSrcweir 					sal_Int32 nExtendedInsert(0);
134cdf0e10cSrcweir 
135cdf0e10cSrcweir 					// prepare extended information for filtering. Maximum size is nCount
136cdf0e10cSrcweir 					mxExtendedInformation.realloc(nCount);
137cdf0e10cSrcweir 
138cdf0e10cSrcweir 					for(sal_Int32 a(0); a < nCount; a++)
139cdf0e10cSrcweir 					{
140cdf0e10cSrcweir 						const beans::PropertyValue& rProp = rViewParameters[a];
141cdf0e10cSrcweir 
142cdf0e10cSrcweir 						if(rProp.Name == getNamePropertyReducedDisplayQuality())
143cdf0e10cSrcweir 						{
144cdf0e10cSrcweir                             // extra information; add to filtered information
145cdf0e10cSrcweir 							mxExtendedInformation[nExtendedInsert++] = rProp;
146cdf0e10cSrcweir 
147cdf0e10cSrcweir                             // for performance reasons, also cache content locally
148cdf0e10cSrcweir                             sal_Bool bSalBool(false);
149cdf0e10cSrcweir 							rProp.Value >>= bSalBool;
150cdf0e10cSrcweir                             mbReducedDisplayQuality = bSalBool;
151cdf0e10cSrcweir 						}
152cdf0e10cSrcweir 						else if(rProp.Name == getNamePropertyObjectTransformation())
153cdf0e10cSrcweir 						{
154cdf0e10cSrcweir 							com::sun::star::geometry::AffineMatrix2D aAffineMatrix2D;
155cdf0e10cSrcweir 							rProp.Value >>= aAffineMatrix2D;
156cdf0e10cSrcweir 							basegfx::unotools::homMatrixFromAffineMatrix(maObjectTransformation, aAffineMatrix2D);
157cdf0e10cSrcweir 						}
158cdf0e10cSrcweir 						else if(rProp.Name == getNamePropertyViewTransformation())
159cdf0e10cSrcweir 						{
160cdf0e10cSrcweir 							com::sun::star::geometry::AffineMatrix2D aAffineMatrix2D;
161cdf0e10cSrcweir 							rProp.Value >>= aAffineMatrix2D;
162cdf0e10cSrcweir 							basegfx::unotools::homMatrixFromAffineMatrix(maViewTransformation, aAffineMatrix2D);
163cdf0e10cSrcweir 						}
164cdf0e10cSrcweir 						else if(rProp.Name == getNamePropertyViewport())
165cdf0e10cSrcweir 						{
166cdf0e10cSrcweir 							com::sun::star::geometry::RealRectangle2D aViewport;
167cdf0e10cSrcweir 							rProp.Value >>= aViewport;
168cdf0e10cSrcweir 							maViewport = basegfx::unotools::b2DRectangleFromRealRectangle2D(aViewport);
169cdf0e10cSrcweir 						}
170cdf0e10cSrcweir 						else if(rProp.Name == getNamePropertyTime())
171cdf0e10cSrcweir 						{
172cdf0e10cSrcweir 							rProp.Value >>= mfViewTime;
173cdf0e10cSrcweir 						}
174cdf0e10cSrcweir 						else if(rProp.Name == getNamePropertyVisualizedPage())
175cdf0e10cSrcweir 						{
176cdf0e10cSrcweir 							rProp.Value >>= mxVisualizedPage;
177cdf0e10cSrcweir 						}
178cdf0e10cSrcweir 						else
179cdf0e10cSrcweir 						{
180cdf0e10cSrcweir 							// extra information; add to filtered information
181cdf0e10cSrcweir 							mxExtendedInformation[nExtendedInsert++] = rProp;
182cdf0e10cSrcweir 						}
183cdf0e10cSrcweir 					}
184cdf0e10cSrcweir 
185cdf0e10cSrcweir 					// extra information size is now known; realloc to final size
186cdf0e10cSrcweir 					mxExtendedInformation.realloc(nExtendedInsert);
187cdf0e10cSrcweir 				}
188cdf0e10cSrcweir 			}
189cdf0e10cSrcweir 
impFillViewInformationFromContent()190cdf0e10cSrcweir 			void impFillViewInformationFromContent()
191cdf0e10cSrcweir 			{
192cdf0e10cSrcweir 				uno::Sequence< beans::PropertyValue > xRetval;
193cdf0e10cSrcweir 				const bool bObjectTransformationUsed(!maObjectTransformation.isIdentity());
194cdf0e10cSrcweir 				const bool bViewTransformationUsed(!maViewTransformation.isIdentity());
195cdf0e10cSrcweir 				const bool bViewportUsed(!maViewport.isEmpty());
196cdf0e10cSrcweir 				const bool bTimeUsed(0.0 < mfViewTime);
197cdf0e10cSrcweir 				const bool bVisualizedPageUsed(mxVisualizedPage.is());
198cdf0e10cSrcweir                 const bool bReducedDisplayQualityUsed(true == mbReducedDisplayQuality);
199cdf0e10cSrcweir 				const bool bExtraInformation(mxExtendedInformation.hasElements());
200cdf0e10cSrcweir 				sal_uInt32 nIndex(0);
201cdf0e10cSrcweir 				const sal_uInt32 nCount(
202cdf0e10cSrcweir 					(bObjectTransformationUsed ? 1 : 0) +
203cdf0e10cSrcweir 					(bViewTransformationUsed ? 1 : 0) +
204cdf0e10cSrcweir 					(bViewportUsed ? 1 : 0) +
205cdf0e10cSrcweir 					(bTimeUsed ? 1 : 0) +
206cdf0e10cSrcweir 					(bVisualizedPageUsed ? 1 : 0) +
207cdf0e10cSrcweir                     (bReducedDisplayQualityUsed ? 1 : 0) +
208cdf0e10cSrcweir 					(bExtraInformation ? mxExtendedInformation.getLength() : 0));
209cdf0e10cSrcweir 
210cdf0e10cSrcweir 				mxViewInformation.realloc(nCount);
211cdf0e10cSrcweir 
212cdf0e10cSrcweir 				if(bObjectTransformationUsed)
213cdf0e10cSrcweir 				{
214cdf0e10cSrcweir 					com::sun::star::geometry::AffineMatrix2D aAffineMatrix2D;
215cdf0e10cSrcweir 					basegfx::unotools::affineMatrixFromHomMatrix(aAffineMatrix2D, maObjectTransformation);
216cdf0e10cSrcweir 					mxViewInformation[nIndex].Name = getNamePropertyObjectTransformation();
217cdf0e10cSrcweir 					mxViewInformation[nIndex].Value <<= aAffineMatrix2D;
218cdf0e10cSrcweir 					nIndex++;
219cdf0e10cSrcweir 				}
220cdf0e10cSrcweir 
221cdf0e10cSrcweir 				if(bViewTransformationUsed)
222cdf0e10cSrcweir 				{
223cdf0e10cSrcweir 					com::sun::star::geometry::AffineMatrix2D aAffineMatrix2D;
224cdf0e10cSrcweir 					basegfx::unotools::affineMatrixFromHomMatrix(aAffineMatrix2D, maViewTransformation);
225cdf0e10cSrcweir 					mxViewInformation[nIndex].Name = getNamePropertyViewTransformation();
226cdf0e10cSrcweir 					mxViewInformation[nIndex].Value <<= aAffineMatrix2D;
227cdf0e10cSrcweir 					nIndex++;
228cdf0e10cSrcweir 				}
229cdf0e10cSrcweir 
230cdf0e10cSrcweir 				if(bViewportUsed)
231cdf0e10cSrcweir 				{
232cdf0e10cSrcweir 					const com::sun::star::geometry::RealRectangle2D aViewport(basegfx::unotools::rectangle2DFromB2DRectangle(maViewport));
233cdf0e10cSrcweir 					mxViewInformation[nIndex].Name = getNamePropertyViewport();
234cdf0e10cSrcweir 					mxViewInformation[nIndex].Value <<= aViewport;
235cdf0e10cSrcweir 					nIndex++;
236cdf0e10cSrcweir 				}
237cdf0e10cSrcweir 
238cdf0e10cSrcweir 				if(bTimeUsed)
239cdf0e10cSrcweir 				{
240cdf0e10cSrcweir 					mxViewInformation[nIndex].Name = getNamePropertyTime();
241cdf0e10cSrcweir 					mxViewInformation[nIndex].Value <<= mfViewTime;
242cdf0e10cSrcweir 					nIndex++;
243cdf0e10cSrcweir 				}
244cdf0e10cSrcweir 
245cdf0e10cSrcweir 				if(bVisualizedPageUsed)
246cdf0e10cSrcweir 				{
247cdf0e10cSrcweir 					mxViewInformation[nIndex].Name = getNamePropertyVisualizedPage();
248cdf0e10cSrcweir 					mxViewInformation[nIndex].Value <<= mxVisualizedPage;
249cdf0e10cSrcweir 					nIndex++;
250cdf0e10cSrcweir 				}
251cdf0e10cSrcweir 
252cdf0e10cSrcweir 				if(bExtraInformation)
253cdf0e10cSrcweir 				{
254cdf0e10cSrcweir 					const sal_Int32 nExtra(mxExtendedInformation.getLength());
255cdf0e10cSrcweir 
256cdf0e10cSrcweir 					for(sal_Int32 a(0); a < nExtra; a++)
257cdf0e10cSrcweir 					{
258cdf0e10cSrcweir 						mxViewInformation[nIndex++] = mxExtendedInformation[a];
259cdf0e10cSrcweir 					}
260cdf0e10cSrcweir 				}
261cdf0e10cSrcweir 			}
262cdf0e10cSrcweir 
263cdf0e10cSrcweir 		public:
ImpViewInformation2D(const basegfx::B2DHomMatrix & rObjectTransformation,const basegfx::B2DHomMatrix & rViewTransformation,const basegfx::B2DRange & rViewport,const uno::Reference<drawing::XDrawPage> & rxDrawPage,double fViewTime,const uno::Sequence<beans::PropertyValue> & rExtendedParameters)264cdf0e10cSrcweir 			ImpViewInformation2D(
265cdf0e10cSrcweir 				const basegfx::B2DHomMatrix& rObjectTransformation,
266cdf0e10cSrcweir 				const basegfx::B2DHomMatrix& rViewTransformation,
267cdf0e10cSrcweir 				const basegfx::B2DRange& rViewport,
268cdf0e10cSrcweir 				const uno::Reference< drawing::XDrawPage >& rxDrawPage,
269cdf0e10cSrcweir 				double fViewTime,
270cdf0e10cSrcweir 				const uno::Sequence< beans::PropertyValue >& rExtendedParameters)
271cdf0e10cSrcweir 			:	mnRefCount(0),
272cdf0e10cSrcweir 				maObjectTransformation(rObjectTransformation),
273cdf0e10cSrcweir 				maViewTransformation(rViewTransformation),
274cdf0e10cSrcweir                 maObjectToViewTransformation(),
275cdf0e10cSrcweir                 maInverseObjectToViewTransformation(),
276cdf0e10cSrcweir 				maViewport(rViewport),
277cdf0e10cSrcweir 				maDiscreteViewport(),
278cdf0e10cSrcweir 				mxVisualizedPage(rxDrawPage),
279cdf0e10cSrcweir 				mfViewTime(fViewTime),
280cdf0e10cSrcweir                 mbReducedDisplayQuality(false),
281cdf0e10cSrcweir 				mxViewInformation(),
282cdf0e10cSrcweir 				mxExtendedInformation()
283cdf0e10cSrcweir 			{
284cdf0e10cSrcweir 				impInterpretPropertyValues(rExtendedParameters);
285cdf0e10cSrcweir 			}
286cdf0e10cSrcweir 
ImpViewInformation2D(const uno::Sequence<beans::PropertyValue> & rViewParameters)287cdf0e10cSrcweir 			ImpViewInformation2D(const uno::Sequence< beans::PropertyValue >& rViewParameters)
288cdf0e10cSrcweir 			:	mnRefCount(0),
289cdf0e10cSrcweir 				maObjectTransformation(),
290cdf0e10cSrcweir 				maViewTransformation(),
291cdf0e10cSrcweir                 maObjectToViewTransformation(),
292cdf0e10cSrcweir                 maInverseObjectToViewTransformation(),
293cdf0e10cSrcweir 				maViewport(),
294cdf0e10cSrcweir 				maDiscreteViewport(),
295cdf0e10cSrcweir 				mxVisualizedPage(),
296cdf0e10cSrcweir 				mfViewTime(),
297cdf0e10cSrcweir                 mbReducedDisplayQuality(false),
298cdf0e10cSrcweir 				mxViewInformation(rViewParameters),
299cdf0e10cSrcweir 				mxExtendedInformation()
300cdf0e10cSrcweir 			{
301cdf0e10cSrcweir 				impInterpretPropertyValues(rViewParameters);
302cdf0e10cSrcweir 			}
303cdf0e10cSrcweir 
ImpViewInformation2D()304cdf0e10cSrcweir 			ImpViewInformation2D()
305cdf0e10cSrcweir 			:	mnRefCount(0),
306cdf0e10cSrcweir 				maObjectTransformation(),
307cdf0e10cSrcweir 				maViewTransformation(),
308cdf0e10cSrcweir                 maObjectToViewTransformation(),
309cdf0e10cSrcweir                 maInverseObjectToViewTransformation(),
310cdf0e10cSrcweir 				maViewport(),
311cdf0e10cSrcweir 				maDiscreteViewport(),
312cdf0e10cSrcweir 				mxVisualizedPage(),
313cdf0e10cSrcweir 				mfViewTime(),
314cdf0e10cSrcweir                 mbReducedDisplayQuality(false),
315cdf0e10cSrcweir 				mxViewInformation(),
316cdf0e10cSrcweir 				mxExtendedInformation()
317cdf0e10cSrcweir 			{
318cdf0e10cSrcweir 			}
319cdf0e10cSrcweir 
getObjectTransformation() const320cdf0e10cSrcweir 			const basegfx::B2DHomMatrix& getObjectTransformation() const
321cdf0e10cSrcweir             {
322cdf0e10cSrcweir                 return maObjectTransformation;
323cdf0e10cSrcweir             }
324cdf0e10cSrcweir 
getViewTransformation() const325cdf0e10cSrcweir 			const basegfx::B2DHomMatrix& getViewTransformation() const
326cdf0e10cSrcweir             {
327cdf0e10cSrcweir                 return maViewTransformation;
328cdf0e10cSrcweir             }
329cdf0e10cSrcweir 
getViewport() const330cdf0e10cSrcweir 			const basegfx::B2DRange& getViewport() const
331cdf0e10cSrcweir             {
332cdf0e10cSrcweir                 return maViewport;
333cdf0e10cSrcweir             }
334cdf0e10cSrcweir 
getDiscreteViewport() const335cdf0e10cSrcweir 			const basegfx::B2DRange& getDiscreteViewport() const
336cdf0e10cSrcweir 			{
337cdf0e10cSrcweir 			    ::osl::Mutex m_mutex;
338cdf0e10cSrcweir 
339cdf0e10cSrcweir 				if(maDiscreteViewport.isEmpty() && !maViewport.isEmpty())
340cdf0e10cSrcweir 				{
341cdf0e10cSrcweir 					basegfx::B2DRange aDiscreteViewport(maViewport);
342cdf0e10cSrcweir 					aDiscreteViewport.transform(getViewTransformation());
343cdf0e10cSrcweir 					const_cast< ImpViewInformation2D* >(this)->maDiscreteViewport = aDiscreteViewport;
344cdf0e10cSrcweir 				}
345cdf0e10cSrcweir 
346cdf0e10cSrcweir 				return maDiscreteViewport;
347cdf0e10cSrcweir 			}
348cdf0e10cSrcweir 
getObjectToViewTransformation() const349cdf0e10cSrcweir     		const basegfx::B2DHomMatrix& getObjectToViewTransformation() const
350cdf0e10cSrcweir             {
351cdf0e10cSrcweir 			    ::osl::Mutex m_mutex;
352cdf0e10cSrcweir 
353cdf0e10cSrcweir 				if(maObjectToViewTransformation.isIdentity() &&
354cdf0e10cSrcweir                     (!maObjectTransformation.isIdentity() || !maViewTransformation.isIdentity()))
355cdf0e10cSrcweir 				{
356cdf0e10cSrcweir     				basegfx::B2DHomMatrix aObjectToView(maViewTransformation * maObjectTransformation);
357cdf0e10cSrcweir 					const_cast< ImpViewInformation2D* >(this)->maObjectToViewTransformation = aObjectToView;
358cdf0e10cSrcweir 				}
359cdf0e10cSrcweir 
360cdf0e10cSrcweir 				return maObjectToViewTransformation;
361cdf0e10cSrcweir             }
362cdf0e10cSrcweir 
getInverseObjectToViewTransformation() const363cdf0e10cSrcweir     		const basegfx::B2DHomMatrix& getInverseObjectToViewTransformation() const
364cdf0e10cSrcweir             {
365cdf0e10cSrcweir 			    ::osl::Mutex m_mutex;
366cdf0e10cSrcweir 
367cdf0e10cSrcweir 				if(maInverseObjectToViewTransformation.isIdentity() &&
368cdf0e10cSrcweir                     (!maObjectTransformation.isIdentity() || !maViewTransformation.isIdentity()))
369cdf0e10cSrcweir 				{
370cdf0e10cSrcweir     				basegfx::B2DHomMatrix aInverseObjectToView(maViewTransformation * maObjectTransformation);
371cdf0e10cSrcweir                     aInverseObjectToView.invert();
372cdf0e10cSrcweir 					const_cast< ImpViewInformation2D* >(this)->maInverseObjectToViewTransformation = aInverseObjectToView;
373cdf0e10cSrcweir 				}
374cdf0e10cSrcweir 
375cdf0e10cSrcweir 				return maInverseObjectToViewTransformation;
376cdf0e10cSrcweir             }
377cdf0e10cSrcweir 
getViewTime() const378cdf0e10cSrcweir 			double getViewTime() const
379cdf0e10cSrcweir             {
380cdf0e10cSrcweir                 return mfViewTime;
381cdf0e10cSrcweir             }
382cdf0e10cSrcweir 
getVisualizedPage() const383cdf0e10cSrcweir 			const uno::Reference< drawing::XDrawPage >& getVisualizedPage() const
384cdf0e10cSrcweir 			{
385cdf0e10cSrcweir 				return mxVisualizedPage;
386cdf0e10cSrcweir 			}
387cdf0e10cSrcweir 
getReducedDisplayQuality() const388cdf0e10cSrcweir             bool getReducedDisplayQuality() const
389cdf0e10cSrcweir             {
390cdf0e10cSrcweir                 return mbReducedDisplayQuality;
391cdf0e10cSrcweir             }
392cdf0e10cSrcweir 
getViewInformationSequence() const393cdf0e10cSrcweir 			const uno::Sequence< beans::PropertyValue >& getViewInformationSequence() const
394cdf0e10cSrcweir 			{
395cdf0e10cSrcweir 				if(!mxViewInformation.hasElements())
396cdf0e10cSrcweir 				{
397cdf0e10cSrcweir 					const_cast< ImpViewInformation2D* >(this)->impFillViewInformationFromContent();
398cdf0e10cSrcweir 				}
399cdf0e10cSrcweir 
400cdf0e10cSrcweir 				return mxViewInformation;
401cdf0e10cSrcweir 			}
402cdf0e10cSrcweir 
getExtendedInformationSequence() const403cdf0e10cSrcweir 			const uno::Sequence< beans::PropertyValue >& getExtendedInformationSequence() const
404cdf0e10cSrcweir 			{
405cdf0e10cSrcweir 				return mxExtendedInformation;
406cdf0e10cSrcweir 			}
407cdf0e10cSrcweir 
operator ==(const ImpViewInformation2D & rCandidate) const408cdf0e10cSrcweir 			bool operator==(const ImpViewInformation2D& rCandidate) const
409cdf0e10cSrcweir 			{
410cdf0e10cSrcweir 				return (maObjectTransformation == rCandidate.maObjectTransformation
411cdf0e10cSrcweir                     && maViewTransformation == rCandidate.maViewTransformation
412cdf0e10cSrcweir 					&& maViewport == rCandidate.maViewport
413cdf0e10cSrcweir 					&& mxVisualizedPage == rCandidate.mxVisualizedPage
414cdf0e10cSrcweir 					&& mfViewTime == rCandidate.mfViewTime
415cdf0e10cSrcweir 					&& mxExtendedInformation == rCandidate.mxExtendedInformation);
416cdf0e10cSrcweir 			}
417cdf0e10cSrcweir 
get_global_default()418cdf0e10cSrcweir 			static ImpViewInformation2D* get_global_default()
419cdf0e10cSrcweir             {
420cdf0e10cSrcweir                 static ImpViewInformation2D* pDefault = 0;
421cdf0e10cSrcweir 
422cdf0e10cSrcweir                 if(!pDefault)
423cdf0e10cSrcweir                 {
424cdf0e10cSrcweir                     pDefault = new ImpViewInformation2D();
425cdf0e10cSrcweir 
426cdf0e10cSrcweir                     // never delete; start with RefCount 1, not 0
427cdf0e10cSrcweir     			    pDefault->mnRefCount++;
428cdf0e10cSrcweir                 }
429cdf0e10cSrcweir 
430cdf0e10cSrcweir                 return pDefault;
431cdf0e10cSrcweir             }
432cdf0e10cSrcweir 		};
433cdf0e10cSrcweir 	} // end of anonymous namespace
434cdf0e10cSrcweir } // end of namespace drawinglayer
435cdf0e10cSrcweir 
436cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
437cdf0e10cSrcweir 
438cdf0e10cSrcweir namespace drawinglayer
439cdf0e10cSrcweir {
440cdf0e10cSrcweir 	namespace geometry
441cdf0e10cSrcweir 	{
ViewInformation2D(const basegfx::B2DHomMatrix & rObjectTransformation,const basegfx::B2DHomMatrix & rViewTransformation,const basegfx::B2DRange & rViewport,const uno::Reference<drawing::XDrawPage> & rxDrawPage,double fViewTime,const uno::Sequence<beans::PropertyValue> & rExtendedParameters)442cdf0e10cSrcweir 		ViewInformation2D::ViewInformation2D(
443cdf0e10cSrcweir 			const basegfx::B2DHomMatrix& rObjectTransformation,
444cdf0e10cSrcweir 			const basegfx::B2DHomMatrix& rViewTransformation,
445cdf0e10cSrcweir 			const basegfx::B2DRange& rViewport,
446cdf0e10cSrcweir 			const uno::Reference< drawing::XDrawPage >& rxDrawPage,
447cdf0e10cSrcweir 			double fViewTime,
448cdf0e10cSrcweir 			const uno::Sequence< beans::PropertyValue >& rExtendedParameters)
449cdf0e10cSrcweir 		:	mpViewInformation2D(new ImpViewInformation2D(
450cdf0e10cSrcweir                 rObjectTransformation,
451cdf0e10cSrcweir                 rViewTransformation,
452cdf0e10cSrcweir                 rViewport,
453cdf0e10cSrcweir                 rxDrawPage,
454cdf0e10cSrcweir                 fViewTime,
455cdf0e10cSrcweir                 rExtendedParameters))
456cdf0e10cSrcweir 		{
457cdf0e10cSrcweir 		}
458cdf0e10cSrcweir 
ViewInformation2D(const uno::Sequence<beans::PropertyValue> & rViewParameters)459cdf0e10cSrcweir 		ViewInformation2D::ViewInformation2D(const uno::Sequence< beans::PropertyValue >& rViewParameters)
460cdf0e10cSrcweir 		:	mpViewInformation2D(new ImpViewInformation2D(rViewParameters))
461cdf0e10cSrcweir 		{
462cdf0e10cSrcweir 		}
463cdf0e10cSrcweir 
ViewInformation2D()464cdf0e10cSrcweir 		ViewInformation2D::ViewInformation2D()
465cdf0e10cSrcweir         :	mpViewInformation2D(ImpViewInformation2D::get_global_default())
466cdf0e10cSrcweir 		{
467cdf0e10cSrcweir 			mpViewInformation2D->mnRefCount++;
468cdf0e10cSrcweir 		}
469cdf0e10cSrcweir 
ViewInformation2D(const ViewInformation2D & rCandidate)470cdf0e10cSrcweir 		ViewInformation2D::ViewInformation2D(const ViewInformation2D& rCandidate)
471cdf0e10cSrcweir 		:	mpViewInformation2D(rCandidate.mpViewInformation2D)
472cdf0e10cSrcweir 		{
473cdf0e10cSrcweir 		    ::osl::Mutex m_mutex;
474cdf0e10cSrcweir 			mpViewInformation2D->mnRefCount++;
475cdf0e10cSrcweir 		}
476cdf0e10cSrcweir 
~ViewInformation2D()477cdf0e10cSrcweir 		ViewInformation2D::~ViewInformation2D()
478cdf0e10cSrcweir 		{
479cdf0e10cSrcweir 		    ::osl::Mutex m_mutex;
480cdf0e10cSrcweir 
481cdf0e10cSrcweir 			if(mpViewInformation2D->mnRefCount)
482cdf0e10cSrcweir 			{
483cdf0e10cSrcweir 				mpViewInformation2D->mnRefCount--;
484cdf0e10cSrcweir 			}
485cdf0e10cSrcweir 			else
486cdf0e10cSrcweir 			{
487cdf0e10cSrcweir 				delete mpViewInformation2D;
488cdf0e10cSrcweir 			}
489cdf0e10cSrcweir 		}
490cdf0e10cSrcweir 
isDefault() const491cdf0e10cSrcweir         bool ViewInformation2D::isDefault() const
492cdf0e10cSrcweir         {
493cdf0e10cSrcweir             return mpViewInformation2D == ImpViewInformation2D::get_global_default();
494cdf0e10cSrcweir         }
495cdf0e10cSrcweir 
operator =(const ViewInformation2D & rCandidate)496cdf0e10cSrcweir 		ViewInformation2D& ViewInformation2D::operator=(const ViewInformation2D& rCandidate)
497cdf0e10cSrcweir 		{
498cdf0e10cSrcweir 		    ::osl::Mutex m_mutex;
499cdf0e10cSrcweir 
500cdf0e10cSrcweir 			if(mpViewInformation2D->mnRefCount)
501cdf0e10cSrcweir 			{
502cdf0e10cSrcweir 				mpViewInformation2D->mnRefCount--;
503cdf0e10cSrcweir 			}
504cdf0e10cSrcweir 			else
505cdf0e10cSrcweir 			{
506cdf0e10cSrcweir 				delete mpViewInformation2D;
507cdf0e10cSrcweir 			}
508cdf0e10cSrcweir 
509cdf0e10cSrcweir 			mpViewInformation2D = rCandidate.mpViewInformation2D;
510cdf0e10cSrcweir 			mpViewInformation2D->mnRefCount++;
511cdf0e10cSrcweir 
512cdf0e10cSrcweir 			return *this;
513cdf0e10cSrcweir 		}
514cdf0e10cSrcweir 
operator ==(const ViewInformation2D & rCandidate) const515cdf0e10cSrcweir 		bool ViewInformation2D::operator==(const ViewInformation2D& rCandidate) const
516cdf0e10cSrcweir 		{
517cdf0e10cSrcweir 			if(rCandidate.mpViewInformation2D == mpViewInformation2D)
518cdf0e10cSrcweir 			{
519cdf0e10cSrcweir 				return true;
520cdf0e10cSrcweir 			}
521cdf0e10cSrcweir 
522cdf0e10cSrcweir 			if(rCandidate.isDefault() != isDefault())
523cdf0e10cSrcweir 			{
524cdf0e10cSrcweir 				return false;
525cdf0e10cSrcweir 			}
526cdf0e10cSrcweir 
527cdf0e10cSrcweir 			return (*rCandidate.mpViewInformation2D == *mpViewInformation2D);
528cdf0e10cSrcweir 		}
529cdf0e10cSrcweir 
getObjectTransformation() const530cdf0e10cSrcweir 		const basegfx::B2DHomMatrix& ViewInformation2D::getObjectTransformation() const
531cdf0e10cSrcweir         {
532cdf0e10cSrcweir 			return mpViewInformation2D->getObjectTransformation();
533cdf0e10cSrcweir         }
534cdf0e10cSrcweir 
getViewTransformation() const535cdf0e10cSrcweir 		const basegfx::B2DHomMatrix& ViewInformation2D::getViewTransformation() const
536cdf0e10cSrcweir 		{
537cdf0e10cSrcweir 			return mpViewInformation2D->getViewTransformation();
538cdf0e10cSrcweir 		}
539cdf0e10cSrcweir 
getViewport() const540cdf0e10cSrcweir 		const basegfx::B2DRange& ViewInformation2D::getViewport() const
541cdf0e10cSrcweir 		{
542cdf0e10cSrcweir 			return mpViewInformation2D->getViewport();
543cdf0e10cSrcweir 		}
544cdf0e10cSrcweir 
getViewTime() const545cdf0e10cSrcweir 		double ViewInformation2D::getViewTime() const
546cdf0e10cSrcweir 		{
547cdf0e10cSrcweir 			return mpViewInformation2D->getViewTime();
548cdf0e10cSrcweir 		}
549cdf0e10cSrcweir 
getVisualizedPage() const550cdf0e10cSrcweir 		const uno::Reference< drawing::XDrawPage >& ViewInformation2D::getVisualizedPage() const
551cdf0e10cSrcweir 		{
552cdf0e10cSrcweir 			return mpViewInformation2D->getVisualizedPage();
553cdf0e10cSrcweir 		}
554cdf0e10cSrcweir 
getObjectToViewTransformation() const555cdf0e10cSrcweir 		const basegfx::B2DHomMatrix& ViewInformation2D::getObjectToViewTransformation() const
556cdf0e10cSrcweir         {
557cdf0e10cSrcweir 			return mpViewInformation2D->getObjectToViewTransformation();
558cdf0e10cSrcweir         }
559cdf0e10cSrcweir 
getInverseObjectToViewTransformation() const560cdf0e10cSrcweir 		const basegfx::B2DHomMatrix& ViewInformation2D::getInverseObjectToViewTransformation() const
561cdf0e10cSrcweir         {
562cdf0e10cSrcweir 			return mpViewInformation2D->getInverseObjectToViewTransformation();
563cdf0e10cSrcweir         }
564cdf0e10cSrcweir 
getDiscreteViewport() const565cdf0e10cSrcweir         const basegfx::B2DRange& ViewInformation2D::getDiscreteViewport() const
566cdf0e10cSrcweir 		{
567cdf0e10cSrcweir 			return mpViewInformation2D->getDiscreteViewport();
568cdf0e10cSrcweir 		}
569cdf0e10cSrcweir 
getReducedDisplayQuality() const570cdf0e10cSrcweir         bool ViewInformation2D::getReducedDisplayQuality() const
571cdf0e10cSrcweir         {
572cdf0e10cSrcweir             return mpViewInformation2D->getReducedDisplayQuality();
573cdf0e10cSrcweir         }
574cdf0e10cSrcweir 
getViewInformationSequence() const575cdf0e10cSrcweir 		const uno::Sequence< beans::PropertyValue >& ViewInformation2D::getViewInformationSequence() const
576cdf0e10cSrcweir 		{
577cdf0e10cSrcweir 			return mpViewInformation2D->getViewInformationSequence();
578cdf0e10cSrcweir 		}
579cdf0e10cSrcweir 
getExtendedInformationSequence() const580cdf0e10cSrcweir 		const uno::Sequence< beans::PropertyValue >& ViewInformation2D::getExtendedInformationSequence() const
581cdf0e10cSrcweir 		{
582cdf0e10cSrcweir 			return mpViewInformation2D->getExtendedInformationSequence();
583cdf0e10cSrcweir 		}
584cdf0e10cSrcweir 	} // end of namespace geometry
585cdf0e10cSrcweir } // end of namespace drawinglayer
586cdf0e10cSrcweir 
587cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
588cdf0e10cSrcweir // eof
589