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 <limits.h>
21 :
22 : #include <tools/bigint.hxx>
23 : #include <tools/debug.hxx>
24 : #include <tools/poly.hxx>
25 :
26 : #include <vcl/virdev.hxx>
27 : #include <vcl/region.hxx>
28 : #include <vcl/wrkwin.hxx>
29 : #include <vcl/cursor.hxx>
30 : #include <vcl/metaact.hxx>
31 : #include <vcl/gdimtf.hxx>
32 : #include <vcl/lineinfo.hxx>
33 : #include <vcl/outdev.hxx>
34 :
35 : #include <svdata.hxx>
36 : #include <window.h>
37 : #include <outdev.h>
38 : #include <salgdi.hxx>
39 :
40 : #include <basegfx/matrix/b2dhommatrix.hxx>
41 : #include <basegfx/polygon/b2dpolygon.hxx>
42 : #include <basegfx/polygon/b2dpolypolygon.hxx>
43 :
44 : static int const s_ImplArySize = MAP_PIXEL+1;
45 : static const long aImplNumeratorAry[s_ImplArySize] =
46 : { 1, 1, 5, 50, 1, 1, 1, 1, 1, 1, 1 };
47 : static const long aImplDenominatorAry[s_ImplArySize] =
48 : { 2540, 254, 127, 127, 1000, 100, 10, 1, 72, 1440, 1 };
49 :
50 : /*
51 : Reduces accuracy until it is a fraction (should become
52 : ctor fraction once); we could also do this with BigInts
53 : */
54 :
55 0 : static Fraction ImplMakeFraction( long nN1, long nN2, long nD1, long nD2 )
56 : {
57 0 : long i = 1;
58 :
59 0 : if ( nN1 < 0 ) { i = -i; nN1 = -nN1; }
60 0 : if ( nN2 < 0 ) { i = -i; nN2 = -nN2; }
61 0 : if ( nD1 < 0 ) { i = -i; nD1 = -nD1; }
62 0 : if ( nD2 < 0 ) { i = -i; nD2 = -nD2; }
63 : // all positive; i sign
64 :
65 0 : Fraction aF( i*nN1, nD1 );
66 0 : aF *= Fraction( nN2, nD2 );
67 :
68 0 : if( nD1 == 0 || nD2 == 0 ) //under these bad circumstances the following while loop will be endless
69 : {
70 : DBG_ASSERT(false,"Invalid parameter for ImplMakeFraction");
71 0 : return Fraction( 1, 1 );
72 : }
73 :
74 0 : while ( aF.GetDenominator() == -1 )
75 : {
76 0 : if ( nN1 > nN2 )
77 0 : nN1 = (nN1 + 1) / 2;
78 : else
79 0 : nN2 = (nN2 + 1) / 2;
80 0 : if ( nD1 > nD2 )
81 0 : nD1 = (nD1 + 1) / 2;
82 : else
83 0 : nD2 = (nD2 + 1) / 2;
84 :
85 0 : aF = Fraction( i*nN1, nD1 );
86 0 : aF *= Fraction( nN2, nD2 );
87 : }
88 :
89 0 : return aF;
90 : }
91 :
92 : // Fraction.GetNumerator()
93 : // Fraction.GetDenominator() > 0
94 : // rOutRes.nPixPerInch? > 0
95 : // rMapRes.nMapScNum?
96 : // rMapRes.nMapScDenom? > 0
97 :
98 0 : static void ImplCalcBigIntThreshold( long nDPIX, long nDPIY,
99 : const ImplMapRes& rMapRes,
100 : ImplThresholdRes& rThresRes )
101 : {
102 0 : if ( nDPIX && (LONG_MAX / nDPIX < std::abs( rMapRes.mnMapScNumX ) ) ) // #111139# avoid div by zero
103 : {
104 0 : rThresRes.mnThresLogToPixX = 0;
105 0 : rThresRes.mnThresPixToLogX = 0;
106 : }
107 : else
108 : {
109 : // calculate thresholds for BigInt arithmetic
110 0 : long nDenomHalfX = rMapRes.mnMapScDenomX / 2;
111 0 : sal_uLong nDenomX = rMapRes.mnMapScDenomX;
112 0 : long nProductX = nDPIX * rMapRes.mnMapScNumX;
113 :
114 0 : if ( !nProductX )
115 0 : rThresRes.mnThresLogToPixX = LONG_MAX;
116 : else
117 0 : rThresRes.mnThresLogToPixX = std::abs( (LONG_MAX - nDenomHalfX) / nProductX );
118 :
119 0 : if ( !nDenomX )
120 0 : rThresRes.mnThresPixToLogX = LONG_MAX;
121 0 : else if ( nProductX >= 0 )
122 0 : rThresRes.mnThresPixToLogX = (long)(((sal_uLong)LONG_MAX - (sal_uLong)( nProductX/2)) / nDenomX);
123 : else
124 0 : rThresRes.mnThresPixToLogX = (long)(((sal_uLong)LONG_MAX + (sal_uLong)(-nProductX/2)) / nDenomX);
125 : }
126 :
127 0 : if ( nDPIY && (LONG_MAX / nDPIY < std::abs( rMapRes.mnMapScNumY ) ) ) // #111139# avoid div by zero
128 : {
129 0 : rThresRes.mnThresLogToPixY = 0;
130 0 : rThresRes.mnThresPixToLogY = 0;
131 : }
132 : else
133 : {
134 : // calculate thresholds for BigInt arithmetic
135 0 : long nDenomHalfY = rMapRes.mnMapScDenomY / 2;
136 0 : sal_uLong nDenomY = rMapRes.mnMapScDenomY;
137 0 : long nProductY = nDPIY * rMapRes.mnMapScNumY;
138 :
139 0 : if ( !nProductY )
140 0 : rThresRes.mnThresLogToPixY = LONG_MAX;
141 : else
142 0 : rThresRes.mnThresLogToPixY = std::abs( (LONG_MAX - nDenomHalfY) / nProductY );
143 :
144 0 : if ( !nDenomY )
145 0 : rThresRes.mnThresPixToLogY = LONG_MAX;
146 0 : else if ( nProductY >= 0 )
147 0 : rThresRes.mnThresPixToLogY = (long)(((sal_uLong)LONG_MAX - (sal_uLong)( nProductY/2)) / nDenomY);
148 : else
149 0 : rThresRes.mnThresPixToLogY = (long)(((sal_uLong)LONG_MAX + (sal_uLong)(-nProductY/2)) / nDenomY);
150 : }
151 :
152 0 : rThresRes.mnThresLogToPixX /= 2;
153 0 : rThresRes.mnThresLogToPixY /= 2;
154 0 : rThresRes.mnThresPixToLogX /= 2;
155 0 : rThresRes.mnThresPixToLogY /= 2;
156 0 : }
157 :
158 0 : static void ImplCalcMapResolution( const MapMode& rMapMode,
159 : long nDPIX, long nDPIY, ImplMapRes& rMapRes )
160 : {
161 0 : switch ( rMapMode.GetMapUnit() )
162 : {
163 : case MAP_RELATIVE:
164 0 : break;
165 : case MAP_100TH_MM:
166 0 : rMapRes.mnMapScNumX = 1;
167 0 : rMapRes.mnMapScDenomX = 2540;
168 0 : rMapRes.mnMapScNumY = 1;
169 0 : rMapRes.mnMapScDenomY = 2540;
170 0 : break;
171 : case MAP_10TH_MM:
172 0 : rMapRes.mnMapScNumX = 1;
173 0 : rMapRes.mnMapScDenomX = 254;
174 0 : rMapRes.mnMapScNumY = 1;
175 0 : rMapRes.mnMapScDenomY = 254;
176 0 : break;
177 : case MAP_MM:
178 0 : rMapRes.mnMapScNumX = 5; // 10
179 0 : rMapRes.mnMapScDenomX = 127; // 254
180 0 : rMapRes.mnMapScNumY = 5; // 10
181 0 : rMapRes.mnMapScDenomY = 127; // 254
182 0 : break;
183 : case MAP_CM:
184 0 : rMapRes.mnMapScNumX = 50; // 100
185 0 : rMapRes.mnMapScDenomX = 127; // 254
186 0 : rMapRes.mnMapScNumY = 50; // 100
187 0 : rMapRes.mnMapScDenomY = 127; // 254
188 0 : break;
189 : case MAP_1000TH_INCH:
190 0 : rMapRes.mnMapScNumX = 1;
191 0 : rMapRes.mnMapScDenomX = 1000;
192 0 : rMapRes.mnMapScNumY = 1;
193 0 : rMapRes.mnMapScDenomY = 1000;
194 0 : break;
195 : case MAP_100TH_INCH:
196 0 : rMapRes.mnMapScNumX = 1;
197 0 : rMapRes.mnMapScDenomX = 100;
198 0 : rMapRes.mnMapScNumY = 1;
199 0 : rMapRes.mnMapScDenomY = 100;
200 0 : break;
201 : case MAP_10TH_INCH:
202 0 : rMapRes.mnMapScNumX = 1;
203 0 : rMapRes.mnMapScDenomX = 10;
204 0 : rMapRes.mnMapScNumY = 1;
205 0 : rMapRes.mnMapScDenomY = 10;
206 0 : break;
207 : case MAP_INCH:
208 0 : rMapRes.mnMapScNumX = 1;
209 0 : rMapRes.mnMapScDenomX = 1;
210 0 : rMapRes.mnMapScNumY = 1;
211 0 : rMapRes.mnMapScDenomY = 1;
212 0 : break;
213 : case MAP_POINT:
214 0 : rMapRes.mnMapScNumX = 1;
215 0 : rMapRes.mnMapScDenomX = 72;
216 0 : rMapRes.mnMapScNumY = 1;
217 0 : rMapRes.mnMapScDenomY = 72;
218 0 : break;
219 : case MAP_TWIP:
220 0 : rMapRes.mnMapScNumX = 1;
221 0 : rMapRes.mnMapScDenomX = 1440;
222 0 : rMapRes.mnMapScNumY = 1;
223 0 : rMapRes.mnMapScDenomY = 1440;
224 0 : break;
225 : case MAP_PIXEL:
226 0 : rMapRes.mnMapScNumX = 1;
227 0 : rMapRes.mnMapScDenomX = nDPIX;
228 0 : rMapRes.mnMapScNumY = 1;
229 0 : rMapRes.mnMapScDenomY = nDPIY;
230 0 : break;
231 : case MAP_SYSFONT:
232 : case MAP_APPFONT:
233 : {
234 0 : ImplSVData* pSVData = ImplGetSVData();
235 0 : if ( !pSVData->maGDIData.mnAppFontX )
236 : {
237 0 : if( pSVData->maWinData.mpFirstFrame )
238 0 : Window::ImplInitAppFontData( pSVData->maWinData.mpFirstFrame );
239 : else
240 : {
241 0 : WorkWindow* pWin = new WorkWindow( NULL, 0 );
242 0 : Window::ImplInitAppFontData( pWin );
243 0 : delete pWin;
244 : }
245 : }
246 0 : rMapRes.mnMapScNumX = pSVData->maGDIData.mnAppFontX;
247 0 : rMapRes.mnMapScDenomX = nDPIX * 40;
248 0 : rMapRes.mnMapScNumY = pSVData->maGDIData.mnAppFontY;
249 0 : rMapRes.mnMapScDenomY = nDPIY * 80;
250 : }
251 0 : break;
252 : default:
253 : OSL_FAIL( "unhandled MapUnit" );
254 0 : break;
255 : }
256 :
257 0 : Fraction aScaleX = rMapMode.GetScaleX();
258 0 : Fraction aScaleY = rMapMode.GetScaleY();
259 :
260 : // set offset according to MapMode
261 0 : Point aOrigin = rMapMode.GetOrigin();
262 0 : if ( rMapMode.GetMapUnit() != MAP_RELATIVE )
263 : {
264 0 : rMapRes.mnMapOfsX = aOrigin.X();
265 0 : rMapRes.mnMapOfsY = aOrigin.Y();
266 : }
267 : else
268 : {
269 0 : BigInt aX( rMapRes.mnMapOfsX );
270 0 : aX *= BigInt( aScaleX.GetDenominator() );
271 0 : if ( rMapRes.mnMapOfsX >= 0 )
272 : {
273 0 : if ( aScaleX.GetNumerator() >= 0 )
274 0 : aX += BigInt( aScaleX.GetNumerator()/2 );
275 : else
276 0 : aX -= BigInt( (aScaleX.GetNumerator()+1)/2 );
277 : }
278 : else
279 : {
280 0 : if ( aScaleX.GetNumerator() >= 0 )
281 0 : aX -= BigInt( (aScaleX.GetNumerator()-1)/2 );
282 : else
283 0 : aX += BigInt( aScaleX.GetNumerator()/2 );
284 : }
285 0 : aX /= BigInt( aScaleX.GetNumerator() );
286 0 : rMapRes.mnMapOfsX = (long)aX + aOrigin.X();
287 0 : BigInt aY( rMapRes.mnMapOfsY );
288 0 : aY *= BigInt( aScaleY.GetDenominator() );
289 0 : if( rMapRes.mnMapOfsY >= 0 )
290 : {
291 0 : if ( aScaleY.GetNumerator() >= 0 )
292 0 : aY += BigInt( aScaleY.GetNumerator()/2 );
293 : else
294 0 : aY -= BigInt( (aScaleY.GetNumerator()+1)/2 );
295 : }
296 : else
297 : {
298 0 : if ( aScaleY.GetNumerator() >= 0 )
299 0 : aY -= BigInt( (aScaleY.GetNumerator()-1)/2 );
300 : else
301 0 : aY += BigInt( aScaleY.GetNumerator()/2 );
302 : }
303 0 : aY /= BigInt( aScaleY.GetNumerator() );
304 0 : rMapRes.mnMapOfsY = (long)aY + aOrigin.Y();
305 : }
306 :
307 : // calculate scaling factor according to MapMode
308 : // aTemp? = rMapRes.mnMapSc? * aScale?
309 : Fraction aTempX = ImplMakeFraction( rMapRes.mnMapScNumX,
310 : aScaleX.GetNumerator(),
311 : rMapRes.mnMapScDenomX,
312 0 : aScaleX.GetDenominator() );
313 : Fraction aTempY = ImplMakeFraction( rMapRes.mnMapScNumY,
314 : aScaleY.GetNumerator(),
315 : rMapRes.mnMapScDenomY,
316 0 : aScaleY.GetDenominator() );
317 0 : rMapRes.mnMapScNumX = aTempX.GetNumerator();
318 0 : rMapRes.mnMapScDenomX = aTempX.GetDenominator();
319 0 : rMapRes.mnMapScNumY = aTempY.GetNumerator();
320 0 : rMapRes.mnMapScDenomY = aTempY.GetDenominator();
321 :
322 : // hack: 0/n approximately 1/max
323 0 : if ( !rMapRes.mnMapScNumX )
324 : {
325 0 : rMapRes.mnMapScNumX = 1;
326 0 : rMapRes.mnMapScDenomX = LONG_MAX;
327 : }
328 0 : if ( !rMapRes.mnMapScNumY )
329 : {
330 0 : rMapRes.mnMapScNumY = 1;
331 0 : rMapRes.mnMapScDenomY = LONG_MAX;
332 : }
333 0 : }
334 :
335 0 : inline void ImplCalcMapResolution( const MapMode& rMapMode,
336 : long nDPIX, long nDPIY,
337 : ImplMapRes& rMapRes,
338 : ImplThresholdRes& rThresRes )
339 : {
340 0 : ImplCalcMapResolution( rMapMode, nDPIX, nDPIY, rMapRes );
341 0 : ImplCalcBigIntThreshold( nDPIX, nDPIY, rMapRes, rThresRes );
342 0 : }
343 :
344 0 : static long ImplLogicToPixel( long n, long nDPI, long nMapNum, long nMapDenom,
345 : long nThres )
346 : {
347 : // To "use" it...
348 : (void) nThres;
349 : #if (SAL_TYPES_SIZEOFLONG < 8)
350 0 : if( (+n < nThres) && (-n < nThres) )
351 : {
352 0 : n *= nMapNum * nDPI;
353 0 : if( nMapDenom != 1 )
354 : {
355 0 : n = (2 * n) / nMapDenom;
356 0 : if( n < 0 ) --n; else ++n;
357 0 : n /= 2;
358 : }
359 : }
360 : else
361 : #endif
362 : {
363 0 : sal_Int64 n64 = n;
364 0 : n64 *= nMapNum;
365 0 : n64 *= nDPI;
366 0 : if( nMapDenom == 1 )
367 0 : n = (long)n64;
368 : else
369 : {
370 0 : n = (long)(2 * n64 / nMapDenom);
371 0 : if( n < 0 ) --n; else ++n;
372 0 : n /= 2;
373 : }
374 : }
375 0 : return n;
376 : }
377 :
378 0 : static long ImplPixelToLogic( long n, long nDPI, long nMapNum, long nMapDenom,
379 : long nThres )
380 : {
381 : // To "use" it...
382 : (void) nThres;
383 : #if (SAL_TYPES_SIZEOFLONG < 8)
384 0 : if( (+n < nThres) && (-n < nThres) )
385 0 : n = (2 * n * nMapDenom) / (nDPI * nMapNum);
386 : else
387 : #endif
388 : {
389 0 : sal_Int64 n64 = n;
390 0 : n64 *= nMapDenom;
391 0 : long nDenom = nDPI * nMapNum;
392 0 : n = (long)(2 * n64 / nDenom);
393 : }
394 0 : if( n < 0 ) --n; else ++n;
395 0 : return (n / 2);
396 : }
397 :
398 0 : long OutputDevice::ImplLogicXToDevicePixel( long nX ) const
399 : {
400 0 : if ( !mbMap )
401 0 : return nX+mnOutOffX;
402 :
403 : return ImplLogicToPixel( nX + maMapRes.mnMapOfsX, mnDPIX,
404 : maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
405 0 : maThresRes.mnThresLogToPixX )+mnOutOffX+mnOutOffOrigX;
406 : }
407 :
408 0 : long OutputDevice::ImplLogicYToDevicePixel( long nY ) const
409 : {
410 0 : if ( !mbMap )
411 0 : return nY+mnOutOffY;
412 :
413 : return ImplLogicToPixel( nY + maMapRes.mnMapOfsY, mnDPIY,
414 : maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
415 0 : maThresRes.mnThresLogToPixY )+mnOutOffY+mnOutOffOrigY;
416 : }
417 :
418 0 : long OutputDevice::ImplLogicWidthToDevicePixel( long nWidth ) const
419 : {
420 0 : if ( !mbMap )
421 0 : return nWidth;
422 :
423 : return ImplLogicToPixel( nWidth, mnDPIX,
424 : maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
425 0 : maThresRes.mnThresLogToPixX );
426 : }
427 :
428 0 : long OutputDevice::ImplLogicHeightToDevicePixel( long nHeight ) const
429 : {
430 0 : if ( !mbMap )
431 0 : return nHeight;
432 :
433 : return ImplLogicToPixel( nHeight, mnDPIY,
434 : maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
435 0 : maThresRes.mnThresLogToPixY );
436 : }
437 :
438 0 : float OutputDevice::ImplFloatLogicHeightToDevicePixel( float fLogicHeight) const
439 : {
440 0 : if( !mbMap)
441 0 : return fLogicHeight;
442 0 : float fPixelHeight = (fLogicHeight * mnDPIY * maMapRes.mnMapScNumY) / maMapRes.mnMapScDenomY;
443 0 : return fPixelHeight;
444 : }
445 :
446 0 : long OutputDevice::ImplDevicePixelToLogicWidth( long nWidth ) const
447 : {
448 0 : if ( !mbMap )
449 0 : return nWidth;
450 :
451 : return ImplPixelToLogic( nWidth, mnDPIX,
452 : maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
453 0 : maThresRes.mnThresPixToLogX );
454 : }
455 :
456 0 : long OutputDevice::ImplDevicePixelToLogicHeight( long nHeight ) const
457 : {
458 0 : if ( !mbMap )
459 0 : return nHeight;
460 :
461 : return ImplPixelToLogic( nHeight, mnDPIY,
462 : maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
463 0 : maThresRes.mnThresPixToLogY );
464 : }
465 :
466 0 : Point OutputDevice::ImplLogicToDevicePixel( const Point& rLogicPt ) const
467 : {
468 0 : if ( !mbMap )
469 0 : return Point( rLogicPt.X()+mnOutOffX, rLogicPt.Y()+mnOutOffY );
470 :
471 0 : return Point( ImplLogicToPixel( rLogicPt.X() + maMapRes.mnMapOfsX, mnDPIX,
472 : maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
473 0 : maThresRes.mnThresLogToPixX )+mnOutOffX+mnOutOffOrigX,
474 0 : ImplLogicToPixel( rLogicPt.Y() + maMapRes.mnMapOfsY, mnDPIY,
475 : maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
476 0 : maThresRes.mnThresLogToPixY )+mnOutOffY+mnOutOffOrigY );
477 : }
478 :
479 0 : Size OutputDevice::ImplLogicToDevicePixel( const Size& rLogicSize ) const
480 : {
481 0 : if ( !mbMap )
482 0 : return rLogicSize;
483 :
484 : return Size( ImplLogicToPixel( rLogicSize.Width(), mnDPIX,
485 : maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
486 : maThresRes.mnThresLogToPixX ),
487 : ImplLogicToPixel( rLogicSize.Height(), mnDPIY,
488 : maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
489 0 : maThresRes.mnThresLogToPixY ) );
490 : }
491 :
492 0 : Rectangle OutputDevice::ImplLogicToDevicePixel( const Rectangle& rLogicRect ) const
493 : {
494 0 : if ( rLogicRect.IsEmpty() )
495 0 : return rLogicRect;
496 :
497 0 : if ( !mbMap )
498 : {
499 0 : return Rectangle( rLogicRect.Left()+mnOutOffX, rLogicRect.Top()+mnOutOffY,
500 0 : rLogicRect.Right()+mnOutOffX, rLogicRect.Bottom()+mnOutOffY );
501 : }
502 :
503 0 : return Rectangle( ImplLogicToPixel( rLogicRect.Left()+maMapRes.mnMapOfsX, mnDPIX,
504 : maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
505 0 : maThresRes.mnThresLogToPixX )+mnOutOffX+mnOutOffOrigX,
506 0 : ImplLogicToPixel( rLogicRect.Top()+maMapRes.mnMapOfsY, mnDPIY,
507 : maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
508 0 : maThresRes.mnThresLogToPixY )+mnOutOffY+mnOutOffOrigY,
509 0 : ImplLogicToPixel( rLogicRect.Right()+maMapRes.mnMapOfsX, mnDPIX,
510 : maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
511 0 : maThresRes.mnThresLogToPixX )+mnOutOffX+mnOutOffOrigX,
512 0 : ImplLogicToPixel( rLogicRect.Bottom()+maMapRes.mnMapOfsY, mnDPIY,
513 : maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
514 0 : maThresRes.mnThresLogToPixY )+mnOutOffY+mnOutOffOrigY );
515 : }
516 :
517 0 : Polygon OutputDevice::ImplLogicToDevicePixel( const Polygon& rLogicPoly ) const
518 : {
519 0 : if ( !mbMap && !mnOutOffX && !mnOutOffY )
520 0 : return rLogicPoly;
521 :
522 : sal_uInt16 i;
523 0 : sal_uInt16 nPoints = rLogicPoly.GetSize();
524 0 : Polygon aPoly( rLogicPoly );
525 :
526 : // get pointer to Point-array (copy data)
527 0 : const Point* pPointAry = aPoly.GetConstPointAry();
528 :
529 0 : if ( mbMap )
530 : {
531 0 : for ( i = 0; i < nPoints; i++ )
532 : {
533 0 : const Point* pPt = &(pPointAry[i]);
534 0 : Point aPt;
535 0 : aPt.X() = ImplLogicToPixel( pPt->X()+maMapRes.mnMapOfsX, mnDPIX,
536 : maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
537 0 : maThresRes.mnThresLogToPixX )+mnOutOffX+mnOutOffOrigX;
538 0 : aPt.Y() = ImplLogicToPixel( pPt->Y()+maMapRes.mnMapOfsY, mnDPIY,
539 : maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
540 0 : maThresRes.mnThresLogToPixY )+mnOutOffY+mnOutOffOrigY;
541 0 : aPoly[i] = aPt;
542 : }
543 : }
544 : else
545 : {
546 0 : for ( i = 0; i < nPoints; i++ )
547 : {
548 0 : Point aPt = pPointAry[i];
549 0 : aPt.X() += mnOutOffX;
550 0 : aPt.Y() += mnOutOffY;
551 0 : aPoly[i] = aPt;
552 : }
553 : }
554 :
555 0 : return aPoly;
556 : }
557 :
558 0 : PolyPolygon OutputDevice::ImplLogicToDevicePixel( const PolyPolygon& rLogicPolyPoly ) const
559 : {
560 0 : if ( !mbMap && !mnOutOffX && !mnOutOffY )
561 0 : return rLogicPolyPoly;
562 :
563 0 : PolyPolygon aPolyPoly( rLogicPolyPoly );
564 0 : sal_uInt16 nPoly = aPolyPoly.Count();
565 0 : for( sal_uInt16 i = 0; i < nPoly; i++ )
566 : {
567 0 : Polygon& rPoly = aPolyPoly[i];
568 0 : rPoly = ImplLogicToDevicePixel( rPoly );
569 : }
570 0 : return aPolyPoly;
571 : }
572 :
573 0 : LineInfo OutputDevice::ImplLogicToDevicePixel( const LineInfo& rLineInfo ) const
574 : {
575 0 : LineInfo aInfo( rLineInfo );
576 :
577 0 : if( aInfo.GetStyle() == LINE_DASH )
578 : {
579 0 : if( aInfo.GetDotCount() && aInfo.GetDotLen() )
580 0 : aInfo.SetDotLen( std::max( ImplLogicWidthToDevicePixel( aInfo.GetDotLen() ), 1L ) );
581 : else
582 0 : aInfo.SetDotCount( 0 );
583 :
584 0 : if( aInfo.GetDashCount() && aInfo.GetDashLen() )
585 0 : aInfo.SetDashLen( std::max( ImplLogicWidthToDevicePixel( aInfo.GetDashLen() ), 1L ) );
586 : else
587 0 : aInfo.SetDashCount( 0 );
588 :
589 0 : aInfo.SetDistance( ImplLogicWidthToDevicePixel( aInfo.GetDistance() ) );
590 :
591 0 : if( ( !aInfo.GetDashCount() && !aInfo.GetDotCount() ) || !aInfo.GetDistance() )
592 0 : aInfo.SetStyle( LINE_SOLID );
593 : }
594 :
595 0 : aInfo.SetWidth( ImplLogicWidthToDevicePixel( aInfo.GetWidth() ) );
596 :
597 0 : return aInfo;
598 : }
599 :
600 0 : Rectangle OutputDevice::ImplDevicePixelToLogic( const Rectangle& rPixelRect ) const
601 : {
602 0 : if ( rPixelRect.IsEmpty() )
603 0 : return rPixelRect;
604 :
605 0 : if ( !mbMap )
606 : {
607 0 : return Rectangle( rPixelRect.Left()-mnOutOffX, rPixelRect.Top()-mnOutOffY,
608 0 : rPixelRect.Right()-mnOutOffX, rPixelRect.Bottom()-mnOutOffY );
609 : }
610 :
611 0 : return Rectangle( ImplPixelToLogic( rPixelRect.Left()-mnOutOffX-mnOutOffOrigX, mnDPIX,
612 : maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
613 0 : maThresRes.mnThresPixToLogX )-maMapRes.mnMapOfsX,
614 0 : ImplPixelToLogic( rPixelRect.Top()-mnOutOffY-mnOutOffOrigY, mnDPIY,
615 : maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
616 0 : maThresRes.mnThresPixToLogY )-maMapRes.mnMapOfsY,
617 0 : ImplPixelToLogic( rPixelRect.Right()-mnOutOffX-mnOutOffOrigX, mnDPIX,
618 : maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
619 0 : maThresRes.mnThresPixToLogX )-maMapRes.mnMapOfsX,
620 0 : ImplPixelToLogic( rPixelRect.Bottom()-mnOutOffY-mnOutOffOrigY, mnDPIY,
621 : maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
622 0 : maThresRes.mnThresPixToLogY )-maMapRes.mnMapOfsY );
623 : }
624 :
625 0 : Region OutputDevice::ImplPixelToDevicePixel( const Region& rRegion ) const
626 : {
627 0 : if ( !mnOutOffX && !mnOutOffY )
628 0 : return rRegion;
629 :
630 0 : Region aRegion( rRegion );
631 0 : aRegion.Move( mnOutOffX+mnOutOffOrigX, mnOutOffY+mnOutOffOrigY );
632 0 : return aRegion;
633 : }
634 :
635 0 : void OutputDevice::EnableMapMode( bool bEnable )
636 : {
637 0 : mbMap = bEnable;
638 :
639 0 : if( mpAlphaVDev )
640 0 : mpAlphaVDev->EnableMapMode( bEnable );
641 0 : }
642 :
643 0 : void OutputDevice::SetMapMode()
644 : {
645 :
646 0 : if ( mpMetaFile )
647 0 : mpMetaFile->AddAction( new MetaMapModeAction( MapMode() ) );
648 :
649 0 : if ( mbMap || !maMapMode.IsDefault() )
650 : {
651 0 : mbMap = false;
652 0 : maMapMode = MapMode();
653 :
654 : // create new objects (clip region are not re-scaled)
655 0 : mbNewFont = true;
656 0 : mbInitFont = true;
657 0 : if ( GetOutDevType() == OUTDEV_WINDOW )
658 : {
659 0 : if ( ((Window*)this)->mpWindowImpl->mpCursor )
660 0 : ((Window*)this)->mpWindowImpl->mpCursor->ImplNew();
661 : }
662 :
663 : // #106426# Adapt logical offset when changing mapmode
664 0 : mnOutOffLogicX = mnOutOffOrigX; // no mapping -> equal offsets
665 0 : mnOutOffLogicY = mnOutOffOrigY;
666 :
667 : // #i75163#
668 0 : ImplInvalidateViewTransform();
669 : }
670 :
671 0 : if( mpAlphaVDev )
672 0 : mpAlphaVDev->SetMapMode();
673 0 : }
674 :
675 0 : void OutputDevice::SetMapMode( const MapMode& rNewMapMode )
676 : {
677 :
678 0 : bool bRelMap = (rNewMapMode.GetMapUnit() == MAP_RELATIVE);
679 :
680 0 : if ( mpMetaFile )
681 : {
682 0 : mpMetaFile->AddAction( new MetaMapModeAction( rNewMapMode ) );
683 : #ifdef DBG_UTIL
684 : if ( GetOutDevType() != OUTDEV_PRINTER )
685 : DBG_ASSERTWARNING( bRelMap, "Please record only relative MapModes!" );
686 : #endif
687 : }
688 :
689 : // do nothing if MapMode was not changed
690 0 : if ( maMapMode == rNewMapMode )
691 0 : return;
692 :
693 0 : if( mpAlphaVDev )
694 0 : mpAlphaVDev->SetMapMode( rNewMapMode );
695 :
696 : // if default MapMode calculate nothing
697 0 : bool bOldMap = mbMap;
698 0 : mbMap = !rNewMapMode.IsDefault();
699 0 : if ( mbMap )
700 : {
701 : // if only the origin is converted, do not scale new
702 0 : if ( (rNewMapMode.GetMapUnit() == maMapMode.GetMapUnit()) &&
703 0 : (rNewMapMode.GetScaleX() == maMapMode.GetScaleX()) &&
704 0 : (rNewMapMode.GetScaleY() == maMapMode.GetScaleY()) &&
705 0 : (bOldMap == mbMap) )
706 : {
707 : // set offset
708 0 : Point aOrigin = rNewMapMode.GetOrigin();
709 0 : maMapRes.mnMapOfsX = aOrigin.X();
710 0 : maMapRes.mnMapOfsY = aOrigin.Y();
711 0 : maMapMode = rNewMapMode;
712 :
713 : // #i75163#
714 0 : ImplInvalidateViewTransform();
715 :
716 0 : return;
717 : }
718 0 : if ( !bOldMap && bRelMap )
719 : {
720 0 : maMapRes.mnMapScNumX = 1;
721 0 : maMapRes.mnMapScNumY = 1;
722 0 : maMapRes.mnMapScDenomX = mnDPIX;
723 0 : maMapRes.mnMapScDenomY = mnDPIY;
724 0 : maMapRes.mnMapOfsX = 0;
725 0 : maMapRes.mnMapOfsY = 0;
726 : }
727 :
728 : // calculate new MapMode-resolution
729 0 : ImplCalcMapResolution( rNewMapMode, mnDPIX, mnDPIY, maMapRes, maThresRes );
730 : }
731 :
732 : // set new MapMode
733 0 : if ( bRelMap )
734 : {
735 0 : Point aOrigin( maMapRes.mnMapOfsX, maMapRes.mnMapOfsY );
736 : // aScale? = maMapMode.GetScale?() * rNewMapMode.GetScale?()
737 0 : Fraction aScaleX = ImplMakeFraction( maMapMode.GetScaleX().GetNumerator(),
738 0 : rNewMapMode.GetScaleX().GetNumerator(),
739 0 : maMapMode.GetScaleX().GetDenominator(),
740 0 : rNewMapMode.GetScaleX().GetDenominator() );
741 0 : Fraction aScaleY = ImplMakeFraction( maMapMode.GetScaleY().GetNumerator(),
742 0 : rNewMapMode.GetScaleY().GetNumerator(),
743 0 : maMapMode.GetScaleY().GetDenominator(),
744 0 : rNewMapMode.GetScaleY().GetDenominator() );
745 0 : maMapMode.SetOrigin( aOrigin );
746 0 : maMapMode.SetScaleX( aScaleX );
747 0 : maMapMode.SetScaleY( aScaleY );
748 : }
749 : else
750 0 : maMapMode = rNewMapMode;
751 :
752 : // create new objects (clip region are not re-scaled)
753 0 : mbNewFont = true;
754 0 : mbInitFont = true;
755 0 : if ( GetOutDevType() == OUTDEV_WINDOW )
756 : {
757 0 : if ( ((Window*)this)->mpWindowImpl->mpCursor )
758 0 : ((Window*)this)->mpWindowImpl->mpCursor->ImplNew();
759 : }
760 :
761 : // #106426# Adapt logical offset when changing mapmode
762 : mnOutOffLogicX = ImplPixelToLogic( mnOutOffOrigX, mnDPIX,
763 : maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
764 0 : maThresRes.mnThresPixToLogX );
765 : mnOutOffLogicY = ImplPixelToLogic( mnOutOffOrigY, mnDPIY,
766 : maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
767 0 : maThresRes.mnThresPixToLogY );
768 :
769 : // #i75163#
770 0 : ImplInvalidateViewTransform();
771 : }
772 :
773 0 : void OutputDevice::SetRelativeMapMode( const MapMode& rNewMapMode )
774 : {
775 : // do nothing if MapMode did not change
776 0 : if ( maMapMode == rNewMapMode )
777 0 : return;
778 :
779 0 : MapUnit eOld = maMapMode.GetMapUnit();
780 0 : MapUnit eNew = rNewMapMode.GetMapUnit();
781 :
782 : // a?F = rNewMapMode.GetScale?() / maMapMode.GetScale?()
783 0 : Fraction aXF = ImplMakeFraction( rNewMapMode.GetScaleX().GetNumerator(),
784 0 : maMapMode.GetScaleX().GetDenominator(),
785 0 : rNewMapMode.GetScaleX().GetDenominator(),
786 0 : maMapMode.GetScaleX().GetNumerator() );
787 0 : Fraction aYF = ImplMakeFraction( rNewMapMode.GetScaleY().GetNumerator(),
788 0 : maMapMode.GetScaleY().GetDenominator(),
789 0 : rNewMapMode.GetScaleY().GetDenominator(),
790 0 : maMapMode.GetScaleY().GetNumerator() );
791 :
792 0 : Point aPt( LogicToLogic( Point(), NULL, &rNewMapMode ) );
793 0 : if ( eNew != eOld )
794 : {
795 0 : if ( eOld > MAP_PIXEL )
796 : {
797 : SAL_WARN( "vcl.gdi", "Not implemented MapUnit" );
798 : }
799 0 : else if ( eNew > MAP_PIXEL )
800 : {
801 : SAL_WARN( "vcl.gdi", "Not implemented MapUnit" );
802 : }
803 : else
804 : {
805 0 : Fraction aF( aImplNumeratorAry[eNew] * aImplDenominatorAry[eOld],
806 0 : aImplNumeratorAry[eOld] * aImplDenominatorAry[eNew] );
807 :
808 : // a?F = a?F * aF
809 0 : aXF = ImplMakeFraction( aXF.GetNumerator(), aF.GetNumerator(),
810 0 : aXF.GetDenominator(), aF.GetDenominator() );
811 0 : aYF = ImplMakeFraction( aYF.GetNumerator(), aF.GetNumerator(),
812 0 : aYF.GetDenominator(), aF.GetDenominator() );
813 0 : if ( eOld == MAP_PIXEL )
814 : {
815 0 : aXF *= Fraction( mnDPIX, 1 );
816 0 : aYF *= Fraction( mnDPIY, 1 );
817 : }
818 0 : else if ( eNew == MAP_PIXEL )
819 : {
820 0 : aXF *= Fraction( 1, mnDPIX );
821 0 : aYF *= Fraction( 1, mnDPIY );
822 : }
823 : }
824 : }
825 :
826 0 : MapMode aNewMapMode( MAP_RELATIVE, Point( -aPt.X(), -aPt.Y() ), aXF, aYF );
827 0 : SetMapMode( aNewMapMode );
828 :
829 0 : if ( eNew != eOld )
830 0 : maMapMode = rNewMapMode;
831 :
832 : // #106426# Adapt logical offset when changing MapMode
833 : mnOutOffLogicX = ImplPixelToLogic( mnOutOffOrigX, mnDPIX,
834 : maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
835 0 : maThresRes.mnThresPixToLogX );
836 : mnOutOffLogicY = ImplPixelToLogic( mnOutOffOrigY, mnDPIY,
837 : maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
838 0 : maThresRes.mnThresPixToLogY );
839 :
840 0 : if( mpAlphaVDev )
841 0 : mpAlphaVDev->SetRelativeMapMode( rNewMapMode );
842 : }
843 :
844 : // #i75163#
845 0 : basegfx::B2DHomMatrix OutputDevice::GetViewTransformation() const
846 : {
847 0 : if(mbMap)
848 : {
849 : // #i82615#
850 0 : if(!mpOutDevData)
851 : {
852 0 : const_cast< OutputDevice* >(this)->ImplInitOutDevData();
853 : }
854 :
855 0 : if(!mpOutDevData->mpViewTransform)
856 : {
857 0 : mpOutDevData->mpViewTransform = new basegfx::B2DHomMatrix;
858 :
859 0 : const double fScaleFactorX((double)mnDPIX * (double)maMapRes.mnMapScNumX / (double)maMapRes.mnMapScDenomX);
860 0 : const double fScaleFactorY((double)mnDPIY * (double)maMapRes.mnMapScNumY / (double)maMapRes.mnMapScDenomY);
861 0 : const double fZeroPointX(((double)maMapRes.mnMapOfsX * fScaleFactorX) + (double)mnOutOffOrigX);
862 0 : const double fZeroPointY(((double)maMapRes.mnMapOfsY * fScaleFactorY) + (double)mnOutOffOrigY);
863 :
864 0 : mpOutDevData->mpViewTransform->set(0, 0, fScaleFactorX);
865 0 : mpOutDevData->mpViewTransform->set(1, 1, fScaleFactorY);
866 0 : mpOutDevData->mpViewTransform->set(0, 2, fZeroPointX);
867 0 : mpOutDevData->mpViewTransform->set(1, 2, fZeroPointY);
868 : }
869 :
870 0 : return *mpOutDevData->mpViewTransform;
871 : }
872 : else
873 : {
874 0 : return basegfx::B2DHomMatrix();
875 : }
876 : }
877 :
878 : // #i75163#
879 0 : basegfx::B2DHomMatrix OutputDevice::GetInverseViewTransformation() const
880 : {
881 0 : if(mbMap)
882 : {
883 : // #i82615#
884 0 : if(!mpOutDevData)
885 : {
886 0 : const_cast< OutputDevice* >(this)->ImplInitOutDevData();
887 : }
888 :
889 0 : if(!mpOutDevData->mpInverseViewTransform)
890 : {
891 0 : GetViewTransformation();
892 0 : mpOutDevData->mpInverseViewTransform = new basegfx::B2DHomMatrix(*mpOutDevData->mpViewTransform);
893 0 : mpOutDevData->mpInverseViewTransform->invert();
894 : }
895 :
896 0 : return *mpOutDevData->mpInverseViewTransform;
897 : }
898 : else
899 : {
900 0 : return basegfx::B2DHomMatrix();
901 : }
902 : }
903 :
904 : // #i75163#
905 0 : basegfx::B2DHomMatrix OutputDevice::GetViewTransformation( const MapMode& rMapMode ) const
906 : {
907 : // #i82615#
908 : ImplMapRes aMapRes;
909 : ImplThresholdRes aThresRes;
910 0 : ImplCalcMapResolution( rMapMode, mnDPIX, mnDPIY, aMapRes, aThresRes );
911 :
912 0 : basegfx::B2DHomMatrix aTransform;
913 :
914 0 : const double fScaleFactorX((double)mnDPIX * (double)aMapRes.mnMapScNumX / (double)aMapRes.mnMapScDenomX);
915 0 : const double fScaleFactorY((double)mnDPIY * (double)aMapRes.mnMapScNumY / (double)aMapRes.mnMapScDenomY);
916 0 : const double fZeroPointX(((double)aMapRes.mnMapOfsX * fScaleFactorX) + (double)mnOutOffOrigX);
917 0 : const double fZeroPointY(((double)aMapRes.mnMapOfsY * fScaleFactorY) + (double)mnOutOffOrigY);
918 :
919 0 : aTransform.set(0, 0, fScaleFactorX);
920 0 : aTransform.set(1, 1, fScaleFactorY);
921 0 : aTransform.set(0, 2, fZeroPointX);
922 0 : aTransform.set(1, 2, fZeroPointY);
923 :
924 0 : return aTransform;
925 : }
926 :
927 : // #i75163#
928 0 : basegfx::B2DHomMatrix OutputDevice::GetInverseViewTransformation( const MapMode& rMapMode ) const
929 : {
930 0 : basegfx::B2DHomMatrix aMatrix( GetViewTransformation( rMapMode ) );
931 0 : aMatrix.invert();
932 0 : return aMatrix;
933 : }
934 :
935 0 : basegfx::B2DHomMatrix OutputDevice::ImplGetDeviceTransformation() const
936 : {
937 0 : basegfx::B2DHomMatrix aTransformation = GetViewTransformation();
938 : // TODO: is it worth to cache the transformed result?
939 0 : if( mnOutOffX || mnOutOffY )
940 0 : aTransformation.translate( mnOutOffX, mnOutOffY );
941 0 : return aTransformation;
942 : }
943 :
944 0 : Point OutputDevice::LogicToPixel( const Point& rLogicPt ) const
945 : {
946 :
947 0 : if ( !mbMap )
948 0 : return rLogicPt;
949 :
950 0 : return Point( ImplLogicToPixel( rLogicPt.X() + maMapRes.mnMapOfsX, mnDPIX,
951 : maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
952 0 : maThresRes.mnThresLogToPixX )+mnOutOffOrigX,
953 0 : ImplLogicToPixel( rLogicPt.Y() + maMapRes.mnMapOfsY, mnDPIY,
954 : maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
955 0 : maThresRes.mnThresLogToPixY )+mnOutOffOrigY );
956 : }
957 :
958 0 : Size OutputDevice::LogicToPixel( const Size& rLogicSize ) const
959 : {
960 :
961 0 : if ( !mbMap )
962 0 : return rLogicSize;
963 :
964 : return Size( ImplLogicToPixel( rLogicSize.Width(), mnDPIX,
965 : maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
966 : maThresRes.mnThresLogToPixX ),
967 : ImplLogicToPixel( rLogicSize.Height(), mnDPIY,
968 : maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
969 0 : maThresRes.mnThresLogToPixY ) );
970 : }
971 :
972 0 : Rectangle OutputDevice::LogicToPixel( const Rectangle& rLogicRect ) const
973 : {
974 :
975 0 : if ( !mbMap || rLogicRect.IsEmpty() )
976 0 : return rLogicRect;
977 :
978 0 : return Rectangle( ImplLogicToPixel( rLogicRect.Left() + maMapRes.mnMapOfsX, mnDPIX,
979 : maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
980 0 : maThresRes.mnThresLogToPixX )+mnOutOffOrigX,
981 0 : ImplLogicToPixel( rLogicRect.Top() + maMapRes.mnMapOfsY, mnDPIY,
982 : maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
983 0 : maThresRes.mnThresLogToPixY )+mnOutOffOrigY,
984 0 : ImplLogicToPixel( rLogicRect.Right() + maMapRes.mnMapOfsX, mnDPIX,
985 : maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
986 0 : maThresRes.mnThresLogToPixX )+mnOutOffOrigX,
987 0 : ImplLogicToPixel( rLogicRect.Bottom() + maMapRes.mnMapOfsY, mnDPIY,
988 : maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
989 0 : maThresRes.mnThresLogToPixY )+mnOutOffOrigY );
990 : }
991 :
992 0 : Polygon OutputDevice::LogicToPixel( const Polygon& rLogicPoly ) const
993 : {
994 :
995 0 : if ( !mbMap )
996 0 : return rLogicPoly;
997 :
998 : sal_uInt16 i;
999 0 : sal_uInt16 nPoints = rLogicPoly.GetSize();
1000 0 : Polygon aPoly( rLogicPoly );
1001 :
1002 : // get pointer to Point-array (copy data)
1003 0 : const Point* pPointAry = aPoly.GetConstPointAry();
1004 :
1005 0 : for ( i = 0; i < nPoints; i++ )
1006 : {
1007 0 : const Point* pPt = &(pPointAry[i]);
1008 0 : Point aPt;
1009 0 : aPt.X() = ImplLogicToPixel( pPt->X() + maMapRes.mnMapOfsX, mnDPIX,
1010 : maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
1011 0 : maThresRes.mnThresLogToPixX )+mnOutOffOrigX;
1012 0 : aPt.Y() = ImplLogicToPixel( pPt->Y() + maMapRes.mnMapOfsY, mnDPIY,
1013 : maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
1014 0 : maThresRes.mnThresLogToPixY )+mnOutOffOrigY;
1015 0 : aPoly[i] = aPt;
1016 : }
1017 :
1018 0 : return aPoly;
1019 : }
1020 :
1021 0 : PolyPolygon OutputDevice::LogicToPixel( const PolyPolygon& rLogicPolyPoly ) const
1022 : {
1023 :
1024 0 : if ( !mbMap )
1025 0 : return rLogicPolyPoly;
1026 :
1027 0 : PolyPolygon aPolyPoly( rLogicPolyPoly );
1028 0 : sal_uInt16 nPoly = aPolyPoly.Count();
1029 0 : for( sal_uInt16 i = 0; i < nPoly; i++ )
1030 : {
1031 0 : Polygon& rPoly = aPolyPoly[i];
1032 0 : rPoly = LogicToPixel( rPoly );
1033 : }
1034 0 : return aPolyPoly;
1035 : }
1036 :
1037 0 : basegfx::B2DPolygon OutputDevice::LogicToPixel( const basegfx::B2DPolygon& rLogicPoly ) const
1038 : {
1039 0 : basegfx::B2DPolygon aTransformedPoly = rLogicPoly;
1040 0 : const ::basegfx::B2DHomMatrix& rTransformationMatrix = GetViewTransformation();
1041 0 : aTransformedPoly.transform( rTransformationMatrix );
1042 0 : return aTransformedPoly;
1043 : }
1044 :
1045 0 : basegfx::B2DPolyPolygon OutputDevice::LogicToPixel( const basegfx::B2DPolyPolygon& rLogicPolyPoly ) const
1046 : {
1047 0 : basegfx::B2DPolyPolygon aTransformedPoly = rLogicPolyPoly;
1048 0 : const ::basegfx::B2DHomMatrix& rTransformationMatrix = GetViewTransformation();
1049 0 : aTransformedPoly.transform( rTransformationMatrix );
1050 0 : return aTransformedPoly;
1051 : }
1052 :
1053 0 : Region OutputDevice::LogicToPixel( const Region& rLogicRegion ) const
1054 : {
1055 :
1056 0 : if(!mbMap || rLogicRegion.IsNull() || rLogicRegion.IsEmpty())
1057 : {
1058 0 : return rLogicRegion;
1059 : }
1060 :
1061 0 : Region aRegion;
1062 :
1063 0 : if(rLogicRegion.getB2DPolyPolygon())
1064 : {
1065 0 : aRegion = Region(LogicToPixel(*rLogicRegion.getB2DPolyPolygon()));
1066 : }
1067 0 : else if(rLogicRegion.getPolyPolygon())
1068 : {
1069 0 : aRegion = Region(LogicToPixel(*rLogicRegion.getPolyPolygon()));
1070 : }
1071 0 : else if(rLogicRegion.getRegionBand())
1072 : {
1073 0 : RectangleVector aRectangles;
1074 0 : rLogicRegion.GetRegionRectangles(aRectangles);
1075 0 : const RectangleVector& rRectangles(aRectangles); // needed to make the '!=' work
1076 :
1077 : // make reverse run to fill new region bottom-up, this will speed it up due to the used data structuring
1078 0 : for(RectangleVector::const_reverse_iterator aRectIter(rRectangles.rbegin()); aRectIter != rRectangles.rend(); ++aRectIter)
1079 : {
1080 0 : aRegion.Union(LogicToPixel(*aRectIter));
1081 0 : }
1082 : }
1083 :
1084 0 : return aRegion;
1085 : }
1086 :
1087 0 : Point OutputDevice::LogicToPixel( const Point& rLogicPt,
1088 : const MapMode& rMapMode ) const
1089 : {
1090 :
1091 0 : if ( rMapMode.IsDefault() )
1092 0 : return rLogicPt;
1093 :
1094 : // convert MapMode resolution and convert
1095 : ImplMapRes aMapRes;
1096 : ImplThresholdRes aThresRes;
1097 0 : ImplCalcMapResolution( rMapMode, mnDPIX, mnDPIY, aMapRes, aThresRes );
1098 :
1099 0 : return Point( ImplLogicToPixel( rLogicPt.X() + aMapRes.mnMapOfsX, mnDPIX,
1100 : aMapRes.mnMapScNumX, aMapRes.mnMapScDenomX,
1101 0 : aThresRes.mnThresLogToPixX )+mnOutOffOrigX,
1102 0 : ImplLogicToPixel( rLogicPt.Y() + aMapRes.mnMapOfsY, mnDPIY,
1103 : aMapRes.mnMapScNumY, aMapRes.mnMapScDenomY,
1104 0 : aThresRes.mnThresLogToPixY )+mnOutOffOrigY );
1105 : }
1106 :
1107 0 : Size OutputDevice::LogicToPixel( const Size& rLogicSize,
1108 : const MapMode& rMapMode ) const
1109 : {
1110 :
1111 0 : if ( rMapMode.IsDefault() )
1112 0 : return rLogicSize;
1113 :
1114 : // convert MapMode resolution and convert
1115 : ImplMapRes aMapRes;
1116 : ImplThresholdRes aThresRes;
1117 0 : ImplCalcMapResolution( rMapMode, mnDPIX, mnDPIY, aMapRes, aThresRes );
1118 :
1119 : return Size( ImplLogicToPixel( rLogicSize.Width(), mnDPIX,
1120 : aMapRes.mnMapScNumX, aMapRes.mnMapScDenomX,
1121 : aThresRes.mnThresLogToPixX ),
1122 : ImplLogicToPixel( rLogicSize.Height(), mnDPIY,
1123 : aMapRes.mnMapScNumY, aMapRes.mnMapScDenomY,
1124 0 : aThresRes.mnThresLogToPixY ) );
1125 : }
1126 :
1127 0 : Rectangle OutputDevice::LogicToPixel( const Rectangle& rLogicRect,
1128 : const MapMode& rMapMode ) const
1129 : {
1130 :
1131 0 : if ( rMapMode.IsDefault() || rLogicRect.IsEmpty() )
1132 0 : return rLogicRect;
1133 :
1134 : // convert MapMode resolution and convert
1135 : ImplMapRes aMapRes;
1136 : ImplThresholdRes aThresRes;
1137 0 : ImplCalcMapResolution( rMapMode, mnDPIX, mnDPIY, aMapRes, aThresRes );
1138 :
1139 0 : return Rectangle( ImplLogicToPixel( rLogicRect.Left() + aMapRes.mnMapOfsX, mnDPIX,
1140 : aMapRes.mnMapScNumX, aMapRes.mnMapScDenomX,
1141 0 : aThresRes.mnThresLogToPixX )+mnOutOffOrigX,
1142 0 : ImplLogicToPixel( rLogicRect.Top() + aMapRes.mnMapOfsY, mnDPIY,
1143 : aMapRes.mnMapScNumY, aMapRes.mnMapScDenomY,
1144 0 : aThresRes.mnThresLogToPixY )+mnOutOffOrigY,
1145 0 : ImplLogicToPixel( rLogicRect.Right() + aMapRes.mnMapOfsX, mnDPIX,
1146 : aMapRes.mnMapScNumX, aMapRes.mnMapScDenomX,
1147 0 : aThresRes.mnThresLogToPixX )+mnOutOffOrigX,
1148 0 : ImplLogicToPixel( rLogicRect.Bottom() + aMapRes.mnMapOfsY, mnDPIY,
1149 : aMapRes.mnMapScNumY, aMapRes.mnMapScDenomY,
1150 0 : aThresRes.mnThresLogToPixY )+mnOutOffOrigY );
1151 : }
1152 :
1153 0 : Polygon OutputDevice::LogicToPixel( const Polygon& rLogicPoly,
1154 : const MapMode& rMapMode ) const
1155 : {
1156 :
1157 0 : if ( rMapMode.IsDefault() )
1158 0 : return rLogicPoly;
1159 :
1160 : // convert MapMode resolution and convert
1161 : ImplMapRes aMapRes;
1162 : ImplThresholdRes aThresRes;
1163 0 : ImplCalcMapResolution( rMapMode, mnDPIX, mnDPIY, aMapRes, aThresRes );
1164 :
1165 : sal_uInt16 i;
1166 0 : sal_uInt16 nPoints = rLogicPoly.GetSize();
1167 0 : Polygon aPoly( rLogicPoly );
1168 :
1169 : // get pointer to Point-array (copy data)
1170 0 : const Point* pPointAry = aPoly.GetConstPointAry();
1171 :
1172 0 : for ( i = 0; i < nPoints; i++ )
1173 : {
1174 0 : const Point* pPt = &(pPointAry[i]);
1175 0 : Point aPt;
1176 0 : aPt.X() = ImplLogicToPixel( pPt->X() + aMapRes.mnMapOfsX, mnDPIX,
1177 : aMapRes.mnMapScNumX, aMapRes.mnMapScDenomX,
1178 0 : aThresRes.mnThresLogToPixX )+mnOutOffOrigX;
1179 0 : aPt.Y() = ImplLogicToPixel( pPt->Y() + aMapRes.mnMapOfsY, mnDPIY,
1180 : aMapRes.mnMapScNumY, aMapRes.mnMapScDenomY,
1181 0 : aThresRes.mnThresLogToPixY )+mnOutOffOrigY;
1182 0 : aPoly[i] = aPt;
1183 : }
1184 :
1185 0 : return aPoly;
1186 : }
1187 :
1188 0 : PolyPolygon OutputDevice::LogicToPixel( const PolyPolygon& rLogicPolyPoly,
1189 : const MapMode& rMapMode ) const
1190 : {
1191 :
1192 0 : if ( rMapMode.IsDefault() )
1193 0 : return rLogicPolyPoly;
1194 :
1195 0 : PolyPolygon aPolyPoly( rLogicPolyPoly );
1196 0 : sal_uInt16 nPoly = aPolyPoly.Count();
1197 0 : for( sal_uInt16 i = 0; i < nPoly; i++ )
1198 : {
1199 0 : Polygon& rPoly = aPolyPoly[i];
1200 0 : rPoly = LogicToPixel( rPoly, rMapMode );
1201 : }
1202 0 : return aPolyPoly;
1203 : }
1204 :
1205 0 : basegfx::B2DPolyPolygon OutputDevice::LogicToPixel( const basegfx::B2DPolyPolygon& rLogicPolyPoly,
1206 : const MapMode& rMapMode ) const
1207 : {
1208 0 : basegfx::B2DPolyPolygon aTransformedPoly = rLogicPolyPoly;
1209 0 : const ::basegfx::B2DHomMatrix& rTransformationMatrix = GetViewTransformation( rMapMode );
1210 0 : aTransformedPoly.transform( rTransformationMatrix );
1211 0 : return aTransformedPoly;
1212 : }
1213 :
1214 0 : basegfx::B2DPolygon OutputDevice::LogicToPixel( const basegfx::B2DPolygon& rLogicPoly,
1215 : const MapMode& rMapMode ) const
1216 : {
1217 0 : basegfx::B2DPolygon aTransformedPoly = rLogicPoly;
1218 0 : const ::basegfx::B2DHomMatrix& rTransformationMatrix = GetViewTransformation( rMapMode );
1219 0 : aTransformedPoly.transform( rTransformationMatrix );
1220 0 : return aTransformedPoly;
1221 : }
1222 :
1223 0 : Region OutputDevice::LogicToPixel( const Region& rLogicRegion, const MapMode& rMapMode ) const
1224 : {
1225 :
1226 0 : if(rMapMode.IsDefault() || rLogicRegion.IsNull() || rLogicRegion.IsEmpty())
1227 : {
1228 0 : return rLogicRegion;
1229 : }
1230 :
1231 0 : Region aRegion;
1232 :
1233 0 : if(rLogicRegion.getB2DPolyPolygon())
1234 : {
1235 0 : aRegion = Region(LogicToPixel(*rLogicRegion.getB2DPolyPolygon(), rMapMode));
1236 : }
1237 0 : else if(rLogicRegion.getPolyPolygon())
1238 : {
1239 0 : aRegion = Region(LogicToPixel(*rLogicRegion.getPolyPolygon(), rMapMode));
1240 : }
1241 0 : else if(rLogicRegion.getRegionBand())
1242 : {
1243 0 : RectangleVector aRectangles;
1244 0 : rLogicRegion.GetRegionRectangles(aRectangles);
1245 0 : const RectangleVector& rRectangles(aRectangles); // needed to make the '!=' work
1246 :
1247 : // make reverse run to fill new region bottom-up, this will speed it up due to the used data structuring
1248 0 : for(RectangleVector::const_reverse_iterator aRectIter(rRectangles.rbegin()); aRectIter != rRectangles.rend(); ++aRectIter)
1249 : {
1250 0 : aRegion.Union(LogicToPixel(*aRectIter, rMapMode));
1251 0 : }
1252 : }
1253 :
1254 0 : return aRegion;
1255 : }
1256 :
1257 0 : Point OutputDevice::PixelToLogic( const Point& rDevicePt ) const
1258 : {
1259 :
1260 0 : if ( !mbMap )
1261 0 : return rDevicePt;
1262 :
1263 : return Point( ImplPixelToLogic( rDevicePt.X(), mnDPIX,
1264 : maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
1265 0 : maThresRes.mnThresPixToLogX ) - maMapRes.mnMapOfsX - mnOutOffLogicX,
1266 : ImplPixelToLogic( rDevicePt.Y(), mnDPIY,
1267 : maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
1268 0 : maThresRes.mnThresPixToLogY ) - maMapRes.mnMapOfsY - mnOutOffLogicY );
1269 : }
1270 :
1271 0 : Size OutputDevice::PixelToLogic( const Size& rDeviceSize ) const
1272 : {
1273 :
1274 0 : if ( !mbMap )
1275 0 : return rDeviceSize;
1276 :
1277 : return Size( ImplPixelToLogic( rDeviceSize.Width(), mnDPIX,
1278 : maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
1279 : maThresRes.mnThresPixToLogX ),
1280 : ImplPixelToLogic( rDeviceSize.Height(), mnDPIY,
1281 : maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
1282 0 : maThresRes.mnThresPixToLogY ) );
1283 : }
1284 :
1285 0 : Rectangle OutputDevice::PixelToLogic( const Rectangle& rDeviceRect ) const
1286 : {
1287 :
1288 0 : if ( !mbMap || rDeviceRect.IsEmpty() )
1289 0 : return rDeviceRect;
1290 :
1291 : return Rectangle( ImplPixelToLogic( rDeviceRect.Left(), mnDPIX,
1292 : maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
1293 0 : maThresRes.mnThresPixToLogX ) - maMapRes.mnMapOfsX - mnOutOffLogicX,
1294 : ImplPixelToLogic( rDeviceRect.Top(), mnDPIY,
1295 : maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
1296 0 : maThresRes.mnThresPixToLogY ) - maMapRes.mnMapOfsY - mnOutOffLogicY,
1297 : ImplPixelToLogic( rDeviceRect.Right(), mnDPIX,
1298 : maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
1299 0 : maThresRes.mnThresPixToLogX ) - maMapRes.mnMapOfsX - mnOutOffLogicX,
1300 : ImplPixelToLogic( rDeviceRect.Bottom(), mnDPIY,
1301 : maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
1302 0 : maThresRes.mnThresPixToLogY ) - maMapRes.mnMapOfsY - mnOutOffLogicY );
1303 : }
1304 :
1305 0 : Polygon OutputDevice::PixelToLogic( const Polygon& rDevicePoly ) const
1306 : {
1307 :
1308 0 : if ( !mbMap )
1309 0 : return rDevicePoly;
1310 :
1311 : sal_uInt16 i;
1312 0 : sal_uInt16 nPoints = rDevicePoly.GetSize();
1313 0 : Polygon aPoly( rDevicePoly );
1314 :
1315 : // get pointer to Point-array (copy data)
1316 0 : const Point* pPointAry = aPoly.GetConstPointAry();
1317 :
1318 0 : for ( i = 0; i < nPoints; i++ )
1319 : {
1320 0 : const Point* pPt = &(pPointAry[i]);
1321 0 : Point aPt;
1322 0 : aPt.X() = ImplPixelToLogic( pPt->X(), mnDPIX,
1323 : maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
1324 0 : maThresRes.mnThresPixToLogX ) - maMapRes.mnMapOfsX - mnOutOffLogicX;
1325 0 : aPt.Y() = ImplPixelToLogic( pPt->Y(), mnDPIY,
1326 : maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
1327 0 : maThresRes.mnThresPixToLogY ) - maMapRes.mnMapOfsY - mnOutOffLogicY;
1328 0 : aPoly[i] = aPt;
1329 : }
1330 :
1331 0 : return aPoly;
1332 : }
1333 :
1334 0 : PolyPolygon OutputDevice::PixelToLogic( const PolyPolygon& rDevicePolyPoly ) const
1335 : {
1336 :
1337 0 : if ( !mbMap )
1338 0 : return rDevicePolyPoly;
1339 :
1340 0 : PolyPolygon aPolyPoly( rDevicePolyPoly );
1341 0 : sal_uInt16 nPoly = aPolyPoly.Count();
1342 0 : for( sal_uInt16 i = 0; i < nPoly; i++ )
1343 : {
1344 0 : Polygon& rPoly = aPolyPoly[i];
1345 0 : rPoly = PixelToLogic( rPoly );
1346 : }
1347 0 : return aPolyPoly;
1348 : }
1349 :
1350 0 : basegfx::B2DPolyPolygon OutputDevice::PixelToLogic( const basegfx::B2DPolyPolygon& rPixelPolyPoly ) const
1351 : {
1352 0 : basegfx::B2DPolyPolygon aTransformedPoly = rPixelPolyPoly;
1353 0 : const ::basegfx::B2DHomMatrix& rTransformationMatrix = GetInverseViewTransformation();
1354 0 : aTransformedPoly.transform( rTransformationMatrix );
1355 0 : return aTransformedPoly;
1356 : }
1357 :
1358 0 : Region OutputDevice::PixelToLogic( const Region& rDeviceRegion ) const
1359 : {
1360 :
1361 0 : if(!mbMap || rDeviceRegion.IsNull() || rDeviceRegion.IsEmpty())
1362 : {
1363 0 : return rDeviceRegion;
1364 : }
1365 :
1366 0 : Region aRegion;
1367 :
1368 0 : if(rDeviceRegion.getB2DPolyPolygon())
1369 : {
1370 0 : aRegion = Region(PixelToLogic(*rDeviceRegion.getB2DPolyPolygon()));
1371 : }
1372 0 : else if(rDeviceRegion.getPolyPolygon())
1373 : {
1374 0 : aRegion = Region(PixelToLogic(*rDeviceRegion.getPolyPolygon()));
1375 : }
1376 0 : else if(rDeviceRegion.getRegionBand())
1377 : {
1378 0 : RectangleVector aRectangles;
1379 0 : rDeviceRegion.GetRegionRectangles(aRectangles);
1380 0 : const RectangleVector& rRectangles(aRectangles); // needed to make the '!=' work
1381 :
1382 : // make reverse run to fill new region bottom-up, this will speed it up due to the used data structuring
1383 0 : for(RectangleVector::const_reverse_iterator aRectIter(rRectangles.rbegin()); aRectIter != rRectangles.rend(); ++aRectIter)
1384 : {
1385 0 : aRegion.Union(PixelToLogic(*aRectIter));
1386 0 : }
1387 : }
1388 :
1389 0 : return aRegion;
1390 : }
1391 :
1392 0 : Point OutputDevice::PixelToLogic( const Point& rDevicePt,
1393 : const MapMode& rMapMode ) const
1394 : {
1395 :
1396 : // calculate nothing if default-MapMode
1397 0 : if ( rMapMode.IsDefault() )
1398 0 : return rDevicePt;
1399 :
1400 : // calculate MapMode-resolution and convert
1401 : ImplMapRes aMapRes;
1402 : ImplThresholdRes aThresRes;
1403 0 : ImplCalcMapResolution( rMapMode, mnDPIX, mnDPIY, aMapRes, aThresRes );
1404 :
1405 : return Point( ImplPixelToLogic( rDevicePt.X(), mnDPIX,
1406 : aMapRes.mnMapScNumX, aMapRes.mnMapScDenomX,
1407 0 : aThresRes.mnThresPixToLogX ) - aMapRes.mnMapOfsX - mnOutOffLogicX,
1408 : ImplPixelToLogic( rDevicePt.Y(), mnDPIY,
1409 : aMapRes.mnMapScNumY, aMapRes.mnMapScDenomY,
1410 0 : aThresRes.mnThresPixToLogY ) - aMapRes.mnMapOfsY - mnOutOffLogicY );
1411 : }
1412 :
1413 0 : Size OutputDevice::PixelToLogic( const Size& rDeviceSize,
1414 : const MapMode& rMapMode ) const
1415 : {
1416 :
1417 : // calculate nothing if default-MapMode
1418 0 : if ( rMapMode.IsDefault() )
1419 0 : return rDeviceSize;
1420 :
1421 : // calculate MapMode-resolution and convert
1422 : ImplMapRes aMapRes;
1423 : ImplThresholdRes aThresRes;
1424 0 : ImplCalcMapResolution( rMapMode, mnDPIX, mnDPIY, aMapRes, aThresRes );
1425 :
1426 : return Size( ImplPixelToLogic( rDeviceSize.Width(), mnDPIX,
1427 : aMapRes.mnMapScNumX, aMapRes.mnMapScDenomX,
1428 : aThresRes.mnThresPixToLogX ),
1429 : ImplPixelToLogic( rDeviceSize.Height(), mnDPIY,
1430 : aMapRes.mnMapScNumY, aMapRes.mnMapScDenomY,
1431 0 : aThresRes.mnThresPixToLogY ) );
1432 : }
1433 :
1434 0 : Rectangle OutputDevice::PixelToLogic( const Rectangle& rDeviceRect,
1435 : const MapMode& rMapMode ) const
1436 : {
1437 :
1438 : // calculate nothing if default-MapMode
1439 0 : if ( rMapMode.IsDefault() || rDeviceRect.IsEmpty() )
1440 0 : return rDeviceRect;
1441 :
1442 : // calculate MapMode-resolution and convert
1443 : ImplMapRes aMapRes;
1444 : ImplThresholdRes aThresRes;
1445 0 : ImplCalcMapResolution( rMapMode, mnDPIX, mnDPIY, aMapRes, aThresRes );
1446 :
1447 : return Rectangle( ImplPixelToLogic( rDeviceRect.Left(), mnDPIX,
1448 : aMapRes.mnMapScNumX, aMapRes.mnMapScDenomX,
1449 0 : aThresRes.mnThresPixToLogX ) - aMapRes.mnMapOfsX - mnOutOffLogicX,
1450 : ImplPixelToLogic( rDeviceRect.Top(), mnDPIY,
1451 : aMapRes.mnMapScNumY, aMapRes.mnMapScDenomY,
1452 0 : aThresRes.mnThresPixToLogY ) - aMapRes.mnMapOfsY - mnOutOffLogicY,
1453 : ImplPixelToLogic( rDeviceRect.Right(), mnDPIX,
1454 : aMapRes.mnMapScNumX, aMapRes.mnMapScDenomX,
1455 0 : aThresRes.mnThresPixToLogX ) - aMapRes.mnMapOfsX - mnOutOffLogicX,
1456 : ImplPixelToLogic( rDeviceRect.Bottom(), mnDPIY,
1457 : aMapRes.mnMapScNumY, aMapRes.mnMapScDenomY,
1458 0 : aThresRes.mnThresPixToLogY ) - aMapRes.mnMapOfsY - mnOutOffLogicY );
1459 : }
1460 :
1461 0 : Polygon OutputDevice::PixelToLogic( const Polygon& rDevicePoly,
1462 : const MapMode& rMapMode ) const
1463 : {
1464 :
1465 : // calculate nothing if default-MapMode
1466 0 : if ( rMapMode.IsDefault() )
1467 0 : return rDevicePoly;
1468 :
1469 : // calculate MapMode-resolution and convert
1470 : ImplMapRes aMapRes;
1471 : ImplThresholdRes aThresRes;
1472 0 : ImplCalcMapResolution( rMapMode, mnDPIX, mnDPIY, aMapRes, aThresRes );
1473 :
1474 : sal_uInt16 i;
1475 0 : sal_uInt16 nPoints = rDevicePoly.GetSize();
1476 0 : Polygon aPoly( rDevicePoly );
1477 :
1478 : // get pointer to Point-array (copy data)
1479 0 : const Point* pPointAry = aPoly.GetConstPointAry();
1480 :
1481 0 : for ( i = 0; i < nPoints; i++ )
1482 : {
1483 0 : const Point* pPt = &(pPointAry[i]);
1484 0 : Point aPt;
1485 0 : aPt.X() = ImplPixelToLogic( pPt->X(), mnDPIX,
1486 : aMapRes.mnMapScNumX, aMapRes.mnMapScDenomX,
1487 0 : aThresRes.mnThresPixToLogX ) - aMapRes.mnMapOfsX - mnOutOffLogicX;
1488 0 : aPt.Y() = ImplPixelToLogic( pPt->Y(), mnDPIY,
1489 : aMapRes.mnMapScNumY, aMapRes.mnMapScDenomY,
1490 0 : aThresRes.mnThresPixToLogY ) - aMapRes.mnMapOfsY - mnOutOffLogicY;
1491 0 : aPoly[i] = aPt;
1492 : }
1493 :
1494 0 : return aPoly;
1495 : }
1496 :
1497 0 : PolyPolygon OutputDevice::PixelToLogic( const PolyPolygon& rDevicePolyPoly,
1498 : const MapMode& rMapMode ) const
1499 : {
1500 :
1501 0 : if ( rMapMode.IsDefault() )
1502 0 : return rDevicePolyPoly;
1503 :
1504 0 : PolyPolygon aPolyPoly( rDevicePolyPoly );
1505 0 : sal_uInt16 nPoly = aPolyPoly.Count();
1506 0 : for( sal_uInt16 i = 0; i < nPoly; i++ )
1507 : {
1508 0 : Polygon& rPoly = aPolyPoly[i];
1509 0 : rPoly = PixelToLogic( rPoly, rMapMode );
1510 : }
1511 0 : return aPolyPoly;
1512 : }
1513 :
1514 0 : basegfx::B2DPolygon OutputDevice::PixelToLogic( const basegfx::B2DPolygon& rPixelPoly,
1515 : const MapMode& rMapMode ) const
1516 : {
1517 0 : basegfx::B2DPolygon aTransformedPoly = rPixelPoly;
1518 0 : const ::basegfx::B2DHomMatrix& rTransformationMatrix = GetInverseViewTransformation( rMapMode );
1519 0 : aTransformedPoly.transform( rTransformationMatrix );
1520 0 : return aTransformedPoly;
1521 : }
1522 :
1523 0 : basegfx::B2DPolyPolygon OutputDevice::PixelToLogic( const basegfx::B2DPolyPolygon& rPixelPolyPoly,
1524 : const MapMode& rMapMode ) const
1525 : {
1526 0 : basegfx::B2DPolyPolygon aTransformedPoly = rPixelPolyPoly;
1527 0 : const ::basegfx::B2DHomMatrix& rTransformationMatrix = GetInverseViewTransformation( rMapMode );
1528 0 : aTransformedPoly.transform( rTransformationMatrix );
1529 0 : return aTransformedPoly;
1530 : }
1531 :
1532 0 : Region OutputDevice::PixelToLogic( const Region& rDeviceRegion, const MapMode& rMapMode ) const
1533 : {
1534 :
1535 0 : if(rMapMode.IsDefault() || rDeviceRegion.IsNull() || rDeviceRegion.IsEmpty())
1536 : {
1537 0 : return rDeviceRegion;
1538 : }
1539 :
1540 0 : Region aRegion;
1541 :
1542 0 : if(rDeviceRegion.getB2DPolyPolygon())
1543 : {
1544 0 : aRegion = Region(PixelToLogic(*rDeviceRegion.getB2DPolyPolygon(), rMapMode));
1545 : }
1546 0 : else if(rDeviceRegion.getPolyPolygon())
1547 : {
1548 0 : aRegion = Region(PixelToLogic(*rDeviceRegion.getPolyPolygon(), rMapMode));
1549 : }
1550 0 : else if(rDeviceRegion.getRegionBand())
1551 : {
1552 0 : RectangleVector aRectangles;
1553 0 : rDeviceRegion.GetRegionRectangles(aRectangles);
1554 0 : const RectangleVector& rRectangles(aRectangles); // needed to make the '!=' work
1555 :
1556 : // make reverse run to fill new region bottom-up, this will speed it up due to the used data structuring
1557 0 : for(RectangleVector::const_reverse_iterator aRectIter(rRectangles.rbegin()); aRectIter != rRectangles.rend(); ++aRectIter)
1558 : {
1559 0 : aRegion.Union(PixelToLogic(*aRectIter, rMapMode));
1560 0 : }
1561 : }
1562 :
1563 0 : return aRegion;
1564 : }
1565 :
1566 : #define ENTER0( rSource, pMapModeSource, pMapModeDest ) \
1567 : if ( !pMapModeSource ) \
1568 : pMapModeSource = &maMapMode; \
1569 : if ( !pMapModeDest ) \
1570 : pMapModeDest = &maMapMode; \
1571 : if ( *pMapModeSource == *pMapModeDest ) \
1572 : return rSource
1573 :
1574 : #define ENTER1( rSource, pMapModeSource, pMapModeDest ) \
1575 : ENTER0( rSource, pMapModeSource, pMapModeDest ); \
1576 : \
1577 : ImplMapRes aMapResSource; \
1578 : aMapResSource.mnMapOfsX = 0; \
1579 : aMapResSource.mnMapOfsY = 0; \
1580 : aMapResSource.mnMapScNumX = 1; \
1581 : aMapResSource.mnMapScNumY = 1; \
1582 : aMapResSource.mnMapScDenomX = 1; \
1583 : aMapResSource.mnMapScDenomY = 1; \
1584 : ImplMapRes aMapResDest(aMapResSource); \
1585 : \
1586 : if ( !mbMap || pMapModeSource != &maMapMode ) \
1587 : { \
1588 : if ( pMapModeSource->GetMapUnit() == MAP_RELATIVE ) \
1589 : aMapResSource = maMapRes; \
1590 : ImplCalcMapResolution( *pMapModeSource, \
1591 : mnDPIX, mnDPIY, aMapResSource ); \
1592 : } \
1593 : else \
1594 : aMapResSource = maMapRes; \
1595 : if ( !mbMap || pMapModeDest != &maMapMode ) \
1596 : { \
1597 : if ( pMapModeDest->GetMapUnit() == MAP_RELATIVE ) \
1598 : aMapResDest = maMapRes; \
1599 : ImplCalcMapResolution( *pMapModeDest, \
1600 : mnDPIX, mnDPIY, aMapResDest ); \
1601 : } \
1602 : else \
1603 : aMapResDest = maMapRes
1604 :
1605 : #define ENTER2( eUnitSource, eUnitDest ) \
1606 : DBG_ASSERT( eUnitSource != MAP_SYSFONT \
1607 : && eUnitSource != MAP_APPFONT \
1608 : && eUnitSource != MAP_RELATIVE, \
1609 : "Source MapUnit nicht erlaubt" ); \
1610 : DBG_ASSERT( eUnitDest != MAP_SYSFONT \
1611 : && eUnitDest != MAP_APPFONT \
1612 : && eUnitDest != MAP_RELATIVE, \
1613 : "Destination MapUnit nicht erlaubt" ); \
1614 : DBG_ASSERTWARNING( eUnitSource != MAP_PIXEL, \
1615 : "MAP_PIXEL mit 72dpi angenaehert" ); \
1616 : DBG_ASSERTWARNING( eUnitDest != MAP_PIXEL, \
1617 : "MAP_PIXEL mit 72dpi angenaehert" )
1618 :
1619 : #define ENTER3( eUnitSource, eUnitDest ) \
1620 : long nNumerator = 1; \
1621 : long nDenominator = 1; \
1622 : DBG_ASSERT( eUnitSource < s_ImplArySize, "Invalid source map unit"); \
1623 : DBG_ASSERT( eUnitDest < s_ImplArySize, "Invalid destination map unit"); \
1624 : if( (eUnitSource < s_ImplArySize) && (eUnitDest < s_ImplArySize) ) \
1625 : { \
1626 : nNumerator = aImplNumeratorAry[eUnitSource] * \
1627 : aImplDenominatorAry[eUnitDest]; \
1628 : nDenominator = aImplNumeratorAry[eUnitDest] * \
1629 : aImplDenominatorAry[eUnitSource]; \
1630 : } \
1631 : if ( eUnitSource == MAP_PIXEL ) \
1632 : nDenominator *= 72; \
1633 : else if( eUnitDest == MAP_PIXEL ) \
1634 : nNumerator *= 72
1635 :
1636 : #define ENTER4( rMapModeSource, rMapModeDest ) \
1637 : ImplMapRes aMapResSource; \
1638 : aMapResSource.mnMapOfsX = 0; \
1639 : aMapResSource.mnMapOfsY = 0; \
1640 : aMapResSource.mnMapScNumX = 1; \
1641 : aMapResSource.mnMapScNumY = 1; \
1642 : aMapResSource.mnMapScDenomX = 1; \
1643 : aMapResSource.mnMapScDenomY = 1; \
1644 : ImplMapRes aMapResDest(aMapResSource); \
1645 : \
1646 : ImplCalcMapResolution( rMapModeSource, 72, 72, aMapResSource ); \
1647 : ImplCalcMapResolution( rMapModeDest, 72, 72, aMapResDest )
1648 :
1649 : // return (n1 * n2 * n3) / (n4 * n5)
1650 0 : static long fn5( const long n1,
1651 : const long n2,
1652 : const long n3,
1653 : const long n4,
1654 : const long n5 )
1655 : {
1656 0 : if ( n1 == 0 || n2 == 0 || n3 == 0 || n4 == 0 || n5 == 0 )
1657 0 : return 0;
1658 0 : if ( LONG_MAX / std::abs(n2) < std::abs(n3) )
1659 : {
1660 : // a6 is skipped
1661 0 : BigInt a7 = n2;
1662 0 : a7 *= n3;
1663 0 : a7 *= n1;
1664 :
1665 0 : if ( LONG_MAX / std::abs(n4) < std::abs(n5) )
1666 : {
1667 0 : BigInt a8 = n4;
1668 0 : a8 *= n5;
1669 :
1670 0 : BigInt a9 = a8;
1671 0 : a9 /= 2;
1672 0 : if ( a7.IsNeg() )
1673 0 : a7 -= a9;
1674 : else
1675 0 : a7 += a9;
1676 :
1677 0 : a7 /= a8;
1678 : } // of if
1679 : else
1680 : {
1681 0 : long n8 = n4 * n5;
1682 :
1683 0 : if ( a7.IsNeg() )
1684 0 : a7 -= n8 / 2;
1685 : else
1686 0 : a7 += n8 / 2;
1687 :
1688 0 : a7 /= n8;
1689 : } // of else
1690 0 : return (long)a7;
1691 : } // of if
1692 : else
1693 : {
1694 0 : long n6 = n2 * n3;
1695 :
1696 0 : if ( LONG_MAX / std::abs(n1) < std::abs(n6) )
1697 : {
1698 0 : BigInt a7 = n1;
1699 0 : a7 *= n6;
1700 :
1701 0 : if ( LONG_MAX / std::abs(n4) < std::abs(n5) )
1702 : {
1703 0 : BigInt a8 = n4;
1704 0 : a8 *= n5;
1705 :
1706 0 : BigInt a9 = a8;
1707 0 : a9 /= 2;
1708 0 : if ( a7.IsNeg() )
1709 0 : a7 -= a9;
1710 : else
1711 0 : a7 += a9;
1712 :
1713 0 : a7 /= a8;
1714 : } // of if
1715 : else
1716 : {
1717 0 : long n8 = n4 * n5;
1718 :
1719 0 : if ( a7.IsNeg() )
1720 0 : a7 -= n8 / 2;
1721 : else
1722 0 : a7 += n8 / 2;
1723 :
1724 0 : a7 /= n8;
1725 : } // of else
1726 0 : return (long)a7;
1727 : } // of if
1728 : else
1729 : {
1730 0 : long n7 = n1 * n6;
1731 :
1732 0 : if ( LONG_MAX / std::abs(n4) < std::abs(n5) )
1733 : {
1734 0 : BigInt a7 = n7;
1735 0 : BigInt a8 = n4;
1736 0 : a8 *= n5;
1737 :
1738 0 : BigInt a9 = a8;
1739 0 : a9 /= 2;
1740 0 : if ( a7.IsNeg() )
1741 0 : a7 -= a9;
1742 : else
1743 0 : a7 += a9;
1744 :
1745 0 : a7 /= a8;
1746 0 : return (long)a7;
1747 : } // of if
1748 : else
1749 : {
1750 0 : const long n8 = n4 * n5;
1751 0 : const long n8_2 = n8 / 2;
1752 :
1753 0 : if( n7 < 0 )
1754 : {
1755 0 : if( ( n7 - LONG_MIN ) >= n8_2 )
1756 0 : n7 -= n8_2;
1757 : }
1758 0 : else if( ( LONG_MAX - n7 ) >= n8_2 )
1759 0 : n7 += n8_2;
1760 :
1761 0 : return n7 / n8;
1762 : } // of else
1763 : } // of else
1764 : } // of else
1765 : }
1766 :
1767 : // return (n1 * n2) / n3
1768 0 : static long fn3( const long n1, const long n2, const long n3 )
1769 : {
1770 0 : if ( n1 == 0 || n2 == 0 || n3 == 0 )
1771 0 : return 0;
1772 0 : if ( LONG_MAX / std::abs(n1) < std::abs(n2) )
1773 : {
1774 0 : BigInt a4 = n1;
1775 0 : a4 *= n2;
1776 :
1777 0 : if ( a4.IsNeg() )
1778 0 : a4 -= n3 / 2;
1779 : else
1780 0 : a4 += n3 / 2;
1781 :
1782 0 : a4 /= n3;
1783 0 : return (long)a4;
1784 : } // of if
1785 : else
1786 : {
1787 0 : long n4 = n1 * n2;
1788 0 : const long n3_2 = n3 / 2;
1789 :
1790 0 : if( n4 < 0 )
1791 : {
1792 0 : if( ( n4 - LONG_MIN ) >= n3_2 )
1793 0 : n4 -= n3_2;
1794 : }
1795 0 : else if( ( LONG_MAX - n4 ) >= n3_2 )
1796 0 : n4 += n3_2;
1797 :
1798 0 : return n4 / n3;
1799 : } // of else
1800 : }
1801 :
1802 0 : Point OutputDevice::LogicToLogic( const Point& rPtSource,
1803 : const MapMode* pMapModeSource,
1804 : const MapMode* pMapModeDest ) const
1805 : {
1806 0 : ENTER1( rPtSource, pMapModeSource, pMapModeDest );
1807 :
1808 0 : return Point( fn5( rPtSource.X() + aMapResSource.mnMapOfsX,
1809 : aMapResSource.mnMapScNumX, aMapResDest.mnMapScDenomX,
1810 0 : aMapResSource.mnMapScDenomX, aMapResDest.mnMapScNumX ) -
1811 : aMapResDest.mnMapOfsX,
1812 0 : fn5( rPtSource.Y() + aMapResSource.mnMapOfsY,
1813 : aMapResSource.mnMapScNumY, aMapResDest.mnMapScDenomY,
1814 0 : aMapResSource.mnMapScDenomY, aMapResDest.mnMapScNumY ) -
1815 0 : aMapResDest.mnMapOfsY );
1816 : }
1817 :
1818 0 : Size OutputDevice::LogicToLogic( const Size& rSzSource,
1819 : const MapMode* pMapModeSource,
1820 : const MapMode* pMapModeDest ) const
1821 : {
1822 0 : ENTER1( rSzSource, pMapModeSource, pMapModeDest );
1823 :
1824 : return Size( fn5( rSzSource.Width(),
1825 : aMapResSource.mnMapScNumX, aMapResDest.mnMapScDenomX,
1826 : aMapResSource.mnMapScDenomX, aMapResDest.mnMapScNumX ),
1827 : fn5( rSzSource.Height(),
1828 : aMapResSource.mnMapScNumY, aMapResDest.mnMapScDenomY,
1829 0 : aMapResSource.mnMapScDenomY, aMapResDest.mnMapScNumY ) );
1830 : }
1831 :
1832 0 : Rectangle OutputDevice::LogicToLogic( const Rectangle& rRectSource,
1833 : const MapMode* pMapModeSource,
1834 : const MapMode* pMapModeDest ) const
1835 : {
1836 0 : ENTER1( rRectSource, pMapModeSource, pMapModeDest );
1837 :
1838 0 : return Rectangle( fn5( rRectSource.Left() + aMapResSource.mnMapOfsX,
1839 : aMapResSource.mnMapScNumX, aMapResDest.mnMapScDenomX,
1840 0 : aMapResSource.mnMapScDenomX, aMapResDest.mnMapScNumX ) -
1841 : aMapResDest.mnMapOfsX,
1842 0 : fn5( rRectSource.Top() + aMapResSource.mnMapOfsY,
1843 : aMapResSource.mnMapScNumY, aMapResDest.mnMapScDenomY,
1844 0 : aMapResSource.mnMapScDenomY, aMapResDest.mnMapScNumY ) -
1845 : aMapResDest.mnMapOfsY,
1846 0 : fn5( rRectSource.Right() + aMapResSource.mnMapOfsX,
1847 : aMapResSource.mnMapScNumX, aMapResDest.mnMapScDenomX,
1848 0 : aMapResSource.mnMapScDenomX, aMapResDest.mnMapScNumX ) -
1849 : aMapResDest.mnMapOfsX,
1850 0 : fn5( rRectSource.Bottom() + aMapResSource.mnMapOfsY,
1851 : aMapResSource.mnMapScNumY, aMapResDest.mnMapScDenomY,
1852 0 : aMapResSource.mnMapScDenomY, aMapResDest.mnMapScNumY ) -
1853 0 : aMapResDest.mnMapOfsY );
1854 : }
1855 :
1856 0 : Point OutputDevice::LogicToLogic( const Point& rPtSource,
1857 : const MapMode& rMapModeSource,
1858 : const MapMode& rMapModeDest )
1859 : {
1860 0 : if ( rMapModeSource == rMapModeDest )
1861 0 : return rPtSource;
1862 :
1863 0 : MapUnit eUnitSource = rMapModeSource.GetMapUnit();
1864 0 : MapUnit eUnitDest = rMapModeDest.GetMapUnit();
1865 : ENTER2( eUnitSource, eUnitDest );
1866 :
1867 0 : if ( rMapModeSource.mpImplMapMode->mbSimple &&
1868 : rMapModeDest.mpImplMapMode->mbSimple )
1869 : {
1870 0 : ENTER3( eUnitSource, eUnitDest );
1871 :
1872 : return Point( fn3( rPtSource.X(), nNumerator, nDenominator ),
1873 0 : fn3( rPtSource.Y(), nNumerator, nDenominator ) );
1874 : }
1875 : else
1876 : {
1877 0 : ENTER4( rMapModeSource, rMapModeDest );
1878 :
1879 0 : return Point( fn5( rPtSource.X() + aMapResSource.mnMapOfsX,
1880 : aMapResSource.mnMapScNumX, aMapResDest.mnMapScDenomX,
1881 0 : aMapResSource.mnMapScDenomX, aMapResDest.mnMapScNumX ) -
1882 : aMapResDest.mnMapOfsX,
1883 0 : fn5( rPtSource.Y() + aMapResSource.mnMapOfsY,
1884 : aMapResSource.mnMapScNumY, aMapResDest.mnMapScDenomY,
1885 0 : aMapResSource.mnMapScDenomY, aMapResDest.mnMapScNumY ) -
1886 0 : aMapResDest.mnMapOfsY );
1887 : }
1888 : }
1889 :
1890 0 : Size OutputDevice::LogicToLogic( const Size& rSzSource,
1891 : const MapMode& rMapModeSource,
1892 : const MapMode& rMapModeDest )
1893 : {
1894 0 : if ( rMapModeSource == rMapModeDest )
1895 0 : return rSzSource;
1896 :
1897 0 : MapUnit eUnitSource = rMapModeSource.GetMapUnit();
1898 0 : MapUnit eUnitDest = rMapModeDest.GetMapUnit();
1899 : ENTER2( eUnitSource, eUnitDest );
1900 :
1901 0 : if ( rMapModeSource.mpImplMapMode->mbSimple &&
1902 : rMapModeDest.mpImplMapMode->mbSimple )
1903 : {
1904 0 : ENTER3( eUnitSource, eUnitDest );
1905 :
1906 : return Size( fn3( rSzSource.Width(), nNumerator, nDenominator ),
1907 0 : fn3( rSzSource.Height(), nNumerator, nDenominator ) );
1908 : }
1909 : else
1910 : {
1911 0 : ENTER4( rMapModeSource, rMapModeDest );
1912 :
1913 : return Size( fn5( rSzSource.Width(),
1914 : aMapResSource.mnMapScNumX, aMapResDest.mnMapScDenomX,
1915 : aMapResSource.mnMapScDenomX, aMapResDest.mnMapScNumX ),
1916 : fn5( rSzSource.Height(),
1917 : aMapResSource.mnMapScNumY, aMapResDest.mnMapScDenomY,
1918 0 : aMapResSource.mnMapScDenomY, aMapResDest.mnMapScNumY ) );
1919 : }
1920 : }
1921 :
1922 0 : basegfx::B2DPolygon OutputDevice::LogicToLogic( const basegfx::B2DPolygon& rPolySource,
1923 : const MapMode& rMapModeSource,
1924 : const MapMode& rMapModeDest )
1925 : {
1926 0 : if(rMapModeSource == rMapModeDest)
1927 : {
1928 0 : return rPolySource;
1929 : }
1930 :
1931 0 : const basegfx::B2DHomMatrix aTransform(LogicToLogic(rMapModeSource, rMapModeDest));
1932 0 : basegfx::B2DPolygon aPoly(rPolySource);
1933 :
1934 0 : aPoly.transform(aTransform);
1935 0 : return aPoly;
1936 : }
1937 :
1938 0 : basegfx::B2DPolyPolygon OutputDevice::LogicToLogic( const basegfx::B2DPolyPolygon& rPolySource,
1939 : const MapMode& rMapModeSource,
1940 : const MapMode& rMapModeDest )
1941 : {
1942 0 : if(rMapModeSource == rMapModeDest)
1943 : {
1944 0 : return rPolySource;
1945 : }
1946 :
1947 0 : const basegfx::B2DHomMatrix aTransform(LogicToLogic(rMapModeSource, rMapModeDest));
1948 0 : basegfx::B2DPolyPolygon aPoly(rPolySource);
1949 :
1950 0 : aPoly.transform(aTransform);
1951 0 : return aPoly;
1952 : }
1953 :
1954 0 : basegfx::B2DHomMatrix OutputDevice::LogicToLogic(const MapMode& rMapModeSource, const MapMode& rMapModeDest)
1955 : {
1956 0 : basegfx::B2DHomMatrix aTransform;
1957 :
1958 0 : if(rMapModeSource == rMapModeDest)
1959 : {
1960 0 : return aTransform;
1961 : }
1962 :
1963 0 : MapUnit eUnitSource = rMapModeSource.GetMapUnit();
1964 0 : MapUnit eUnitDest = rMapModeDest.GetMapUnit();
1965 : ENTER2(eUnitSource, eUnitDest);
1966 :
1967 0 : if(rMapModeSource.mpImplMapMode->mbSimple && rMapModeDest.mpImplMapMode->mbSimple)
1968 : {
1969 0 : ENTER3(eUnitSource, eUnitDest);
1970 :
1971 0 : const double fScaleFactor((double)nNumerator / (double)nDenominator);
1972 0 : aTransform.set(0, 0, fScaleFactor);
1973 0 : aTransform.set(1, 1, fScaleFactor);
1974 : }
1975 : else
1976 : {
1977 0 : ENTER4(rMapModeSource, rMapModeDest);
1978 :
1979 0 : const double fScaleFactorX((double(aMapResSource.mnMapScNumX) * double(aMapResDest.mnMapScDenomX)) / (double(aMapResSource.mnMapScDenomX) * double(aMapResDest.mnMapScNumX)));
1980 0 : const double fScaleFactorY((double(aMapResSource.mnMapScNumY) * double(aMapResDest.mnMapScDenomY)) / (double(aMapResSource.mnMapScDenomY) * double(aMapResDest.mnMapScNumY)));
1981 0 : const double fZeroPointX(double(aMapResSource.mnMapOfsX) * fScaleFactorX - double(aMapResDest.mnMapOfsX));
1982 0 : const double fZeroPointY(double(aMapResSource.mnMapOfsY) * fScaleFactorY - double(aMapResDest.mnMapOfsY));
1983 :
1984 0 : aTransform.set(0, 0, fScaleFactorX);
1985 0 : aTransform.set(1, 1, fScaleFactorY);
1986 0 : aTransform.set(0, 2, fZeroPointX);
1987 0 : aTransform.set(1, 2, fZeroPointY);
1988 : }
1989 :
1990 0 : return aTransform;
1991 : }
1992 :
1993 0 : Rectangle OutputDevice::LogicToLogic( const Rectangle& rRectSource,
1994 : const MapMode& rMapModeSource,
1995 : const MapMode& rMapModeDest )
1996 : {
1997 0 : if ( rMapModeSource == rMapModeDest )
1998 0 : return rRectSource;
1999 :
2000 0 : MapUnit eUnitSource = rMapModeSource.GetMapUnit();
2001 0 : MapUnit eUnitDest = rMapModeDest.GetMapUnit();
2002 : ENTER2( eUnitSource, eUnitDest );
2003 :
2004 0 : if ( rMapModeSource.mpImplMapMode->mbSimple &&
2005 : rMapModeDest.mpImplMapMode->mbSimple )
2006 : {
2007 0 : ENTER3( eUnitSource, eUnitDest );
2008 :
2009 : return Rectangle( fn3( rRectSource.Left(), nNumerator, nDenominator ),
2010 : fn3( rRectSource.Top(), nNumerator, nDenominator ),
2011 : fn3( rRectSource.Right(), nNumerator, nDenominator ),
2012 0 : fn3( rRectSource.Bottom(), nNumerator, nDenominator ) );
2013 : }
2014 : else
2015 : {
2016 0 : ENTER4( rMapModeSource, rMapModeDest );
2017 :
2018 0 : return Rectangle( fn5( rRectSource.Left() + aMapResSource.mnMapOfsX,
2019 : aMapResSource.mnMapScNumX, aMapResDest.mnMapScDenomX,
2020 0 : aMapResSource.mnMapScDenomX, aMapResDest.mnMapScNumX ) -
2021 : aMapResDest.mnMapOfsX,
2022 0 : fn5( rRectSource.Top() + aMapResSource.mnMapOfsY,
2023 : aMapResSource.mnMapScNumY, aMapResDest.mnMapScDenomY,
2024 0 : aMapResSource.mnMapScDenomY, aMapResDest.mnMapScNumY ) -
2025 : aMapResDest.mnMapOfsY,
2026 0 : fn5( rRectSource.Right() + aMapResSource.mnMapOfsX,
2027 : aMapResSource.mnMapScNumX, aMapResDest.mnMapScDenomX,
2028 0 : aMapResSource.mnMapScDenomX, aMapResDest.mnMapScNumX ) -
2029 : aMapResDest.mnMapOfsX,
2030 0 : fn5( rRectSource.Bottom() + aMapResSource.mnMapOfsY,
2031 : aMapResSource.mnMapScNumY, aMapResDest.mnMapScDenomY,
2032 0 : aMapResSource.mnMapScDenomY, aMapResDest.mnMapScNumY ) -
2033 0 : aMapResDest.mnMapOfsY );
2034 : }
2035 : }
2036 :
2037 0 : long OutputDevice::LogicToLogic( long nLongSource,
2038 : MapUnit eUnitSource, MapUnit eUnitDest )
2039 : {
2040 0 : if ( eUnitSource == eUnitDest )
2041 0 : return nLongSource;
2042 :
2043 : ENTER2( eUnitSource, eUnitDest );
2044 0 : ENTER3( eUnitSource, eUnitDest );
2045 :
2046 0 : return fn3( nLongSource, nNumerator, nDenominator );
2047 : }
2048 :
2049 0 : void OutputDevice::SetPixelOffset( const Size& rOffset )
2050 : {
2051 0 : mnOutOffOrigX = rOffset.Width();
2052 0 : mnOutOffOrigY = rOffset.Height();
2053 :
2054 : mnOutOffLogicX = ImplPixelToLogic( mnOutOffOrigX, mnDPIX,
2055 : maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
2056 0 : maThresRes.mnThresPixToLogX );
2057 : mnOutOffLogicY = ImplPixelToLogic( mnOutOffOrigY, mnDPIY,
2058 : maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
2059 0 : maThresRes.mnThresPixToLogY );
2060 :
2061 0 : if( mpAlphaVDev )
2062 0 : mpAlphaVDev->SetPixelOffset( rOffset );
2063 0 : }
2064 :
2065 0 : Size OutputDevice::GetPixelOffset() const
2066 : {
2067 0 : return Size(mnOutOffOrigX, mnOutOffOrigY);
2068 : }
2069 :
2070 0 : long Window::ImplLogicUnitToPixelX( long nX, MapUnit eUnit )
2071 : {
2072 0 : if ( eUnit != MAP_PIXEL )
2073 : {
2074 0 : ImplFrameData* pFrameData = mpWindowImpl->mpFrameData;
2075 :
2076 : // shift map unit, then re-calculate
2077 0 : if ( pFrameData->meMapUnit != eUnit )
2078 : {
2079 0 : pFrameData->meMapUnit = eUnit;
2080 : ImplCalcMapResolution( MapMode( eUnit ), mnDPIX, mnDPIY,
2081 0 : pFrameData->maMapUnitRes );
2082 : }
2083 :
2084 : // BigInt is not required, as this function is only used to
2085 : // convert the window position
2086 0 : nX = nX * mnDPIX * pFrameData->maMapUnitRes.mnMapScNumX;
2087 0 : nX += nX >= 0 ? (pFrameData->maMapUnitRes.mnMapScDenomX/2) :
2088 0 : -((pFrameData->maMapUnitRes.mnMapScDenomX-1)/2);
2089 0 : nX /= pFrameData->maMapUnitRes.mnMapScDenomX;
2090 : }
2091 :
2092 0 : return nX;
2093 : }
2094 :
2095 0 : long Window::ImplLogicUnitToPixelY( long nY, MapUnit eUnit )
2096 : {
2097 0 : if ( eUnit != MAP_PIXEL )
2098 : {
2099 0 : ImplFrameData* pFrameData = mpWindowImpl->mpFrameData;
2100 :
2101 : // shift map unit, then re-calculate
2102 0 : if ( pFrameData->meMapUnit != eUnit )
2103 : {
2104 0 : pFrameData->meMapUnit = eUnit;
2105 : ImplCalcMapResolution( MapMode( eUnit ), mnDPIX, mnDPIY,
2106 0 : pFrameData->maMapUnitRes );
2107 : }
2108 :
2109 : // BigInt is not required, as this function is only used to
2110 : // convert the window position
2111 0 : nY = nY * mnDPIY * pFrameData->maMapUnitRes.mnMapScNumY;
2112 0 : nY += nY >= 0 ? (pFrameData->maMapUnitRes.mnMapScDenomY/2) :
2113 0 : -((pFrameData->maMapUnitRes.mnMapScDenomY-1)/2);
2114 0 : nY /= pFrameData->maMapUnitRes.mnMapScDenomY;
2115 : }
2116 :
2117 0 : return nY;
2118 3 : }
2119 :
2120 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|