Tizen 2.0 Release
[framework/graphics/cairo.git] / src / cairo-time.c
1 /* cairo - a vector graphics library with display and print output
2  *
3  * Copyright (c) 2007 Netlabs
4  * Copyright (c) 2006 Mozilla Corporation
5  * Copyright (c) 2006 Red Hat, Inc.
6  * Copyright (c) 2011 Andrea Canciani
7  *
8  * Permission to use, copy, modify, distribute, and sell this software
9  * and its documentation for any purpose is hereby granted without
10  * fee, provided that the above copyright notice appear in all copies
11  * and that both that copyright notice and this permission notice
12  * appear in supporting documentation, and that the name of
13  * the authors not be used in advertising or publicity pertaining to
14  * distribution of the software without specific, written prior
15  * permission. The authors make no representations about the
16  * suitability of this software for any purpose.  It is provided "as
17  * is" without express or implied warranty.
18  *
19  * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
20  * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
21  * FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL,
22  * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
23  * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
24  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
25  * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
26  *
27  * Authors: Peter Weilbacher <mozilla@weilbacher.org>
28  *          Vladimir Vukicevic <vladimir@pobox.com>
29  *          Carl Worth <cworth@cworth.org>
30  *          Andrea Canciani <ranma42@gmail.com>
31  */
32
33 #include "cairoint.h"
34
35 #include "cairo-time-private.h"
36
37 #if HAVE_CLOCK_GETTIME
38 #if defined(CLOCK_MONOTONIC_RAW)
39 #define CAIRO_CLOCK CLOCK_MONOTONIC_RAW
40 #elif defined(CLOCK_MONOTONIC)
41 #define CAIRO_CLOCK CLOCK_MONOTONIC
42 #endif
43 #endif
44
45 #if defined(__APPLE__)
46 #include <mach/mach_time.h>
47
48 static cairo_always_inline double
49 _cairo_time_1s (void)
50 {
51     mach_timebase_info_data_t freq;
52
53     mach_timebase_info (&freq);
54
55     return 1000000000. * freq.denom / freq.numer;
56 }
57
58 cairo_time_t
59 _cairo_time_get (void)
60 {
61     return mach_absolute_time ();
62 }
63
64 #elif defined(__OS2__)
65 #define INCL_BASE
66 #include <os2.h>
67
68 static cairo_always_inline double
69 _cairo_time_1s (void)
70 {
71     ULONG freq;
72
73     DosTmrQueryFreq (&freq);
74
75     return freq;
76 }
77
78 cairo_time_t
79 _cairo_time_get (void)
80 {
81     QWORD t;
82     cairo_int64_t r;
83
84     DosTmrQueryTime (&t);
85
86     r = _cairo_int64_lsl (_cairo_int32_to_int64 (t.ulHi), 32);
87     r = _cairo_int64_add (r, _cairo_int32_to_int64 (t.ulLo));
88
89     return r;
90 }
91
92 #elif _WIN32
93 #define WIN32_LEAN_AND_MEAN
94 #include <windows.h>
95
96 static cairo_always_inline double
97 _cairo_time_1s (void)
98 {
99     LARGE_INTEGER freq;
100
101     QueryPerformanceFrequency (&freq);
102
103     return freq.QuadPart;
104 }
105
106 #ifndef HAVE_UINT64_T
107 static cairo_always_inline cairo_time_t
108 _cairo_time_from_large_integer (LARGE_INTEGER t)
109 {
110     cairo_int64_t r;
111
112     r = _cairo_int64_lsl (_cairo_int32_to_int64 (t.HighPart), 32);
113     r = _cairo_int64_add (r, _cairo_int32_to_int64 (t.LowPart));
114
115     return r;
116 }
117 #else
118 static cairo_always_inline cairo_time_t
119 _cairo_time_from_large_integer (LARGE_INTEGER t)
120 {
121     return t.QuadPart;
122 }
123 #endif
124
125 cairo_time_t
126 _cairo_time_get (void)
127 {
128     LARGE_INTEGER t;
129
130     QueryPerformanceCounter (&t);
131
132     return _cairo_time_from_large_integer(t);
133 }
134
135 #elif defined(CAIRO_CLOCK)
136 #include <time.h>
137
138 static cairo_always_inline double
139 _cairo_time_1s (void)
140 {
141     return 1000000000;
142 }
143
144 cairo_time_t
145 _cairo_time_get (void)
146 {
147     struct timespec t;
148     cairo_time_t r;
149
150     clock_gettime (CAIRO_CLOCK, &t);
151
152     r = _cairo_double_to_int64 (_cairo_time_1s ());
153     r = _cairo_int64_mul (r, _cairo_int32_to_int64 (t.tv_sec));
154     r = _cairo_int64_add (r, _cairo_int32_to_int64 (t.tv_nsec));
155
156     return r;
157 }
158
159 #else
160 #include <sys/time.h>
161
162 static cairo_always_inline double
163 _cairo_time_1s (void)
164 {
165     return 1000000;
166 }
167
168 cairo_time_t
169 _cairo_time_get (void)
170 {
171     struct timeval t;
172     cairo_time_t r;
173
174     gettimeofday (&t, NULL);
175
176     r = _cairo_double_to_int64 (_cairo_time_1s ());
177     r = _cairo_int64_mul (r, _cairo_int32_to_int64 (t.tv_sec));
178     r = _cairo_int64_add (r, _cairo_int32_to_int64 (t.tv_usec));
179
180     return r;
181 }
182
183 #endif
184
185 int
186 _cairo_time_cmp (const void *a,
187                  const void *b)
188 {
189     const cairo_time_t *ta = a, *tb = b;
190     return _cairo_int64_cmp (*ta, *tb);
191 }
192
193 static double
194 _cairo_time_ticks_per_sec (void)
195 {
196     static double ticks = 0;
197
198     if (unlikely (ticks == 0))
199         ticks = _cairo_time_1s ();
200
201     return ticks;
202 }
203
204 static double
205 _cairo_time_s_per_tick (void)
206 {
207     static double s = 0;
208
209     if (unlikely (s == 0))
210         s = 1. / _cairo_time_ticks_per_sec ();
211
212     return s;
213 }
214
215 double
216 _cairo_time_to_s (cairo_time_t t)
217 {
218     return _cairo_int64_to_double (t) * _cairo_time_s_per_tick ();
219 }
220
221 cairo_time_t
222 _cairo_time_from_s (double t)
223 {
224     return _cairo_double_to_int64 (t * _cairo_time_ticks_per_sec ());
225 }