xref: /AOO41X/main/svtools/source/misc/unitconv.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2008 by Sun Microsystems, Inc.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * $RCSfile: dlgutil.cxx,v $
10*cdf0e10cSrcweir  * $Revision: 1.17 $
11*cdf0e10cSrcweir  *
12*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
13*cdf0e10cSrcweir  *
14*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
15*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
16*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
17*cdf0e10cSrcweir  *
18*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
19*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
22*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
23*cdf0e10cSrcweir  *
24*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
25*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
26*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
27*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
28*cdf0e10cSrcweir  *
29*cdf0e10cSrcweir  ************************************************************************/
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
32*cdf0e10cSrcweir #include "precompiled_svtools.hxx"
33*cdf0e10cSrcweir 
34*cdf0e10cSrcweir // include ---------------------------------------------------------------
35*cdf0e10cSrcweir 
36*cdf0e10cSrcweir #include <svtools/unitconv.hxx>
37*cdf0e10cSrcweir 
38*cdf0e10cSrcweir // -----------------------------------------------------------------------
39*cdf0e10cSrcweir 
40*cdf0e10cSrcweir void SetFieldUnit( MetricField& rField, FieldUnit eUnit, sal_Bool bAll )
41*cdf0e10cSrcweir {
42*cdf0e10cSrcweir 	sal_Int64 nFirst	= rField.Denormalize( rField.GetFirst( FUNIT_TWIP ) );
43*cdf0e10cSrcweir 	sal_Int64 nLast = rField.Denormalize( rField.GetLast( FUNIT_TWIP ) );
44*cdf0e10cSrcweir 	sal_Int64 nMin = rField.Denormalize( rField.GetMin( FUNIT_TWIP ) );
45*cdf0e10cSrcweir 	sal_Int64 nMax = rField.Denormalize( rField.GetMax( FUNIT_TWIP ) );
46*cdf0e10cSrcweir 
47*cdf0e10cSrcweir 	if ( !bAll )
48*cdf0e10cSrcweir 	{
49*cdf0e10cSrcweir 		switch ( eUnit )
50*cdf0e10cSrcweir 		{
51*cdf0e10cSrcweir 			case FUNIT_M:
52*cdf0e10cSrcweir 			case FUNIT_KM:
53*cdf0e10cSrcweir 				eUnit = FUNIT_CM;
54*cdf0e10cSrcweir 				break;
55*cdf0e10cSrcweir 
56*cdf0e10cSrcweir 			case FUNIT_FOOT:
57*cdf0e10cSrcweir 			case FUNIT_MILE:
58*cdf0e10cSrcweir 				eUnit = FUNIT_INCH;
59*cdf0e10cSrcweir 				break;
60*cdf0e10cSrcweir             default: ;//prevent warning
61*cdf0e10cSrcweir 		}
62*cdf0e10cSrcweir 	}
63*cdf0e10cSrcweir 	rField.SetUnit( eUnit );
64*cdf0e10cSrcweir 	switch( eUnit )
65*cdf0e10cSrcweir 	{
66*cdf0e10cSrcweir 		case FUNIT_MM:
67*cdf0e10cSrcweir 			rField.SetSpinSize( 50 );
68*cdf0e10cSrcweir 			break;
69*cdf0e10cSrcweir 
70*cdf0e10cSrcweir 		case FUNIT_INCH:
71*cdf0e10cSrcweir 			rField.SetSpinSize( 2 );
72*cdf0e10cSrcweir 			break;
73*cdf0e10cSrcweir 
74*cdf0e10cSrcweir 		default:
75*cdf0e10cSrcweir 			rField.SetSpinSize( 10 );
76*cdf0e10cSrcweir 	}
77*cdf0e10cSrcweir 
78*cdf0e10cSrcweir 	if ( FUNIT_POINT == eUnit )
79*cdf0e10cSrcweir     {
80*cdf0e10cSrcweir         if( rField.GetDecimalDigits() > 1 )
81*cdf0e10cSrcweir 		    rField.SetDecimalDigits( 1 );
82*cdf0e10cSrcweir     }
83*cdf0e10cSrcweir 	else
84*cdf0e10cSrcweir 		rField.SetDecimalDigits( 2 );
85*cdf0e10cSrcweir 
86*cdf0e10cSrcweir 	if ( !bAll )
87*cdf0e10cSrcweir 	{
88*cdf0e10cSrcweir 		rField.SetFirst( rField.Normalize( nFirst ), FUNIT_TWIP );
89*cdf0e10cSrcweir 		rField.SetLast( rField.Normalize( nLast ), FUNIT_TWIP );
90*cdf0e10cSrcweir 		rField.SetMin( rField.Normalize( nMin ), FUNIT_TWIP );
91*cdf0e10cSrcweir 		rField.SetMax( rField.Normalize( nMax ), FUNIT_TWIP );
92*cdf0e10cSrcweir 	}
93*cdf0e10cSrcweir }
94*cdf0e10cSrcweir 
95*cdf0e10cSrcweir // -----------------------------------------------------------------------
96*cdf0e10cSrcweir 
97*cdf0e10cSrcweir void SetFieldUnit( MetricBox& rBox, FieldUnit eUnit, sal_Bool bAll )
98*cdf0e10cSrcweir {
99*cdf0e10cSrcweir 	sal_Int64 nMin = rBox.Denormalize( rBox.GetMin( FUNIT_TWIP ) );
100*cdf0e10cSrcweir 	sal_Int64 nMax = rBox.Denormalize( rBox.GetMax( FUNIT_TWIP ) );
101*cdf0e10cSrcweir 
102*cdf0e10cSrcweir 	if ( !bAll )
103*cdf0e10cSrcweir 	{
104*cdf0e10cSrcweir 		switch ( eUnit )
105*cdf0e10cSrcweir 		{
106*cdf0e10cSrcweir 			case FUNIT_M:
107*cdf0e10cSrcweir 			case FUNIT_KM:
108*cdf0e10cSrcweir 				eUnit = FUNIT_CM;
109*cdf0e10cSrcweir 				break;
110*cdf0e10cSrcweir 
111*cdf0e10cSrcweir 			case FUNIT_FOOT:
112*cdf0e10cSrcweir 			case FUNIT_MILE:
113*cdf0e10cSrcweir 				eUnit = FUNIT_INCH;
114*cdf0e10cSrcweir 				break;
115*cdf0e10cSrcweir             default: ;//prevent warning
116*cdf0e10cSrcweir         }
117*cdf0e10cSrcweir 	}
118*cdf0e10cSrcweir 	rBox.SetUnit( eUnit );
119*cdf0e10cSrcweir 
120*cdf0e10cSrcweir 	if ( FUNIT_POINT == eUnit && rBox.GetDecimalDigits() > 1 )
121*cdf0e10cSrcweir 		rBox.SetDecimalDigits( 1 );
122*cdf0e10cSrcweir 	else
123*cdf0e10cSrcweir 		rBox.SetDecimalDigits( 2 );
124*cdf0e10cSrcweir 
125*cdf0e10cSrcweir 	if ( !bAll )
126*cdf0e10cSrcweir 	{
127*cdf0e10cSrcweir 		rBox.SetMin( rBox.Normalize( nMin ), FUNIT_TWIP );
128*cdf0e10cSrcweir 		rBox.SetMax( rBox.Normalize( nMax ), FUNIT_TWIP );
129*cdf0e10cSrcweir 	}
130*cdf0e10cSrcweir }
131*cdf0e10cSrcweir 
132*cdf0e10cSrcweir // -----------------------------------------------------------------------
133*cdf0e10cSrcweir void SetMetricValue( MetricField& rField, long nCoreValue, SfxMapUnit eUnit )
134*cdf0e10cSrcweir {
135*cdf0e10cSrcweir 	sal_Int64 nVal = OutputDevice::LogicToLogic( nCoreValue, (MapUnit)eUnit, MAP_100TH_MM );
136*cdf0e10cSrcweir 	nVal = rField.Normalize( nVal );
137*cdf0e10cSrcweir 	rField.SetValue( nVal, FUNIT_100TH_MM );
138*cdf0e10cSrcweir 
139*cdf0e10cSrcweir }
140*cdf0e10cSrcweir 
141*cdf0e10cSrcweir // -----------------------------------------------------------------------
142*cdf0e10cSrcweir 
143*cdf0e10cSrcweir long GetCoreValue( const MetricField& rField, SfxMapUnit eUnit )
144*cdf0e10cSrcweir {
145*cdf0e10cSrcweir 	sal_Int64 nVal = rField.GetValue( FUNIT_100TH_MM );
146*cdf0e10cSrcweir     // avoid rounding issues
147*cdf0e10cSrcweir     const sal_Int64 nSizeMask = 0xffffffffff000000LL;
148*cdf0e10cSrcweir     bool bRoundBefore = true;
149*cdf0e10cSrcweir     if( nVal >= 0 )
150*cdf0e10cSrcweir     {
151*cdf0e10cSrcweir         if( (nVal & nSizeMask) == 0 )
152*cdf0e10cSrcweir             bRoundBefore = false;
153*cdf0e10cSrcweir     }
154*cdf0e10cSrcweir     else
155*cdf0e10cSrcweir     {
156*cdf0e10cSrcweir         if( ((-nVal) & nSizeMask ) == 0 )
157*cdf0e10cSrcweir             bRoundBefore = false;
158*cdf0e10cSrcweir     }
159*cdf0e10cSrcweir     if( bRoundBefore )
160*cdf0e10cSrcweir         nVal = rField.Denormalize( nVal );
161*cdf0e10cSrcweir 	sal_Int64 nUnitVal = OutputDevice::LogicToLogic( static_cast<long>(nVal), MAP_100TH_MM, (MapUnit)eUnit );
162*cdf0e10cSrcweir     if( ! bRoundBefore )
163*cdf0e10cSrcweir         nUnitVal = rField.Denormalize( nUnitVal );
164*cdf0e10cSrcweir 	return static_cast<long>(nUnitVal);
165*cdf0e10cSrcweir }
166*cdf0e10cSrcweir 
167*cdf0e10cSrcweir // -----------------------------------------------------------------------
168*cdf0e10cSrcweir 
169*cdf0e10cSrcweir long CalcToUnit( float nIn, SfxMapUnit eUnit )
170*cdf0e10cSrcweir {
171*cdf0e10cSrcweir 	// nIn ist in Points
172*cdf0e10cSrcweir 
173*cdf0e10cSrcweir 	DBG_ASSERT( eUnit == SFX_MAPUNIT_TWIP 		||
174*cdf0e10cSrcweir 				eUnit == SFX_MAPUNIT_100TH_MM 	||
175*cdf0e10cSrcweir 				eUnit == SFX_MAPUNIT_10TH_MM 	||
176*cdf0e10cSrcweir 				eUnit == SFX_MAPUNIT_MM 		||
177*cdf0e10cSrcweir 				eUnit == SFX_MAPUNIT_CM, "this unit is not implemented" );
178*cdf0e10cSrcweir 
179*cdf0e10cSrcweir 	float nTmp = nIn;
180*cdf0e10cSrcweir 
181*cdf0e10cSrcweir 	if ( SFX_MAPUNIT_TWIP != eUnit )
182*cdf0e10cSrcweir 		nTmp = nIn * 10 / 567;
183*cdf0e10cSrcweir 
184*cdf0e10cSrcweir 	switch ( eUnit )
185*cdf0e10cSrcweir 	{
186*cdf0e10cSrcweir 		case SFX_MAPUNIT_100TH_MM:	nTmp *= 100; break;
187*cdf0e10cSrcweir 		case SFX_MAPUNIT_10TH_MM:	nTmp *= 10;	 break;
188*cdf0e10cSrcweir 		case SFX_MAPUNIT_MM:					 break;
189*cdf0e10cSrcweir 		case SFX_MAPUNIT_CM:		nTmp /= 10;	 break;
190*cdf0e10cSrcweir         default: ;//prevent warning
191*cdf0e10cSrcweir     }
192*cdf0e10cSrcweir 
193*cdf0e10cSrcweir 	nTmp *= 20;
194*cdf0e10cSrcweir 	long nRet = (long)nTmp;
195*cdf0e10cSrcweir 	return nRet;
196*cdf0e10cSrcweir //!	return (long)(nTmp * 20);
197*cdf0e10cSrcweir }
198*cdf0e10cSrcweir 
199*cdf0e10cSrcweir // -----------------------------------------------------------------------
200*cdf0e10cSrcweir 
201*cdf0e10cSrcweir long ItemToControl( long nIn, SfxMapUnit eItem, SfxFieldUnit eCtrl )
202*cdf0e10cSrcweir {
203*cdf0e10cSrcweir 	long nOut = 0;
204*cdf0e10cSrcweir 
205*cdf0e10cSrcweir 	switch ( eItem )
206*cdf0e10cSrcweir 	{
207*cdf0e10cSrcweir 		case SFX_MAPUNIT_100TH_MM:
208*cdf0e10cSrcweir 		case SFX_MAPUNIT_10TH_MM:
209*cdf0e10cSrcweir 		case SFX_MAPUNIT_MM:
210*cdf0e10cSrcweir 		{
211*cdf0e10cSrcweir 			if ( eItem == SFX_MAPUNIT_10TH_MM )
212*cdf0e10cSrcweir 				nIn /= 10;
213*cdf0e10cSrcweir 			else if ( eItem == SFX_MAPUNIT_100TH_MM )
214*cdf0e10cSrcweir 				nIn /= 100;
215*cdf0e10cSrcweir 			nOut = TransformMetric( nIn, FUNIT_MM, (FieldUnit)eCtrl );
216*cdf0e10cSrcweir 		}
217*cdf0e10cSrcweir 		break;
218*cdf0e10cSrcweir 
219*cdf0e10cSrcweir 		case SFX_MAPUNIT_CM:
220*cdf0e10cSrcweir 		{
221*cdf0e10cSrcweir 			nOut = TransformMetric( nIn, FUNIT_CM, (FieldUnit)eCtrl );
222*cdf0e10cSrcweir 		}
223*cdf0e10cSrcweir 		break;
224*cdf0e10cSrcweir 
225*cdf0e10cSrcweir 		case SFX_MAPUNIT_1000TH_INCH:
226*cdf0e10cSrcweir 		case SFX_MAPUNIT_100TH_INCH:
227*cdf0e10cSrcweir 		case SFX_MAPUNIT_10TH_INCH:
228*cdf0e10cSrcweir 		case SFX_MAPUNIT_INCH:
229*cdf0e10cSrcweir 		{
230*cdf0e10cSrcweir 			if ( eItem == SFX_MAPUNIT_10TH_INCH )
231*cdf0e10cSrcweir 				nIn /= 10;
232*cdf0e10cSrcweir 			else if ( eItem == SFX_MAPUNIT_100TH_INCH )
233*cdf0e10cSrcweir 				nIn /= 100;
234*cdf0e10cSrcweir 			else if ( eItem == SFX_MAPUNIT_1000TH_INCH )
235*cdf0e10cSrcweir 				nIn /= 1000;
236*cdf0e10cSrcweir 			nOut = TransformMetric( nIn, FUNIT_INCH, (FieldUnit)eCtrl );
237*cdf0e10cSrcweir 		}
238*cdf0e10cSrcweir 		break;
239*cdf0e10cSrcweir 
240*cdf0e10cSrcweir 		case SFX_MAPUNIT_POINT:
241*cdf0e10cSrcweir 		{
242*cdf0e10cSrcweir 			nOut = TransformMetric( nIn, FUNIT_POINT, (FieldUnit)eCtrl );
243*cdf0e10cSrcweir 		}
244*cdf0e10cSrcweir 		break;
245*cdf0e10cSrcweir 
246*cdf0e10cSrcweir 		case SFX_MAPUNIT_TWIP:
247*cdf0e10cSrcweir 		{
248*cdf0e10cSrcweir 			nOut = TransformMetric( nIn, FUNIT_TWIP, (FieldUnit)eCtrl );
249*cdf0e10cSrcweir 		}
250*cdf0e10cSrcweir 		break;
251*cdf0e10cSrcweir         default: ;//prevent warning
252*cdf0e10cSrcweir     }
253*cdf0e10cSrcweir 	return nOut;
254*cdf0e10cSrcweir }
255*cdf0e10cSrcweir 
256*cdf0e10cSrcweir // -----------------------------------------------------------------------
257*cdf0e10cSrcweir 
258*cdf0e10cSrcweir long ControlToItem( long nIn, SfxFieldUnit eCtrl, SfxMapUnit eItem )
259*cdf0e10cSrcweir {
260*cdf0e10cSrcweir 	return ItemToControl( nIn, eItem, eCtrl );
261*cdf0e10cSrcweir }
262*cdf0e10cSrcweir 
263*cdf0e10cSrcweir // -----------------------------------------------------------------------
264*cdf0e10cSrcweir 
265*cdf0e10cSrcweir FieldUnit MapToFieldUnit( const SfxMapUnit eUnit )
266*cdf0e10cSrcweir {
267*cdf0e10cSrcweir 	switch ( eUnit )
268*cdf0e10cSrcweir 	{
269*cdf0e10cSrcweir 		case SFX_MAPUNIT_100TH_MM:
270*cdf0e10cSrcweir 		case SFX_MAPUNIT_10TH_MM:
271*cdf0e10cSrcweir 		case SFX_MAPUNIT_MM:
272*cdf0e10cSrcweir 			return FUNIT_MM;
273*cdf0e10cSrcweir 
274*cdf0e10cSrcweir 		case SFX_MAPUNIT_CM:
275*cdf0e10cSrcweir 			return FUNIT_CM;
276*cdf0e10cSrcweir 
277*cdf0e10cSrcweir 		case SFX_MAPUNIT_1000TH_INCH:
278*cdf0e10cSrcweir 		case SFX_MAPUNIT_100TH_INCH:
279*cdf0e10cSrcweir 		case SFX_MAPUNIT_10TH_INCH:
280*cdf0e10cSrcweir 		case SFX_MAPUNIT_INCH:
281*cdf0e10cSrcweir 			return FUNIT_INCH;
282*cdf0e10cSrcweir 
283*cdf0e10cSrcweir 		case SFX_MAPUNIT_POINT:
284*cdf0e10cSrcweir 			return FUNIT_POINT;
285*cdf0e10cSrcweir 
286*cdf0e10cSrcweir 		case SFX_MAPUNIT_TWIP:
287*cdf0e10cSrcweir 			return FUNIT_TWIP;
288*cdf0e10cSrcweir         default: ;//prevent warning
289*cdf0e10cSrcweir     }
290*cdf0e10cSrcweir 	return FUNIT_NONE;
291*cdf0e10cSrcweir }
292*cdf0e10cSrcweir 
293*cdf0e10cSrcweir // -----------------------------------------------------------------------
294*cdf0e10cSrcweir 
295*cdf0e10cSrcweir MapUnit FieldToMapUnit( const SfxFieldUnit /*eUnit*/ )
296*cdf0e10cSrcweir {
297*cdf0e10cSrcweir 	return MAP_APPFONT;
298*cdf0e10cSrcweir }
299*cdf0e10cSrcweir 
300*cdf0e10cSrcweir // -----------------------------------------------------------------------
301*cdf0e10cSrcweir 
302*cdf0e10cSrcweir long ConvertValueToMap( long nVal, SfxMapUnit eUnit )
303*cdf0e10cSrcweir {
304*cdf0e10cSrcweir 	long nNew = nVal;
305*cdf0e10cSrcweir 
306*cdf0e10cSrcweir 	switch ( eUnit )
307*cdf0e10cSrcweir 	{
308*cdf0e10cSrcweir 		case SFX_MAPUNIT_10TH_MM:
309*cdf0e10cSrcweir 		case SFX_MAPUNIT_10TH_INCH:
310*cdf0e10cSrcweir 			nNew *= 10;
311*cdf0e10cSrcweir 			break;
312*cdf0e10cSrcweir 
313*cdf0e10cSrcweir 		case SFX_MAPUNIT_100TH_MM:
314*cdf0e10cSrcweir 		case SFX_MAPUNIT_100TH_INCH:
315*cdf0e10cSrcweir 			nNew *= 100;
316*cdf0e10cSrcweir 			break;
317*cdf0e10cSrcweir 
318*cdf0e10cSrcweir 		case SFX_MAPUNIT_1000TH_INCH:
319*cdf0e10cSrcweir 			nNew *= 1000;
320*cdf0e10cSrcweir         default: ;//prevent warning
321*cdf0e10cSrcweir     }
322*cdf0e10cSrcweir 	return nNew;
323*cdf0e10cSrcweir }
324*cdf0e10cSrcweir 
325*cdf0e10cSrcweir // -----------------------------------------------------------------------
326*cdf0e10cSrcweir 
327*cdf0e10cSrcweir long ConvertValueToUnit( long nVal, SfxMapUnit eUnit )
328*cdf0e10cSrcweir {
329*cdf0e10cSrcweir 	long nNew = nVal;
330*cdf0e10cSrcweir 
331*cdf0e10cSrcweir 	switch ( eUnit )
332*cdf0e10cSrcweir 	{
333*cdf0e10cSrcweir 		case SFX_MAPUNIT_10TH_MM:
334*cdf0e10cSrcweir 		case SFX_MAPUNIT_10TH_INCH:
335*cdf0e10cSrcweir 			nNew /= 10;
336*cdf0e10cSrcweir 			break;
337*cdf0e10cSrcweir 
338*cdf0e10cSrcweir 		case SFX_MAPUNIT_100TH_MM:
339*cdf0e10cSrcweir 		case SFX_MAPUNIT_100TH_INCH:
340*cdf0e10cSrcweir 			nNew /= 100;
341*cdf0e10cSrcweir 			break;
342*cdf0e10cSrcweir 
343*cdf0e10cSrcweir 		case SFX_MAPUNIT_1000TH_INCH:
344*cdf0e10cSrcweir 			nNew /= 1000;
345*cdf0e10cSrcweir         break;
346*cdf0e10cSrcweir         default: ;//prevent warning
347*cdf0e10cSrcweir 	}
348*cdf0e10cSrcweir 	return nNew;
349*cdf0e10cSrcweir }
350*cdf0e10cSrcweir 
351*cdf0e10cSrcweir // -----------------------------------------------------------------------
352*cdf0e10cSrcweir 
353*cdf0e10cSrcweir long CalcToPoint( long nIn, SfxMapUnit eUnit, sal_uInt16 nFaktor )
354*cdf0e10cSrcweir {
355*cdf0e10cSrcweir 	DBG_ASSERT( eUnit == SFX_MAPUNIT_TWIP 		||
356*cdf0e10cSrcweir 				eUnit == SFX_MAPUNIT_100TH_MM 	||
357*cdf0e10cSrcweir 				eUnit == SFX_MAPUNIT_10TH_MM 	||
358*cdf0e10cSrcweir 				eUnit == SFX_MAPUNIT_MM 		||
359*cdf0e10cSrcweir 				eUnit == SFX_MAPUNIT_CM, "this unit is not implemented" );
360*cdf0e10cSrcweir 
361*cdf0e10cSrcweir 	long nRet = 0;
362*cdf0e10cSrcweir 
363*cdf0e10cSrcweir 	if ( SFX_MAPUNIT_TWIP == eUnit )
364*cdf0e10cSrcweir 		nRet = nIn;
365*cdf0e10cSrcweir 	else
366*cdf0e10cSrcweir 		nRet = nIn * 567;
367*cdf0e10cSrcweir 
368*cdf0e10cSrcweir 	switch ( eUnit )
369*cdf0e10cSrcweir 	{
370*cdf0e10cSrcweir 		case SFX_MAPUNIT_100TH_MM:	nRet /= 100; break;
371*cdf0e10cSrcweir 		case SFX_MAPUNIT_10TH_MM:	nRet /= 10;	 break;
372*cdf0e10cSrcweir 		case SFX_MAPUNIT_MM:					 break;
373*cdf0e10cSrcweir 		case SFX_MAPUNIT_CM:		nRet *= 10;	 break;
374*cdf0e10cSrcweir         default: ;//prevent warning
375*cdf0e10cSrcweir     }
376*cdf0e10cSrcweir 
377*cdf0e10cSrcweir 	// ggf. aufrunden
378*cdf0e10cSrcweir 	if ( SFX_MAPUNIT_TWIP != eUnit )
379*cdf0e10cSrcweir 	{
380*cdf0e10cSrcweir 		long nMod = 10;
381*cdf0e10cSrcweir 		long nTmp = nRet % nMod;
382*cdf0e10cSrcweir 
383*cdf0e10cSrcweir 		if ( nTmp >= 4 )
384*cdf0e10cSrcweir 			nRet += 10 - nTmp;
385*cdf0e10cSrcweir 		nRet /= 10;
386*cdf0e10cSrcweir 	}
387*cdf0e10cSrcweir 	return nRet * nFaktor / 20;
388*cdf0e10cSrcweir }
389*cdf0e10cSrcweir 
390*cdf0e10cSrcweir // -----------------------------------------------------------------------
391*cdf0e10cSrcweir 
392*cdf0e10cSrcweir long CMToTwips( long nIn )
393*cdf0e10cSrcweir {
394*cdf0e10cSrcweir 	long nRet = 0;
395*cdf0e10cSrcweir 
396*cdf0e10cSrcweir 	if ( nIn <= ( LONG_MAX / 567 ) && nIn >= ( LONG_MIN / 567 ) )
397*cdf0e10cSrcweir 		nRet = nIn * 567;
398*cdf0e10cSrcweir 	return nRet;
399*cdf0e10cSrcweir }
400*cdf0e10cSrcweir 
401*cdf0e10cSrcweir // -----------------------------------------------------------------------
402*cdf0e10cSrcweir 
403*cdf0e10cSrcweir long MMToTwips( long nIn )
404*cdf0e10cSrcweir {
405*cdf0e10cSrcweir 	long nRet = 0;
406*cdf0e10cSrcweir 
407*cdf0e10cSrcweir 	if ( nIn <= ( LONG_MAX / 567 ) && nIn >= ( LONG_MIN / 567 ) )
408*cdf0e10cSrcweir 		nRet = nIn * 567 / 10;
409*cdf0e10cSrcweir 	return nRet;
410*cdf0e10cSrcweir }
411*cdf0e10cSrcweir 
412*cdf0e10cSrcweir // -----------------------------------------------------------------------
413*cdf0e10cSrcweir 
414*cdf0e10cSrcweir long InchToTwips( long nIn )
415*cdf0e10cSrcweir {
416*cdf0e10cSrcweir 	long nRet = 0;
417*cdf0e10cSrcweir 
418*cdf0e10cSrcweir 	if ( nIn <= ( LONG_MAX / 1440 ) && nIn >= ( LONG_MIN / 1440 ) )
419*cdf0e10cSrcweir 		nRet = nIn * 1440;
420*cdf0e10cSrcweir 	return nRet;
421*cdf0e10cSrcweir }
422*cdf0e10cSrcweir 
423*cdf0e10cSrcweir // -----------------------------------------------------------------------
424*cdf0e10cSrcweir 
425*cdf0e10cSrcweir long PointToTwips( long nIn )
426*cdf0e10cSrcweir {
427*cdf0e10cSrcweir 	long nRet = 0;
428*cdf0e10cSrcweir 
429*cdf0e10cSrcweir 	if ( nIn <= ( LONG_MAX / 20 ) && nIn >= ( LONG_MIN / 20 ) )
430*cdf0e10cSrcweir 		nRet = nIn * 20;
431*cdf0e10cSrcweir 	return nRet;
432*cdf0e10cSrcweir }
433*cdf0e10cSrcweir 
434*cdf0e10cSrcweir // -----------------------------------------------------------------------
435*cdf0e10cSrcweir 
436*cdf0e10cSrcweir long PicaToTwips( long nIn )
437*cdf0e10cSrcweir {
438*cdf0e10cSrcweir 	long nRet = 0;
439*cdf0e10cSrcweir 
440*cdf0e10cSrcweir 	if ( nIn <= ( LONG_MAX / 240 ) && nIn >= ( LONG_MIN / 240 ) )
441*cdf0e10cSrcweir 		nRet = nIn * 240;
442*cdf0e10cSrcweir 	return nRet;
443*cdf0e10cSrcweir }
444*cdf0e10cSrcweir 
445*cdf0e10cSrcweir // -----------------------------------------------------------------------
446*cdf0e10cSrcweir 
447*cdf0e10cSrcweir long TwipsToCM( long nIn )
448*cdf0e10cSrcweir {
449*cdf0e10cSrcweir 	long nRet = nIn / 567;
450*cdf0e10cSrcweir 	return nRet;
451*cdf0e10cSrcweir }
452*cdf0e10cSrcweir 
453*cdf0e10cSrcweir // -----------------------------------------------------------------------
454*cdf0e10cSrcweir 
455*cdf0e10cSrcweir long InchToCM( long nIn )
456*cdf0e10cSrcweir {
457*cdf0e10cSrcweir 	long nRet = 0;
458*cdf0e10cSrcweir 
459*cdf0e10cSrcweir 	if ( nIn <= ( LONG_MAX / 254 ) && nIn >= ( LONG_MIN / 254 ) )
460*cdf0e10cSrcweir 		nRet = nIn * 254 / 100;
461*cdf0e10cSrcweir 	return nRet;
462*cdf0e10cSrcweir }
463*cdf0e10cSrcweir 
464*cdf0e10cSrcweir // -----------------------------------------------------------------------
465*cdf0e10cSrcweir 
466*cdf0e10cSrcweir long MMToCM( long nIn )
467*cdf0e10cSrcweir {
468*cdf0e10cSrcweir 	long nRet = nIn / 10;
469*cdf0e10cSrcweir 	return nRet;
470*cdf0e10cSrcweir }
471*cdf0e10cSrcweir 
472*cdf0e10cSrcweir // -----------------------------------------------------------------------
473*cdf0e10cSrcweir 
474*cdf0e10cSrcweir long PointToCM( long nIn )
475*cdf0e10cSrcweir {
476*cdf0e10cSrcweir 	long nRet = 0;
477*cdf0e10cSrcweir 
478*cdf0e10cSrcweir 	if ( nIn <= ( LONG_MAX / 20 ) && nIn >= ( LONG_MIN / 20 ) )
479*cdf0e10cSrcweir 		nRet = nIn * 20 / 567;
480*cdf0e10cSrcweir 	return nRet;
481*cdf0e10cSrcweir }
482*cdf0e10cSrcweir 
483*cdf0e10cSrcweir // -----------------------------------------------------------------------
484*cdf0e10cSrcweir 
485*cdf0e10cSrcweir long PicaToCM( long nIn)
486*cdf0e10cSrcweir {
487*cdf0e10cSrcweir 	long nRet = 0;
488*cdf0e10cSrcweir 
489*cdf0e10cSrcweir 	if ( nIn <= ( LONG_MAX / 12 / 20 ) && nIn >= ( LONG_MIN / 12 / 20 ) )
490*cdf0e10cSrcweir 		nRet = nIn * 12 * 20 / 567;
491*cdf0e10cSrcweir 	return nRet;
492*cdf0e10cSrcweir }
493*cdf0e10cSrcweir 
494*cdf0e10cSrcweir // -----------------------------------------------------------------------
495*cdf0e10cSrcweir 
496*cdf0e10cSrcweir long TwipsToMM( long nIn )
497*cdf0e10cSrcweir {
498*cdf0e10cSrcweir 	long nRet = 0;
499*cdf0e10cSrcweir 
500*cdf0e10cSrcweir 	if ( nIn <= ( LONG_MAX / 10 ) && nIn >= ( LONG_MIN / 10 ) )
501*cdf0e10cSrcweir 		nRet = nIn * 10 / 566;
502*cdf0e10cSrcweir 	return nRet;
503*cdf0e10cSrcweir }
504*cdf0e10cSrcweir 
505*cdf0e10cSrcweir // -----------------------------------------------------------------------
506*cdf0e10cSrcweir 
507*cdf0e10cSrcweir long CMToMM( long nIn )
508*cdf0e10cSrcweir {
509*cdf0e10cSrcweir 	long nRet = 0;
510*cdf0e10cSrcweir 
511*cdf0e10cSrcweir 	if ( nIn <= ( LONG_MAX / 10 ) && nIn >= ( LONG_MIN / 10 ) )
512*cdf0e10cSrcweir 		nRet = nIn * 10;
513*cdf0e10cSrcweir 	return nRet;
514*cdf0e10cSrcweir }
515*cdf0e10cSrcweir 
516*cdf0e10cSrcweir // -----------------------------------------------------------------------
517*cdf0e10cSrcweir 
518*cdf0e10cSrcweir long InchToMM( long nIn )
519*cdf0e10cSrcweir {
520*cdf0e10cSrcweir 	long nRet = 0;
521*cdf0e10cSrcweir 
522*cdf0e10cSrcweir 	if ( nIn <= ( LONG_MAX / 254 ) && nIn >= ( LONG_MIN / 254 ) )
523*cdf0e10cSrcweir 		nRet = nIn * 254 / 10;
524*cdf0e10cSrcweir 	return nRet;
525*cdf0e10cSrcweir }
526*cdf0e10cSrcweir 
527*cdf0e10cSrcweir // -----------------------------------------------------------------------
528*cdf0e10cSrcweir 
529*cdf0e10cSrcweir long PointToMM( long nIn )
530*cdf0e10cSrcweir {
531*cdf0e10cSrcweir 	long nRet = 0;
532*cdf0e10cSrcweir 
533*cdf0e10cSrcweir 	if ( nIn <= ( LONG_MAX / 200 ) && nIn >= ( LONG_MIN / 200 ) )
534*cdf0e10cSrcweir 		nRet = nIn * 200 / 567;
535*cdf0e10cSrcweir 	return nRet;
536*cdf0e10cSrcweir }
537*cdf0e10cSrcweir 
538*cdf0e10cSrcweir // -----------------------------------------------------------------------
539*cdf0e10cSrcweir 
540*cdf0e10cSrcweir long PicaToMM( long nIn )
541*cdf0e10cSrcweir {
542*cdf0e10cSrcweir 	long nRet = 0;
543*cdf0e10cSrcweir 
544*cdf0e10cSrcweir 	if ( nIn <= ( LONG_MAX / 12 / 200 ) && nIn >= ( LONG_MIN / 12 / 200 ) )
545*cdf0e10cSrcweir 		nRet = nIn * 12 * 200 / 567;
546*cdf0e10cSrcweir 	return nRet;
547*cdf0e10cSrcweir }
548*cdf0e10cSrcweir 
549*cdf0e10cSrcweir // -----------------------------------------------------------------------
550*cdf0e10cSrcweir 
551*cdf0e10cSrcweir long TwipsToInch( long nIn )
552*cdf0e10cSrcweir {
553*cdf0e10cSrcweir 	long nRet = nIn / 1440;
554*cdf0e10cSrcweir 	return nRet;
555*cdf0e10cSrcweir }
556*cdf0e10cSrcweir 
557*cdf0e10cSrcweir // -----------------------------------------------------------------------
558*cdf0e10cSrcweir 
559*cdf0e10cSrcweir long CMToInch( long nIn )
560*cdf0e10cSrcweir {
561*cdf0e10cSrcweir 	long nRet = 0;
562*cdf0e10cSrcweir 
563*cdf0e10cSrcweir 	if ( nIn <= ( LONG_MAX / 100 ) && nIn >= ( LONG_MIN / 100 ) )
564*cdf0e10cSrcweir 		nRet = nIn * 100 / 254;
565*cdf0e10cSrcweir 	return nRet;
566*cdf0e10cSrcweir }
567*cdf0e10cSrcweir 
568*cdf0e10cSrcweir // -----------------------------------------------------------------------
569*cdf0e10cSrcweir 
570*cdf0e10cSrcweir long MMToInch( long nIn )
571*cdf0e10cSrcweir {
572*cdf0e10cSrcweir 	long nRet = 0;
573*cdf0e10cSrcweir 
574*cdf0e10cSrcweir 	if ( nIn <= ( LONG_MAX / 10 ) && nIn >= ( LONG_MIN / 10 ) )
575*cdf0e10cSrcweir 		nRet = nIn * 10 / 254;
576*cdf0e10cSrcweir 	return nRet;
577*cdf0e10cSrcweir }
578*cdf0e10cSrcweir 
579*cdf0e10cSrcweir // -----------------------------------------------------------------------
580*cdf0e10cSrcweir 
581*cdf0e10cSrcweir long PointToInch( long nIn )
582*cdf0e10cSrcweir {
583*cdf0e10cSrcweir 	long nRet = nIn / 72;
584*cdf0e10cSrcweir 	return nRet;
585*cdf0e10cSrcweir }
586*cdf0e10cSrcweir 
587*cdf0e10cSrcweir // -----------------------------------------------------------------------
588*cdf0e10cSrcweir 
589*cdf0e10cSrcweir long PicaToInch( long nIn )
590*cdf0e10cSrcweir {
591*cdf0e10cSrcweir 	long nRet = nIn / 6;
592*cdf0e10cSrcweir 	return nRet;
593*cdf0e10cSrcweir }
594*cdf0e10cSrcweir 
595*cdf0e10cSrcweir // -----------------------------------------------------------------------
596*cdf0e10cSrcweir 
597*cdf0e10cSrcweir long TwipsToPoint( long nIn )
598*cdf0e10cSrcweir {
599*cdf0e10cSrcweir 	long nRet = nIn / 20;
600*cdf0e10cSrcweir 	return nRet;
601*cdf0e10cSrcweir }
602*cdf0e10cSrcweir 
603*cdf0e10cSrcweir // -----------------------------------------------------------------------
604*cdf0e10cSrcweir 
605*cdf0e10cSrcweir long InchToPoint( long nIn )
606*cdf0e10cSrcweir {
607*cdf0e10cSrcweir 	long nRet = 0;
608*cdf0e10cSrcweir 
609*cdf0e10cSrcweir 	if ( nIn <= ( LONG_MAX / 72 ) && nIn >= ( LONG_MIN / 72 ) )
610*cdf0e10cSrcweir 		nRet = nIn * 72;
611*cdf0e10cSrcweir 	return nRet;
612*cdf0e10cSrcweir }
613*cdf0e10cSrcweir 
614*cdf0e10cSrcweir // -----------------------------------------------------------------------
615*cdf0e10cSrcweir 
616*cdf0e10cSrcweir long CMToPoint( long nIn )
617*cdf0e10cSrcweir {
618*cdf0e10cSrcweir 	long nRet = 0;
619*cdf0e10cSrcweir 
620*cdf0e10cSrcweir 	if ( nIn <= ( LONG_MAX / 567 ) && nIn >= ( LONG_MIN / 567 ) )
621*cdf0e10cSrcweir 		nRet = nIn * 567 / 20;
622*cdf0e10cSrcweir 	return nRet;
623*cdf0e10cSrcweir }
624*cdf0e10cSrcweir 
625*cdf0e10cSrcweir // -----------------------------------------------------------------------
626*cdf0e10cSrcweir 
627*cdf0e10cSrcweir long MMToPoint( long nIn )
628*cdf0e10cSrcweir {
629*cdf0e10cSrcweir 	long nRet = 0;
630*cdf0e10cSrcweir 
631*cdf0e10cSrcweir 	if ( nIn <= ( LONG_MAX / 567 ) && nIn >= ( LONG_MIN / 567 ) )
632*cdf0e10cSrcweir 		nRet = nIn * 567 / 200;
633*cdf0e10cSrcweir 	return nRet;
634*cdf0e10cSrcweir }
635*cdf0e10cSrcweir 
636*cdf0e10cSrcweir // -----------------------------------------------------------------------
637*cdf0e10cSrcweir 
638*cdf0e10cSrcweir long PicaToPoint( long nIn )
639*cdf0e10cSrcweir {
640*cdf0e10cSrcweir 	long nRet = nIn / 12;
641*cdf0e10cSrcweir 	return nRet;
642*cdf0e10cSrcweir }
643*cdf0e10cSrcweir 
644*cdf0e10cSrcweir // -----------------------------------------------------------------------
645*cdf0e10cSrcweir 
646*cdf0e10cSrcweir long TwipsToPica( long nIn )
647*cdf0e10cSrcweir {
648*cdf0e10cSrcweir 	long nRet = nIn / 240;
649*cdf0e10cSrcweir 	return nRet;
650*cdf0e10cSrcweir }
651*cdf0e10cSrcweir 
652*cdf0e10cSrcweir // -----------------------------------------------------------------------
653*cdf0e10cSrcweir 
654*cdf0e10cSrcweir long InchToPica( long nIn )
655*cdf0e10cSrcweir {
656*cdf0e10cSrcweir 	long nRet = 0;
657*cdf0e10cSrcweir 
658*cdf0e10cSrcweir 	if ( nIn <= ( LONG_MAX / 6 ) && nIn >= ( LONG_MIN / 6 ) )
659*cdf0e10cSrcweir 		nRet = nIn * 6;
660*cdf0e10cSrcweir 	return nRet;
661*cdf0e10cSrcweir }
662*cdf0e10cSrcweir 
663*cdf0e10cSrcweir // -----------------------------------------------------------------------
664*cdf0e10cSrcweir 
665*cdf0e10cSrcweir long PointToPica( long nIn )
666*cdf0e10cSrcweir {
667*cdf0e10cSrcweir 	long nRet = 0;
668*cdf0e10cSrcweir 
669*cdf0e10cSrcweir 	if ( nIn <= ( LONG_MAX / 12 ) && nIn >= ( LONG_MIN / 12 ) )
670*cdf0e10cSrcweir 		nRet = nIn * 12;
671*cdf0e10cSrcweir 	return nRet;
672*cdf0e10cSrcweir }
673*cdf0e10cSrcweir 
674*cdf0e10cSrcweir // -----------------------------------------------------------------------
675*cdf0e10cSrcweir 
676*cdf0e10cSrcweir long CMToPica( long nIn )
677*cdf0e10cSrcweir {
678*cdf0e10cSrcweir 	long nRet = 0;
679*cdf0e10cSrcweir 
680*cdf0e10cSrcweir 	if ( nIn <= ( LONG_MAX / 567 ) && nIn >= ( LONG_MIN / 567 ) )
681*cdf0e10cSrcweir 		nRet = nIn * 567 / 20 / 12;
682*cdf0e10cSrcweir 	return nRet;
683*cdf0e10cSrcweir }
684*cdf0e10cSrcweir 
685*cdf0e10cSrcweir // -----------------------------------------------------------------------
686*cdf0e10cSrcweir 
687*cdf0e10cSrcweir long MMToPica( long nIn )
688*cdf0e10cSrcweir {
689*cdf0e10cSrcweir 	long nRet = 0;
690*cdf0e10cSrcweir 
691*cdf0e10cSrcweir 	if ( nIn <= ( LONG_MAX / 567 ) && nIn >= ( LONG_MIN / 567 ) )
692*cdf0e10cSrcweir 		nRet = nIn * 567 / 200 / 12;
693*cdf0e10cSrcweir 	return nRet;
694*cdf0e10cSrcweir }
695*cdf0e10cSrcweir 
696*cdf0e10cSrcweir // -----------------------------------------------------------------------
697*cdf0e10cSrcweir 
698*cdf0e10cSrcweir long Nothing( long nIn )
699*cdf0e10cSrcweir {
700*cdf0e10cSrcweir 	long nRet = nIn;
701*cdf0e10cSrcweir 	return nRet;
702*cdf0e10cSrcweir }
703*cdf0e10cSrcweir 
704*cdf0e10cSrcweir FUNC_CONVERT ConvertTable[6][6] =
705*cdf0e10cSrcweir {
706*cdf0e10cSrcweir //  CM,			MM			INCH		 POINT		  PICAS=32	   TWIPS
707*cdf0e10cSrcweir 	{ Nothing, 	CMToMM, 	CMToInch,    CMToPoint,   CMToPica,    CMToTwips },
708*cdf0e10cSrcweir 	{ MMToCM,		Nothing,	MMToInch,	 MMToPoint,   MMToPica,    MMToTwips },
709*cdf0e10cSrcweir 	{ InchToCM,	InchToMM,	Nothing,	 InchToPoint, InchToPica,  InchToTwips },
710*cdf0e10cSrcweir 	{ PointToCM,	PointToMM,  PointToInch, Nothing,	  PointToPica, PointToTwips },
711*cdf0e10cSrcweir 	{ PicaToCM,	PicaToMM,   PicaToInch,  PicaToPoint, Nothing,	   PicaToTwips },
712*cdf0e10cSrcweir 	{ TwipsToCM,	TwipsToMM,  TwipsToInch, TwipsToPoint,TwipsToPica, Nothing }
713*cdf0e10cSrcweir };
714*cdf0e10cSrcweir 
715*cdf0e10cSrcweir // -----------------------------------------------------------------------
716*cdf0e10cSrcweir 
717*cdf0e10cSrcweir long TransformMetric( long nVal, FieldUnit aOld, FieldUnit aNew )
718*cdf0e10cSrcweir {
719*cdf0e10cSrcweir 	if ( aOld == FUNIT_NONE	  || aNew == FUNIT_NONE ||
720*cdf0e10cSrcweir 		 aOld == FUNIT_CUSTOM || aNew == FUNIT_CUSTOM )
721*cdf0e10cSrcweir 	{
722*cdf0e10cSrcweir 		return nVal;
723*cdf0e10cSrcweir 	}
724*cdf0e10cSrcweir 
725*cdf0e10cSrcweir 	sal_uInt16 nOld = 0;
726*cdf0e10cSrcweir 	sal_uInt16 nNew = 0;
727*cdf0e10cSrcweir 
728*cdf0e10cSrcweir 	switch ( aOld )
729*cdf0e10cSrcweir 	{
730*cdf0e10cSrcweir 		case FUNIT_CM:
731*cdf0e10cSrcweir 			nOld = 0; break;
732*cdf0e10cSrcweir 		case FUNIT_MM:
733*cdf0e10cSrcweir 			nOld = 1; break;
734*cdf0e10cSrcweir 		case FUNIT_INCH:
735*cdf0e10cSrcweir 			nOld = 2; break;
736*cdf0e10cSrcweir 		case FUNIT_POINT:
737*cdf0e10cSrcweir 			nOld = 3; break;
738*cdf0e10cSrcweir 		case FUNIT_PICA:
739*cdf0e10cSrcweir 			nOld = 4; break;
740*cdf0e10cSrcweir 		case FUNIT_TWIP:
741*cdf0e10cSrcweir 			nOld = 5; break;
742*cdf0e10cSrcweir         default: ;//prevent warning
743*cdf0e10cSrcweir     }
744*cdf0e10cSrcweir 
745*cdf0e10cSrcweir 	switch ( aNew )
746*cdf0e10cSrcweir 	{
747*cdf0e10cSrcweir 		case FUNIT_CM:
748*cdf0e10cSrcweir 			nNew = 0; break;
749*cdf0e10cSrcweir 		case FUNIT_MM:
750*cdf0e10cSrcweir 			nNew = 1; break;
751*cdf0e10cSrcweir 		case FUNIT_INCH:
752*cdf0e10cSrcweir 			nNew = 2; break;
753*cdf0e10cSrcweir 		case FUNIT_POINT:
754*cdf0e10cSrcweir 			nNew = 3; break;
755*cdf0e10cSrcweir 		case FUNIT_PICA:
756*cdf0e10cSrcweir 			nNew = 4; break;
757*cdf0e10cSrcweir 		case FUNIT_TWIP:
758*cdf0e10cSrcweir 			nNew = 5; break;
759*cdf0e10cSrcweir         default: ;//prevent warning
760*cdf0e10cSrcweir     }
761*cdf0e10cSrcweir 	return ConvertTable[nOld][nNew]( nVal );
762*cdf0e10cSrcweir }
763*cdf0e10cSrcweir 
764