Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <drawinglayer/geometry/viewinformation2d.hxx>
21 : #include <basegfx/matrix/b2dhommatrix.hxx>
22 : #include <basegfx/range/b2drange.hxx>
23 : #include <basegfx/tools/canvastools.hxx>
24 : #include <com/sun/star/geometry/AffineMatrix2D.hpp>
25 : #include <com/sun/star/geometry/RealRectangle2D.hpp>
26 : #include <rtl/instance.hxx>
27 :
28 :
29 :
30 : using namespace com::sun::star;
31 :
32 :
33 :
34 : namespace drawinglayer
35 : {
36 : namespace geometry
37 : {
38 264971 : class ImpViewInformation2D
39 : {
40 : private:
41 : // ViewInformation2D implementation can change refcount, so we have only
42 : // two memory regions for pairs of ViewInformation2D/ImpViewInformation2D
43 : friend class ::drawinglayer::geometry::ViewInformation2D;
44 :
45 : protected:
46 : // the object transformation
47 : basegfx::B2DHomMatrix maObjectTransformation;
48 :
49 : // the view transformation
50 : basegfx::B2DHomMatrix maViewTransformation;
51 :
52 : // the ObjectToView and it's inverse, both on demand from ObjectTransformation
53 : // and ViewTransformation
54 : basegfx::B2DHomMatrix maObjectToViewTransformation;
55 : basegfx::B2DHomMatrix maInverseObjectToViewTransformation;
56 :
57 : // the visible range and the on-demand one in ViewCoordinates
58 : basegfx::B2DRange maViewport;
59 : basegfx::B2DRange maDiscreteViewport;
60 :
61 : // the DrawPage which is target of visualisation. This is needed e.g. for
62 : // the view-dependent decomposition of PageNumber TextFields.
63 : // This parameter is buffered here, but mainly resides in mxExtendedInformation,
64 : // so it will be interpreted, but held there. It will also not be added
65 : // to mxExtendedInformation in impFillViewInformationFromContent (it's there already)
66 : uno::Reference< drawing::XDrawPage > mxVisualizedPage;
67 :
68 : // the point in time
69 : double mfViewTime;
70 :
71 : // bitfield
72 : bool mbReducedDisplayQuality : 1;
73 :
74 : // the complete PropertyValue representation (if already created)
75 : uno::Sequence< beans::PropertyValue > mxViewInformation;
76 :
77 : // the extra PropertyValues; not represented by ViewTransformation,
78 : // Viewport, VisualizedPage or ViewTime
79 : uno::Sequence< beans::PropertyValue > mxExtendedInformation;
80 :
81 : // the local UNO API strings
82 0 : static OUString getNamePropertyObjectTransformation()
83 : {
84 0 : return OUString("ObjectTransformation");
85 : }
86 :
87 0 : static OUString getNamePropertyViewTransformation()
88 : {
89 0 : return OUString("ViewTransformation");
90 : }
91 :
92 0 : static OUString getNamePropertyViewport()
93 : {
94 0 : return OUString("Viewport");
95 : }
96 :
97 0 : static OUString getNamePropertyTime()
98 : {
99 0 : return OUString("Time");
100 : }
101 :
102 0 : static OUString getNamePropertyVisualizedPage()
103 : {
104 0 : return OUString("VisualizedPage");
105 : }
106 :
107 2132 : static OUString getNamePropertyReducedDisplayQuality()
108 : {
109 2132 : return OUString("ReducedDisplayQuality");
110 : }
111 :
112 88300 : void impInterpretPropertyValues(const uno::Sequence< beans::PropertyValue >& rViewParameters)
113 : {
114 88300 : if(rViewParameters.hasElements())
115 : {
116 2132 : const sal_Int32 nCount(rViewParameters.getLength());
117 2132 : sal_Int32 nExtendedInsert(0);
118 :
119 : // prepare extended information for filtering. Maximum size is nCount
120 2132 : mxExtendedInformation.realloc(nCount);
121 :
122 4264 : for(sal_Int32 a(0); a < nCount; a++)
123 : {
124 2132 : const beans::PropertyValue& rProp = rViewParameters[a];
125 :
126 2132 : if(rProp.Name == getNamePropertyReducedDisplayQuality())
127 : {
128 : // extra information; add to filtered information
129 2132 : mxExtendedInformation[nExtendedInsert++] = rProp;
130 :
131 : // for performance reasons, also cache content locally
132 2132 : bool bSalBool(false);
133 2132 : rProp.Value >>= bSalBool;
134 2132 : mbReducedDisplayQuality = bSalBool;
135 : }
136 0 : else if(rProp.Name == getNamePropertyObjectTransformation())
137 : {
138 0 : com::sun::star::geometry::AffineMatrix2D aAffineMatrix2D;
139 0 : rProp.Value >>= aAffineMatrix2D;
140 0 : basegfx::unotools::homMatrixFromAffineMatrix(maObjectTransformation, aAffineMatrix2D);
141 : }
142 0 : else if(rProp.Name == getNamePropertyViewTransformation())
143 : {
144 0 : com::sun::star::geometry::AffineMatrix2D aAffineMatrix2D;
145 0 : rProp.Value >>= aAffineMatrix2D;
146 0 : basegfx::unotools::homMatrixFromAffineMatrix(maViewTransformation, aAffineMatrix2D);
147 : }
148 0 : else if(rProp.Name == getNamePropertyViewport())
149 : {
150 0 : com::sun::star::geometry::RealRectangle2D aViewport;
151 0 : rProp.Value >>= aViewport;
152 0 : maViewport = basegfx::unotools::b2DRectangleFromRealRectangle2D(aViewport);
153 : }
154 0 : else if(rProp.Name == getNamePropertyTime())
155 : {
156 0 : rProp.Value >>= mfViewTime;
157 : }
158 0 : else if(rProp.Name == getNamePropertyVisualizedPage())
159 : {
160 0 : rProp.Value >>= mxVisualizedPage;
161 : }
162 : else
163 : {
164 : // extra information; add to filtered information
165 0 : mxExtendedInformation[nExtendedInsert++] = rProp;
166 : }
167 : }
168 :
169 : // extra information size is now known; realloc to final size
170 2132 : mxExtendedInformation.realloc(nExtendedInsert);
171 : }
172 88300 : }
173 :
174 0 : void impFillViewInformationFromContent()
175 : {
176 0 : const bool bObjectTransformationUsed(!maObjectTransformation.isIdentity());
177 0 : const bool bViewTransformationUsed(!maViewTransformation.isIdentity());
178 0 : const bool bViewportUsed(!maViewport.isEmpty());
179 0 : const bool bTimeUsed(0.0 < mfViewTime);
180 0 : const bool bVisualizedPageUsed(mxVisualizedPage.is());
181 0 : const bool bReducedDisplayQualityUsed(mbReducedDisplayQuality);
182 0 : const bool bExtraInformation(mxExtendedInformation.hasElements());
183 0 : sal_uInt32 nIndex(0);
184 : const sal_uInt32 nCount(
185 0 : (bObjectTransformationUsed ? 1 : 0) +
186 0 : (bViewTransformationUsed ? 1 : 0) +
187 0 : (bViewportUsed ? 1 : 0) +
188 0 : (bTimeUsed ? 1 : 0) +
189 0 : (bVisualizedPageUsed ? 1 : 0) +
190 0 : (bReducedDisplayQualityUsed ? 1 : 0) +
191 0 : (bExtraInformation ? mxExtendedInformation.getLength() : 0));
192 :
193 0 : mxViewInformation.realloc(nCount);
194 :
195 0 : if(bObjectTransformationUsed)
196 : {
197 0 : com::sun::star::geometry::AffineMatrix2D aAffineMatrix2D;
198 0 : basegfx::unotools::affineMatrixFromHomMatrix(aAffineMatrix2D, maObjectTransformation);
199 0 : mxViewInformation[nIndex].Name = getNamePropertyObjectTransformation();
200 0 : mxViewInformation[nIndex].Value <<= aAffineMatrix2D;
201 0 : nIndex++;
202 : }
203 :
204 0 : if(bViewTransformationUsed)
205 : {
206 0 : com::sun::star::geometry::AffineMatrix2D aAffineMatrix2D;
207 0 : basegfx::unotools::affineMatrixFromHomMatrix(aAffineMatrix2D, maViewTransformation);
208 0 : mxViewInformation[nIndex].Name = getNamePropertyViewTransformation();
209 0 : mxViewInformation[nIndex].Value <<= aAffineMatrix2D;
210 0 : nIndex++;
211 : }
212 :
213 0 : if(bViewportUsed)
214 : {
215 0 : const com::sun::star::geometry::RealRectangle2D aViewport(basegfx::unotools::rectangle2DFromB2DRectangle(maViewport));
216 0 : mxViewInformation[nIndex].Name = getNamePropertyViewport();
217 0 : mxViewInformation[nIndex].Value <<= aViewport;
218 0 : nIndex++;
219 : }
220 :
221 0 : if(bTimeUsed)
222 : {
223 0 : mxViewInformation[nIndex].Name = getNamePropertyTime();
224 0 : mxViewInformation[nIndex].Value <<= mfViewTime;
225 0 : nIndex++;
226 : }
227 :
228 0 : if(bVisualizedPageUsed)
229 : {
230 0 : mxViewInformation[nIndex].Name = getNamePropertyVisualizedPage();
231 0 : mxViewInformation[nIndex].Value <<= mxVisualizedPage;
232 0 : nIndex++;
233 : }
234 :
235 0 : if(bExtraInformation)
236 : {
237 0 : const sal_Int32 nExtra(mxExtendedInformation.getLength());
238 :
239 0 : for(sal_Int32 a(0); a < nExtra; a++)
240 : {
241 0 : mxViewInformation[nIndex++] = mxExtendedInformation[a];
242 : }
243 : }
244 0 : }
245 :
246 : public:
247 83458 : ImpViewInformation2D(
248 : const basegfx::B2DHomMatrix& rObjectTransformation,
249 : const basegfx::B2DHomMatrix& rViewTransformation,
250 : const basegfx::B2DRange& rViewport,
251 : const uno::Reference< drawing::XDrawPage >& rxDrawPage,
252 : double fViewTime,
253 : const uno::Sequence< beans::PropertyValue >& rExtendedParameters)
254 : : maObjectTransformation(rObjectTransformation),
255 : maViewTransformation(rViewTransformation),
256 : maObjectToViewTransformation(),
257 : maInverseObjectToViewTransformation(),
258 : maViewport(rViewport),
259 : maDiscreteViewport(),
260 : mxVisualizedPage(rxDrawPage),
261 : mfViewTime(fViewTime),
262 : mbReducedDisplayQuality(false),
263 : mxViewInformation(),
264 83458 : mxExtendedInformation()
265 : {
266 83458 : impInterpretPropertyValues(rExtendedParameters);
267 83458 : }
268 :
269 4842 : explicit ImpViewInformation2D(const uno::Sequence< beans::PropertyValue >& rViewParameters)
270 : : maObjectTransformation(),
271 : maViewTransformation(),
272 : maObjectToViewTransformation(),
273 : maInverseObjectToViewTransformation(),
274 : maViewport(),
275 : maDiscreteViewport(),
276 : mxVisualizedPage(),
277 : mfViewTime(),
278 : mbReducedDisplayQuality(false),
279 : mxViewInformation(rViewParameters),
280 4842 : mxExtendedInformation()
281 : {
282 4842 : impInterpretPropertyValues(rViewParameters);
283 4842 : }
284 :
285 110 : ImpViewInformation2D()
286 : : maObjectTransformation(),
287 : maViewTransformation(),
288 : maObjectToViewTransformation(),
289 : maInverseObjectToViewTransformation(),
290 : maViewport(),
291 : maDiscreteViewport(),
292 : mxVisualizedPage(),
293 : mfViewTime(),
294 : mbReducedDisplayQuality(false),
295 : mxViewInformation(),
296 110 : mxExtendedInformation()
297 : {
298 110 : }
299 :
300 11925 : const basegfx::B2DHomMatrix& getObjectTransformation() const
301 : {
302 11925 : return maObjectTransformation;
303 : }
304 :
305 29375 : const basegfx::B2DHomMatrix& getViewTransformation() const
306 : {
307 29375 : return maViewTransformation;
308 : }
309 :
310 125210 : const basegfx::B2DRange& getViewport() const
311 : {
312 125210 : return maViewport;
313 : }
314 :
315 9015 : const basegfx::B2DRange& getDiscreteViewport() const
316 : {
317 9015 : if(maDiscreteViewport.isEmpty() && !maViewport.isEmpty())
318 : {
319 2606 : basegfx::B2DRange aDiscreteViewport(maViewport);
320 2606 : aDiscreteViewport.transform(getViewTransformation());
321 2606 : const_cast< ImpViewInformation2D* >(this)->maDiscreteViewport = aDiscreteViewport;
322 : }
323 :
324 9015 : return maDiscreteViewport;
325 : }
326 :
327 76689 : const basegfx::B2DHomMatrix& getObjectToViewTransformation() const
328 : {
329 167213 : if(maObjectToViewTransformation.isIdentity() &&
330 94437 : (!maObjectTransformation.isIdentity() || !maViewTransformation.isIdentity()))
331 : {
332 43269 : basegfx::B2DHomMatrix aObjectToView(maViewTransformation * maObjectTransformation);
333 43269 : const_cast< ImpViewInformation2D* >(this)->maObjectToViewTransformation = aObjectToView;
334 : }
335 :
336 76689 : return maObjectToViewTransformation;
337 : }
338 :
339 257438 : const basegfx::B2DHomMatrix& getInverseObjectToViewTransformation() const
340 : {
341 297590 : if(maInverseObjectToViewTransformation.isIdentity() &&
342 68089 : (!maObjectTransformation.isIdentity() || !maViewTransformation.isIdentity()))
343 : {
344 4840 : basegfx::B2DHomMatrix aInverseObjectToView(maViewTransformation * maObjectTransformation);
345 4840 : aInverseObjectToView.invert();
346 4840 : const_cast< ImpViewInformation2D* >(this)->maInverseObjectToViewTransformation = aInverseObjectToView;
347 : }
348 :
349 257438 : return maInverseObjectToViewTransformation;
350 : }
351 :
352 10886 : double getViewTime() const
353 : {
354 10886 : return mfViewTime;
355 : }
356 :
357 33889 : const uno::Reference< drawing::XDrawPage >& getVisualizedPage() const
358 : {
359 33889 : return mxVisualizedPage;
360 : }
361 :
362 13 : bool getReducedDisplayQuality() const
363 : {
364 13 : return mbReducedDisplayQuality;
365 : }
366 :
367 0 : const uno::Sequence< beans::PropertyValue >& getViewInformationSequence() const
368 : {
369 0 : if(!mxViewInformation.hasElements())
370 : {
371 0 : const_cast< ImpViewInformation2D* >(this)->impFillViewInformationFromContent();
372 : }
373 :
374 0 : return mxViewInformation;
375 : }
376 :
377 10886 : const uno::Sequence< beans::PropertyValue >& getExtendedInformationSequence() const
378 : {
379 10886 : return mxExtendedInformation;
380 : }
381 :
382 0 : bool operator==(const ImpViewInformation2D& rCandidate) const
383 : {
384 0 : return (maObjectTransformation == rCandidate.maObjectTransformation
385 0 : && maViewTransformation == rCandidate.maViewTransformation
386 0 : && maViewport == rCandidate.maViewport
387 0 : && mxVisualizedPage == rCandidate.mxVisualizedPage
388 0 : && mfViewTime == rCandidate.mfViewTime
389 0 : && mxExtendedInformation == rCandidate.mxExtendedInformation);
390 : }
391 : };
392 : } // end of anonymous namespace
393 : } // end of namespace drawinglayer
394 :
395 :
396 :
397 : namespace drawinglayer
398 : {
399 : namespace geometry
400 : {
401 : namespace
402 : {
403 : struct theGlobalDefault :
404 : public rtl::Static< ViewInformation2D::ImplType, theGlobalDefault > {};
405 : }
406 :
407 83458 : ViewInformation2D::ViewInformation2D(
408 : const basegfx::B2DHomMatrix& rObjectTransformation,
409 : const basegfx::B2DHomMatrix& rViewTransformation,
410 : const basegfx::B2DRange& rViewport,
411 : const uno::Reference< drawing::XDrawPage >& rxDrawPage,
412 : double fViewTime,
413 : const uno::Sequence< beans::PropertyValue >& rExtendedParameters)
414 : : mpViewInformation2D(ImpViewInformation2D(
415 : rObjectTransformation,
416 : rViewTransformation,
417 : rViewport,
418 : rxDrawPage,
419 : fViewTime,
420 83458 : rExtendedParameters))
421 : {
422 83458 : }
423 :
424 4842 : ViewInformation2D::ViewInformation2D(const uno::Sequence< beans::PropertyValue >& rViewParameters)
425 4842 : : mpViewInformation2D(ImpViewInformation2D(rViewParameters))
426 : {
427 4842 : }
428 :
429 43969 : ViewInformation2D::ViewInformation2D()
430 43969 : : mpViewInformation2D(theGlobalDefault::get())
431 : {
432 43969 : }
433 :
434 105300 : ViewInformation2D::ViewInformation2D(const ViewInformation2D& rCandidate)
435 105300 : : mpViewInformation2D(rCandidate.mpViewInformation2D)
436 : {
437 105300 : }
438 :
439 237530 : ViewInformation2D::~ViewInformation2D()
440 : {
441 237530 : }
442 :
443 63380 : ViewInformation2D& ViewInformation2D::operator=(const ViewInformation2D& rCandidate)
444 : {
445 63380 : mpViewInformation2D = rCandidate.mpViewInformation2D;
446 63380 : return *this;
447 : }
448 :
449 0 : bool ViewInformation2D::operator==(const ViewInformation2D& rCandidate) const
450 : {
451 0 : return rCandidate.mpViewInformation2D == mpViewInformation2D;
452 : }
453 :
454 11925 : const basegfx::B2DHomMatrix& ViewInformation2D::getObjectTransformation() const
455 : {
456 11925 : return mpViewInformation2D->getObjectTransformation();
457 : }
458 :
459 26769 : const basegfx::B2DHomMatrix& ViewInformation2D::getViewTransformation() const
460 : {
461 26769 : return mpViewInformation2D->getViewTransformation();
462 : }
463 :
464 125210 : const basegfx::B2DRange& ViewInformation2D::getViewport() const
465 : {
466 125210 : return mpViewInformation2D->getViewport();
467 : }
468 :
469 10886 : double ViewInformation2D::getViewTime() const
470 : {
471 10886 : return mpViewInformation2D->getViewTime();
472 : }
473 :
474 33889 : const uno::Reference< drawing::XDrawPage >& ViewInformation2D::getVisualizedPage() const
475 : {
476 33889 : return mpViewInformation2D->getVisualizedPage();
477 : }
478 :
479 76689 : const basegfx::B2DHomMatrix& ViewInformation2D::getObjectToViewTransformation() const
480 : {
481 76689 : return mpViewInformation2D->getObjectToViewTransformation();
482 : }
483 :
484 257438 : const basegfx::B2DHomMatrix& ViewInformation2D::getInverseObjectToViewTransformation() const
485 : {
486 257438 : return mpViewInformation2D->getInverseObjectToViewTransformation();
487 : }
488 :
489 9015 : const basegfx::B2DRange& ViewInformation2D::getDiscreteViewport() const
490 : {
491 9015 : return mpViewInformation2D->getDiscreteViewport();
492 : }
493 :
494 13 : bool ViewInformation2D::getReducedDisplayQuality() const
495 : {
496 13 : return mpViewInformation2D->getReducedDisplayQuality();
497 : }
498 :
499 0 : const uno::Sequence< beans::PropertyValue >& ViewInformation2D::getViewInformationSequence() const
500 : {
501 0 : return mpViewInformation2D->getViewInformationSequence();
502 : }
503 :
504 10886 : const uno::Sequence< beans::PropertyValue >& ViewInformation2D::getExtendedInformationSequence() const
505 : {
506 10886 : return mpViewInformation2D->getExtendedInformationSequence();
507 : }
508 : } // end of namespace geometry
509 : } // end of namespace drawinglayer
510 :
511 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|