ftools.cxx (09dbbe93) ftools.cxx (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

--- 10 unchanged lines hidden (view full) ---

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>
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

--- 10 unchanged lines hidden (view full) ---

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>
27
28namespace basegfx
29{
30 // init static member of class fTools
31 double ::basegfx::fTools::mfSmallValue = 0.000000001;
28
29namespace 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 }
32} // end of namespace basegfx
33
34// eof
109} // end of namespace basegfx
110
111// eof