xref: /aoo42x/main/basegfx/source/numeric/ftools.cxx (revision 2a27d9ca)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_basegfx.hxx"
26 #include <basegfx/numeric/ftools.hxx>
27 #include <algorithm>
28 
29 namespace basegfx
30 {
31 	// init static member of class fTools
32 	double ::basegfx::fTools::mfSmallValue = 0.000000001;
33 
34 	double snapToNearestMultiple(double v, const double fStep)
35 	{
36 		if(fTools::equalZero(fStep))
37 		{
38 			// with a zero step, all snaps to 0.0
39 			return 0.0;
40 		}
41 		else
42 		{
43 			const double fHalfStep(fStep * 0.5);
44 			const double fChange(fHalfStep - fmod(v + fHalfStep, fStep));
45 
46             if(basegfx::fTools::equal(fabs(v), fabs(fChange)))
47             {
48                 return 0.0;
49             }
50             else
51             {
52     			return v + fChange;
53             }
54 		}
55 	}
56 
57 	double snapToZeroRange(double v, double fWidth)
58 	{
59 		if(fTools::equalZero(fWidth))
60 		{
61 			// with no range all snaps to range bound
62 			return 0.0;
63 		}
64 		else
65 		{
66 			if(v < 0.0 || v > fWidth)
67 			{
68 				double fRetval(fmod(v, fWidth));
69 
70 				if(fRetval < 0.0)
71 				{
72 					fRetval += fWidth;
73 				}
74 
75 				return fRetval;
76 			}
77 			else
78 			{
79 				return v;
80 			}
81 		}
82 	}
83 
84 	double snapToRange(double v, double fLow, double fHigh)
85 	{
86 		if(fTools::equal(fLow, fHigh))
87 		{
88 			// with no range all snaps to range bound
89 			return 0.0;
90 		}
91 		else
92 		{
93 			if(fLow > fHigh)
94 			{
95 				// correct range order. Evtl. assert this (?)
96 				std::swap(fLow, fHigh);
97 			}
98 
99 			if(v < fLow || v > fHigh)
100 			{
101 				return snapToZeroRange(v - fLow, fHigh - fLow) + fLow;
102 			}
103 			else
104 			{
105 				return v;
106 			}
107 		}
108 	}
109 } // end of namespace basegfx
110 
111 // eof
112