Subversion Repositories Kolibri OS

Rev

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

  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. }
  226.