xref: /aoo41x/main/vcl/source/gdi/outmap.cxx (revision cdf0e10c)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_vcl.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir #include <limits.h>
32*cdf0e10cSrcweir 
33*cdf0e10cSrcweir #include <tools/bigint.hxx>
34*cdf0e10cSrcweir #include <tools/debug.hxx>
35*cdf0e10cSrcweir #include <tools/poly.hxx>
36*cdf0e10cSrcweir 
37*cdf0e10cSrcweir #include <vcl/virdev.hxx>
38*cdf0e10cSrcweir #include <vcl/region.hxx>
39*cdf0e10cSrcweir #include <vcl/wrkwin.hxx>
40*cdf0e10cSrcweir #include <vcl/cursor.hxx>
41*cdf0e10cSrcweir #include <vcl/metaact.hxx>
42*cdf0e10cSrcweir #include <vcl/gdimtf.hxx>
43*cdf0e10cSrcweir #include <vcl/lineinfo.hxx>
44*cdf0e10cSrcweir #include <vcl/outdev.hxx>
45*cdf0e10cSrcweir 
46*cdf0e10cSrcweir #include <svdata.hxx>
47*cdf0e10cSrcweir #include <region.h>
48*cdf0e10cSrcweir #include <window.h>
49*cdf0e10cSrcweir #include <outdev.h>
50*cdf0e10cSrcweir #include <salgdi.hxx>
51*cdf0e10cSrcweir 
52*cdf0e10cSrcweir #include <basegfx/matrix/b2dhommatrix.hxx>
53*cdf0e10cSrcweir #include <basegfx/polygon/b2dpolygon.hxx>
54*cdf0e10cSrcweir #include <basegfx/polygon/b2dpolypolygon.hxx>
55*cdf0e10cSrcweir 
56*cdf0e10cSrcweir #define USE_64BIT_INTS
57*cdf0e10cSrcweir 
58*cdf0e10cSrcweir // =======================================================================
59*cdf0e10cSrcweir 
60*cdf0e10cSrcweir DBG_NAMEEX( OutputDevice )
61*cdf0e10cSrcweir DBG_NAMEEX( Polygon )
62*cdf0e10cSrcweir DBG_NAMEEX( PolyPolygon )
63*cdf0e10cSrcweir DBG_NAMEEX( Region )
64*cdf0e10cSrcweir 
65*cdf0e10cSrcweir // =======================================================================
66*cdf0e10cSrcweir 
67*cdf0e10cSrcweir static long aImplNumeratorAry[MAP_PIXEL+1] =
68*cdf0e10cSrcweir 	{	 1,   1,   5,  50,	  1,   1,  1, 1,  1,	1, 1 };
69*cdf0e10cSrcweir static long aImplDenominatorAry[MAP_PIXEL+1] =
70*cdf0e10cSrcweir 	 { 2540, 254, 127, 127, 1000, 100, 10, 1, 72, 1440, 1 };
71*cdf0e10cSrcweir 
72*cdf0e10cSrcweir // -----------------------------------------------------------------------
73*cdf0e10cSrcweir 
74*cdf0e10cSrcweir /*
75*cdf0e10cSrcweir Reduziert die Genauigkeit bis eine Fraction draus wird (sollte mal
76*cdf0e10cSrcweir ein Fraction ctor werden) koennte man dann auch mit BigInts machen
77*cdf0e10cSrcweir */
78*cdf0e10cSrcweir 
79*cdf0e10cSrcweir static Fraction ImplMakeFraction( long nN1, long nN2, long nD1, long nD2 )
80*cdf0e10cSrcweir {
81*cdf0e10cSrcweir 	long i = 1;
82*cdf0e10cSrcweir 
83*cdf0e10cSrcweir 	if ( nN1 < 0 ) { i = -i; nN1 = -nN1; }
84*cdf0e10cSrcweir 	if ( nN2 < 0 ) { i = -i; nN2 = -nN2; }
85*cdf0e10cSrcweir 	if ( nD1 < 0 ) { i = -i; nD1 = -nD1; }
86*cdf0e10cSrcweir 	if ( nD2 < 0 ) { i = -i; nD2 = -nD2; }
87*cdf0e10cSrcweir 	// alle positiv; i Vorzeichen
88*cdf0e10cSrcweir 
89*cdf0e10cSrcweir 	Fraction aF( i*nN1, nD1 );
90*cdf0e10cSrcweir 	aF *= Fraction( nN2, nD2 );
91*cdf0e10cSrcweir 
92*cdf0e10cSrcweir     if( nD1 == 0 || nD2 == 0 ) //under these bad circumstances the following while loop will be endless
93*cdf0e10cSrcweir     {
94*cdf0e10cSrcweir         DBG_ASSERT(false,"Invalid parameter for ImplMakeFraction");
95*cdf0e10cSrcweir         return Fraction( 1, 1 );
96*cdf0e10cSrcweir     }
97*cdf0e10cSrcweir 
98*cdf0e10cSrcweir 	while ( aF.GetDenominator() == -1 )
99*cdf0e10cSrcweir 	{
100*cdf0e10cSrcweir 		if ( nN1 > nN2 )
101*cdf0e10cSrcweir 			nN1 = (nN1 + 1) / 2;
102*cdf0e10cSrcweir 		else
103*cdf0e10cSrcweir 			nN2 = (nN2 + 1) / 2;
104*cdf0e10cSrcweir 		if ( nD1 > nD2 )
105*cdf0e10cSrcweir 			nD1 = (nD1 + 1) / 2;
106*cdf0e10cSrcweir 		else
107*cdf0e10cSrcweir 			nD2 = (nD2 + 1) / 2;
108*cdf0e10cSrcweir 
109*cdf0e10cSrcweir 		aF = Fraction( i*nN1, nD1 );
110*cdf0e10cSrcweir 		aF *= Fraction( nN2, nD2 );
111*cdf0e10cSrcweir 	}
112*cdf0e10cSrcweir 
113*cdf0e10cSrcweir 	return aF;
114*cdf0e10cSrcweir }
115*cdf0e10cSrcweir 
116*cdf0e10cSrcweir // -----------------------------------------------------------------------
117*cdf0e10cSrcweir 
118*cdf0e10cSrcweir // Fraction.GetNumerator()
119*cdf0e10cSrcweir // Fraction.GetDenominator()	> 0
120*cdf0e10cSrcweir // rOutRes.nPixPerInch? 		> 0
121*cdf0e10cSrcweir // rMapRes.nMapScNum?
122*cdf0e10cSrcweir // rMapRes.nMapScDenom? 		> 0
123*cdf0e10cSrcweir 
124*cdf0e10cSrcweir static void ImplCalcBigIntThreshold( long nDPIX, long nDPIY,
125*cdf0e10cSrcweir 									 const ImplMapRes& rMapRes,
126*cdf0e10cSrcweir 									 ImplThresholdRes& rThresRes )
127*cdf0e10cSrcweir {
128*cdf0e10cSrcweir 	if ( nDPIX && (LONG_MAX / nDPIX < Abs( rMapRes.mnMapScNumX ) ) ) // #111139# avoid div by zero
129*cdf0e10cSrcweir 	{
130*cdf0e10cSrcweir 		rThresRes.mnThresLogToPixX = 0;
131*cdf0e10cSrcweir 		rThresRes.mnThresPixToLogX = 0;
132*cdf0e10cSrcweir 	}
133*cdf0e10cSrcweir 	else
134*cdf0e10cSrcweir 	{
135*cdf0e10cSrcweir 		// Schwellenwerte fuer BigInt Arithmetik berechnen
136*cdf0e10cSrcweir 		long	nDenomHalfX = rMapRes.mnMapScDenomX / 2;
137*cdf0e10cSrcweir 		sal_uLong	nDenomX 	= rMapRes.mnMapScDenomX;
138*cdf0e10cSrcweir 		long	nProductX	= nDPIX * rMapRes.mnMapScNumX;
139*cdf0e10cSrcweir 
140*cdf0e10cSrcweir 		if ( !nProductX )
141*cdf0e10cSrcweir 			rThresRes.mnThresLogToPixX = LONG_MAX;
142*cdf0e10cSrcweir 		else
143*cdf0e10cSrcweir 			rThresRes.mnThresLogToPixX = Abs( (LONG_MAX - nDenomHalfX) / nProductX );
144*cdf0e10cSrcweir 
145*cdf0e10cSrcweir 		if ( !nDenomX )
146*cdf0e10cSrcweir 			rThresRes.mnThresPixToLogX = LONG_MAX;
147*cdf0e10cSrcweir 		else if ( nProductX >= 0 )
148*cdf0e10cSrcweir 			rThresRes.mnThresPixToLogX = (long)(((sal_uLong)LONG_MAX - (sal_uLong)( nProductX/2)) / nDenomX);
149*cdf0e10cSrcweir 		else
150*cdf0e10cSrcweir 			rThresRes.mnThresPixToLogX = (long)(((sal_uLong)LONG_MAX + (sal_uLong)(-nProductX/2)) / nDenomX);
151*cdf0e10cSrcweir 	}
152*cdf0e10cSrcweir 
153*cdf0e10cSrcweir 	if ( nDPIY && (LONG_MAX / nDPIY < Abs( rMapRes.mnMapScNumY ) ) ) // #111139# avoid div by zero
154*cdf0e10cSrcweir 	{
155*cdf0e10cSrcweir 		rThresRes.mnThresLogToPixY = 0;
156*cdf0e10cSrcweir 		rThresRes.mnThresPixToLogY = 0;
157*cdf0e10cSrcweir 	}
158*cdf0e10cSrcweir 	else
159*cdf0e10cSrcweir 	{
160*cdf0e10cSrcweir 		// Schwellenwerte fuer BigInt Arithmetik berechnen
161*cdf0e10cSrcweir 		long	nDenomHalfY = rMapRes.mnMapScDenomY / 2;
162*cdf0e10cSrcweir 		sal_uLong	nDenomY 	= rMapRes.mnMapScDenomY;
163*cdf0e10cSrcweir 		long	nProductY	= nDPIY * rMapRes.mnMapScNumY;
164*cdf0e10cSrcweir 
165*cdf0e10cSrcweir 		if ( !nProductY )
166*cdf0e10cSrcweir 			rThresRes.mnThresLogToPixY = LONG_MAX;
167*cdf0e10cSrcweir 		else
168*cdf0e10cSrcweir 			rThresRes.mnThresLogToPixY = Abs( (LONG_MAX - nDenomHalfY) / nProductY );
169*cdf0e10cSrcweir 
170*cdf0e10cSrcweir 		if ( !nDenomY )
171*cdf0e10cSrcweir 			rThresRes.mnThresPixToLogY = LONG_MAX;
172*cdf0e10cSrcweir 		else if ( nProductY >= 0 )
173*cdf0e10cSrcweir 			rThresRes.mnThresPixToLogY = (long)(((sal_uLong)LONG_MAX - (sal_uLong)( nProductY/2)) / nDenomY);
174*cdf0e10cSrcweir 		else
175*cdf0e10cSrcweir 			rThresRes.mnThresPixToLogY = (long)(((sal_uLong)LONG_MAX + (sal_uLong)(-nProductY/2)) / nDenomY);
176*cdf0e10cSrcweir 	}
177*cdf0e10cSrcweir 
178*cdf0e10cSrcweir #ifdef USE_64BIT_INTS
179*cdf0e10cSrcweir     rThresRes.mnThresLogToPixX /= 2;
180*cdf0e10cSrcweir     rThresRes.mnThresLogToPixY /= 2;
181*cdf0e10cSrcweir     rThresRes.mnThresPixToLogX /= 2;
182*cdf0e10cSrcweir     rThresRes.mnThresPixToLogY /= 2;
183*cdf0e10cSrcweir #endif
184*cdf0e10cSrcweir }
185*cdf0e10cSrcweir 
186*cdf0e10cSrcweir // -----------------------------------------------------------------------
187*cdf0e10cSrcweir 
188*cdf0e10cSrcweir static void ImplCalcMapResolution( const MapMode& rMapMode,
189*cdf0e10cSrcweir 								   long nDPIX, long nDPIY, ImplMapRes& rMapRes )
190*cdf0e10cSrcweir {
191*cdf0e10cSrcweir 	switch ( rMapMode.GetMapUnit() )
192*cdf0e10cSrcweir 	{
193*cdf0e10cSrcweir 		case MAP_RELATIVE:
194*cdf0e10cSrcweir 			break;
195*cdf0e10cSrcweir 		case MAP_100TH_MM:
196*cdf0e10cSrcweir 			rMapRes.mnMapScNumX   = 1;
197*cdf0e10cSrcweir 			rMapRes.mnMapScDenomX = 2540;
198*cdf0e10cSrcweir 			rMapRes.mnMapScNumY   = 1;
199*cdf0e10cSrcweir 			rMapRes.mnMapScDenomY = 2540;
200*cdf0e10cSrcweir 			break;
201*cdf0e10cSrcweir 		case MAP_10TH_MM:
202*cdf0e10cSrcweir 			rMapRes.mnMapScNumX   = 1;
203*cdf0e10cSrcweir 			rMapRes.mnMapScDenomX = 254;
204*cdf0e10cSrcweir 			rMapRes.mnMapScNumY   = 1;
205*cdf0e10cSrcweir 			rMapRes.mnMapScDenomY = 254;
206*cdf0e10cSrcweir 			break;
207*cdf0e10cSrcweir 		case MAP_MM:
208*cdf0e10cSrcweir 			rMapRes.mnMapScNumX   = 5;		// 10
209*cdf0e10cSrcweir 			rMapRes.mnMapScDenomX = 127;	// 254
210*cdf0e10cSrcweir 			rMapRes.mnMapScNumY   = 5;		// 10
211*cdf0e10cSrcweir 			rMapRes.mnMapScDenomY = 127;	// 254
212*cdf0e10cSrcweir 			break;
213*cdf0e10cSrcweir 		case MAP_CM:
214*cdf0e10cSrcweir 			rMapRes.mnMapScNumX   = 50; 	// 100
215*cdf0e10cSrcweir 			rMapRes.mnMapScDenomX = 127;	// 254
216*cdf0e10cSrcweir 			rMapRes.mnMapScNumY   = 50; 	// 100
217*cdf0e10cSrcweir 			rMapRes.mnMapScDenomY = 127;	// 254
218*cdf0e10cSrcweir 			break;
219*cdf0e10cSrcweir 		case MAP_1000TH_INCH:
220*cdf0e10cSrcweir 			rMapRes.mnMapScNumX   = 1;
221*cdf0e10cSrcweir 			rMapRes.mnMapScDenomX = 1000;
222*cdf0e10cSrcweir 			rMapRes.mnMapScNumY   = 1;
223*cdf0e10cSrcweir 			rMapRes.mnMapScDenomY = 1000;
224*cdf0e10cSrcweir 			break;
225*cdf0e10cSrcweir 		case MAP_100TH_INCH:
226*cdf0e10cSrcweir 			rMapRes.mnMapScNumX   = 1;
227*cdf0e10cSrcweir 			rMapRes.mnMapScDenomX = 100;
228*cdf0e10cSrcweir 			rMapRes.mnMapScNumY   = 1;
229*cdf0e10cSrcweir 			rMapRes.mnMapScDenomY = 100;
230*cdf0e10cSrcweir 			break;
231*cdf0e10cSrcweir 		case MAP_10TH_INCH:
232*cdf0e10cSrcweir 			rMapRes.mnMapScNumX   = 1;
233*cdf0e10cSrcweir 			rMapRes.mnMapScDenomX = 10;
234*cdf0e10cSrcweir 			rMapRes.mnMapScNumY   = 1;
235*cdf0e10cSrcweir 			rMapRes.mnMapScDenomY = 10;
236*cdf0e10cSrcweir 			break;
237*cdf0e10cSrcweir 		case MAP_INCH:
238*cdf0e10cSrcweir 			rMapRes.mnMapScNumX   = 1;
239*cdf0e10cSrcweir 			rMapRes.mnMapScDenomX = 1;
240*cdf0e10cSrcweir 			rMapRes.mnMapScNumY   = 1;
241*cdf0e10cSrcweir 			rMapRes.mnMapScDenomY = 1;
242*cdf0e10cSrcweir 			break;
243*cdf0e10cSrcweir 		case MAP_POINT:
244*cdf0e10cSrcweir 			rMapRes.mnMapScNumX   = 1;
245*cdf0e10cSrcweir 			rMapRes.mnMapScDenomX = 72;
246*cdf0e10cSrcweir 			rMapRes.mnMapScNumY   = 1;
247*cdf0e10cSrcweir 			rMapRes.mnMapScDenomY = 72;
248*cdf0e10cSrcweir 			break;
249*cdf0e10cSrcweir 		case MAP_TWIP:
250*cdf0e10cSrcweir 			rMapRes.mnMapScNumX   = 1;
251*cdf0e10cSrcweir 			rMapRes.mnMapScDenomX = 1440;
252*cdf0e10cSrcweir 			rMapRes.mnMapScNumY   = 1;
253*cdf0e10cSrcweir 			rMapRes.mnMapScDenomY = 1440;
254*cdf0e10cSrcweir 			break;
255*cdf0e10cSrcweir 		case MAP_PIXEL:
256*cdf0e10cSrcweir 			rMapRes.mnMapScNumX   = 1;
257*cdf0e10cSrcweir 			rMapRes.mnMapScDenomX = nDPIX;
258*cdf0e10cSrcweir 			rMapRes.mnMapScNumY   = 1;
259*cdf0e10cSrcweir 			rMapRes.mnMapScDenomY = nDPIY;
260*cdf0e10cSrcweir 			break;
261*cdf0e10cSrcweir 		case MAP_SYSFONT:
262*cdf0e10cSrcweir 		case MAP_APPFONT:
263*cdf0e10cSrcweir 		case MAP_REALAPPFONT:
264*cdf0e10cSrcweir 			{
265*cdf0e10cSrcweir 			ImplSVData* pSVData = ImplGetSVData();
266*cdf0e10cSrcweir 			if ( !pSVData->maGDIData.mnAppFontX )
267*cdf0e10cSrcweir 			{
268*cdf0e10cSrcweir                 if( pSVData->maWinData.mpFirstFrame )
269*cdf0e10cSrcweir                     Window::ImplInitAppFontData( pSVData->maWinData.mpFirstFrame );
270*cdf0e10cSrcweir                 else
271*cdf0e10cSrcweir                 {
272*cdf0e10cSrcweir                     WorkWindow* pWin = new WorkWindow( NULL, 0 );
273*cdf0e10cSrcweir                     Window::ImplInitAppFontData( pWin );
274*cdf0e10cSrcweir                     delete pWin;
275*cdf0e10cSrcweir                 }
276*cdf0e10cSrcweir 			}
277*cdf0e10cSrcweir 			if ( rMapMode.GetMapUnit() == MAP_REALAPPFONT )
278*cdf0e10cSrcweir 				rMapRes.mnMapScNumX   = pSVData->maGDIData.mnRealAppFontX;
279*cdf0e10cSrcweir 			else
280*cdf0e10cSrcweir 				rMapRes.mnMapScNumX   = pSVData->maGDIData.mnAppFontX;
281*cdf0e10cSrcweir 			rMapRes.mnMapScDenomX = nDPIX * 40;
282*cdf0e10cSrcweir 			rMapRes.mnMapScNumY   = pSVData->maGDIData.mnAppFontY;;
283*cdf0e10cSrcweir 			rMapRes.mnMapScDenomY = nDPIY * 80;
284*cdf0e10cSrcweir 			}
285*cdf0e10cSrcweir 			break;
286*cdf0e10cSrcweir         default:
287*cdf0e10cSrcweir             DBG_ERROR( "unhandled MapUnit" );
288*cdf0e10cSrcweir             break;
289*cdf0e10cSrcweir 	}
290*cdf0e10cSrcweir 
291*cdf0e10cSrcweir 	Fraction aScaleX = rMapMode.GetScaleX();
292*cdf0e10cSrcweir 	Fraction aScaleY = rMapMode.GetScaleY();
293*cdf0e10cSrcweir 
294*cdf0e10cSrcweir 	// Offset laut MapMode setzen
295*cdf0e10cSrcweir 	Point aOrigin = rMapMode.GetOrigin();
296*cdf0e10cSrcweir 	if ( rMapMode.GetMapUnit() != MAP_RELATIVE )
297*cdf0e10cSrcweir 	{
298*cdf0e10cSrcweir 		rMapRes.mnMapOfsX = aOrigin.X();
299*cdf0e10cSrcweir 		rMapRes.mnMapOfsY = aOrigin.Y();
300*cdf0e10cSrcweir 	}
301*cdf0e10cSrcweir 	else
302*cdf0e10cSrcweir 	{
303*cdf0e10cSrcweir 		BigInt aX( rMapRes.mnMapOfsX );
304*cdf0e10cSrcweir 		aX *= BigInt( aScaleX.GetDenominator() );
305*cdf0e10cSrcweir 		if ( rMapRes.mnMapOfsX >= 0 )
306*cdf0e10cSrcweir 		{
307*cdf0e10cSrcweir 			if ( aScaleX.GetNumerator() >= 0 )
308*cdf0e10cSrcweir 				aX += BigInt( aScaleX.GetNumerator()/2 );
309*cdf0e10cSrcweir 			else
310*cdf0e10cSrcweir 				aX -= BigInt( (aScaleX.GetNumerator()+1)/2 );
311*cdf0e10cSrcweir 		}
312*cdf0e10cSrcweir 		else
313*cdf0e10cSrcweir 		{
314*cdf0e10cSrcweir 			if ( aScaleX.GetNumerator() >= 0 )
315*cdf0e10cSrcweir 				aX -= BigInt( (aScaleX.GetNumerator()-1)/2 );
316*cdf0e10cSrcweir 			else
317*cdf0e10cSrcweir 				aX += BigInt( aScaleX.GetNumerator()/2 );
318*cdf0e10cSrcweir 		}
319*cdf0e10cSrcweir 		aX /= BigInt( aScaleX.GetNumerator() );
320*cdf0e10cSrcweir 		rMapRes.mnMapOfsX = (long)aX + aOrigin.X();
321*cdf0e10cSrcweir 		BigInt aY( rMapRes.mnMapOfsY );
322*cdf0e10cSrcweir 		aY *= BigInt( aScaleY.GetDenominator() );
323*cdf0e10cSrcweir 		if( rMapRes.mnMapOfsY >= 0 )
324*cdf0e10cSrcweir 		{
325*cdf0e10cSrcweir 			if ( aScaleY.GetNumerator() >= 0 )
326*cdf0e10cSrcweir 				aY += BigInt( aScaleY.GetNumerator()/2 );
327*cdf0e10cSrcweir 			else
328*cdf0e10cSrcweir 				aY -= BigInt( (aScaleY.GetNumerator()+1)/2 );
329*cdf0e10cSrcweir 		}
330*cdf0e10cSrcweir 		else
331*cdf0e10cSrcweir 		{
332*cdf0e10cSrcweir 			if ( aScaleY.GetNumerator() >= 0 )
333*cdf0e10cSrcweir 				aY -= BigInt( (aScaleY.GetNumerator()-1)/2 );
334*cdf0e10cSrcweir 			else
335*cdf0e10cSrcweir 				aY += BigInt( aScaleY.GetNumerator()/2 );
336*cdf0e10cSrcweir 		}
337*cdf0e10cSrcweir 		aY /= BigInt( aScaleY.GetNumerator() );
338*cdf0e10cSrcweir 		rMapRes.mnMapOfsY = (long)aY + aOrigin.Y();
339*cdf0e10cSrcweir 	}
340*cdf0e10cSrcweir 
341*cdf0e10cSrcweir 	// Scaling Faktor laut MapMode einberechnen
342*cdf0e10cSrcweir 	// aTemp? = rMapRes.mnMapSc? * aScale?
343*cdf0e10cSrcweir 	Fraction aTempX = ImplMakeFraction( rMapRes.mnMapScNumX,
344*cdf0e10cSrcweir 										aScaleX.GetNumerator(),
345*cdf0e10cSrcweir 										rMapRes.mnMapScDenomX,
346*cdf0e10cSrcweir 										aScaleX.GetDenominator() );
347*cdf0e10cSrcweir 	Fraction aTempY = ImplMakeFraction( rMapRes.mnMapScNumY,
348*cdf0e10cSrcweir 										aScaleY.GetNumerator(),
349*cdf0e10cSrcweir 										rMapRes.mnMapScDenomY,
350*cdf0e10cSrcweir 										aScaleY.GetDenominator() );
351*cdf0e10cSrcweir 	rMapRes.mnMapScNumX   = aTempX.GetNumerator();
352*cdf0e10cSrcweir 	rMapRes.mnMapScDenomX = aTempX.GetDenominator();
353*cdf0e10cSrcweir 	rMapRes.mnMapScNumY   = aTempY.GetNumerator();
354*cdf0e10cSrcweir 	rMapRes.mnMapScDenomY = aTempY.GetDenominator();
355*cdf0e10cSrcweir 
356*cdf0e10cSrcweir 	// hack: 0/n ungef"ahr 1/max
357*cdf0e10cSrcweir 	if ( !rMapRes.mnMapScNumX )
358*cdf0e10cSrcweir 	{
359*cdf0e10cSrcweir 		rMapRes.mnMapScNumX = 1;
360*cdf0e10cSrcweir 		rMapRes.mnMapScDenomX = LONG_MAX;
361*cdf0e10cSrcweir 	}
362*cdf0e10cSrcweir 	if ( !rMapRes.mnMapScNumY )
363*cdf0e10cSrcweir 	{
364*cdf0e10cSrcweir 		rMapRes.mnMapScNumY = 1;
365*cdf0e10cSrcweir 		rMapRes.mnMapScDenomY = LONG_MAX;
366*cdf0e10cSrcweir 	}
367*cdf0e10cSrcweir }
368*cdf0e10cSrcweir 
369*cdf0e10cSrcweir // -----------------------------------------------------------------------
370*cdf0e10cSrcweir 
371*cdf0e10cSrcweir inline void ImplCalcMapResolution( const MapMode& rMapMode,
372*cdf0e10cSrcweir 								   long nDPIX, long nDPIY,
373*cdf0e10cSrcweir 								   ImplMapRes& rMapRes,
374*cdf0e10cSrcweir 								   ImplThresholdRes& rThresRes )
375*cdf0e10cSrcweir {
376*cdf0e10cSrcweir 	ImplCalcMapResolution( rMapMode, nDPIX, nDPIY, rMapRes );
377*cdf0e10cSrcweir 	ImplCalcBigIntThreshold( nDPIX, nDPIY, rMapRes, rThresRes );
378*cdf0e10cSrcweir }
379*cdf0e10cSrcweir 
380*cdf0e10cSrcweir // -----------------------------------------------------------------------
381*cdf0e10cSrcweir 
382*cdf0e10cSrcweir static long ImplLogicToPixel( long n, long nDPI, long nMapNum, long nMapDenom,
383*cdf0e10cSrcweir 							  long nThres )
384*cdf0e10cSrcweir {
385*cdf0e10cSrcweir     // To "use" it...
386*cdf0e10cSrcweir     (void) nThres;
387*cdf0e10cSrcweir #ifdef USE_64BIT_INTS
388*cdf0e10cSrcweir #if (SAL_TYPES_SIZEOFLONG < 8)
389*cdf0e10cSrcweir     if( (+n < nThres) && (-n < nThres) )
390*cdf0e10cSrcweir     {
391*cdf0e10cSrcweir        n *= nMapNum * nDPI;
392*cdf0e10cSrcweir        if( nMapDenom != 1 )
393*cdf0e10cSrcweir        {
394*cdf0e10cSrcweir           n = (2 * n) / nMapDenom;
395*cdf0e10cSrcweir           if( n < 0 ) --n; else ++n;
396*cdf0e10cSrcweir           n /= 2;
397*cdf0e10cSrcweir        }
398*cdf0e10cSrcweir     }
399*cdf0e10cSrcweir     else
400*cdf0e10cSrcweir #endif
401*cdf0e10cSrcweir     {
402*cdf0e10cSrcweir        sal_Int64 n64 = n;
403*cdf0e10cSrcweir        n64 *= nMapNum;
404*cdf0e10cSrcweir        n64 *= nDPI;
405*cdf0e10cSrcweir        if( nMapDenom == 1 )
406*cdf0e10cSrcweir           n = (long)n64;
407*cdf0e10cSrcweir        else
408*cdf0e10cSrcweir        {
409*cdf0e10cSrcweir           n = (long)(2 * n64 / nMapDenom);
410*cdf0e10cSrcweir           if( n < 0 ) --n; else ++n;
411*cdf0e10cSrcweir           n /= 2;
412*cdf0e10cSrcweir        }
413*cdf0e10cSrcweir     }
414*cdf0e10cSrcweir     return n;
415*cdf0e10cSrcweir #else // USE_64BIT_INTS
416*cdf0e10cSrcweir 	if ( Abs( n ) < nThres )
417*cdf0e10cSrcweir 	{
418*cdf0e10cSrcweir 		n *= nDPI * nMapNum;
419*cdf0e10cSrcweir 		n += n >= 0 ? nMapDenom/2 : -((nMapDenom-1)/2);
420*cdf0e10cSrcweir                 return (n / nMapDenom);
421*cdf0e10cSrcweir 	}
422*cdf0e10cSrcweir 	else
423*cdf0e10cSrcweir 	{
424*cdf0e10cSrcweir 		BigInt aTemp( n );
425*cdf0e10cSrcweir 		aTemp *= BigInt( nDPI );
426*cdf0e10cSrcweir 		aTemp *= BigInt( nMapNum );
427*cdf0e10cSrcweir 
428*cdf0e10cSrcweir 		if ( aTemp.IsNeg() )
429*cdf0e10cSrcweir 		{
430*cdf0e10cSrcweir 			BigInt aMapScDenom2( (nMapDenom-1)/2 );
431*cdf0e10cSrcweir 			aTemp -= aMapScDenom2;
432*cdf0e10cSrcweir 		}
433*cdf0e10cSrcweir 		else
434*cdf0e10cSrcweir 		{
435*cdf0e10cSrcweir 			BigInt aMapScDenom2( nMapDenom/2 );
436*cdf0e10cSrcweir 			aTemp += aMapScDenom2;
437*cdf0e10cSrcweir 		}
438*cdf0e10cSrcweir 
439*cdf0e10cSrcweir 		aTemp /= BigInt( nMapDenom );
440*cdf0e10cSrcweir 		return (long)aTemp;
441*cdf0e10cSrcweir 	}
442*cdf0e10cSrcweir #endif
443*cdf0e10cSrcweir }
444*cdf0e10cSrcweir 
445*cdf0e10cSrcweir // -----------------------------------------------------------------------
446*cdf0e10cSrcweir 
447*cdf0e10cSrcweir static long ImplPixelToLogic( long n, long nDPI, long nMapNum, long nMapDenom,
448*cdf0e10cSrcweir 							  long nThres )
449*cdf0e10cSrcweir {
450*cdf0e10cSrcweir     // To "use" it...
451*cdf0e10cSrcweir    (void) nThres;
452*cdf0e10cSrcweir #ifdef USE_64BIT_INTS
453*cdf0e10cSrcweir #if (SAL_TYPES_SIZEOFLONG < 8)
454*cdf0e10cSrcweir     if( (+n < nThres) && (-n < nThres) )
455*cdf0e10cSrcweir         n = (2 * n * nMapDenom) / (nDPI * nMapNum);
456*cdf0e10cSrcweir     else
457*cdf0e10cSrcweir #endif
458*cdf0e10cSrcweir     {
459*cdf0e10cSrcweir         sal_Int64 n64 = n;
460*cdf0e10cSrcweir         n64 *= nMapDenom;
461*cdf0e10cSrcweir         long nDenom  = nDPI * nMapNum;
462*cdf0e10cSrcweir         n = (long)(2 * n64 / nDenom);
463*cdf0e10cSrcweir     }
464*cdf0e10cSrcweir     if( n < 0 ) --n; else ++n;
465*cdf0e10cSrcweir     return (n / 2);
466*cdf0e10cSrcweir #else // USE_64BIT_INTS
467*cdf0e10cSrcweir 	if ( Abs( n ) < nThres )
468*cdf0e10cSrcweir 	{
469*cdf0e10cSrcweir 		long nDenom  = nDPI * nMapNum;
470*cdf0e10cSrcweir 		long nNum    = n * nMapDenom;
471*cdf0e10cSrcweir 		if( (nNum ^ nDenom) >= 0 )
472*cdf0e10cSrcweir 			nNum += nDenom/2;
473*cdf0e10cSrcweir 		else
474*cdf0e10cSrcweir 			nNum -= nDenom/2;
475*cdf0e10cSrcweir 		return (nNum / nDenom);
476*cdf0e10cSrcweir 	}
477*cdf0e10cSrcweir 	else
478*cdf0e10cSrcweir 	{
479*cdf0e10cSrcweir 		BigInt aDenom( nDPI );
480*cdf0e10cSrcweir 		aDenom *= BigInt( nMapNum );
481*cdf0e10cSrcweir 
482*cdf0e10cSrcweir 		BigInt aNum( n );
483*cdf0e10cSrcweir 		aNum *= BigInt( nMapDenom );
484*cdf0e10cSrcweir 
485*cdf0e10cSrcweir 		BigInt aDenom2( aDenom );
486*cdf0e10cSrcweir 		if ( aNum.IsNeg() )
487*cdf0e10cSrcweir 		{
488*cdf0e10cSrcweir 			if ( aDenom.IsNeg() )
489*cdf0e10cSrcweir 			{
490*cdf0e10cSrcweir 				aDenom2 /= BigInt(2);
491*cdf0e10cSrcweir 				aNum += aDenom2;
492*cdf0e10cSrcweir 			}
493*cdf0e10cSrcweir 			else
494*cdf0e10cSrcweir 			{
495*cdf0e10cSrcweir 				aDenom2 -= 1;
496*cdf0e10cSrcweir 				aDenom2 /= BigInt(2);
497*cdf0e10cSrcweir 				aNum -= aDenom2;
498*cdf0e10cSrcweir 			}
499*cdf0e10cSrcweir 		}
500*cdf0e10cSrcweir 		else
501*cdf0e10cSrcweir 		{
502*cdf0e10cSrcweir 			if ( aDenom.IsNeg() )
503*cdf0e10cSrcweir 			{
504*cdf0e10cSrcweir 				aDenom2 += 1;
505*cdf0e10cSrcweir 				aDenom2 /= BigInt(2);
506*cdf0e10cSrcweir 				aNum -= aDenom2;
507*cdf0e10cSrcweir 			}
508*cdf0e10cSrcweir 			else
509*cdf0e10cSrcweir 			{
510*cdf0e10cSrcweir 				aDenom2 /= BigInt(2);
511*cdf0e10cSrcweir 				aNum += aDenom2;
512*cdf0e10cSrcweir 			}
513*cdf0e10cSrcweir 		}
514*cdf0e10cSrcweir 
515*cdf0e10cSrcweir 		aNum  /= aDenom;
516*cdf0e10cSrcweir 		return (long)aNum;
517*cdf0e10cSrcweir 	}
518*cdf0e10cSrcweir #endif
519*cdf0e10cSrcweir }
520*cdf0e10cSrcweir 
521*cdf0e10cSrcweir // -----------------------------------------------------------------------
522*cdf0e10cSrcweir 
523*cdf0e10cSrcweir long OutputDevice::ImplLogicXToDevicePixel( long nX ) const
524*cdf0e10cSrcweir {
525*cdf0e10cSrcweir 	if ( !mbMap )
526*cdf0e10cSrcweir 		return nX+mnOutOffX;
527*cdf0e10cSrcweir 
528*cdf0e10cSrcweir 	return ImplLogicToPixel( nX + maMapRes.mnMapOfsX, mnDPIX,
529*cdf0e10cSrcweir 							 maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
530*cdf0e10cSrcweir 							 maThresRes.mnThresLogToPixX )+mnOutOffX+mnOutOffOrigX;
531*cdf0e10cSrcweir }
532*cdf0e10cSrcweir 
533*cdf0e10cSrcweir // -----------------------------------------------------------------------
534*cdf0e10cSrcweir 
535*cdf0e10cSrcweir long OutputDevice::ImplLogicYToDevicePixel( long nY ) const
536*cdf0e10cSrcweir {
537*cdf0e10cSrcweir 	if ( !mbMap )
538*cdf0e10cSrcweir 		return nY+mnOutOffY;
539*cdf0e10cSrcweir 
540*cdf0e10cSrcweir 	return ImplLogicToPixel( nY + maMapRes.mnMapOfsY, mnDPIY,
541*cdf0e10cSrcweir 							 maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
542*cdf0e10cSrcweir 							 maThresRes.mnThresLogToPixY )+mnOutOffY+mnOutOffOrigY;
543*cdf0e10cSrcweir }
544*cdf0e10cSrcweir 
545*cdf0e10cSrcweir // -----------------------------------------------------------------------
546*cdf0e10cSrcweir 
547*cdf0e10cSrcweir long OutputDevice::ImplLogicWidthToDevicePixel( long nWidth ) const
548*cdf0e10cSrcweir {
549*cdf0e10cSrcweir 	if ( !mbMap )
550*cdf0e10cSrcweir 		return nWidth;
551*cdf0e10cSrcweir 
552*cdf0e10cSrcweir 	return ImplLogicToPixel( nWidth, mnDPIX,
553*cdf0e10cSrcweir 							 maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
554*cdf0e10cSrcweir 							 maThresRes.mnThresLogToPixX );
555*cdf0e10cSrcweir }
556*cdf0e10cSrcweir 
557*cdf0e10cSrcweir float OutputDevice::ImplFloatLogicWidthToDevicePixel( float fLogicWidth) const
558*cdf0e10cSrcweir {
559*cdf0e10cSrcweir 	if( !mbMap)
560*cdf0e10cSrcweir 		return fLogicWidth;
561*cdf0e10cSrcweir 	// TODO: consolidate the calculation into one multiplication
562*cdf0e10cSrcweir 	float fPixelWidth = (fLogicWidth * mnDPIX * maMapRes.mnMapScNumX) / maMapRes.mnMapScDenomX;
563*cdf0e10cSrcweir 	return fPixelWidth;
564*cdf0e10cSrcweir }
565*cdf0e10cSrcweir 
566*cdf0e10cSrcweir // -----------------------------------------------------------------------
567*cdf0e10cSrcweir 
568*cdf0e10cSrcweir long OutputDevice::ImplLogicHeightToDevicePixel( long nHeight ) const
569*cdf0e10cSrcweir {
570*cdf0e10cSrcweir 	if ( !mbMap )
571*cdf0e10cSrcweir 		return nHeight;
572*cdf0e10cSrcweir 
573*cdf0e10cSrcweir 	return ImplLogicToPixel( nHeight, mnDPIY,
574*cdf0e10cSrcweir 							 maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
575*cdf0e10cSrcweir 							 maThresRes.mnThresLogToPixY );
576*cdf0e10cSrcweir }
577*cdf0e10cSrcweir 
578*cdf0e10cSrcweir float OutputDevice::ImplFloatLogicHeightToDevicePixel( float fLogicHeight) const
579*cdf0e10cSrcweir {
580*cdf0e10cSrcweir 	if( !mbMap)
581*cdf0e10cSrcweir 		return fLogicHeight;
582*cdf0e10cSrcweir 	float fPixelHeight = (fLogicHeight * mnDPIY * maMapRes.mnMapScNumY) / maMapRes.mnMapScDenomY;
583*cdf0e10cSrcweir 	return fPixelHeight;
584*cdf0e10cSrcweir }
585*cdf0e10cSrcweir 
586*cdf0e10cSrcweir // -----------------------------------------------------------------------
587*cdf0e10cSrcweir 
588*cdf0e10cSrcweir long OutputDevice::ImplDevicePixelToLogicWidth( long nWidth ) const
589*cdf0e10cSrcweir {
590*cdf0e10cSrcweir 	if ( !mbMap )
591*cdf0e10cSrcweir 		return nWidth;
592*cdf0e10cSrcweir 
593*cdf0e10cSrcweir 	return ImplPixelToLogic( nWidth, mnDPIX,
594*cdf0e10cSrcweir 							 maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
595*cdf0e10cSrcweir 							 maThresRes.mnThresPixToLogX );
596*cdf0e10cSrcweir }
597*cdf0e10cSrcweir 
598*cdf0e10cSrcweir float OutputDevice::ImplFloatDevicePixelToLogicWidth( float fPixelWidth) const
599*cdf0e10cSrcweir {
600*cdf0e10cSrcweir 	if( !mbMap)
601*cdf0e10cSrcweir 		return fPixelWidth;
602*cdf0e10cSrcweir 	float fLogicHeight = (fPixelWidth * maMapRes.mnMapScDenomX) / (mnDPIX * maMapRes.mnMapScNumX);
603*cdf0e10cSrcweir 	return fLogicHeight;
604*cdf0e10cSrcweir }
605*cdf0e10cSrcweir 
606*cdf0e10cSrcweir // -----------------------------------------------------------------------
607*cdf0e10cSrcweir 
608*cdf0e10cSrcweir long OutputDevice::ImplDevicePixelToLogicHeight( long nHeight ) const
609*cdf0e10cSrcweir {
610*cdf0e10cSrcweir 	if ( !mbMap )
611*cdf0e10cSrcweir 		return nHeight;
612*cdf0e10cSrcweir 
613*cdf0e10cSrcweir 	return ImplPixelToLogic( nHeight, mnDPIY,
614*cdf0e10cSrcweir 							 maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
615*cdf0e10cSrcweir 							 maThresRes.mnThresPixToLogY );
616*cdf0e10cSrcweir }
617*cdf0e10cSrcweir 
618*cdf0e10cSrcweir float OutputDevice::ImplFloatDevicePixelToLogicHeight( float fPixelHeight) const
619*cdf0e10cSrcweir {
620*cdf0e10cSrcweir 	if( !mbMap)
621*cdf0e10cSrcweir 		return fPixelHeight;
622*cdf0e10cSrcweir 	float fLogicHeight = (fPixelHeight * maMapRes.mnMapScDenomY) / (mnDPIY * maMapRes.mnMapScNumY);
623*cdf0e10cSrcweir 	return fLogicHeight;
624*cdf0e10cSrcweir }
625*cdf0e10cSrcweir 
626*cdf0e10cSrcweir 
627*cdf0e10cSrcweir // -----------------------------------------------------------------------
628*cdf0e10cSrcweir 
629*cdf0e10cSrcweir Point OutputDevice::ImplLogicToDevicePixel( const Point& rLogicPt ) const
630*cdf0e10cSrcweir {
631*cdf0e10cSrcweir 	if ( !mbMap )
632*cdf0e10cSrcweir 		return Point( rLogicPt.X()+mnOutOffX, rLogicPt.Y()+mnOutOffY );
633*cdf0e10cSrcweir 
634*cdf0e10cSrcweir 	return Point( ImplLogicToPixel( rLogicPt.X() + maMapRes.mnMapOfsX, mnDPIX,
635*cdf0e10cSrcweir 									maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
636*cdf0e10cSrcweir 									maThresRes.mnThresLogToPixX )+mnOutOffX+mnOutOffOrigX,
637*cdf0e10cSrcweir 				  ImplLogicToPixel( rLogicPt.Y() + maMapRes.mnMapOfsY, mnDPIY,
638*cdf0e10cSrcweir 									maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
639*cdf0e10cSrcweir 									maThresRes.mnThresLogToPixY )+mnOutOffY+mnOutOffOrigY );
640*cdf0e10cSrcweir }
641*cdf0e10cSrcweir 
642*cdf0e10cSrcweir // -----------------------------------------------------------------------
643*cdf0e10cSrcweir 
644*cdf0e10cSrcweir Size OutputDevice::ImplLogicToDevicePixel( const Size& rLogicSize ) const
645*cdf0e10cSrcweir {
646*cdf0e10cSrcweir 	if ( !mbMap )
647*cdf0e10cSrcweir 		return rLogicSize;
648*cdf0e10cSrcweir 
649*cdf0e10cSrcweir 	return Size( ImplLogicToPixel( rLogicSize.Width(), mnDPIX,
650*cdf0e10cSrcweir 								   maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
651*cdf0e10cSrcweir 								   maThresRes.mnThresLogToPixX ),
652*cdf0e10cSrcweir 				 ImplLogicToPixel( rLogicSize.Height(), mnDPIY,
653*cdf0e10cSrcweir 								   maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
654*cdf0e10cSrcweir 								   maThresRes.mnThresLogToPixY ) );
655*cdf0e10cSrcweir }
656*cdf0e10cSrcweir 
657*cdf0e10cSrcweir // -----------------------------------------------------------------------
658*cdf0e10cSrcweir 
659*cdf0e10cSrcweir Rectangle OutputDevice::ImplLogicToDevicePixel( const Rectangle& rLogicRect ) const
660*cdf0e10cSrcweir {
661*cdf0e10cSrcweir 	if ( rLogicRect.IsEmpty() )
662*cdf0e10cSrcweir 		return rLogicRect;
663*cdf0e10cSrcweir 
664*cdf0e10cSrcweir 	if ( !mbMap )
665*cdf0e10cSrcweir 	{
666*cdf0e10cSrcweir 		return Rectangle( rLogicRect.Left()+mnOutOffX, rLogicRect.Top()+mnOutOffY,
667*cdf0e10cSrcweir 						  rLogicRect.Right()+mnOutOffX, rLogicRect.Bottom()+mnOutOffY );
668*cdf0e10cSrcweir 	}
669*cdf0e10cSrcweir 
670*cdf0e10cSrcweir 	return Rectangle( ImplLogicToPixel( rLogicRect.Left()+maMapRes.mnMapOfsX, mnDPIX,
671*cdf0e10cSrcweir 										maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
672*cdf0e10cSrcweir 										maThresRes.mnThresLogToPixX )+mnOutOffX+mnOutOffOrigX,
673*cdf0e10cSrcweir 					  ImplLogicToPixel( rLogicRect.Top()+maMapRes.mnMapOfsY, mnDPIY,
674*cdf0e10cSrcweir 										maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
675*cdf0e10cSrcweir 										maThresRes.mnThresLogToPixY )+mnOutOffY+mnOutOffOrigY,
676*cdf0e10cSrcweir 					  ImplLogicToPixel( rLogicRect.Right()+maMapRes.mnMapOfsX, mnDPIX,
677*cdf0e10cSrcweir 										maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
678*cdf0e10cSrcweir 										maThresRes.mnThresLogToPixX )+mnOutOffX+mnOutOffOrigX,
679*cdf0e10cSrcweir 					  ImplLogicToPixel( rLogicRect.Bottom()+maMapRes.mnMapOfsY, mnDPIY,
680*cdf0e10cSrcweir 										maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
681*cdf0e10cSrcweir 										maThresRes.mnThresLogToPixY )+mnOutOffY+mnOutOffOrigY );
682*cdf0e10cSrcweir }
683*cdf0e10cSrcweir 
684*cdf0e10cSrcweir // -----------------------------------------------------------------------
685*cdf0e10cSrcweir 
686*cdf0e10cSrcweir Polygon OutputDevice::ImplLogicToDevicePixel( const Polygon& rLogicPoly ) const
687*cdf0e10cSrcweir {
688*cdf0e10cSrcweir 	if ( !mbMap && !mnOutOffX && !mnOutOffY )
689*cdf0e10cSrcweir 		return rLogicPoly;
690*cdf0e10cSrcweir 
691*cdf0e10cSrcweir 	sal_uInt16	i;
692*cdf0e10cSrcweir 	sal_uInt16	nPoints = rLogicPoly.GetSize();
693*cdf0e10cSrcweir 	Polygon aPoly( rLogicPoly );
694*cdf0e10cSrcweir 
695*cdf0e10cSrcweir 	// Pointer auf das Point-Array holen (Daten werden kopiert)
696*cdf0e10cSrcweir 	const Point* pPointAry = aPoly.GetConstPointAry();
697*cdf0e10cSrcweir 
698*cdf0e10cSrcweir 	if ( mbMap )
699*cdf0e10cSrcweir 	{
700*cdf0e10cSrcweir 		for ( i = 0; i < nPoints; i++ )
701*cdf0e10cSrcweir 		{
702*cdf0e10cSrcweir 			const Point* pPt = &(pPointAry[i]);
703*cdf0e10cSrcweir             Point aPt;
704*cdf0e10cSrcweir 			aPt.X() = ImplLogicToPixel( pPt->X()+maMapRes.mnMapOfsX, mnDPIX,
705*cdf0e10cSrcweir                                         maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
706*cdf0e10cSrcweir                                         maThresRes.mnThresLogToPixX )+mnOutOffX+mnOutOffOrigX;
707*cdf0e10cSrcweir 			aPt.Y() = ImplLogicToPixel( pPt->Y()+maMapRes.mnMapOfsY, mnDPIY,
708*cdf0e10cSrcweir                                         maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
709*cdf0e10cSrcweir                                         maThresRes.mnThresLogToPixY )+mnOutOffY+mnOutOffOrigY;
710*cdf0e10cSrcweir             aPoly[i] = aPt;
711*cdf0e10cSrcweir 		}
712*cdf0e10cSrcweir 	}
713*cdf0e10cSrcweir 	else
714*cdf0e10cSrcweir 	{
715*cdf0e10cSrcweir 		for ( i = 0; i < nPoints; i++ )
716*cdf0e10cSrcweir 		{
717*cdf0e10cSrcweir 			Point aPt = pPointAry[i];
718*cdf0e10cSrcweir 			aPt.X() += mnOutOffX;
719*cdf0e10cSrcweir 			aPt.Y() += mnOutOffY;
720*cdf0e10cSrcweir             aPoly[i] = aPt;
721*cdf0e10cSrcweir 		}
722*cdf0e10cSrcweir 	}
723*cdf0e10cSrcweir 
724*cdf0e10cSrcweir 	return aPoly;
725*cdf0e10cSrcweir }
726*cdf0e10cSrcweir 
727*cdf0e10cSrcweir // -----------------------------------------------------------------------
728*cdf0e10cSrcweir 
729*cdf0e10cSrcweir PolyPolygon OutputDevice::ImplLogicToDevicePixel( const PolyPolygon& rLogicPolyPoly ) const
730*cdf0e10cSrcweir {
731*cdf0e10cSrcweir 	if ( !mbMap && !mnOutOffX && !mnOutOffY )
732*cdf0e10cSrcweir 		return rLogicPolyPoly;
733*cdf0e10cSrcweir 
734*cdf0e10cSrcweir 	PolyPolygon aPolyPoly( rLogicPolyPoly );
735*cdf0e10cSrcweir 	sal_uInt16		nPoly = aPolyPoly.Count();
736*cdf0e10cSrcweir 	for( sal_uInt16 i = 0; i < nPoly; i++ )
737*cdf0e10cSrcweir 	{
738*cdf0e10cSrcweir 		Polygon& rPoly = aPolyPoly[i];
739*cdf0e10cSrcweir 		rPoly = ImplLogicToDevicePixel( rPoly );
740*cdf0e10cSrcweir 	}
741*cdf0e10cSrcweir 	return aPolyPoly;
742*cdf0e10cSrcweir }
743*cdf0e10cSrcweir 
744*cdf0e10cSrcweir // -----------------------------------------------------------------------
745*cdf0e10cSrcweir 
746*cdf0e10cSrcweir LineInfo OutputDevice::ImplLogicToDevicePixel( const LineInfo& rLineInfo ) const
747*cdf0e10cSrcweir {
748*cdf0e10cSrcweir 	LineInfo aInfo( rLineInfo );
749*cdf0e10cSrcweir 
750*cdf0e10cSrcweir 	if( aInfo.GetStyle() == LINE_DASH )
751*cdf0e10cSrcweir 	{
752*cdf0e10cSrcweir 		if( aInfo.GetDotCount() && aInfo.GetDotLen() )
753*cdf0e10cSrcweir 			aInfo.SetDotLen( Max( ImplLogicWidthToDevicePixel( aInfo.GetDotLen() ), 1L ) );
754*cdf0e10cSrcweir 		else
755*cdf0e10cSrcweir 			aInfo.SetDotCount( 0 );
756*cdf0e10cSrcweir 
757*cdf0e10cSrcweir 		if( aInfo.GetDashCount() && aInfo.GetDashLen() )
758*cdf0e10cSrcweir 			aInfo.SetDashLen( Max( ImplLogicWidthToDevicePixel( aInfo.GetDashLen() ), 1L ) );
759*cdf0e10cSrcweir 		else
760*cdf0e10cSrcweir 			aInfo.SetDashCount( 0 );
761*cdf0e10cSrcweir 
762*cdf0e10cSrcweir 		aInfo.SetDistance( ImplLogicWidthToDevicePixel( aInfo.GetDistance() ) );
763*cdf0e10cSrcweir 
764*cdf0e10cSrcweir 		if( ( !aInfo.GetDashCount() && !aInfo.GetDotCount() ) || !aInfo.GetDistance() )
765*cdf0e10cSrcweir 			aInfo.SetStyle( LINE_SOLID );
766*cdf0e10cSrcweir 	}
767*cdf0e10cSrcweir 
768*cdf0e10cSrcweir 	aInfo.SetWidth( ImplLogicWidthToDevicePixel( aInfo.GetWidth() ) );
769*cdf0e10cSrcweir 
770*cdf0e10cSrcweir 	return aInfo;
771*cdf0e10cSrcweir }
772*cdf0e10cSrcweir 
773*cdf0e10cSrcweir // -----------------------------------------------------------------------
774*cdf0e10cSrcweir 
775*cdf0e10cSrcweir Rectangle OutputDevice::ImplDevicePixelToLogic( const Rectangle& rPixelRect ) const
776*cdf0e10cSrcweir {
777*cdf0e10cSrcweir 	if ( rPixelRect.IsEmpty() )
778*cdf0e10cSrcweir 		return rPixelRect;
779*cdf0e10cSrcweir 
780*cdf0e10cSrcweir 	if ( !mbMap )
781*cdf0e10cSrcweir 	{
782*cdf0e10cSrcweir 		return Rectangle( rPixelRect.Left()-mnOutOffX, rPixelRect.Top()-mnOutOffY,
783*cdf0e10cSrcweir 						  rPixelRect.Right()-mnOutOffX, rPixelRect.Bottom()-mnOutOffY );
784*cdf0e10cSrcweir 	}
785*cdf0e10cSrcweir 
786*cdf0e10cSrcweir 	return Rectangle( ImplPixelToLogic( rPixelRect.Left()-mnOutOffX-mnOutOffOrigX, mnDPIX,
787*cdf0e10cSrcweir 										maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
788*cdf0e10cSrcweir 										maThresRes.mnThresPixToLogX )-maMapRes.mnMapOfsX,
789*cdf0e10cSrcweir 					  ImplPixelToLogic( rPixelRect.Top()-mnOutOffY-mnOutOffOrigY, mnDPIY,
790*cdf0e10cSrcweir 										maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
791*cdf0e10cSrcweir 										maThresRes.mnThresPixToLogY )-maMapRes.mnMapOfsY,
792*cdf0e10cSrcweir 					  ImplPixelToLogic( rPixelRect.Right()-mnOutOffX-mnOutOffOrigX, mnDPIX,
793*cdf0e10cSrcweir 										maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
794*cdf0e10cSrcweir 										maThresRes.mnThresPixToLogX )-maMapRes.mnMapOfsX,
795*cdf0e10cSrcweir 					  ImplPixelToLogic( rPixelRect.Bottom()-mnOutOffY-mnOutOffOrigY, mnDPIY,
796*cdf0e10cSrcweir 										maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
797*cdf0e10cSrcweir 										maThresRes.mnThresPixToLogY )-maMapRes.mnMapOfsY );
798*cdf0e10cSrcweir }
799*cdf0e10cSrcweir 
800*cdf0e10cSrcweir // -----------------------------------------------------------------------
801*cdf0e10cSrcweir 
802*cdf0e10cSrcweir Region OutputDevice::ImplPixelToDevicePixel( const Region& rRegion ) const
803*cdf0e10cSrcweir {
804*cdf0e10cSrcweir 	DBG_CHKOBJ( &rRegion, Region, ImplDbgTestRegion );
805*cdf0e10cSrcweir 
806*cdf0e10cSrcweir 	if ( !mnOutOffX && !mnOutOffY )
807*cdf0e10cSrcweir 		return rRegion;
808*cdf0e10cSrcweir 
809*cdf0e10cSrcweir 	Region aRegion( rRegion );
810*cdf0e10cSrcweir 	aRegion.Move( mnOutOffX+mnOutOffOrigX, mnOutOffY+mnOutOffOrigY );
811*cdf0e10cSrcweir 	return aRegion;
812*cdf0e10cSrcweir }
813*cdf0e10cSrcweir 
814*cdf0e10cSrcweir // -----------------------------------------------------------------------
815*cdf0e10cSrcweir 
816*cdf0e10cSrcweir void OutputDevice::EnableMapMode( sal_Bool bEnable )
817*cdf0e10cSrcweir {
818*cdf0e10cSrcweir     mbMap = (bEnable != 0);
819*cdf0e10cSrcweir 
820*cdf0e10cSrcweir     if( mpAlphaVDev )
821*cdf0e10cSrcweir         mpAlphaVDev->EnableMapMode( bEnable );
822*cdf0e10cSrcweir }
823*cdf0e10cSrcweir 
824*cdf0e10cSrcweir // -----------------------------------------------------------------------
825*cdf0e10cSrcweir 
826*cdf0e10cSrcweir void OutputDevice::SetMapMode()
827*cdf0e10cSrcweir {
828*cdf0e10cSrcweir 	DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
829*cdf0e10cSrcweir 
830*cdf0e10cSrcweir 	if ( mpMetaFile )
831*cdf0e10cSrcweir 		mpMetaFile->AddAction( new MetaMapModeAction( MapMode() ) );
832*cdf0e10cSrcweir 
833*cdf0e10cSrcweir 	if ( mbMap || !maMapMode.IsDefault() )
834*cdf0e10cSrcweir 	{
835*cdf0e10cSrcweir 		mbMap		= sal_False;
836*cdf0e10cSrcweir 		maMapMode	= MapMode();
837*cdf0e10cSrcweir 
838*cdf0e10cSrcweir 		// create new objects (clip region werden nicht neu skaliert)
839*cdf0e10cSrcweir 		mbNewFont	= sal_True;
840*cdf0e10cSrcweir 		mbInitFont	= sal_True;
841*cdf0e10cSrcweir 		if ( GetOutDevType() == OUTDEV_WINDOW )
842*cdf0e10cSrcweir 		{
843*cdf0e10cSrcweir 			if ( ((Window*)this)->mpWindowImpl->mpCursor )
844*cdf0e10cSrcweir 				((Window*)this)->mpWindowImpl->mpCursor->ImplNew();
845*cdf0e10cSrcweir 		}
846*cdf0e10cSrcweir 
847*cdf0e10cSrcweir         // #106426# Adapt logical offset when changing mapmode
848*cdf0e10cSrcweir         mnOutOffLogicX = mnOutOffOrigX; // no mapping -> equal offsets
849*cdf0e10cSrcweir         mnOutOffLogicY = mnOutOffOrigY;
850*cdf0e10cSrcweir 
851*cdf0e10cSrcweir 		// #i75163#
852*cdf0e10cSrcweir 		ImplInvalidateViewTransform();
853*cdf0e10cSrcweir 	}
854*cdf0e10cSrcweir 
855*cdf0e10cSrcweir     if( mpAlphaVDev )
856*cdf0e10cSrcweir         mpAlphaVDev->SetMapMode();
857*cdf0e10cSrcweir }
858*cdf0e10cSrcweir 
859*cdf0e10cSrcweir // -----------------------------------------------------------------------
860*cdf0e10cSrcweir 
861*cdf0e10cSrcweir void OutputDevice::SetMapMode( const MapMode& rNewMapMode )
862*cdf0e10cSrcweir {
863*cdf0e10cSrcweir 	DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
864*cdf0e10cSrcweir 
865*cdf0e10cSrcweir 	sal_Bool bRelMap = (rNewMapMode.GetMapUnit() == MAP_RELATIVE);
866*cdf0e10cSrcweir 
867*cdf0e10cSrcweir 	if ( mpMetaFile )
868*cdf0e10cSrcweir 	{
869*cdf0e10cSrcweir 		mpMetaFile->AddAction( new MetaMapModeAction( rNewMapMode ) );
870*cdf0e10cSrcweir #ifdef DBG_UTIL
871*cdf0e10cSrcweir 		if ( GetOutDevType() != OUTDEV_PRINTER )
872*cdf0e10cSrcweir 			DBG_ASSERTWARNING( bRelMap, "Please record only relative MapModes!" );
873*cdf0e10cSrcweir #endif
874*cdf0e10cSrcweir 	}
875*cdf0e10cSrcweir 
876*cdf0e10cSrcweir 	// Ist der MapMode der gleiche wie vorher, dann mache nichts
877*cdf0e10cSrcweir 	if ( maMapMode == rNewMapMode )
878*cdf0e10cSrcweir 		return;
879*cdf0e10cSrcweir 
880*cdf0e10cSrcweir     if( mpAlphaVDev )
881*cdf0e10cSrcweir         mpAlphaVDev->SetMapMode( rNewMapMode );
882*cdf0e10cSrcweir 
883*cdf0e10cSrcweir 	// Ist Default-MapMode, dann bereche nichts
884*cdf0e10cSrcweir 	sal_Bool bOldMap = mbMap;
885*cdf0e10cSrcweir 	mbMap = !rNewMapMode.IsDefault();
886*cdf0e10cSrcweir 	if ( mbMap )
887*cdf0e10cSrcweir 	{
888*cdf0e10cSrcweir 		// Falls nur der Orign umgesetzt wird, dann scaliere nichts neu
889*cdf0e10cSrcweir 		if ( (rNewMapMode.GetMapUnit() == maMapMode.GetMapUnit()) &&
890*cdf0e10cSrcweir 			 (rNewMapMode.GetScaleX()  == maMapMode.GetScaleX())  &&
891*cdf0e10cSrcweir 			 (rNewMapMode.GetScaleY()  == maMapMode.GetScaleY())  &&
892*cdf0e10cSrcweir 			 (bOldMap				   == mbMap) )
893*cdf0e10cSrcweir 		{
894*cdf0e10cSrcweir 			// Offset setzen
895*cdf0e10cSrcweir 			Point aOrigin = rNewMapMode.GetOrigin();
896*cdf0e10cSrcweir 			maMapRes.mnMapOfsX = aOrigin.X();
897*cdf0e10cSrcweir 			maMapRes.mnMapOfsY = aOrigin.Y();
898*cdf0e10cSrcweir 			maMapMode = rNewMapMode;
899*cdf0e10cSrcweir 
900*cdf0e10cSrcweir 			// #i75163#
901*cdf0e10cSrcweir 			ImplInvalidateViewTransform();
902*cdf0e10cSrcweir 
903*cdf0e10cSrcweir 			return;
904*cdf0e10cSrcweir 		}
905*cdf0e10cSrcweir 		if ( !bOldMap && bRelMap )
906*cdf0e10cSrcweir 		{
907*cdf0e10cSrcweir 			maMapRes.mnMapScNumX	= 1;
908*cdf0e10cSrcweir 			maMapRes.mnMapScNumY	= 1;
909*cdf0e10cSrcweir 			maMapRes.mnMapScDenomX	= mnDPIX;
910*cdf0e10cSrcweir 			maMapRes.mnMapScDenomY	= mnDPIY;
911*cdf0e10cSrcweir 			maMapRes.mnMapOfsX		= 0;
912*cdf0e10cSrcweir 			maMapRes.mnMapOfsY		= 0;
913*cdf0e10cSrcweir 		}
914*cdf0e10cSrcweir 
915*cdf0e10cSrcweir 		// Neue MapMode-Aufloesung berechnen
916*cdf0e10cSrcweir 		ImplCalcMapResolution( rNewMapMode, mnDPIX, mnDPIY, maMapRes, maThresRes );
917*cdf0e10cSrcweir 	}
918*cdf0e10cSrcweir 
919*cdf0e10cSrcweir 	// Neuen MapMode setzen
920*cdf0e10cSrcweir 	if ( bRelMap )
921*cdf0e10cSrcweir 	{
922*cdf0e10cSrcweir 		Point aOrigin( maMapRes.mnMapOfsX, maMapRes.mnMapOfsY );
923*cdf0e10cSrcweir 		// aScale? = maMapMode.GetScale?() * rNewMapMode.GetScale?()
924*cdf0e10cSrcweir 		Fraction aScaleX = ImplMakeFraction( maMapMode.GetScaleX().GetNumerator(),
925*cdf0e10cSrcweir 											 rNewMapMode.GetScaleX().GetNumerator(),
926*cdf0e10cSrcweir 											 maMapMode.GetScaleX().GetDenominator(),
927*cdf0e10cSrcweir 											 rNewMapMode.GetScaleX().GetDenominator() );
928*cdf0e10cSrcweir 		Fraction aScaleY = ImplMakeFraction( maMapMode.GetScaleY().GetNumerator(),
929*cdf0e10cSrcweir 											 rNewMapMode.GetScaleY().GetNumerator(),
930*cdf0e10cSrcweir 											 maMapMode.GetScaleY().GetDenominator(),
931*cdf0e10cSrcweir 											 rNewMapMode.GetScaleY().GetDenominator() );
932*cdf0e10cSrcweir 		maMapMode.SetOrigin( aOrigin );
933*cdf0e10cSrcweir 		maMapMode.SetScaleX( aScaleX );
934*cdf0e10cSrcweir 		maMapMode.SetScaleY( aScaleY );
935*cdf0e10cSrcweir 	}
936*cdf0e10cSrcweir 	else
937*cdf0e10cSrcweir 		maMapMode = rNewMapMode;
938*cdf0e10cSrcweir 
939*cdf0e10cSrcweir 	// create new objects (clip region werden nicht neu skaliert)
940*cdf0e10cSrcweir 	mbNewFont	= sal_True;
941*cdf0e10cSrcweir 	mbInitFont	= sal_True;
942*cdf0e10cSrcweir 	if ( GetOutDevType() == OUTDEV_WINDOW )
943*cdf0e10cSrcweir 	{
944*cdf0e10cSrcweir 		if ( ((Window*)this)->mpWindowImpl->mpCursor )
945*cdf0e10cSrcweir 			((Window*)this)->mpWindowImpl->mpCursor->ImplNew();
946*cdf0e10cSrcweir 	}
947*cdf0e10cSrcweir 
948*cdf0e10cSrcweir     // #106426# Adapt logical offset when changing mapmode
949*cdf0e10cSrcweir 	mnOutOffLogicX = ImplPixelToLogic( mnOutOffOrigX, mnDPIX,
950*cdf0e10cSrcweir                                        maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
951*cdf0e10cSrcweir                                        maThresRes.mnThresPixToLogX );
952*cdf0e10cSrcweir 	mnOutOffLogicY = ImplPixelToLogic( mnOutOffOrigY, mnDPIY,
953*cdf0e10cSrcweir                                        maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
954*cdf0e10cSrcweir                                        maThresRes.mnThresPixToLogY );
955*cdf0e10cSrcweir 
956*cdf0e10cSrcweir 	// #i75163#
957*cdf0e10cSrcweir 	ImplInvalidateViewTransform();
958*cdf0e10cSrcweir }
959*cdf0e10cSrcweir 
960*cdf0e10cSrcweir // -----------------------------------------------------------------------
961*cdf0e10cSrcweir 
962*cdf0e10cSrcweir void OutputDevice::SetRelativeMapMode( const MapMode& rNewMapMode )
963*cdf0e10cSrcweir {
964*cdf0e10cSrcweir 	DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
965*cdf0e10cSrcweir 
966*cdf0e10cSrcweir 	// Ist der MapMode der gleiche wie vorher, dann mache nichts
967*cdf0e10cSrcweir 	if ( maMapMode == rNewMapMode )
968*cdf0e10cSrcweir 		return;
969*cdf0e10cSrcweir 
970*cdf0e10cSrcweir 	MapUnit eOld = maMapMode.GetMapUnit();
971*cdf0e10cSrcweir 	MapUnit eNew = rNewMapMode.GetMapUnit();
972*cdf0e10cSrcweir 
973*cdf0e10cSrcweir 	// a?F = rNewMapMode.GetScale?() / maMapMode.GetScale?()
974*cdf0e10cSrcweir 	Fraction aXF = ImplMakeFraction( rNewMapMode.GetScaleX().GetNumerator(),
975*cdf0e10cSrcweir 									 maMapMode.GetScaleX().GetDenominator(),
976*cdf0e10cSrcweir 									 rNewMapMode.GetScaleX().GetDenominator(),
977*cdf0e10cSrcweir 									 maMapMode.GetScaleX().GetNumerator() );
978*cdf0e10cSrcweir 	Fraction aYF = ImplMakeFraction( rNewMapMode.GetScaleY().GetNumerator(),
979*cdf0e10cSrcweir 									 maMapMode.GetScaleY().GetDenominator(),
980*cdf0e10cSrcweir 									 rNewMapMode.GetScaleY().GetDenominator(),
981*cdf0e10cSrcweir 									 maMapMode.GetScaleY().GetNumerator() );
982*cdf0e10cSrcweir 
983*cdf0e10cSrcweir 	Point aPt( LogicToLogic( Point(), NULL, &rNewMapMode ) );
984*cdf0e10cSrcweir 	if ( eNew != eOld )
985*cdf0e10cSrcweir 	{
986*cdf0e10cSrcweir 		if ( eOld > MAP_PIXEL )
987*cdf0e10cSrcweir 		{
988*cdf0e10cSrcweir 			DBG_ERRORFILE( "Not implemented MapUnit" );
989*cdf0e10cSrcweir 		}
990*cdf0e10cSrcweir 		else if ( eNew > MAP_PIXEL )
991*cdf0e10cSrcweir 		{
992*cdf0e10cSrcweir 			DBG_ERRORFILE( "Not implemented MapUnit" );
993*cdf0e10cSrcweir 		}
994*cdf0e10cSrcweir 		else
995*cdf0e10cSrcweir 		{
996*cdf0e10cSrcweir 			Fraction aF( aImplNumeratorAry[eNew] * aImplDenominatorAry[eOld],
997*cdf0e10cSrcweir 						 aImplNumeratorAry[eOld] * aImplDenominatorAry[eNew] );
998*cdf0e10cSrcweir 
999*cdf0e10cSrcweir 			// a?F =  a?F * aF
1000*cdf0e10cSrcweir 			aXF = ImplMakeFraction( aXF.GetNumerator(),   aF.GetNumerator(),
1001*cdf0e10cSrcweir 									aXF.GetDenominator(), aF.GetDenominator() );
1002*cdf0e10cSrcweir 			aYF = ImplMakeFraction( aYF.GetNumerator(),   aF.GetNumerator(),
1003*cdf0e10cSrcweir 									aYF.GetDenominator(), aF.GetDenominator() );
1004*cdf0e10cSrcweir 			if ( eOld == MAP_PIXEL )
1005*cdf0e10cSrcweir 			{
1006*cdf0e10cSrcweir 				aXF *= Fraction( mnDPIX, 1 );
1007*cdf0e10cSrcweir 				aYF *= Fraction( mnDPIY, 1 );
1008*cdf0e10cSrcweir 			}
1009*cdf0e10cSrcweir 			else if ( eNew == MAP_PIXEL )
1010*cdf0e10cSrcweir 			{
1011*cdf0e10cSrcweir 				aXF *= Fraction( 1, mnDPIX );
1012*cdf0e10cSrcweir 				aYF *= Fraction( 1, mnDPIY );
1013*cdf0e10cSrcweir 			}
1014*cdf0e10cSrcweir 		}
1015*cdf0e10cSrcweir 	}
1016*cdf0e10cSrcweir 
1017*cdf0e10cSrcweir 	MapMode aNewMapMode( MAP_RELATIVE, Point( -aPt.X(), -aPt.Y() ), aXF, aYF );
1018*cdf0e10cSrcweir 	SetMapMode( aNewMapMode );
1019*cdf0e10cSrcweir 
1020*cdf0e10cSrcweir 	if ( eNew != eOld )
1021*cdf0e10cSrcweir 		maMapMode = rNewMapMode;
1022*cdf0e10cSrcweir 
1023*cdf0e10cSrcweir     // #106426# Adapt logical offset when changing mapmode
1024*cdf0e10cSrcweir 	mnOutOffLogicX = ImplPixelToLogic( mnOutOffOrigX, mnDPIX,
1025*cdf0e10cSrcweir                                        maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
1026*cdf0e10cSrcweir                                        maThresRes.mnThresPixToLogX );
1027*cdf0e10cSrcweir 	mnOutOffLogicY = ImplPixelToLogic( mnOutOffOrigY, mnDPIY,
1028*cdf0e10cSrcweir                                        maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
1029*cdf0e10cSrcweir                                        maThresRes.mnThresPixToLogY );
1030*cdf0e10cSrcweir 
1031*cdf0e10cSrcweir     if( mpAlphaVDev )
1032*cdf0e10cSrcweir         mpAlphaVDev->SetRelativeMapMode( rNewMapMode );
1033*cdf0e10cSrcweir }
1034*cdf0e10cSrcweir 
1035*cdf0e10cSrcweir // -----------------------------------------------------------------------
1036*cdf0e10cSrcweir 
1037*cdf0e10cSrcweir // #i75163#
1038*cdf0e10cSrcweir basegfx::B2DHomMatrix OutputDevice::GetViewTransformation() const
1039*cdf0e10cSrcweir {
1040*cdf0e10cSrcweir     if(mbMap)
1041*cdf0e10cSrcweir     {
1042*cdf0e10cSrcweir         // #i82615#
1043*cdf0e10cSrcweir         if(!mpOutDevData)
1044*cdf0e10cSrcweir         {
1045*cdf0e10cSrcweir     		const_cast< OutputDevice* >(this)->ImplInitOutDevData();
1046*cdf0e10cSrcweir         }
1047*cdf0e10cSrcweir 
1048*cdf0e10cSrcweir 		if(!mpOutDevData->mpViewTransform)
1049*cdf0e10cSrcweir 		{
1050*cdf0e10cSrcweir 			mpOutDevData->mpViewTransform = new basegfx::B2DHomMatrix;
1051*cdf0e10cSrcweir 
1052*cdf0e10cSrcweir 			const double fScaleFactorX((double)mnDPIX * (double)maMapRes.mnMapScNumX / (double)maMapRes.mnMapScDenomX);
1053*cdf0e10cSrcweir 			const double fScaleFactorY((double)mnDPIY * (double)maMapRes.mnMapScNumY / (double)maMapRes.mnMapScDenomY);
1054*cdf0e10cSrcweir 			const double fZeroPointX(((double)maMapRes.mnMapOfsX * fScaleFactorX) + (double)mnOutOffOrigX);
1055*cdf0e10cSrcweir 			const double fZeroPointY(((double)maMapRes.mnMapOfsY * fScaleFactorY) + (double)mnOutOffOrigY);
1056*cdf0e10cSrcweir 
1057*cdf0e10cSrcweir 			mpOutDevData->mpViewTransform->set(0, 0, fScaleFactorX);
1058*cdf0e10cSrcweir 			mpOutDevData->mpViewTransform->set(1, 1, fScaleFactorY);
1059*cdf0e10cSrcweir 			mpOutDevData->mpViewTransform->set(0, 2, fZeroPointX);
1060*cdf0e10cSrcweir 			mpOutDevData->mpViewTransform->set(1, 2, fZeroPointY);
1061*cdf0e10cSrcweir 		}
1062*cdf0e10cSrcweir 
1063*cdf0e10cSrcweir 		return *mpOutDevData->mpViewTransform;
1064*cdf0e10cSrcweir     }
1065*cdf0e10cSrcweir 	else
1066*cdf0e10cSrcweir 	{
1067*cdf0e10cSrcweir 		return basegfx::B2DHomMatrix();
1068*cdf0e10cSrcweir 	}
1069*cdf0e10cSrcweir }
1070*cdf0e10cSrcweir 
1071*cdf0e10cSrcweir // -----------------------------------------------------------------------
1072*cdf0e10cSrcweir 
1073*cdf0e10cSrcweir // #i75163#
1074*cdf0e10cSrcweir basegfx::B2DHomMatrix OutputDevice::GetInverseViewTransformation() const
1075*cdf0e10cSrcweir {
1076*cdf0e10cSrcweir     if(mbMap)
1077*cdf0e10cSrcweir     {
1078*cdf0e10cSrcweir         // #i82615#
1079*cdf0e10cSrcweir         if(!mpOutDevData)
1080*cdf0e10cSrcweir         {
1081*cdf0e10cSrcweir     		const_cast< OutputDevice* >(this)->ImplInitOutDevData();
1082*cdf0e10cSrcweir         }
1083*cdf0e10cSrcweir 
1084*cdf0e10cSrcweir         if(!mpOutDevData->mpInverseViewTransform)
1085*cdf0e10cSrcweir 		{
1086*cdf0e10cSrcweir 			GetViewTransformation();
1087*cdf0e10cSrcweir 			mpOutDevData->mpInverseViewTransform = new basegfx::B2DHomMatrix(*mpOutDevData->mpViewTransform);
1088*cdf0e10cSrcweir 			mpOutDevData->mpInverseViewTransform->invert();
1089*cdf0e10cSrcweir 		}
1090*cdf0e10cSrcweir 
1091*cdf0e10cSrcweir 		return *mpOutDevData->mpInverseViewTransform;
1092*cdf0e10cSrcweir 	}
1093*cdf0e10cSrcweir 	else
1094*cdf0e10cSrcweir 	{
1095*cdf0e10cSrcweir 		return basegfx::B2DHomMatrix();
1096*cdf0e10cSrcweir 	}
1097*cdf0e10cSrcweir }
1098*cdf0e10cSrcweir 
1099*cdf0e10cSrcweir // -----------------------------------------------------------------------
1100*cdf0e10cSrcweir 
1101*cdf0e10cSrcweir // #i75163#
1102*cdf0e10cSrcweir basegfx::B2DHomMatrix OutputDevice::GetViewTransformation( const MapMode& rMapMode ) const
1103*cdf0e10cSrcweir {
1104*cdf0e10cSrcweir     // #i82615#
1105*cdf0e10cSrcweir 	ImplMapRes			aMapRes;
1106*cdf0e10cSrcweir 	ImplThresholdRes	aThresRes;
1107*cdf0e10cSrcweir 	ImplCalcMapResolution( rMapMode, mnDPIX, mnDPIY, aMapRes, aThresRes );
1108*cdf0e10cSrcweir 
1109*cdf0e10cSrcweir 	basegfx::B2DHomMatrix aTransform;
1110*cdf0e10cSrcweir 
1111*cdf0e10cSrcweir 	const double fScaleFactorX((double)mnDPIX * (double)aMapRes.mnMapScNumX / (double)aMapRes.mnMapScDenomX);
1112*cdf0e10cSrcweir 	const double fScaleFactorY((double)mnDPIY * (double)aMapRes.mnMapScNumY / (double)aMapRes.mnMapScDenomY);
1113*cdf0e10cSrcweir 	const double fZeroPointX(((double)aMapRes.mnMapOfsX * fScaleFactorX) + (double)mnOutOffOrigX);
1114*cdf0e10cSrcweir 	const double fZeroPointY(((double)aMapRes.mnMapOfsY * fScaleFactorY) + (double)mnOutOffOrigY);
1115*cdf0e10cSrcweir 
1116*cdf0e10cSrcweir 	aTransform.set(0, 0, fScaleFactorX);
1117*cdf0e10cSrcweir 	aTransform.set(1, 1, fScaleFactorY);
1118*cdf0e10cSrcweir 	aTransform.set(0, 2, fZeroPointX);
1119*cdf0e10cSrcweir 	aTransform.set(1, 2, fZeroPointY);
1120*cdf0e10cSrcweir 
1121*cdf0e10cSrcweir 	return aTransform;
1122*cdf0e10cSrcweir }
1123*cdf0e10cSrcweir 
1124*cdf0e10cSrcweir // -----------------------------------------------------------------------
1125*cdf0e10cSrcweir 
1126*cdf0e10cSrcweir // #i75163#
1127*cdf0e10cSrcweir basegfx::B2DHomMatrix OutputDevice::GetInverseViewTransformation( const MapMode& rMapMode ) const
1128*cdf0e10cSrcweir {
1129*cdf0e10cSrcweir     basegfx::B2DHomMatrix aMatrix( GetViewTransformation( rMapMode ) );
1130*cdf0e10cSrcweir     aMatrix.invert();
1131*cdf0e10cSrcweir     return aMatrix;
1132*cdf0e10cSrcweir }
1133*cdf0e10cSrcweir 
1134*cdf0e10cSrcweir // -----------------------------------------------------------------------
1135*cdf0e10cSrcweir 
1136*cdf0e10cSrcweir basegfx::B2DHomMatrix OutputDevice::ImplGetDeviceTransformation() const
1137*cdf0e10cSrcweir {
1138*cdf0e10cSrcweir 	basegfx::B2DHomMatrix aTransformation = GetViewTransformation();
1139*cdf0e10cSrcweir 	// TODO: is it worth to cache the transformed result?
1140*cdf0e10cSrcweir 	if( mnOutOffX || mnOutOffY )
1141*cdf0e10cSrcweir 		aTransformation.translate( mnOutOffX, mnOutOffY );
1142*cdf0e10cSrcweir 	return aTransformation;
1143*cdf0e10cSrcweir }
1144*cdf0e10cSrcweir 
1145*cdf0e10cSrcweir // -----------------------------------------------------------------------
1146*cdf0e10cSrcweir 
1147*cdf0e10cSrcweir Point OutputDevice::LogicToPixel( const Point& rLogicPt ) const
1148*cdf0e10cSrcweir {
1149*cdf0e10cSrcweir 	DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
1150*cdf0e10cSrcweir 
1151*cdf0e10cSrcweir 	if ( !mbMap )
1152*cdf0e10cSrcweir 		return rLogicPt;
1153*cdf0e10cSrcweir 
1154*cdf0e10cSrcweir 	return Point( ImplLogicToPixel( rLogicPt.X() + maMapRes.mnMapOfsX, mnDPIX,
1155*cdf0e10cSrcweir 									maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
1156*cdf0e10cSrcweir 									maThresRes.mnThresLogToPixX )+mnOutOffOrigX,
1157*cdf0e10cSrcweir 				  ImplLogicToPixel( rLogicPt.Y() + maMapRes.mnMapOfsY, mnDPIY,
1158*cdf0e10cSrcweir 									maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
1159*cdf0e10cSrcweir 									maThresRes.mnThresLogToPixY )+mnOutOffOrigY );
1160*cdf0e10cSrcweir }
1161*cdf0e10cSrcweir 
1162*cdf0e10cSrcweir // -----------------------------------------------------------------------
1163*cdf0e10cSrcweir 
1164*cdf0e10cSrcweir Size OutputDevice::LogicToPixel( const Size& rLogicSize ) const
1165*cdf0e10cSrcweir {
1166*cdf0e10cSrcweir 	DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
1167*cdf0e10cSrcweir 
1168*cdf0e10cSrcweir 	if ( !mbMap )
1169*cdf0e10cSrcweir 		return rLogicSize;
1170*cdf0e10cSrcweir 
1171*cdf0e10cSrcweir 	return Size( ImplLogicToPixel( rLogicSize.Width(), mnDPIX,
1172*cdf0e10cSrcweir 								   maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
1173*cdf0e10cSrcweir 								   maThresRes.mnThresLogToPixX ),
1174*cdf0e10cSrcweir 				 ImplLogicToPixel( rLogicSize.Height(), mnDPIY,
1175*cdf0e10cSrcweir 								   maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
1176*cdf0e10cSrcweir 								   maThresRes.mnThresLogToPixY ) );
1177*cdf0e10cSrcweir }
1178*cdf0e10cSrcweir 
1179*cdf0e10cSrcweir // -----------------------------------------------------------------------
1180*cdf0e10cSrcweir 
1181*cdf0e10cSrcweir Rectangle OutputDevice::LogicToPixel( const Rectangle& rLogicRect ) const
1182*cdf0e10cSrcweir {
1183*cdf0e10cSrcweir 	DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
1184*cdf0e10cSrcweir 
1185*cdf0e10cSrcweir 	if ( !mbMap || rLogicRect.IsEmpty() )
1186*cdf0e10cSrcweir 		return rLogicRect;
1187*cdf0e10cSrcweir 
1188*cdf0e10cSrcweir 	return Rectangle( ImplLogicToPixel( rLogicRect.Left() + maMapRes.mnMapOfsX, mnDPIX,
1189*cdf0e10cSrcweir 										maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
1190*cdf0e10cSrcweir 										maThresRes.mnThresLogToPixX )+mnOutOffOrigX,
1191*cdf0e10cSrcweir 					  ImplLogicToPixel( rLogicRect.Top() + maMapRes.mnMapOfsY, mnDPIY,
1192*cdf0e10cSrcweir 										maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
1193*cdf0e10cSrcweir 										maThresRes.mnThresLogToPixY )+mnOutOffOrigY,
1194*cdf0e10cSrcweir 					  ImplLogicToPixel( rLogicRect.Right() + maMapRes.mnMapOfsX, mnDPIX,
1195*cdf0e10cSrcweir 										maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
1196*cdf0e10cSrcweir 										maThresRes.mnThresLogToPixX )+mnOutOffOrigX,
1197*cdf0e10cSrcweir 					  ImplLogicToPixel( rLogicRect.Bottom() + maMapRes.mnMapOfsY, mnDPIY,
1198*cdf0e10cSrcweir 										maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
1199*cdf0e10cSrcweir 										maThresRes.mnThresLogToPixY )+mnOutOffOrigY );
1200*cdf0e10cSrcweir }
1201*cdf0e10cSrcweir 
1202*cdf0e10cSrcweir // -----------------------------------------------------------------------
1203*cdf0e10cSrcweir 
1204*cdf0e10cSrcweir Polygon OutputDevice::LogicToPixel( const Polygon& rLogicPoly ) const
1205*cdf0e10cSrcweir {
1206*cdf0e10cSrcweir 	DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
1207*cdf0e10cSrcweir 	DBG_CHKOBJ( &rLogicPoly, Polygon, NULL );
1208*cdf0e10cSrcweir 
1209*cdf0e10cSrcweir 	if ( !mbMap )
1210*cdf0e10cSrcweir 		return rLogicPoly;
1211*cdf0e10cSrcweir 
1212*cdf0e10cSrcweir 	sal_uInt16	i;
1213*cdf0e10cSrcweir 	sal_uInt16	nPoints = rLogicPoly.GetSize();
1214*cdf0e10cSrcweir 	Polygon aPoly( rLogicPoly );
1215*cdf0e10cSrcweir 
1216*cdf0e10cSrcweir 	// Pointer auf das Point-Array holen (Daten werden kopiert)
1217*cdf0e10cSrcweir 	const Point* pPointAry = aPoly.GetConstPointAry();
1218*cdf0e10cSrcweir 
1219*cdf0e10cSrcweir     for ( i = 0; i < nPoints; i++ )
1220*cdf0e10cSrcweir     {
1221*cdf0e10cSrcweir         const Point* pPt = &(pPointAry[i]);
1222*cdf0e10cSrcweir         Point aPt;
1223*cdf0e10cSrcweir         aPt.X() = ImplLogicToPixel( pPt->X() + maMapRes.mnMapOfsX, mnDPIX,
1224*cdf0e10cSrcweir                                     maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
1225*cdf0e10cSrcweir                                     maThresRes.mnThresLogToPixX )+mnOutOffOrigX;
1226*cdf0e10cSrcweir         aPt.Y() = ImplLogicToPixel( pPt->Y() + maMapRes.mnMapOfsY, mnDPIY,
1227*cdf0e10cSrcweir                                     maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
1228*cdf0e10cSrcweir                                     maThresRes.mnThresLogToPixY )+mnOutOffOrigY;
1229*cdf0e10cSrcweir         aPoly[i] = aPt;
1230*cdf0e10cSrcweir     }
1231*cdf0e10cSrcweir 
1232*cdf0e10cSrcweir 	return aPoly;
1233*cdf0e10cSrcweir }
1234*cdf0e10cSrcweir 
1235*cdf0e10cSrcweir // -----------------------------------------------------------------------
1236*cdf0e10cSrcweir 
1237*cdf0e10cSrcweir PolyPolygon OutputDevice::LogicToPixel( const PolyPolygon& rLogicPolyPoly ) const
1238*cdf0e10cSrcweir {
1239*cdf0e10cSrcweir 	DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
1240*cdf0e10cSrcweir 	DBG_CHKOBJ( &rLogicPolyPoly, PolyPolygon, NULL );
1241*cdf0e10cSrcweir 
1242*cdf0e10cSrcweir 	if ( !mbMap )
1243*cdf0e10cSrcweir 		return rLogicPolyPoly;
1244*cdf0e10cSrcweir 
1245*cdf0e10cSrcweir 	PolyPolygon aPolyPoly( rLogicPolyPoly );
1246*cdf0e10cSrcweir 	sal_uInt16		nPoly = aPolyPoly.Count();
1247*cdf0e10cSrcweir 	for( sal_uInt16 i = 0; i < nPoly; i++ )
1248*cdf0e10cSrcweir 	{
1249*cdf0e10cSrcweir 		Polygon& rPoly = aPolyPoly[i];
1250*cdf0e10cSrcweir 		rPoly = LogicToPixel( rPoly );
1251*cdf0e10cSrcweir 	}
1252*cdf0e10cSrcweir 	return aPolyPoly;
1253*cdf0e10cSrcweir }
1254*cdf0e10cSrcweir 
1255*cdf0e10cSrcweir // -----------------------------------------------------------------------
1256*cdf0e10cSrcweir 
1257*cdf0e10cSrcweir basegfx::B2DPolygon OutputDevice::LogicToPixel( const basegfx::B2DPolygon& rLogicPoly ) const
1258*cdf0e10cSrcweir {
1259*cdf0e10cSrcweir     basegfx::B2DPolygon aTransformedPoly = rLogicPoly;
1260*cdf0e10cSrcweir     const ::basegfx::B2DHomMatrix& rTransformationMatrix = GetViewTransformation();
1261*cdf0e10cSrcweir     aTransformedPoly.transform( rTransformationMatrix );
1262*cdf0e10cSrcweir     return aTransformedPoly;
1263*cdf0e10cSrcweir }
1264*cdf0e10cSrcweir 
1265*cdf0e10cSrcweir // -----------------------------------------------------------------------
1266*cdf0e10cSrcweir 
1267*cdf0e10cSrcweir basegfx::B2DPolyPolygon OutputDevice::LogicToPixel( const basegfx::B2DPolyPolygon& rLogicPolyPoly ) const
1268*cdf0e10cSrcweir {
1269*cdf0e10cSrcweir     basegfx::B2DPolyPolygon aTransformedPoly = rLogicPolyPoly;
1270*cdf0e10cSrcweir     const ::basegfx::B2DHomMatrix& rTransformationMatrix = GetViewTransformation();
1271*cdf0e10cSrcweir     aTransformedPoly.transform( rTransformationMatrix );
1272*cdf0e10cSrcweir     return aTransformedPoly;
1273*cdf0e10cSrcweir }
1274*cdf0e10cSrcweir 
1275*cdf0e10cSrcweir // -----------------------------------------------------------------------
1276*cdf0e10cSrcweir 
1277*cdf0e10cSrcweir Region OutputDevice::LogicToPixel( const Region& rLogicRegion ) const
1278*cdf0e10cSrcweir {
1279*cdf0e10cSrcweir 	DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
1280*cdf0e10cSrcweir 	DBG_CHKOBJ( &rLogicRegion, Region, ImplDbgTestRegion );
1281*cdf0e10cSrcweir 
1282*cdf0e10cSrcweir 	RegionType eType = rLogicRegion.GetType();
1283*cdf0e10cSrcweir 
1284*cdf0e10cSrcweir 	if ( !mbMap || (eType == REGION_EMPTY) || (eType == REGION_NULL) )
1285*cdf0e10cSrcweir 		return rLogicRegion;
1286*cdf0e10cSrcweir 
1287*cdf0e10cSrcweir 	Region			aRegion;
1288*cdf0e10cSrcweir 	const ImplRegion& rImplRegion = *rLogicRegion.ImplGetImplRegion();
1289*cdf0e10cSrcweir 	const PolyPolygon* pPolyPoly = rImplRegion.mpPolyPoly;
1290*cdf0e10cSrcweir 	const basegfx::B2DPolyPolygon* pB2DPolyPoly = rImplRegion.mpB2DPolyPoly;
1291*cdf0e10cSrcweir 
1292*cdf0e10cSrcweir 	if ( pPolyPoly )
1293*cdf0e10cSrcweir 		aRegion = Region( LogicToPixel( *pPolyPoly ) );
1294*cdf0e10cSrcweir 	else if( pB2DPolyPoly )
1295*cdf0e10cSrcweir 	{
1296*cdf0e10cSrcweir 		basegfx::B2DPolyPolygon aTransformedPoly = *pB2DPolyPoly;
1297*cdf0e10cSrcweir 		const ::basegfx::B2DHomMatrix& rTransformationMatrix = GetViewTransformation();
1298*cdf0e10cSrcweir 		aTransformedPoly.transform( rTransformationMatrix );
1299*cdf0e10cSrcweir 		aRegion = Region( aTransformedPoly );
1300*cdf0e10cSrcweir 	}
1301*cdf0e10cSrcweir 	else
1302*cdf0e10cSrcweir 	{
1303*cdf0e10cSrcweir 		long				nX;
1304*cdf0e10cSrcweir 		long				nY;
1305*cdf0e10cSrcweir 		long				nWidth;
1306*cdf0e10cSrcweir 		long				nHeight;
1307*cdf0e10cSrcweir 		ImplRegionInfo		aInfo;
1308*cdf0e10cSrcweir 		sal_Bool				bRegionRect;
1309*cdf0e10cSrcweir 
1310*cdf0e10cSrcweir 		aRegion.ImplBeginAddRect();
1311*cdf0e10cSrcweir 		bRegionRect = rLogicRegion.ImplGetFirstRect( aInfo, nX, nY, nWidth, nHeight );
1312*cdf0e10cSrcweir 		while ( bRegionRect )
1313*cdf0e10cSrcweir 		{
1314*cdf0e10cSrcweir 			Rectangle aRect( Point( nX, nY ), Size( nWidth, nHeight ) );
1315*cdf0e10cSrcweir 			aRegion.ImplAddRect( LogicToPixel( aRect ) );
1316*cdf0e10cSrcweir 			bRegionRect = rLogicRegion.ImplGetNextRect( aInfo, nX, nY, nWidth, nHeight );
1317*cdf0e10cSrcweir 		}
1318*cdf0e10cSrcweir 		aRegion.ImplEndAddRect();
1319*cdf0e10cSrcweir 	}
1320*cdf0e10cSrcweir 
1321*cdf0e10cSrcweir 	return aRegion;
1322*cdf0e10cSrcweir }
1323*cdf0e10cSrcweir 
1324*cdf0e10cSrcweir // -----------------------------------------------------------------------
1325*cdf0e10cSrcweir 
1326*cdf0e10cSrcweir Point OutputDevice::LogicToPixel( const Point& rLogicPt,
1327*cdf0e10cSrcweir 								  const MapMode& rMapMode ) const
1328*cdf0e10cSrcweir {
1329*cdf0e10cSrcweir 	DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
1330*cdf0e10cSrcweir 
1331*cdf0e10cSrcweir 	if ( rMapMode.IsDefault() )
1332*cdf0e10cSrcweir 		return rLogicPt;
1333*cdf0e10cSrcweir 
1334*cdf0e10cSrcweir 	// MapMode-Aufloesung berechnen und Umrechnen
1335*cdf0e10cSrcweir 	ImplMapRes			aMapRes;
1336*cdf0e10cSrcweir 	ImplThresholdRes	aThresRes;
1337*cdf0e10cSrcweir 	ImplCalcMapResolution( rMapMode, mnDPIX, mnDPIY, aMapRes, aThresRes );
1338*cdf0e10cSrcweir 
1339*cdf0e10cSrcweir 	return Point( ImplLogicToPixel( rLogicPt.X() + aMapRes.mnMapOfsX, mnDPIX,
1340*cdf0e10cSrcweir 									aMapRes.mnMapScNumX, aMapRes.mnMapScDenomX,
1341*cdf0e10cSrcweir 									aThresRes.mnThresLogToPixX )+mnOutOffOrigX,
1342*cdf0e10cSrcweir 				  ImplLogicToPixel( rLogicPt.Y() + aMapRes.mnMapOfsY, mnDPIY,
1343*cdf0e10cSrcweir 									aMapRes.mnMapScNumY, aMapRes.mnMapScDenomY,
1344*cdf0e10cSrcweir 									aThresRes.mnThresLogToPixY )+mnOutOffOrigY );
1345*cdf0e10cSrcweir }
1346*cdf0e10cSrcweir 
1347*cdf0e10cSrcweir // -----------------------------------------------------------------------
1348*cdf0e10cSrcweir 
1349*cdf0e10cSrcweir Size OutputDevice::LogicToPixel( const Size& rLogicSize,
1350*cdf0e10cSrcweir 								 const MapMode& rMapMode ) const
1351*cdf0e10cSrcweir {
1352*cdf0e10cSrcweir 	DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
1353*cdf0e10cSrcweir 
1354*cdf0e10cSrcweir 	if ( rMapMode.IsDefault() )
1355*cdf0e10cSrcweir 		return rLogicSize;
1356*cdf0e10cSrcweir 
1357*cdf0e10cSrcweir 	// MapMode-Aufloesung berechnen und Umrechnen
1358*cdf0e10cSrcweir 	ImplMapRes			aMapRes;
1359*cdf0e10cSrcweir 	ImplThresholdRes	aThresRes;
1360*cdf0e10cSrcweir 	ImplCalcMapResolution( rMapMode, mnDPIX, mnDPIY, aMapRes, aThresRes );
1361*cdf0e10cSrcweir 
1362*cdf0e10cSrcweir 	return Size( ImplLogicToPixel( rLogicSize.Width(), mnDPIX,
1363*cdf0e10cSrcweir 								   aMapRes.mnMapScNumX, aMapRes.mnMapScDenomX,
1364*cdf0e10cSrcweir 								   aThresRes.mnThresLogToPixX ),
1365*cdf0e10cSrcweir 				 ImplLogicToPixel( rLogicSize.Height(), mnDPIY,
1366*cdf0e10cSrcweir 								   aMapRes.mnMapScNumY, aMapRes.mnMapScDenomY,
1367*cdf0e10cSrcweir 								   aThresRes.mnThresLogToPixY ) );
1368*cdf0e10cSrcweir }
1369*cdf0e10cSrcweir 
1370*cdf0e10cSrcweir // -----------------------------------------------------------------------
1371*cdf0e10cSrcweir 
1372*cdf0e10cSrcweir Rectangle OutputDevice::LogicToPixel( const Rectangle& rLogicRect,
1373*cdf0e10cSrcweir 									  const MapMode& rMapMode ) const
1374*cdf0e10cSrcweir {
1375*cdf0e10cSrcweir 	DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
1376*cdf0e10cSrcweir 
1377*cdf0e10cSrcweir 	if ( rMapMode.IsDefault() || rLogicRect.IsEmpty() )
1378*cdf0e10cSrcweir 		return rLogicRect;
1379*cdf0e10cSrcweir 
1380*cdf0e10cSrcweir 	// MapMode-Aufloesung berechnen und Umrechnen
1381*cdf0e10cSrcweir 	ImplMapRes			aMapRes;
1382*cdf0e10cSrcweir 	ImplThresholdRes	aThresRes;
1383*cdf0e10cSrcweir 	ImplCalcMapResolution( rMapMode, mnDPIX, mnDPIY, aMapRes, aThresRes );
1384*cdf0e10cSrcweir 
1385*cdf0e10cSrcweir 	return Rectangle( ImplLogicToPixel( rLogicRect.Left() + aMapRes.mnMapOfsX, mnDPIX,
1386*cdf0e10cSrcweir 										aMapRes.mnMapScNumX, aMapRes.mnMapScDenomX,
1387*cdf0e10cSrcweir 										aThresRes.mnThresLogToPixX )+mnOutOffOrigX,
1388*cdf0e10cSrcweir 					  ImplLogicToPixel( rLogicRect.Top() + aMapRes.mnMapOfsY, mnDPIY,
1389*cdf0e10cSrcweir 										aMapRes.mnMapScNumY, aMapRes.mnMapScDenomY,
1390*cdf0e10cSrcweir 										aThresRes.mnThresLogToPixY )+mnOutOffOrigY,
1391*cdf0e10cSrcweir 					  ImplLogicToPixel( rLogicRect.Right() + aMapRes.mnMapOfsX, mnDPIX,
1392*cdf0e10cSrcweir 										aMapRes.mnMapScNumX, aMapRes.mnMapScDenomX,
1393*cdf0e10cSrcweir 										aThresRes.mnThresLogToPixX )+mnOutOffOrigX,
1394*cdf0e10cSrcweir 					  ImplLogicToPixel( rLogicRect.Bottom() + aMapRes.mnMapOfsY, mnDPIY,
1395*cdf0e10cSrcweir 										aMapRes.mnMapScNumY, aMapRes.mnMapScDenomY,
1396*cdf0e10cSrcweir 										aThresRes.mnThresLogToPixY )+mnOutOffOrigY );
1397*cdf0e10cSrcweir }
1398*cdf0e10cSrcweir 
1399*cdf0e10cSrcweir // -----------------------------------------------------------------------
1400*cdf0e10cSrcweir 
1401*cdf0e10cSrcweir Polygon OutputDevice::LogicToPixel( const Polygon& rLogicPoly,
1402*cdf0e10cSrcweir 									const MapMode& rMapMode ) const
1403*cdf0e10cSrcweir {
1404*cdf0e10cSrcweir 	DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
1405*cdf0e10cSrcweir 	DBG_CHKOBJ( &rLogicPoly, Polygon, NULL );
1406*cdf0e10cSrcweir 
1407*cdf0e10cSrcweir 	if ( rMapMode.IsDefault() )
1408*cdf0e10cSrcweir 		return rLogicPoly;
1409*cdf0e10cSrcweir 
1410*cdf0e10cSrcweir 	// MapMode-Aufloesung berechnen und Umrechnen
1411*cdf0e10cSrcweir 	ImplMapRes			aMapRes;
1412*cdf0e10cSrcweir 	ImplThresholdRes	aThresRes;
1413*cdf0e10cSrcweir 	ImplCalcMapResolution( rMapMode, mnDPIX, mnDPIY, aMapRes, aThresRes );
1414*cdf0e10cSrcweir 
1415*cdf0e10cSrcweir 	sal_uInt16	i;
1416*cdf0e10cSrcweir 	sal_uInt16	nPoints = rLogicPoly.GetSize();
1417*cdf0e10cSrcweir 	Polygon aPoly( rLogicPoly );
1418*cdf0e10cSrcweir 
1419*cdf0e10cSrcweir 	// Pointer auf das Point-Array holen (Daten werden kopiert)
1420*cdf0e10cSrcweir 	const Point* pPointAry = aPoly.GetConstPointAry();
1421*cdf0e10cSrcweir 
1422*cdf0e10cSrcweir     for ( i = 0; i < nPoints; i++ )
1423*cdf0e10cSrcweir     {
1424*cdf0e10cSrcweir         const Point* pPt = &(pPointAry[i]);
1425*cdf0e10cSrcweir         Point aPt;
1426*cdf0e10cSrcweir         aPt.X() = ImplLogicToPixel( pPt->X() + aMapRes.mnMapOfsX, mnDPIX,
1427*cdf0e10cSrcweir                                     aMapRes.mnMapScNumX, aMapRes.mnMapScDenomX,
1428*cdf0e10cSrcweir                                     aThresRes.mnThresLogToPixX )+mnOutOffOrigX;
1429*cdf0e10cSrcweir         aPt.Y() = ImplLogicToPixel( pPt->Y() + aMapRes.mnMapOfsY, mnDPIY,
1430*cdf0e10cSrcweir                                     aMapRes.mnMapScNumY, aMapRes.mnMapScDenomY,
1431*cdf0e10cSrcweir                                     aThresRes.mnThresLogToPixY )+mnOutOffOrigY;
1432*cdf0e10cSrcweir         aPoly[i] = aPt;
1433*cdf0e10cSrcweir     }
1434*cdf0e10cSrcweir 
1435*cdf0e10cSrcweir 	return aPoly;
1436*cdf0e10cSrcweir }
1437*cdf0e10cSrcweir 
1438*cdf0e10cSrcweir // -----------------------------------------------------------------------
1439*cdf0e10cSrcweir 
1440*cdf0e10cSrcweir PolyPolygon OutputDevice::LogicToPixel( const PolyPolygon& rLogicPolyPoly,
1441*cdf0e10cSrcweir 										const MapMode& rMapMode ) const
1442*cdf0e10cSrcweir {
1443*cdf0e10cSrcweir 	DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
1444*cdf0e10cSrcweir 	DBG_CHKOBJ( &rLogicPolyPoly, PolyPolygon, NULL );
1445*cdf0e10cSrcweir 
1446*cdf0e10cSrcweir 	if ( rMapMode.IsDefault() )
1447*cdf0e10cSrcweir 		return rLogicPolyPoly;
1448*cdf0e10cSrcweir 
1449*cdf0e10cSrcweir 	PolyPolygon aPolyPoly( rLogicPolyPoly );
1450*cdf0e10cSrcweir 	sal_uInt16		nPoly = aPolyPoly.Count();
1451*cdf0e10cSrcweir 	for( sal_uInt16 i = 0; i < nPoly; i++ )
1452*cdf0e10cSrcweir 	{
1453*cdf0e10cSrcweir 		Polygon& rPoly = aPolyPoly[i];
1454*cdf0e10cSrcweir 		rPoly = LogicToPixel( rPoly, rMapMode );
1455*cdf0e10cSrcweir 	}
1456*cdf0e10cSrcweir 	return aPolyPoly;
1457*cdf0e10cSrcweir }
1458*cdf0e10cSrcweir 
1459*cdf0e10cSrcweir // -----------------------------------------------------------------------
1460*cdf0e10cSrcweir 
1461*cdf0e10cSrcweir basegfx::B2DPolyPolygon OutputDevice::LogicToPixel( const basegfx::B2DPolyPolygon& rLogicPolyPoly,
1462*cdf0e10cSrcweir                                                     const MapMode& rMapMode ) const
1463*cdf0e10cSrcweir {
1464*cdf0e10cSrcweir     basegfx::B2DPolyPolygon aTransformedPoly = rLogicPolyPoly;
1465*cdf0e10cSrcweir     const ::basegfx::B2DHomMatrix& rTransformationMatrix = GetViewTransformation( rMapMode );
1466*cdf0e10cSrcweir     aTransformedPoly.transform( rTransformationMatrix );
1467*cdf0e10cSrcweir     return aTransformedPoly;
1468*cdf0e10cSrcweir }
1469*cdf0e10cSrcweir 
1470*cdf0e10cSrcweir // -----------------------------------------------------------------------
1471*cdf0e10cSrcweir 
1472*cdf0e10cSrcweir basegfx::B2DPolygon OutputDevice::LogicToPixel( const basegfx::B2DPolygon& rLogicPoly,
1473*cdf0e10cSrcweir                                                 const MapMode& rMapMode ) const
1474*cdf0e10cSrcweir {
1475*cdf0e10cSrcweir     basegfx::B2DPolygon aTransformedPoly = rLogicPoly;
1476*cdf0e10cSrcweir     const ::basegfx::B2DHomMatrix& rTransformationMatrix = GetViewTransformation( rMapMode );
1477*cdf0e10cSrcweir     aTransformedPoly.transform( rTransformationMatrix );
1478*cdf0e10cSrcweir     return aTransformedPoly;
1479*cdf0e10cSrcweir }
1480*cdf0e10cSrcweir 
1481*cdf0e10cSrcweir // -----------------------------------------------------------------------
1482*cdf0e10cSrcweir 
1483*cdf0e10cSrcweir Region OutputDevice::LogicToPixel( const Region& rLogicRegion,
1484*cdf0e10cSrcweir 								   const MapMode& rMapMode ) const
1485*cdf0e10cSrcweir {
1486*cdf0e10cSrcweir 	DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
1487*cdf0e10cSrcweir 	DBG_CHKOBJ( &rLogicRegion, Region, ImplDbgTestRegion );
1488*cdf0e10cSrcweir 
1489*cdf0e10cSrcweir 	RegionType eType = rLogicRegion.GetType();
1490*cdf0e10cSrcweir 
1491*cdf0e10cSrcweir 	if ( rMapMode.IsDefault() || (eType == REGION_EMPTY) || (eType == REGION_NULL) )
1492*cdf0e10cSrcweir 		return rLogicRegion;
1493*cdf0e10cSrcweir 
1494*cdf0e10cSrcweir 	Region			aRegion;
1495*cdf0e10cSrcweir 	PolyPolygon*	pPolyPoly = rLogicRegion.ImplGetImplRegion()->mpPolyPoly;
1496*cdf0e10cSrcweir 
1497*cdf0e10cSrcweir 	if( pPolyPoly )
1498*cdf0e10cSrcweir 		aRegion = Region( LogicToPixel( *pPolyPoly, rMapMode ) );
1499*cdf0e10cSrcweir 	else
1500*cdf0e10cSrcweir 	{
1501*cdf0e10cSrcweir 		long				nX;
1502*cdf0e10cSrcweir 		long				nY;
1503*cdf0e10cSrcweir 		long				nWidth;
1504*cdf0e10cSrcweir 		long				nHeight;
1505*cdf0e10cSrcweir 		ImplRegionInfo		aInfo;
1506*cdf0e10cSrcweir 		sal_Bool				bRegionRect;
1507*cdf0e10cSrcweir 
1508*cdf0e10cSrcweir 		aRegion.ImplBeginAddRect();
1509*cdf0e10cSrcweir 		bRegionRect = rLogicRegion.ImplGetFirstRect( aInfo, nX, nY, nWidth, nHeight );
1510*cdf0e10cSrcweir 		while ( bRegionRect )
1511*cdf0e10cSrcweir 		{
1512*cdf0e10cSrcweir 			Rectangle aRect( Point( nX, nY ), Size( nWidth, nHeight ) );
1513*cdf0e10cSrcweir 			aRegion.ImplAddRect( LogicToPixel( aRect, rMapMode ) );
1514*cdf0e10cSrcweir 			bRegionRect = rLogicRegion.ImplGetNextRect( aInfo, nX, nY, nWidth, nHeight );
1515*cdf0e10cSrcweir 		}
1516*cdf0e10cSrcweir 		aRegion.ImplEndAddRect();
1517*cdf0e10cSrcweir 	}
1518*cdf0e10cSrcweir 
1519*cdf0e10cSrcweir 	return aRegion;
1520*cdf0e10cSrcweir }
1521*cdf0e10cSrcweir 
1522*cdf0e10cSrcweir // -----------------------------------------------------------------------
1523*cdf0e10cSrcweir 
1524*cdf0e10cSrcweir Point OutputDevice::PixelToLogic( const Point& rDevicePt ) const
1525*cdf0e10cSrcweir {
1526*cdf0e10cSrcweir 	DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
1527*cdf0e10cSrcweir 
1528*cdf0e10cSrcweir 	if ( !mbMap )
1529*cdf0e10cSrcweir 		return rDevicePt;
1530*cdf0e10cSrcweir 
1531*cdf0e10cSrcweir 	return Point( ImplPixelToLogic( rDevicePt.X(), mnDPIX,
1532*cdf0e10cSrcweir 									maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
1533*cdf0e10cSrcweir 									maThresRes.mnThresPixToLogX ) - maMapRes.mnMapOfsX - mnOutOffLogicX,
1534*cdf0e10cSrcweir 				  ImplPixelToLogic( rDevicePt.Y(), mnDPIY,
1535*cdf0e10cSrcweir 									maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
1536*cdf0e10cSrcweir 									maThresRes.mnThresPixToLogY ) - maMapRes.mnMapOfsY - mnOutOffLogicY );
1537*cdf0e10cSrcweir }
1538*cdf0e10cSrcweir 
1539*cdf0e10cSrcweir // -----------------------------------------------------------------------
1540*cdf0e10cSrcweir 
1541*cdf0e10cSrcweir Size OutputDevice::PixelToLogic( const Size& rDeviceSize ) const
1542*cdf0e10cSrcweir {
1543*cdf0e10cSrcweir 	DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
1544*cdf0e10cSrcweir 
1545*cdf0e10cSrcweir 	if ( !mbMap )
1546*cdf0e10cSrcweir 		return rDeviceSize;
1547*cdf0e10cSrcweir 
1548*cdf0e10cSrcweir 	return Size( ImplPixelToLogic( rDeviceSize.Width(), mnDPIX,
1549*cdf0e10cSrcweir 								   maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
1550*cdf0e10cSrcweir 								   maThresRes.mnThresPixToLogX ),
1551*cdf0e10cSrcweir 				 ImplPixelToLogic( rDeviceSize.Height(), mnDPIY,
1552*cdf0e10cSrcweir 								   maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
1553*cdf0e10cSrcweir 								   maThresRes.mnThresPixToLogY ) );
1554*cdf0e10cSrcweir }
1555*cdf0e10cSrcweir 
1556*cdf0e10cSrcweir // -----------------------------------------------------------------------
1557*cdf0e10cSrcweir 
1558*cdf0e10cSrcweir Rectangle OutputDevice::PixelToLogic( const Rectangle& rDeviceRect ) const
1559*cdf0e10cSrcweir {
1560*cdf0e10cSrcweir 	DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
1561*cdf0e10cSrcweir 
1562*cdf0e10cSrcweir 	if ( !mbMap || rDeviceRect.IsEmpty() )
1563*cdf0e10cSrcweir 		return rDeviceRect;
1564*cdf0e10cSrcweir 
1565*cdf0e10cSrcweir 	return Rectangle( ImplPixelToLogic( rDeviceRect.Left(), mnDPIX,
1566*cdf0e10cSrcweir 										maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
1567*cdf0e10cSrcweir 										maThresRes.mnThresPixToLogX ) - maMapRes.mnMapOfsX - mnOutOffLogicX,
1568*cdf0e10cSrcweir 					  ImplPixelToLogic( rDeviceRect.Top(), mnDPIY,
1569*cdf0e10cSrcweir 										maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
1570*cdf0e10cSrcweir 										maThresRes.mnThresPixToLogY ) - maMapRes.mnMapOfsY - mnOutOffLogicY,
1571*cdf0e10cSrcweir 					  ImplPixelToLogic( rDeviceRect.Right(), mnDPIX,
1572*cdf0e10cSrcweir 										maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
1573*cdf0e10cSrcweir 										maThresRes.mnThresPixToLogX ) - maMapRes.mnMapOfsX - mnOutOffLogicX,
1574*cdf0e10cSrcweir 					  ImplPixelToLogic( rDeviceRect.Bottom(), mnDPIY,
1575*cdf0e10cSrcweir 										maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
1576*cdf0e10cSrcweir 										maThresRes.mnThresPixToLogY ) - maMapRes.mnMapOfsY - mnOutOffLogicY );
1577*cdf0e10cSrcweir }
1578*cdf0e10cSrcweir 
1579*cdf0e10cSrcweir // -----------------------------------------------------------------------
1580*cdf0e10cSrcweir 
1581*cdf0e10cSrcweir Polygon OutputDevice::PixelToLogic( const Polygon& rDevicePoly ) const
1582*cdf0e10cSrcweir {
1583*cdf0e10cSrcweir 	DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
1584*cdf0e10cSrcweir 	DBG_CHKOBJ( &rDevicePoly, Polygon, NULL );
1585*cdf0e10cSrcweir 
1586*cdf0e10cSrcweir 	if ( !mbMap )
1587*cdf0e10cSrcweir 		return rDevicePoly;
1588*cdf0e10cSrcweir 
1589*cdf0e10cSrcweir 	sal_uInt16	i;
1590*cdf0e10cSrcweir 	sal_uInt16	nPoints = rDevicePoly.GetSize();
1591*cdf0e10cSrcweir 	Polygon aPoly( rDevicePoly );
1592*cdf0e10cSrcweir 
1593*cdf0e10cSrcweir 	// Pointer auf das Point-Array holen (Daten werden kopiert)
1594*cdf0e10cSrcweir 	const Point* pPointAry = aPoly.GetConstPointAry();
1595*cdf0e10cSrcweir 
1596*cdf0e10cSrcweir     for ( i = 0; i < nPoints; i++ )
1597*cdf0e10cSrcweir     {
1598*cdf0e10cSrcweir         const Point* pPt = &(pPointAry[i]);
1599*cdf0e10cSrcweir         Point aPt;
1600*cdf0e10cSrcweir         aPt.X() = ImplPixelToLogic( pPt->X(), mnDPIX,
1601*cdf0e10cSrcweir                                     maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
1602*cdf0e10cSrcweir                                     maThresRes.mnThresPixToLogX ) - maMapRes.mnMapOfsX - mnOutOffLogicX;
1603*cdf0e10cSrcweir         aPt.Y() = ImplPixelToLogic( pPt->Y(), mnDPIY,
1604*cdf0e10cSrcweir                                     maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
1605*cdf0e10cSrcweir                                     maThresRes.mnThresPixToLogY ) - maMapRes.mnMapOfsY - mnOutOffLogicY;
1606*cdf0e10cSrcweir         aPoly[i] = aPt;
1607*cdf0e10cSrcweir     }
1608*cdf0e10cSrcweir 
1609*cdf0e10cSrcweir 	return aPoly;
1610*cdf0e10cSrcweir }
1611*cdf0e10cSrcweir 
1612*cdf0e10cSrcweir // -----------------------------------------------------------------------
1613*cdf0e10cSrcweir 
1614*cdf0e10cSrcweir PolyPolygon OutputDevice::PixelToLogic( const PolyPolygon& rDevicePolyPoly ) const
1615*cdf0e10cSrcweir {
1616*cdf0e10cSrcweir 	DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
1617*cdf0e10cSrcweir 	DBG_CHKOBJ( &rDevicePolyPoly, PolyPolygon, NULL );
1618*cdf0e10cSrcweir 
1619*cdf0e10cSrcweir 	if ( !mbMap )
1620*cdf0e10cSrcweir 		return rDevicePolyPoly;
1621*cdf0e10cSrcweir 
1622*cdf0e10cSrcweir 	PolyPolygon aPolyPoly( rDevicePolyPoly );
1623*cdf0e10cSrcweir 	sal_uInt16		nPoly = aPolyPoly.Count();
1624*cdf0e10cSrcweir 	for( sal_uInt16 i = 0; i < nPoly; i++ )
1625*cdf0e10cSrcweir 	{
1626*cdf0e10cSrcweir 		Polygon& rPoly = aPolyPoly[i];
1627*cdf0e10cSrcweir 		rPoly = PixelToLogic( rPoly );
1628*cdf0e10cSrcweir 	}
1629*cdf0e10cSrcweir 	return aPolyPoly;
1630*cdf0e10cSrcweir }
1631*cdf0e10cSrcweir 
1632*cdf0e10cSrcweir // -----------------------------------------------------------------------
1633*cdf0e10cSrcweir 
1634*cdf0e10cSrcweir basegfx::B2DPolygon OutputDevice::PixelToLogic( const basegfx::B2DPolygon& rPixelPoly ) const
1635*cdf0e10cSrcweir {
1636*cdf0e10cSrcweir     basegfx::B2DPolygon aTransformedPoly = rPixelPoly;
1637*cdf0e10cSrcweir     const ::basegfx::B2DHomMatrix& rTransformationMatrix = GetInverseViewTransformation();
1638*cdf0e10cSrcweir     aTransformedPoly.transform( rTransformationMatrix );
1639*cdf0e10cSrcweir     return aTransformedPoly;
1640*cdf0e10cSrcweir }
1641*cdf0e10cSrcweir 
1642*cdf0e10cSrcweir // -----------------------------------------------------------------------
1643*cdf0e10cSrcweir 
1644*cdf0e10cSrcweir basegfx::B2DPolyPolygon OutputDevice::PixelToLogic( const basegfx::B2DPolyPolygon& rPixelPolyPoly ) const
1645*cdf0e10cSrcweir {
1646*cdf0e10cSrcweir     basegfx::B2DPolyPolygon aTransformedPoly = rPixelPolyPoly;
1647*cdf0e10cSrcweir     const ::basegfx::B2DHomMatrix& rTransformationMatrix = GetInverseViewTransformation();
1648*cdf0e10cSrcweir     aTransformedPoly.transform( rTransformationMatrix );
1649*cdf0e10cSrcweir     return aTransformedPoly;
1650*cdf0e10cSrcweir }
1651*cdf0e10cSrcweir 
1652*cdf0e10cSrcweir // -----------------------------------------------------------------------
1653*cdf0e10cSrcweir 
1654*cdf0e10cSrcweir Region OutputDevice::PixelToLogic( const Region& rDeviceRegion ) const
1655*cdf0e10cSrcweir {
1656*cdf0e10cSrcweir 	DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
1657*cdf0e10cSrcweir 	DBG_CHKOBJ( &rDeviceRegion, Region, ImplDbgTestRegion );
1658*cdf0e10cSrcweir 
1659*cdf0e10cSrcweir 	RegionType eType = rDeviceRegion.GetType();
1660*cdf0e10cSrcweir 
1661*cdf0e10cSrcweir 	if ( !mbMap || (eType == REGION_EMPTY) || (eType == REGION_NULL) )
1662*cdf0e10cSrcweir 		return rDeviceRegion;
1663*cdf0e10cSrcweir 
1664*cdf0e10cSrcweir 	Region			aRegion;
1665*cdf0e10cSrcweir 	PolyPolygon*	pPolyPoly = rDeviceRegion.ImplGetImplRegion()->mpPolyPoly;
1666*cdf0e10cSrcweir 
1667*cdf0e10cSrcweir 	if ( pPolyPoly )
1668*cdf0e10cSrcweir 		aRegion = Region( PixelToLogic( *pPolyPoly ) );
1669*cdf0e10cSrcweir 	else
1670*cdf0e10cSrcweir 	{
1671*cdf0e10cSrcweir 		long				nX;
1672*cdf0e10cSrcweir 		long				nY;
1673*cdf0e10cSrcweir 		long				nWidth;
1674*cdf0e10cSrcweir 		long				nHeight;
1675*cdf0e10cSrcweir 		ImplRegionInfo		aInfo;
1676*cdf0e10cSrcweir 		sal_Bool				bRegionRect;
1677*cdf0e10cSrcweir 
1678*cdf0e10cSrcweir 		aRegion.ImplBeginAddRect();
1679*cdf0e10cSrcweir 		bRegionRect = rDeviceRegion.ImplGetFirstRect( aInfo, nX, nY, nWidth, nHeight );
1680*cdf0e10cSrcweir 		while ( bRegionRect )
1681*cdf0e10cSrcweir 		{
1682*cdf0e10cSrcweir 			Rectangle aRect( Point( nX, nY ), Size( nWidth, nHeight ) );
1683*cdf0e10cSrcweir 			aRegion.ImplAddRect( PixelToLogic( aRect ) );
1684*cdf0e10cSrcweir 			bRegionRect = rDeviceRegion.ImplGetNextRect( aInfo, nX, nY, nWidth, nHeight );
1685*cdf0e10cSrcweir 		}
1686*cdf0e10cSrcweir 		aRegion.ImplEndAddRect();
1687*cdf0e10cSrcweir 	}
1688*cdf0e10cSrcweir 
1689*cdf0e10cSrcweir 	return aRegion;
1690*cdf0e10cSrcweir }
1691*cdf0e10cSrcweir 
1692*cdf0e10cSrcweir // -----------------------------------------------------------------------
1693*cdf0e10cSrcweir 
1694*cdf0e10cSrcweir Point OutputDevice::PixelToLogic( const Point& rDevicePt,
1695*cdf0e10cSrcweir 								  const MapMode& rMapMode ) const
1696*cdf0e10cSrcweir {
1697*cdf0e10cSrcweir 	DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
1698*cdf0e10cSrcweir 
1699*cdf0e10cSrcweir 	// Ist Default-MapMode, dann bereche nichts
1700*cdf0e10cSrcweir 	if ( rMapMode.IsDefault() )
1701*cdf0e10cSrcweir 		return rDevicePt;
1702*cdf0e10cSrcweir 
1703*cdf0e10cSrcweir 	// MapMode-Aufloesung berechnen und Umrechnen
1704*cdf0e10cSrcweir 	ImplMapRes			aMapRes;
1705*cdf0e10cSrcweir 	ImplThresholdRes	aThresRes;
1706*cdf0e10cSrcweir 	ImplCalcMapResolution( rMapMode, mnDPIX, mnDPIY, aMapRes, aThresRes );
1707*cdf0e10cSrcweir 
1708*cdf0e10cSrcweir 	return Point( ImplPixelToLogic( rDevicePt.X(), mnDPIX,
1709*cdf0e10cSrcweir 									aMapRes.mnMapScNumX, aMapRes.mnMapScDenomX,
1710*cdf0e10cSrcweir 									aThresRes.mnThresPixToLogX ) - aMapRes.mnMapOfsX - mnOutOffLogicX,
1711*cdf0e10cSrcweir 				  ImplPixelToLogic( rDevicePt.Y(), mnDPIY,
1712*cdf0e10cSrcweir 									aMapRes.mnMapScNumY, aMapRes.mnMapScDenomY,
1713*cdf0e10cSrcweir 									aThresRes.mnThresPixToLogY ) - aMapRes.mnMapOfsY - mnOutOffLogicY );
1714*cdf0e10cSrcweir }
1715*cdf0e10cSrcweir 
1716*cdf0e10cSrcweir // -----------------------------------------------------------------------
1717*cdf0e10cSrcweir 
1718*cdf0e10cSrcweir Size OutputDevice::PixelToLogic( const Size& rDeviceSize,
1719*cdf0e10cSrcweir 								 const MapMode& rMapMode ) const
1720*cdf0e10cSrcweir {
1721*cdf0e10cSrcweir 	DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
1722*cdf0e10cSrcweir 
1723*cdf0e10cSrcweir 	// Ist Default-MapMode, dann bereche nichts
1724*cdf0e10cSrcweir 	if ( rMapMode.IsDefault() )
1725*cdf0e10cSrcweir 		return rDeviceSize;
1726*cdf0e10cSrcweir 
1727*cdf0e10cSrcweir 	// MapMode-Aufloesung berechnen und Umrechnen
1728*cdf0e10cSrcweir 	ImplMapRes			aMapRes;
1729*cdf0e10cSrcweir 	ImplThresholdRes	aThresRes;
1730*cdf0e10cSrcweir 	ImplCalcMapResolution( rMapMode, mnDPIX, mnDPIY, aMapRes, aThresRes );
1731*cdf0e10cSrcweir 
1732*cdf0e10cSrcweir 	return Size( ImplPixelToLogic( rDeviceSize.Width(), mnDPIX,
1733*cdf0e10cSrcweir 								   aMapRes.mnMapScNumX, aMapRes.mnMapScDenomX,
1734*cdf0e10cSrcweir 								   aThresRes.mnThresPixToLogX ),
1735*cdf0e10cSrcweir 				 ImplPixelToLogic( rDeviceSize.Height(), mnDPIY,
1736*cdf0e10cSrcweir 								   aMapRes.mnMapScNumY, aMapRes.mnMapScDenomY,
1737*cdf0e10cSrcweir 								   aThresRes.mnThresPixToLogY ) );
1738*cdf0e10cSrcweir }
1739*cdf0e10cSrcweir 
1740*cdf0e10cSrcweir // -----------------------------------------------------------------------
1741*cdf0e10cSrcweir 
1742*cdf0e10cSrcweir Rectangle OutputDevice::PixelToLogic( const Rectangle& rDeviceRect,
1743*cdf0e10cSrcweir 									  const MapMode& rMapMode ) const
1744*cdf0e10cSrcweir {
1745*cdf0e10cSrcweir 	DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
1746*cdf0e10cSrcweir 
1747*cdf0e10cSrcweir 	// Ist Default-MapMode, dann bereche nichts
1748*cdf0e10cSrcweir 	if ( rMapMode.IsDefault() || rDeviceRect.IsEmpty() )
1749*cdf0e10cSrcweir 		return rDeviceRect;
1750*cdf0e10cSrcweir 
1751*cdf0e10cSrcweir 	// MapMode-Aufloesung berechnen und Umrechnen
1752*cdf0e10cSrcweir 	ImplMapRes			aMapRes;
1753*cdf0e10cSrcweir 	ImplThresholdRes	aThresRes;
1754*cdf0e10cSrcweir 	ImplCalcMapResolution( rMapMode, mnDPIX, mnDPIY, aMapRes, aThresRes );
1755*cdf0e10cSrcweir 
1756*cdf0e10cSrcweir 	return Rectangle( ImplPixelToLogic( rDeviceRect.Left(), mnDPIX,
1757*cdf0e10cSrcweir 										aMapRes.mnMapScNumX, aMapRes.mnMapScDenomX,
1758*cdf0e10cSrcweir 										aThresRes.mnThresPixToLogX ) - aMapRes.mnMapOfsX - mnOutOffLogicX,
1759*cdf0e10cSrcweir 					  ImplPixelToLogic( rDeviceRect.Top(), mnDPIY,
1760*cdf0e10cSrcweir 										aMapRes.mnMapScNumY, aMapRes.mnMapScDenomY,
1761*cdf0e10cSrcweir 										aThresRes.mnThresPixToLogY ) - aMapRes.mnMapOfsY - mnOutOffLogicY,
1762*cdf0e10cSrcweir 					  ImplPixelToLogic( rDeviceRect.Right(), mnDPIX,
1763*cdf0e10cSrcweir 										aMapRes.mnMapScNumX, aMapRes.mnMapScDenomX,
1764*cdf0e10cSrcweir 										aThresRes.mnThresPixToLogX ) - aMapRes.mnMapOfsX - mnOutOffLogicX,
1765*cdf0e10cSrcweir 					  ImplPixelToLogic( rDeviceRect.Bottom(), mnDPIY,
1766*cdf0e10cSrcweir 										aMapRes.mnMapScNumY, aMapRes.mnMapScDenomY,
1767*cdf0e10cSrcweir 										aThresRes.mnThresPixToLogY ) - aMapRes.mnMapOfsY - mnOutOffLogicY );
1768*cdf0e10cSrcweir }
1769*cdf0e10cSrcweir 
1770*cdf0e10cSrcweir // -----------------------------------------------------------------------
1771*cdf0e10cSrcweir 
1772*cdf0e10cSrcweir Polygon OutputDevice::PixelToLogic( const Polygon& rDevicePoly,
1773*cdf0e10cSrcweir 									const MapMode& rMapMode ) const
1774*cdf0e10cSrcweir {
1775*cdf0e10cSrcweir 	DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
1776*cdf0e10cSrcweir 	DBG_CHKOBJ( &rDevicePoly, Polygon, NULL );
1777*cdf0e10cSrcweir 
1778*cdf0e10cSrcweir 	// Ist Default-MapMode, dann bereche nichts
1779*cdf0e10cSrcweir 	if ( rMapMode.IsDefault() )
1780*cdf0e10cSrcweir 		return rDevicePoly;
1781*cdf0e10cSrcweir 
1782*cdf0e10cSrcweir 	// MapMode-Aufloesung berechnen und Umrechnen
1783*cdf0e10cSrcweir 	ImplMapRes			aMapRes;
1784*cdf0e10cSrcweir 	ImplThresholdRes	aThresRes;
1785*cdf0e10cSrcweir 	ImplCalcMapResolution( rMapMode, mnDPIX, mnDPIY, aMapRes, aThresRes );
1786*cdf0e10cSrcweir 
1787*cdf0e10cSrcweir 	sal_uInt16	i;
1788*cdf0e10cSrcweir 	sal_uInt16	nPoints = rDevicePoly.GetSize();
1789*cdf0e10cSrcweir 	Polygon aPoly( rDevicePoly );
1790*cdf0e10cSrcweir 
1791*cdf0e10cSrcweir 	// Pointer auf das Point-Array holen (Daten werden kopiert)
1792*cdf0e10cSrcweir 	const Point* pPointAry = aPoly.GetConstPointAry();
1793*cdf0e10cSrcweir 
1794*cdf0e10cSrcweir     for ( i = 0; i < nPoints; i++ )
1795*cdf0e10cSrcweir     {
1796*cdf0e10cSrcweir         const Point* pPt = &(pPointAry[i]);
1797*cdf0e10cSrcweir         Point aPt;
1798*cdf0e10cSrcweir         aPt.X() = ImplPixelToLogic( pPt->X(), mnDPIX,
1799*cdf0e10cSrcweir                                     aMapRes.mnMapScNumX, aMapRes.mnMapScDenomX,
1800*cdf0e10cSrcweir                                     aThresRes.mnThresPixToLogX ) - aMapRes.mnMapOfsX - mnOutOffLogicX;
1801*cdf0e10cSrcweir         aPt.Y() = ImplPixelToLogic( pPt->Y(), mnDPIY,
1802*cdf0e10cSrcweir                                     aMapRes.mnMapScNumY, aMapRes.mnMapScDenomY,
1803*cdf0e10cSrcweir                                     aThresRes.mnThresPixToLogY ) - aMapRes.mnMapOfsY - mnOutOffLogicY;
1804*cdf0e10cSrcweir         aPoly[i] = aPt;
1805*cdf0e10cSrcweir     }
1806*cdf0e10cSrcweir 
1807*cdf0e10cSrcweir 	return aPoly;
1808*cdf0e10cSrcweir }
1809*cdf0e10cSrcweir 
1810*cdf0e10cSrcweir // -----------------------------------------------------------------------
1811*cdf0e10cSrcweir 
1812*cdf0e10cSrcweir PolyPolygon OutputDevice::PixelToLogic( const PolyPolygon& rDevicePolyPoly,
1813*cdf0e10cSrcweir 										const MapMode& rMapMode ) const
1814*cdf0e10cSrcweir {
1815*cdf0e10cSrcweir 	DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
1816*cdf0e10cSrcweir 	DBG_CHKOBJ( &rDevicePolyPoly, PolyPolygon, NULL );
1817*cdf0e10cSrcweir 
1818*cdf0e10cSrcweir 	if ( rMapMode.IsDefault() )
1819*cdf0e10cSrcweir 		return rDevicePolyPoly;
1820*cdf0e10cSrcweir 
1821*cdf0e10cSrcweir 	PolyPolygon aPolyPoly( rDevicePolyPoly );
1822*cdf0e10cSrcweir 	sal_uInt16		nPoly = aPolyPoly.Count();
1823*cdf0e10cSrcweir 	for( sal_uInt16 i = 0; i < nPoly; i++ )
1824*cdf0e10cSrcweir 	{
1825*cdf0e10cSrcweir 		Polygon& rPoly = aPolyPoly[i];
1826*cdf0e10cSrcweir 		rPoly = PixelToLogic( rPoly, rMapMode );
1827*cdf0e10cSrcweir 	}
1828*cdf0e10cSrcweir 	return aPolyPoly;
1829*cdf0e10cSrcweir }
1830*cdf0e10cSrcweir 
1831*cdf0e10cSrcweir // -----------------------------------------------------------------------
1832*cdf0e10cSrcweir 
1833*cdf0e10cSrcweir basegfx::B2DPolygon OutputDevice::PixelToLogic( const basegfx::B2DPolygon& rPixelPoly,
1834*cdf0e10cSrcweir                                                 const MapMode& rMapMode ) const
1835*cdf0e10cSrcweir {
1836*cdf0e10cSrcweir     basegfx::B2DPolygon aTransformedPoly = rPixelPoly;
1837*cdf0e10cSrcweir     const ::basegfx::B2DHomMatrix& rTransformationMatrix = GetInverseViewTransformation( rMapMode );
1838*cdf0e10cSrcweir     aTransformedPoly.transform( rTransformationMatrix );
1839*cdf0e10cSrcweir     return aTransformedPoly;
1840*cdf0e10cSrcweir }
1841*cdf0e10cSrcweir 
1842*cdf0e10cSrcweir // -----------------------------------------------------------------------
1843*cdf0e10cSrcweir 
1844*cdf0e10cSrcweir basegfx::B2DPolyPolygon OutputDevice::PixelToLogic( const basegfx::B2DPolyPolygon& rPixelPolyPoly,
1845*cdf0e10cSrcweir                                                     const MapMode& rMapMode ) const
1846*cdf0e10cSrcweir {
1847*cdf0e10cSrcweir     basegfx::B2DPolyPolygon aTransformedPoly = rPixelPolyPoly;
1848*cdf0e10cSrcweir     const ::basegfx::B2DHomMatrix& rTransformationMatrix = GetInverseViewTransformation( rMapMode );
1849*cdf0e10cSrcweir     aTransformedPoly.transform( rTransformationMatrix );
1850*cdf0e10cSrcweir     return aTransformedPoly;
1851*cdf0e10cSrcweir }
1852*cdf0e10cSrcweir 
1853*cdf0e10cSrcweir // -----------------------------------------------------------------------
1854*cdf0e10cSrcweir 
1855*cdf0e10cSrcweir Region OutputDevice::PixelToLogic( const Region& rDeviceRegion,
1856*cdf0e10cSrcweir 								   const MapMode& rMapMode ) const
1857*cdf0e10cSrcweir {
1858*cdf0e10cSrcweir 	DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
1859*cdf0e10cSrcweir 	DBG_CHKOBJ( &rDeviceRegion, Region, ImplDbgTestRegion );
1860*cdf0e10cSrcweir 
1861*cdf0e10cSrcweir 	RegionType eType = rDeviceRegion.GetType();
1862*cdf0e10cSrcweir 
1863*cdf0e10cSrcweir 	if ( rMapMode.IsDefault() || (eType == REGION_EMPTY) || (eType == REGION_NULL) )
1864*cdf0e10cSrcweir 		return rDeviceRegion;
1865*cdf0e10cSrcweir 
1866*cdf0e10cSrcweir 	Region			aRegion;
1867*cdf0e10cSrcweir 	PolyPolygon*	pPolyPoly = rDeviceRegion.ImplGetImplRegion()->mpPolyPoly;
1868*cdf0e10cSrcweir 
1869*cdf0e10cSrcweir 	if ( pPolyPoly )
1870*cdf0e10cSrcweir 		aRegion = Region( PixelToLogic( *pPolyPoly, rMapMode ) );
1871*cdf0e10cSrcweir 	else
1872*cdf0e10cSrcweir 	{
1873*cdf0e10cSrcweir 		long				nX;
1874*cdf0e10cSrcweir 		long				nY;
1875*cdf0e10cSrcweir 		long				nWidth;
1876*cdf0e10cSrcweir 		long				nHeight;
1877*cdf0e10cSrcweir 		ImplRegionInfo		aInfo;
1878*cdf0e10cSrcweir 		sal_Bool				bRegionRect;
1879*cdf0e10cSrcweir 
1880*cdf0e10cSrcweir 		aRegion.ImplBeginAddRect();
1881*cdf0e10cSrcweir 		bRegionRect = rDeviceRegion.ImplGetFirstRect( aInfo, nX, nY, nWidth, nHeight );
1882*cdf0e10cSrcweir 		while ( bRegionRect )
1883*cdf0e10cSrcweir 		{
1884*cdf0e10cSrcweir 			Rectangle aRect( Point( nX, nY ), Size( nWidth, nHeight ) );
1885*cdf0e10cSrcweir 			aRegion.ImplAddRect( PixelToLogic( aRect, rMapMode ) );
1886*cdf0e10cSrcweir 			bRegionRect = rDeviceRegion.ImplGetNextRect( aInfo, nX, nY, nWidth, nHeight );
1887*cdf0e10cSrcweir 		}
1888*cdf0e10cSrcweir 		aRegion.ImplEndAddRect();
1889*cdf0e10cSrcweir 	}
1890*cdf0e10cSrcweir 
1891*cdf0e10cSrcweir 	return aRegion;
1892*cdf0e10cSrcweir }
1893*cdf0e10cSrcweir 
1894*cdf0e10cSrcweir // -----------------------------------------------------------------------
1895*cdf0e10cSrcweir 
1896*cdf0e10cSrcweir #define ENTER0( rSource, pMapModeSource, pMapModeDest ) 				\
1897*cdf0e10cSrcweir 	if ( !pMapModeSource )												\
1898*cdf0e10cSrcweir 		pMapModeSource = &maMapMode;									\
1899*cdf0e10cSrcweir 	if ( !pMapModeDest )												\
1900*cdf0e10cSrcweir 		pMapModeDest = &maMapMode;										\
1901*cdf0e10cSrcweir 	if ( *pMapModeSource == *pMapModeDest ) 							\
1902*cdf0e10cSrcweir 		return rSource
1903*cdf0e10cSrcweir 
1904*cdf0e10cSrcweir // -----------------------------------------------------------------------
1905*cdf0e10cSrcweir 
1906*cdf0e10cSrcweir #define ENTER1( rSource, pMapModeSource, pMapModeDest ) 				\
1907*cdf0e10cSrcweir 	ENTER0( rSource, pMapModeSource, pMapModeDest );					\
1908*cdf0e10cSrcweir 																		\
1909*cdf0e10cSrcweir 	ImplMapRes aMapResSource;											\
1910*cdf0e10cSrcweir 	ImplMapRes aMapResDest; 											\
1911*cdf0e10cSrcweir 																		\
1912*cdf0e10cSrcweir 	if ( !mbMap || pMapModeSource != &maMapMode )						\
1913*cdf0e10cSrcweir 	{																	\
1914*cdf0e10cSrcweir 		if ( pMapModeSource->GetMapUnit() == MAP_RELATIVE ) 			\
1915*cdf0e10cSrcweir 			aMapResSource = maMapRes;									\
1916*cdf0e10cSrcweir 		ImplCalcMapResolution( *pMapModeSource, 						\
1917*cdf0e10cSrcweir 							   mnDPIX, mnDPIY, aMapResSource ); 		\
1918*cdf0e10cSrcweir 	}																	\
1919*cdf0e10cSrcweir 	else																\
1920*cdf0e10cSrcweir 		aMapResSource = maMapRes;										\
1921*cdf0e10cSrcweir 	if ( !mbMap || pMapModeDest != &maMapMode ) 						\
1922*cdf0e10cSrcweir 	{																	\
1923*cdf0e10cSrcweir 		if ( pMapModeDest->GetMapUnit() == MAP_RELATIVE )				\
1924*cdf0e10cSrcweir 			aMapResDest = maMapRes; 									\
1925*cdf0e10cSrcweir 		ImplCalcMapResolution( *pMapModeDest,							\
1926*cdf0e10cSrcweir 							   mnDPIX, mnDPIY, aMapResDest );			\
1927*cdf0e10cSrcweir 	}																	\
1928*cdf0e10cSrcweir 	else																\
1929*cdf0e10cSrcweir 		aMapResDest = maMapRes
1930*cdf0e10cSrcweir 
1931*cdf0e10cSrcweir // -----------------------------------------------------------------------
1932*cdf0e10cSrcweir 
1933*cdf0e10cSrcweir #define ENTER2( eUnitSource, eUnitDest )								\
1934*cdf0e10cSrcweir 	DBG_ASSERT( eUnitSource != MAP_SYSFONT								\
1935*cdf0e10cSrcweir 				&& eUnitSource != MAP_APPFONT							\
1936*cdf0e10cSrcweir 				&& eUnitSource != MAP_RELATIVE, 						\
1937*cdf0e10cSrcweir 				"Source MapUnit nicht erlaubt" );                       \
1938*cdf0e10cSrcweir 	DBG_ASSERT( eUnitDest != MAP_SYSFONT								\
1939*cdf0e10cSrcweir 				&& eUnitDest != MAP_APPFONT 							\
1940*cdf0e10cSrcweir 				&& eUnitDest != MAP_RELATIVE,							\
1941*cdf0e10cSrcweir 				"Destination MapUnit nicht erlaubt" );                  \
1942*cdf0e10cSrcweir 	DBG_ASSERTWARNING( eUnitSource != MAP_PIXEL,						\
1943*cdf0e10cSrcweir 					   "MAP_PIXEL mit 72dpi angenaehert" );             \
1944*cdf0e10cSrcweir 	DBG_ASSERTWARNING( eUnitDest != MAP_PIXEL,							\
1945*cdf0e10cSrcweir 					   "MAP_PIXEL mit 72dpi angenaehert" )
1946*cdf0e10cSrcweir 
1947*cdf0e10cSrcweir // -----------------------------------------------------------------------
1948*cdf0e10cSrcweir 
1949*cdf0e10cSrcweir #define ENTER3( eUnitSource, eUnitDest )								\
1950*cdf0e10cSrcweir 	long nNumerator 	 = 1;		\
1951*cdf0e10cSrcweir 	long nDenominator	 = 1;		\
1952*cdf0e10cSrcweir 	DBG_ASSERT( eUnitSource < MAP_LASTENUMDUMMY, "Invalid source map unit");	\
1953*cdf0e10cSrcweir 	DBG_ASSERT( eUnitDest < MAP_LASTENUMDUMMY, "Invalid destination map unit");	\
1954*cdf0e10cSrcweir 	if( (eUnitSource < MAP_LASTENUMDUMMY) && (eUnitDest < MAP_LASTENUMDUMMY) )	\
1955*cdf0e10cSrcweir 	{	\
1956*cdf0e10cSrcweir 		nNumerator 	 = aImplNumeratorAry[eUnitSource] * 			\
1957*cdf0e10cSrcweir 						   aImplDenominatorAry[eUnitDest];				\
1958*cdf0e10cSrcweir 		nDenominator	 = aImplNumeratorAry[eUnitDest] *				\
1959*cdf0e10cSrcweir 						   aImplDenominatorAry[eUnitSource];			\
1960*cdf0e10cSrcweir 	} \
1961*cdf0e10cSrcweir 	if ( eUnitSource == MAP_PIXEL ) 									\
1962*cdf0e10cSrcweir 		nDenominator *= 72; 											\
1963*cdf0e10cSrcweir 	else if( eUnitDest == MAP_PIXEL )									\
1964*cdf0e10cSrcweir 		nNumerator *= 72
1965*cdf0e10cSrcweir 
1966*cdf0e10cSrcweir // -----------------------------------------------------------------------
1967*cdf0e10cSrcweir 
1968*cdf0e10cSrcweir #define ENTER4( rMapModeSource, rMapModeDest )							\
1969*cdf0e10cSrcweir 	ImplMapRes aMapResSource;											\
1970*cdf0e10cSrcweir 	ImplMapRes aMapResDest; 											\
1971*cdf0e10cSrcweir 																		\
1972*cdf0e10cSrcweir 	ImplCalcMapResolution( rMapModeSource, 72, 72, aMapResSource ); 	\
1973*cdf0e10cSrcweir 	ImplCalcMapResolution( rMapModeDest, 72, 72, aMapResDest )
1974*cdf0e10cSrcweir 
1975*cdf0e10cSrcweir // -----------------------------------------------------------------------
1976*cdf0e10cSrcweir 
1977*cdf0e10cSrcweir // return (n1 * n2 * n3) / (n4 * n5)
1978*cdf0e10cSrcweir static long fn5( const long n1,
1979*cdf0e10cSrcweir 				 const long n2,
1980*cdf0e10cSrcweir 				 const long n3,
1981*cdf0e10cSrcweir 				 const long n4,
1982*cdf0e10cSrcweir 				 const long n5 )
1983*cdf0e10cSrcweir {
1984*cdf0e10cSrcweir 	if ( n1 == 0 || n2 == 0 || n3 == 0 || n4 == 0 || n5 == 0 )
1985*cdf0e10cSrcweir 		return 0;
1986*cdf0e10cSrcweir 	if ( LONG_MAX / Abs(n2) < Abs(n3) )
1987*cdf0e10cSrcweir 	{
1988*cdf0e10cSrcweir 		// a6 wird "ubersprungen
1989*cdf0e10cSrcweir 		BigInt a7 = n2;
1990*cdf0e10cSrcweir 		a7 *= n3;
1991*cdf0e10cSrcweir 		a7 *= n1;
1992*cdf0e10cSrcweir 
1993*cdf0e10cSrcweir 		if ( LONG_MAX / Abs(n4) < Abs(n5) )
1994*cdf0e10cSrcweir 		{
1995*cdf0e10cSrcweir 			BigInt a8 = n4;
1996*cdf0e10cSrcweir 			a8 *= n5;
1997*cdf0e10cSrcweir 
1998*cdf0e10cSrcweir 			BigInt a9 = a8;
1999*cdf0e10cSrcweir 			a9 /= 2;
2000*cdf0e10cSrcweir 			if ( a7.IsNeg() )
2001*cdf0e10cSrcweir 				a7 -= a9;
2002*cdf0e10cSrcweir 			else
2003*cdf0e10cSrcweir 				a7 += a9;
2004*cdf0e10cSrcweir 
2005*cdf0e10cSrcweir 			a7 /= a8;
2006*cdf0e10cSrcweir 		} // of if
2007*cdf0e10cSrcweir 		else
2008*cdf0e10cSrcweir 		{
2009*cdf0e10cSrcweir 			long n8 = n4 * n5;
2010*cdf0e10cSrcweir 
2011*cdf0e10cSrcweir 			if ( a7.IsNeg() )
2012*cdf0e10cSrcweir 				a7 -= n8 / 2;
2013*cdf0e10cSrcweir 			else
2014*cdf0e10cSrcweir 				a7 += n8 / 2;
2015*cdf0e10cSrcweir 
2016*cdf0e10cSrcweir 			a7 /= n8;
2017*cdf0e10cSrcweir 		} // of else
2018*cdf0e10cSrcweir 		return (long)a7;
2019*cdf0e10cSrcweir 	} // of if
2020*cdf0e10cSrcweir 	else
2021*cdf0e10cSrcweir 	{
2022*cdf0e10cSrcweir 		long n6 = n2 * n3;
2023*cdf0e10cSrcweir 
2024*cdf0e10cSrcweir 		if ( LONG_MAX / Abs(n1) < Abs(n6) )
2025*cdf0e10cSrcweir 		{
2026*cdf0e10cSrcweir 			BigInt a7 = n1;
2027*cdf0e10cSrcweir 			a7 *= n6;
2028*cdf0e10cSrcweir 
2029*cdf0e10cSrcweir 			if ( LONG_MAX / Abs(n4) < Abs(n5) )
2030*cdf0e10cSrcweir 			{
2031*cdf0e10cSrcweir 				BigInt a8 = n4;
2032*cdf0e10cSrcweir 				a8 *= n5;
2033*cdf0e10cSrcweir 
2034*cdf0e10cSrcweir 				BigInt a9 = a8;
2035*cdf0e10cSrcweir 				a9 /= 2;
2036*cdf0e10cSrcweir 				if ( a7.IsNeg() )
2037*cdf0e10cSrcweir 					a7 -= a9;
2038*cdf0e10cSrcweir 				else
2039*cdf0e10cSrcweir 					a7 += a9;
2040*cdf0e10cSrcweir 
2041*cdf0e10cSrcweir 				a7 /= a8;
2042*cdf0e10cSrcweir 			} // of if
2043*cdf0e10cSrcweir 			else
2044*cdf0e10cSrcweir 			{
2045*cdf0e10cSrcweir 				long n8 = n4 * n5;
2046*cdf0e10cSrcweir 
2047*cdf0e10cSrcweir 				if ( a7.IsNeg() )
2048*cdf0e10cSrcweir 					a7 -= n8 / 2;
2049*cdf0e10cSrcweir 				else
2050*cdf0e10cSrcweir 					a7 += n8 / 2;
2051*cdf0e10cSrcweir 
2052*cdf0e10cSrcweir 				a7 /= n8;
2053*cdf0e10cSrcweir 			} // of else
2054*cdf0e10cSrcweir 			return (long)a7;
2055*cdf0e10cSrcweir 		} // of if
2056*cdf0e10cSrcweir 		else
2057*cdf0e10cSrcweir 		{
2058*cdf0e10cSrcweir 			long n7 = n1 * n6;
2059*cdf0e10cSrcweir 
2060*cdf0e10cSrcweir 			if ( LONG_MAX / Abs(n4) < Abs(n5) )
2061*cdf0e10cSrcweir 			{
2062*cdf0e10cSrcweir 				BigInt a7 = n7;
2063*cdf0e10cSrcweir 				BigInt a8 = n4;
2064*cdf0e10cSrcweir 				a8 *= n5;
2065*cdf0e10cSrcweir 
2066*cdf0e10cSrcweir 				BigInt a9 = a8;
2067*cdf0e10cSrcweir 				a9 /= 2;
2068*cdf0e10cSrcweir 				if ( a7.IsNeg() )
2069*cdf0e10cSrcweir 					a7 -= a9;
2070*cdf0e10cSrcweir 				else
2071*cdf0e10cSrcweir 					a7 += a9;
2072*cdf0e10cSrcweir 
2073*cdf0e10cSrcweir 				a7 /= a8;
2074*cdf0e10cSrcweir 				return (long)a7;
2075*cdf0e10cSrcweir 			} // of if
2076*cdf0e10cSrcweir 			else
2077*cdf0e10cSrcweir 			{
2078*cdf0e10cSrcweir 				const long n8 = n4 * n5;
2079*cdf0e10cSrcweir 				const long n8_2 = n8 / 2;
2080*cdf0e10cSrcweir 
2081*cdf0e10cSrcweir 				if( n7 < 0 )
2082*cdf0e10cSrcweir 				{
2083*cdf0e10cSrcweir 					if( ( n7 - LONG_MIN ) >= n8_2 )
2084*cdf0e10cSrcweir 						n7 -= n8_2;
2085*cdf0e10cSrcweir 				}
2086*cdf0e10cSrcweir 				else if( ( LONG_MAX - n7 ) >= n8_2 )
2087*cdf0e10cSrcweir 					n7 += n8_2;
2088*cdf0e10cSrcweir 
2089*cdf0e10cSrcweir 				return n7 / n8;
2090*cdf0e10cSrcweir 			} // of else
2091*cdf0e10cSrcweir 		} // of else
2092*cdf0e10cSrcweir 	} // of else
2093*cdf0e10cSrcweir }
2094*cdf0e10cSrcweir 
2095*cdf0e10cSrcweir // -----------------------------------------------------------------------
2096*cdf0e10cSrcweir 
2097*cdf0e10cSrcweir // return (n1 * n2) / n3
2098*cdf0e10cSrcweir static long fn3( const long n1, const long n2, const long n3 )
2099*cdf0e10cSrcweir {
2100*cdf0e10cSrcweir 	if ( n1 == 0 || n2 == 0 || n3 == 0 )
2101*cdf0e10cSrcweir 		return 0;
2102*cdf0e10cSrcweir 	if ( LONG_MAX / Abs(n1) < Abs(n2) )
2103*cdf0e10cSrcweir 	{
2104*cdf0e10cSrcweir 		BigInt a4 = n1;
2105*cdf0e10cSrcweir 		a4 *= n2;
2106*cdf0e10cSrcweir 
2107*cdf0e10cSrcweir 		if ( a4.IsNeg() )
2108*cdf0e10cSrcweir 			a4 -= n3 / 2;
2109*cdf0e10cSrcweir 		else
2110*cdf0e10cSrcweir 			a4 += n3 / 2;
2111*cdf0e10cSrcweir 
2112*cdf0e10cSrcweir 		a4 /= n3;
2113*cdf0e10cSrcweir 		return (long)a4;
2114*cdf0e10cSrcweir 	} // of if
2115*cdf0e10cSrcweir 	else
2116*cdf0e10cSrcweir 	{
2117*cdf0e10cSrcweir 		long		n4 = n1 * n2;
2118*cdf0e10cSrcweir 		const long	n3_2 = n3 / 2;
2119*cdf0e10cSrcweir 
2120*cdf0e10cSrcweir 		if( n4 < 0 )
2121*cdf0e10cSrcweir 		{
2122*cdf0e10cSrcweir 			if( ( n4 - LONG_MIN ) >= n3_2 )
2123*cdf0e10cSrcweir 				n4 -= n3_2;
2124*cdf0e10cSrcweir 		}
2125*cdf0e10cSrcweir 		else if( ( LONG_MAX - n4 ) >= n3_2 )
2126*cdf0e10cSrcweir 			n4 += n3_2;
2127*cdf0e10cSrcweir 
2128*cdf0e10cSrcweir 		return n4 / n3;
2129*cdf0e10cSrcweir 	} // of else
2130*cdf0e10cSrcweir }
2131*cdf0e10cSrcweir 
2132*cdf0e10cSrcweir // -----------------------------------------------------------------------
2133*cdf0e10cSrcweir 
2134*cdf0e10cSrcweir Point OutputDevice::LogicToLogic( const Point& rPtSource,
2135*cdf0e10cSrcweir 								  const MapMode* pMapModeSource,
2136*cdf0e10cSrcweir 								  const MapMode* pMapModeDest ) const
2137*cdf0e10cSrcweir {
2138*cdf0e10cSrcweir 	ENTER1( rPtSource, pMapModeSource, pMapModeDest );
2139*cdf0e10cSrcweir 
2140*cdf0e10cSrcweir 	return Point( fn5( rPtSource.X() + aMapResSource.mnMapOfsX,
2141*cdf0e10cSrcweir 					   aMapResSource.mnMapScNumX, aMapResDest.mnMapScDenomX,
2142*cdf0e10cSrcweir 					   aMapResSource.mnMapScDenomX, aMapResDest.mnMapScNumX ) -
2143*cdf0e10cSrcweir 				  aMapResDest.mnMapOfsX,
2144*cdf0e10cSrcweir 				  fn5( rPtSource.Y() + aMapResSource.mnMapOfsY,
2145*cdf0e10cSrcweir 					   aMapResSource.mnMapScNumY, aMapResDest.mnMapScDenomY,
2146*cdf0e10cSrcweir 					   aMapResSource.mnMapScDenomY, aMapResDest.mnMapScNumY ) -
2147*cdf0e10cSrcweir 				  aMapResDest.mnMapOfsY );
2148*cdf0e10cSrcweir }
2149*cdf0e10cSrcweir 
2150*cdf0e10cSrcweir // -----------------------------------------------------------------------
2151*cdf0e10cSrcweir 
2152*cdf0e10cSrcweir Size OutputDevice::LogicToLogic( const Size& rSzSource,
2153*cdf0e10cSrcweir 								 const MapMode* pMapModeSource,
2154*cdf0e10cSrcweir 								 const MapMode* pMapModeDest ) const
2155*cdf0e10cSrcweir {
2156*cdf0e10cSrcweir 	ENTER1( rSzSource, pMapModeSource, pMapModeDest );
2157*cdf0e10cSrcweir 
2158*cdf0e10cSrcweir 	return Size( fn5( rSzSource.Width(),
2159*cdf0e10cSrcweir 					  aMapResSource.mnMapScNumX, aMapResDest.mnMapScDenomX,
2160*cdf0e10cSrcweir 					  aMapResSource.mnMapScDenomX, aMapResDest.mnMapScNumX ),
2161*cdf0e10cSrcweir 				 fn5( rSzSource.Height(),
2162*cdf0e10cSrcweir 					  aMapResSource.mnMapScNumY, aMapResDest.mnMapScDenomY,
2163*cdf0e10cSrcweir 					  aMapResSource.mnMapScDenomY, aMapResDest.mnMapScNumY ) );
2164*cdf0e10cSrcweir }
2165*cdf0e10cSrcweir 
2166*cdf0e10cSrcweir // -----------------------------------------------------------------------
2167*cdf0e10cSrcweir 
2168*cdf0e10cSrcweir Rectangle OutputDevice::LogicToLogic( const Rectangle& rRectSource,
2169*cdf0e10cSrcweir 									  const MapMode* pMapModeSource,
2170*cdf0e10cSrcweir 									  const MapMode* pMapModeDest ) const
2171*cdf0e10cSrcweir {
2172*cdf0e10cSrcweir 	ENTER1( rRectSource, pMapModeSource, pMapModeDest );
2173*cdf0e10cSrcweir 
2174*cdf0e10cSrcweir 	return Rectangle( fn5( rRectSource.Left() + aMapResSource.mnMapOfsX,
2175*cdf0e10cSrcweir 						   aMapResSource.mnMapScNumX, aMapResDest.mnMapScDenomX,
2176*cdf0e10cSrcweir 						   aMapResSource.mnMapScDenomX, aMapResDest.mnMapScNumX ) -
2177*cdf0e10cSrcweir 					  aMapResDest.mnMapOfsX,
2178*cdf0e10cSrcweir 					  fn5( rRectSource.Top() + aMapResSource.mnMapOfsY,
2179*cdf0e10cSrcweir 						   aMapResSource.mnMapScNumY, aMapResDest.mnMapScDenomY,
2180*cdf0e10cSrcweir 						   aMapResSource.mnMapScDenomY, aMapResDest.mnMapScNumY ) -
2181*cdf0e10cSrcweir 					  aMapResDest.mnMapOfsY,
2182*cdf0e10cSrcweir 					  fn5( rRectSource.Right() + aMapResSource.mnMapOfsX,
2183*cdf0e10cSrcweir 						   aMapResSource.mnMapScNumX, aMapResDest.mnMapScDenomX,
2184*cdf0e10cSrcweir 						   aMapResSource.mnMapScDenomX, aMapResDest.mnMapScNumX ) -
2185*cdf0e10cSrcweir 					  aMapResDest.mnMapOfsX,
2186*cdf0e10cSrcweir 					  fn5( rRectSource.Bottom() + aMapResSource.mnMapOfsY,
2187*cdf0e10cSrcweir 						   aMapResSource.mnMapScNumY, aMapResDest.mnMapScDenomY,
2188*cdf0e10cSrcweir 						   aMapResSource.mnMapScDenomY, aMapResDest.mnMapScNumY ) -
2189*cdf0e10cSrcweir 					  aMapResDest.mnMapOfsY );
2190*cdf0e10cSrcweir }
2191*cdf0e10cSrcweir 
2192*cdf0e10cSrcweir // -----------------------------------------------------------------------
2193*cdf0e10cSrcweir 
2194*cdf0e10cSrcweir long* OutputDevice::LogicToLogic( long* pX, sal_uInt16 nCount,
2195*cdf0e10cSrcweir 								  const MapMode* pMapModeSource,
2196*cdf0e10cSrcweir 								  const MapMode* pMapModeDest ) const
2197*cdf0e10cSrcweir {
2198*cdf0e10cSrcweir 	ENTER1( pX, pMapModeSource, pMapModeDest );
2199*cdf0e10cSrcweir 
2200*cdf0e10cSrcweir 	for( ; nCount; nCount--, pX++ )
2201*cdf0e10cSrcweir 	{
2202*cdf0e10cSrcweir 		*pX = fn5( *pX,
2203*cdf0e10cSrcweir 				   aMapResSource.mnMapScNumX, aMapResDest.mnMapScDenomX,
2204*cdf0e10cSrcweir 				   aMapResSource.mnMapScDenomX, aMapResDest.mnMapScNumX );
2205*cdf0e10cSrcweir 	}
2206*cdf0e10cSrcweir 
2207*cdf0e10cSrcweir 	return NULL;
2208*cdf0e10cSrcweir }
2209*cdf0e10cSrcweir 
2210*cdf0e10cSrcweir // -----------------------------------------------------------------------
2211*cdf0e10cSrcweir 
2212*cdf0e10cSrcweir Point OutputDevice::LogicToLogic( const Point& rPtSource,
2213*cdf0e10cSrcweir 								  const MapMode& rMapModeSource,
2214*cdf0e10cSrcweir 								  const MapMode& rMapModeDest )
2215*cdf0e10cSrcweir {
2216*cdf0e10cSrcweir 	if ( rMapModeSource == rMapModeDest )
2217*cdf0e10cSrcweir 		return rPtSource;
2218*cdf0e10cSrcweir 
2219*cdf0e10cSrcweir 	MapUnit eUnitSource = rMapModeSource.GetMapUnit();
2220*cdf0e10cSrcweir 	MapUnit eUnitDest	= rMapModeDest.GetMapUnit();
2221*cdf0e10cSrcweir 	ENTER2( eUnitSource, eUnitDest );
2222*cdf0e10cSrcweir 
2223*cdf0e10cSrcweir 	if ( rMapModeSource.mpImplMapMode->mbSimple &&
2224*cdf0e10cSrcweir 		 rMapModeDest.mpImplMapMode->mbSimple )
2225*cdf0e10cSrcweir 	{
2226*cdf0e10cSrcweir 		ENTER3( eUnitSource, eUnitDest );
2227*cdf0e10cSrcweir 
2228*cdf0e10cSrcweir 		return Point( fn3( rPtSource.X(), nNumerator, nDenominator ),
2229*cdf0e10cSrcweir 					  fn3( rPtSource.Y(), nNumerator, nDenominator ) );
2230*cdf0e10cSrcweir 	}
2231*cdf0e10cSrcweir 	else
2232*cdf0e10cSrcweir 	{
2233*cdf0e10cSrcweir 		ENTER4( rMapModeSource, rMapModeDest );
2234*cdf0e10cSrcweir 
2235*cdf0e10cSrcweir 		return Point( fn5( rPtSource.X() + aMapResSource.mnMapOfsX,
2236*cdf0e10cSrcweir 						   aMapResSource.mnMapScNumX, aMapResDest.mnMapScDenomX,
2237*cdf0e10cSrcweir 						   aMapResSource.mnMapScDenomX, aMapResDest.mnMapScNumX ) -
2238*cdf0e10cSrcweir 					  aMapResDest.mnMapOfsX,
2239*cdf0e10cSrcweir 					  fn5( rPtSource.Y() + aMapResSource.mnMapOfsY,
2240*cdf0e10cSrcweir 						   aMapResSource.mnMapScNumY, aMapResDest.mnMapScDenomY,
2241*cdf0e10cSrcweir 						   aMapResSource.mnMapScDenomY, aMapResDest.mnMapScNumY ) -
2242*cdf0e10cSrcweir 					  aMapResDest.mnMapOfsY );
2243*cdf0e10cSrcweir 	}
2244*cdf0e10cSrcweir }
2245*cdf0e10cSrcweir 
2246*cdf0e10cSrcweir // -----------------------------------------------------------------------
2247*cdf0e10cSrcweir 
2248*cdf0e10cSrcweir Size OutputDevice::LogicToLogic( const Size& rSzSource,
2249*cdf0e10cSrcweir 								 const MapMode& rMapModeSource,
2250*cdf0e10cSrcweir 								 const MapMode& rMapModeDest )
2251*cdf0e10cSrcweir {
2252*cdf0e10cSrcweir 	if ( rMapModeSource == rMapModeDest )
2253*cdf0e10cSrcweir 		return rSzSource;
2254*cdf0e10cSrcweir 
2255*cdf0e10cSrcweir 	MapUnit eUnitSource = rMapModeSource.GetMapUnit();
2256*cdf0e10cSrcweir 	MapUnit eUnitDest	= rMapModeDest.GetMapUnit();
2257*cdf0e10cSrcweir 	ENTER2( eUnitSource, eUnitDest );
2258*cdf0e10cSrcweir 
2259*cdf0e10cSrcweir 	if ( rMapModeSource.mpImplMapMode->mbSimple &&
2260*cdf0e10cSrcweir 		 rMapModeDest.mpImplMapMode->mbSimple )
2261*cdf0e10cSrcweir 	{
2262*cdf0e10cSrcweir 		ENTER3( eUnitSource, eUnitDest );
2263*cdf0e10cSrcweir 
2264*cdf0e10cSrcweir 		return Size( fn3( rSzSource.Width(),  nNumerator, nDenominator ),
2265*cdf0e10cSrcweir 					 fn3( rSzSource.Height(), nNumerator, nDenominator ) );
2266*cdf0e10cSrcweir 	}
2267*cdf0e10cSrcweir 	else
2268*cdf0e10cSrcweir 	{
2269*cdf0e10cSrcweir 		ENTER4( rMapModeSource, rMapModeDest );
2270*cdf0e10cSrcweir 
2271*cdf0e10cSrcweir 		return Size( fn5( rSzSource.Width(),
2272*cdf0e10cSrcweir 						  aMapResSource.mnMapScNumX, aMapResDest.mnMapScDenomX,
2273*cdf0e10cSrcweir 						  aMapResSource.mnMapScDenomX, aMapResDest.mnMapScNumX ),
2274*cdf0e10cSrcweir 					 fn5( rSzSource.Height(),
2275*cdf0e10cSrcweir 						  aMapResSource.mnMapScNumY, aMapResDest.mnMapScDenomY,
2276*cdf0e10cSrcweir 						  aMapResSource.mnMapScDenomY, aMapResDest.mnMapScNumY ) );
2277*cdf0e10cSrcweir 	}
2278*cdf0e10cSrcweir }
2279*cdf0e10cSrcweir 
2280*cdf0e10cSrcweir // -----------------------------------------------------------------------
2281*cdf0e10cSrcweir 
2282*cdf0e10cSrcweir basegfx::B2DPolygon OutputDevice::LogicToLogic( const basegfx::B2DPolygon& rPolySource,
2283*cdf0e10cSrcweir                                                 const MapMode& rMapModeSource,
2284*cdf0e10cSrcweir                                                 const MapMode& rMapModeDest )
2285*cdf0e10cSrcweir {
2286*cdf0e10cSrcweir 	if ( rMapModeSource == rMapModeDest )
2287*cdf0e10cSrcweir 		return rPolySource;
2288*cdf0e10cSrcweir 
2289*cdf0e10cSrcweir 	MapUnit eUnitSource = rMapModeSource.GetMapUnit();
2290*cdf0e10cSrcweir 	MapUnit eUnitDest	= rMapModeDest.GetMapUnit();
2291*cdf0e10cSrcweir 	ENTER2( eUnitSource, eUnitDest );
2292*cdf0e10cSrcweir 
2293*cdf0e10cSrcweir     basegfx::B2DHomMatrix aTransform;
2294*cdf0e10cSrcweir 
2295*cdf0e10cSrcweir 	if ( rMapModeSource.mpImplMapMode->mbSimple &&
2296*cdf0e10cSrcweir 		 rMapModeDest.mpImplMapMode->mbSimple )
2297*cdf0e10cSrcweir 	{
2298*cdf0e10cSrcweir 		ENTER3( eUnitSource, eUnitDest );
2299*cdf0e10cSrcweir 
2300*cdf0e10cSrcweir 		const double fScaleFactor((double)nNumerator / (double)nDenominator);
2301*cdf0e10cSrcweir 		aTransform.set(0, 0, fScaleFactor);
2302*cdf0e10cSrcweir 		aTransform.set(1, 1, fScaleFactor);
2303*cdf0e10cSrcweir 	}
2304*cdf0e10cSrcweir 	else
2305*cdf0e10cSrcweir 	{
2306*cdf0e10cSrcweir 		ENTER4( rMapModeSource, rMapModeDest );
2307*cdf0e10cSrcweir 
2308*cdf0e10cSrcweir 		const double fScaleFactorX(  (double(aMapResSource.mnMapScNumX) *  double(aMapResDest.mnMapScDenomX))
2309*cdf0e10cSrcweir 		                           / (double(aMapResSource.mnMapScDenomX) * double(aMapResDest.mnMapScNumX)) );
2310*cdf0e10cSrcweir 		const double fScaleFactorY(  (double(aMapResSource.mnMapScNumY) *  double(aMapResDest.mnMapScDenomY))
2311*cdf0e10cSrcweir 		                           / (double(aMapResSource.mnMapScDenomY) * double(aMapResDest.mnMapScNumY)) );
2312*cdf0e10cSrcweir 		const double fZeroPointX(double(aMapResSource.mnMapOfsX) * fScaleFactorX - double(aMapResDest.mnMapOfsX));
2313*cdf0e10cSrcweir 		const double fZeroPointY(double(aMapResSource.mnMapOfsY) * fScaleFactorY - double(aMapResDest.mnMapOfsY));
2314*cdf0e10cSrcweir 
2315*cdf0e10cSrcweir 		aTransform.set(0, 0, fScaleFactorX);
2316*cdf0e10cSrcweir 		aTransform.set(1, 1, fScaleFactorY);
2317*cdf0e10cSrcweir 		aTransform.set(0, 2, fZeroPointX);
2318*cdf0e10cSrcweir 		aTransform.set(1, 2, fZeroPointY);
2319*cdf0e10cSrcweir 	}
2320*cdf0e10cSrcweir 	basegfx::B2DPolygon aPoly( rPolySource );
2321*cdf0e10cSrcweir 	aPoly.transform( aTransform );
2322*cdf0e10cSrcweir 	return aPoly;
2323*cdf0e10cSrcweir }
2324*cdf0e10cSrcweir 
2325*cdf0e10cSrcweir // -----------------------------------------------------------------------
2326*cdf0e10cSrcweir 
2327*cdf0e10cSrcweir basegfx::B2DPolyPolygon OutputDevice::LogicToLogic( const basegfx::B2DPolyPolygon& rPolySource,
2328*cdf0e10cSrcweir                                                     const MapMode& rMapModeSource,
2329*cdf0e10cSrcweir                                                     const MapMode& rMapModeDest )
2330*cdf0e10cSrcweir {
2331*cdf0e10cSrcweir 	if ( rMapModeSource == rMapModeDest )
2332*cdf0e10cSrcweir 		return rPolySource;
2333*cdf0e10cSrcweir 
2334*cdf0e10cSrcweir 	MapUnit eUnitSource = rMapModeSource.GetMapUnit();
2335*cdf0e10cSrcweir 	MapUnit eUnitDest	= rMapModeDest.GetMapUnit();
2336*cdf0e10cSrcweir 	ENTER2( eUnitSource, eUnitDest );
2337*cdf0e10cSrcweir 
2338*cdf0e10cSrcweir     basegfx::B2DHomMatrix aTransform;
2339*cdf0e10cSrcweir 
2340*cdf0e10cSrcweir 	if ( rMapModeSource.mpImplMapMode->mbSimple &&
2341*cdf0e10cSrcweir 		 rMapModeDest.mpImplMapMode->mbSimple )
2342*cdf0e10cSrcweir 	{
2343*cdf0e10cSrcweir 		ENTER3( eUnitSource, eUnitDest );
2344*cdf0e10cSrcweir 
2345*cdf0e10cSrcweir 		const double fScaleFactor((double)nNumerator / (double)nDenominator);
2346*cdf0e10cSrcweir 		aTransform.set(0, 0, fScaleFactor);
2347*cdf0e10cSrcweir 		aTransform.set(1, 1, fScaleFactor);
2348*cdf0e10cSrcweir 	}
2349*cdf0e10cSrcweir 	else
2350*cdf0e10cSrcweir 	{
2351*cdf0e10cSrcweir 		ENTER4( rMapModeSource, rMapModeDest );
2352*cdf0e10cSrcweir 
2353*cdf0e10cSrcweir 		const double fScaleFactorX(  (double(aMapResSource.mnMapScNumX) *  double(aMapResDest.mnMapScDenomX))
2354*cdf0e10cSrcweir 		                           / (double(aMapResSource.mnMapScDenomX) * double(aMapResDest.mnMapScNumX)) );
2355*cdf0e10cSrcweir 		const double fScaleFactorY(  (double(aMapResSource.mnMapScNumY) *  double(aMapResDest.mnMapScDenomY))
2356*cdf0e10cSrcweir 		                           / (double(aMapResSource.mnMapScDenomY) * double(aMapResDest.mnMapScNumY)) );
2357*cdf0e10cSrcweir 		const double fZeroPointX(double(aMapResSource.mnMapOfsX) * fScaleFactorX - double(aMapResDest.mnMapOfsX));
2358*cdf0e10cSrcweir 		const double fZeroPointY(double(aMapResSource.mnMapOfsY) * fScaleFactorY - double(aMapResDest.mnMapOfsY));
2359*cdf0e10cSrcweir 
2360*cdf0e10cSrcweir 		aTransform.set(0, 0, fScaleFactorX);
2361*cdf0e10cSrcweir 		aTransform.set(1, 1, fScaleFactorY);
2362*cdf0e10cSrcweir 		aTransform.set(0, 2, fZeroPointX);
2363*cdf0e10cSrcweir 		aTransform.set(1, 2, fZeroPointY);
2364*cdf0e10cSrcweir 	}
2365*cdf0e10cSrcweir 	basegfx::B2DPolyPolygon aPoly( rPolySource );
2366*cdf0e10cSrcweir 	aPoly.transform( aTransform );
2367*cdf0e10cSrcweir 	return aPoly;
2368*cdf0e10cSrcweir }
2369*cdf0e10cSrcweir 
2370*cdf0e10cSrcweir // -----------------------------------------------------------------------
2371*cdf0e10cSrcweir 
2372*cdf0e10cSrcweir Rectangle OutputDevice::LogicToLogic( const Rectangle& rRectSource,
2373*cdf0e10cSrcweir 									  const MapMode& rMapModeSource,
2374*cdf0e10cSrcweir 									  const MapMode& rMapModeDest )
2375*cdf0e10cSrcweir {
2376*cdf0e10cSrcweir 	if ( rMapModeSource == rMapModeDest )
2377*cdf0e10cSrcweir 		return rRectSource;
2378*cdf0e10cSrcweir 
2379*cdf0e10cSrcweir 	MapUnit eUnitSource = rMapModeSource.GetMapUnit();
2380*cdf0e10cSrcweir 	MapUnit eUnitDest	= rMapModeDest.GetMapUnit();
2381*cdf0e10cSrcweir 	ENTER2( eUnitSource, eUnitDest );
2382*cdf0e10cSrcweir 
2383*cdf0e10cSrcweir 	if ( rMapModeSource.mpImplMapMode->mbSimple &&
2384*cdf0e10cSrcweir 		 rMapModeDest.mpImplMapMode->mbSimple )
2385*cdf0e10cSrcweir 	{
2386*cdf0e10cSrcweir 		ENTER3( eUnitSource, eUnitDest );
2387*cdf0e10cSrcweir 
2388*cdf0e10cSrcweir 		return Rectangle( fn3( rRectSource.Left(), nNumerator, nDenominator ),
2389*cdf0e10cSrcweir 						  fn3( rRectSource.Top(), nNumerator, nDenominator ),
2390*cdf0e10cSrcweir 						  fn3( rRectSource.Right(), nNumerator, nDenominator ),
2391*cdf0e10cSrcweir 						  fn3( rRectSource.Bottom(), nNumerator, nDenominator ) );
2392*cdf0e10cSrcweir 	}
2393*cdf0e10cSrcweir 	else
2394*cdf0e10cSrcweir 	{
2395*cdf0e10cSrcweir 		ENTER4( rMapModeSource, rMapModeDest );
2396*cdf0e10cSrcweir 
2397*cdf0e10cSrcweir 		return Rectangle( fn5( rRectSource.Left() + aMapResSource.mnMapOfsX,
2398*cdf0e10cSrcweir 							   aMapResSource.mnMapScNumX, aMapResDest.mnMapScDenomX,
2399*cdf0e10cSrcweir 							   aMapResSource.mnMapScDenomX, aMapResDest.mnMapScNumX ) -
2400*cdf0e10cSrcweir 						  aMapResDest.mnMapOfsX,
2401*cdf0e10cSrcweir 						  fn5( rRectSource.Top() + aMapResSource.mnMapOfsY,
2402*cdf0e10cSrcweir 							   aMapResSource.mnMapScNumY, aMapResDest.mnMapScDenomY,
2403*cdf0e10cSrcweir 							   aMapResSource.mnMapScDenomY, aMapResDest.mnMapScNumY ) -
2404*cdf0e10cSrcweir 						  aMapResDest.mnMapOfsY,
2405*cdf0e10cSrcweir 						  fn5( rRectSource.Right() + aMapResSource.mnMapOfsX,
2406*cdf0e10cSrcweir 							   aMapResSource.mnMapScNumX, aMapResDest.mnMapScDenomX,
2407*cdf0e10cSrcweir 							   aMapResSource.mnMapScDenomX, aMapResDest.mnMapScNumX ) -
2408*cdf0e10cSrcweir 						  aMapResDest.mnMapOfsX,
2409*cdf0e10cSrcweir 						  fn5( rRectSource.Bottom() + aMapResSource.mnMapOfsY,
2410*cdf0e10cSrcweir 							   aMapResSource.mnMapScNumY, aMapResDest.mnMapScDenomY,
2411*cdf0e10cSrcweir 							   aMapResSource.mnMapScDenomY, aMapResDest.mnMapScNumY ) -
2412*cdf0e10cSrcweir 						  aMapResDest.mnMapOfsY );
2413*cdf0e10cSrcweir 	}
2414*cdf0e10cSrcweir }
2415*cdf0e10cSrcweir 
2416*cdf0e10cSrcweir // -----------------------------------------------------------------------
2417*cdf0e10cSrcweir 
2418*cdf0e10cSrcweir long OutputDevice::LogicToLogic( long nLongSource,
2419*cdf0e10cSrcweir 								 MapUnit eUnitSource, MapUnit eUnitDest )
2420*cdf0e10cSrcweir {
2421*cdf0e10cSrcweir 	if ( eUnitSource == eUnitDest )
2422*cdf0e10cSrcweir 		return nLongSource;
2423*cdf0e10cSrcweir 
2424*cdf0e10cSrcweir 	ENTER2( eUnitSource, eUnitDest );
2425*cdf0e10cSrcweir 	ENTER3( eUnitSource, eUnitDest );
2426*cdf0e10cSrcweir 
2427*cdf0e10cSrcweir 	return fn3( nLongSource, nNumerator, nDenominator );
2428*cdf0e10cSrcweir }
2429*cdf0e10cSrcweir 
2430*cdf0e10cSrcweir // -----------------------------------------------------------------------
2431*cdf0e10cSrcweir 
2432*cdf0e10cSrcweir void OutputDevice::SetPixelOffset( const Size& rOffset )
2433*cdf0e10cSrcweir {
2434*cdf0e10cSrcweir     mnOutOffOrigX  = rOffset.Width();
2435*cdf0e10cSrcweir     mnOutOffOrigY  = rOffset.Height();
2436*cdf0e10cSrcweir 
2437*cdf0e10cSrcweir 	mnOutOffLogicX = ImplPixelToLogic( mnOutOffOrigX, mnDPIX,
2438*cdf0e10cSrcweir                                        maMapRes.mnMapScNumX, maMapRes.mnMapScDenomX,
2439*cdf0e10cSrcweir                                        maThresRes.mnThresPixToLogX );
2440*cdf0e10cSrcweir 	mnOutOffLogicY = ImplPixelToLogic( mnOutOffOrigY, mnDPIY,
2441*cdf0e10cSrcweir                                        maMapRes.mnMapScNumY, maMapRes.mnMapScDenomY,
2442*cdf0e10cSrcweir                                        maThresRes.mnThresPixToLogY );
2443*cdf0e10cSrcweir 
2444*cdf0e10cSrcweir     if( mpAlphaVDev )
2445*cdf0e10cSrcweir         mpAlphaVDev->SetPixelOffset( rOffset );
2446*cdf0e10cSrcweir }
2447*cdf0e10cSrcweir 
2448*cdf0e10cSrcweir // -----------------------------------------------------------------------
2449*cdf0e10cSrcweir 
2450*cdf0e10cSrcweir Size OutputDevice::GetPixelOffset() const
2451*cdf0e10cSrcweir {
2452*cdf0e10cSrcweir     return Size(mnOutOffOrigX, mnOutOffOrigY);
2453*cdf0e10cSrcweir }
2454*cdf0e10cSrcweir 
2455*cdf0e10cSrcweir // -----------------------------------------------------------------------
2456*cdf0e10cSrcweir 
2457*cdf0e10cSrcweir long Window::ImplLogicUnitToPixelX( long nX, MapUnit eUnit )
2458*cdf0e10cSrcweir {
2459*cdf0e10cSrcweir 	if ( eUnit != MAP_PIXEL )
2460*cdf0e10cSrcweir 	{
2461*cdf0e10cSrcweir 		ImplFrameData* pFrameData = mpWindowImpl->mpFrameData;
2462*cdf0e10cSrcweir 
2463*cdf0e10cSrcweir 		// Map-Einheit verschieden, dann neu berechnen
2464*cdf0e10cSrcweir 		if ( pFrameData->meMapUnit != eUnit )
2465*cdf0e10cSrcweir 		{
2466*cdf0e10cSrcweir 			pFrameData->meMapUnit = eUnit;
2467*cdf0e10cSrcweir 			ImplCalcMapResolution( MapMode( eUnit ), mnDPIX, mnDPIY,
2468*cdf0e10cSrcweir 								   pFrameData->maMapUnitRes );
2469*cdf0e10cSrcweir 		}
2470*cdf0e10cSrcweir 
2471*cdf0e10cSrcweir 		// Es wird kein BigInt gebraucht, da diese Funktion nur zur Umrechnung
2472*cdf0e10cSrcweir 		// von Fensterposition benutzt wird
2473*cdf0e10cSrcweir 		nX	= nX * mnDPIX * pFrameData->maMapUnitRes.mnMapScNumX;
2474*cdf0e10cSrcweir 		nX += nX >= 0 ?  (pFrameData->maMapUnitRes.mnMapScDenomX/2) :
2475*cdf0e10cSrcweir 						-((pFrameData->maMapUnitRes.mnMapScDenomX-1)/2);
2476*cdf0e10cSrcweir 		nX /= pFrameData->maMapUnitRes.mnMapScDenomX;
2477*cdf0e10cSrcweir 	}
2478*cdf0e10cSrcweir 
2479*cdf0e10cSrcweir 	return nX;
2480*cdf0e10cSrcweir }
2481*cdf0e10cSrcweir 
2482*cdf0e10cSrcweir // -----------------------------------------------------------------------
2483*cdf0e10cSrcweir 
2484*cdf0e10cSrcweir long Window::ImplLogicUnitToPixelY( long nY, MapUnit eUnit )
2485*cdf0e10cSrcweir {
2486*cdf0e10cSrcweir 	if ( eUnit != MAP_PIXEL )
2487*cdf0e10cSrcweir 	{
2488*cdf0e10cSrcweir 		ImplFrameData* pFrameData = mpWindowImpl->mpFrameData;
2489*cdf0e10cSrcweir 
2490*cdf0e10cSrcweir 		// Map-Einheit verschieden, dann neu berechnen
2491*cdf0e10cSrcweir 		if ( pFrameData->meMapUnit != eUnit )
2492*cdf0e10cSrcweir 		{
2493*cdf0e10cSrcweir 			pFrameData->meMapUnit = eUnit;
2494*cdf0e10cSrcweir 			ImplCalcMapResolution( MapMode( eUnit ), mnDPIX, mnDPIY,
2495*cdf0e10cSrcweir 								   pFrameData->maMapUnitRes );
2496*cdf0e10cSrcweir 		}
2497*cdf0e10cSrcweir 
2498*cdf0e10cSrcweir 		// Es wird kein BigInt gebraucht, da diese Funktion nur zur Umrechnung
2499*cdf0e10cSrcweir 		// von Fensterposition benutzt wird
2500*cdf0e10cSrcweir 		nY	= nY * mnDPIY * pFrameData->maMapUnitRes.mnMapScNumY;
2501*cdf0e10cSrcweir 		nY += nY >= 0 ?  (pFrameData->maMapUnitRes.mnMapScDenomY/2) :
2502*cdf0e10cSrcweir 						-((pFrameData->maMapUnitRes.mnMapScDenomY-1)/2);
2503*cdf0e10cSrcweir 		nY /= pFrameData->maMapUnitRes.mnMapScDenomY;
2504*cdf0e10cSrcweir 	}
2505*cdf0e10cSrcweir 
2506*cdf0e10cSrcweir 	return nY;
2507*cdf0e10cSrcweir }
2508