Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
3959 Serge 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 
28
 *	    Vladimir Vukicevic 
29
 *	    Carl Worth 
30
 *          Andrea Canciani 
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 
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 
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 
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 
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 
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
}