Mercurial > MadButterfly
view src/timertool.c @ 1136:950076863b7e
Fix the tween calculation for the inbetween frames. Now, we can use primitive instead og group to defin ethe animation. Currently, it has been tested against rectangle only. We need to check others as well.
author | wycc |
---|---|
date | Tue, 21 Dec 2010 14:35:42 +0800 |
parents | 586e50f82c1f |
children |
line wrap: on
line source
// -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 4; -*- // vim: sw=4:ts=8:sts=4 #include <stdio.h> #include <sys/time.h> #ifdef __FreeBSD__ #include <machine/cpufunc.h> #include <sys/types.h> #include <sys/sysctl.h> #endif #include "mb_timer.h" #ifdef __FreeBSD__ void get_now(mb_timeval_t *tmo) { struct timeval tv; static uint64_t cpufreq; static uint64_t diff; static mb_timeval_t tm = {0, 0}; static uint64_t last_ts; mb_timeval_t diff_tm; uint64_t ts, udiff, sdiff; size_t sysctl_sz; int r; if(MB_TIMEVAL_SEC(&tm) == 0) { sysctl_sz = sizeof(uint64_t); r = sysctlbyname("kern.timecounter.tc.TSC.frequency", &cpufreq, &sysctl_sz, NULL, 0); if(r == -1) { perror("sysctl"); return; } gettimeofday(&tv, NULL); last_ts = rdtsc(); MB_TIMEVAL_SET(tmo, tv.tv_sec, tv.tv_usec); MB_TIMEVAL_CP(&tm, tmo); diff = 0; } else { ts = rdtsc(); diff += ts - last_ts; sdiff = diff / cpufreq; udiff = (diff % cpufreq) * 1000000 / cpufreq; MB_TIMEVAL_SET(&diff_tm, sdiff, udiff); MB_TIMEVAL_CP(tmo, &tm); MB_TIMEVAL_ADD(tmo, &diff_tm); MB_TIMEVAL_SET(&diff_tm, sdiff, 0); MB_TIMEVAL_ADD(&tm, &diff_tm); diff %= cpufreq; last_ts = ts; } } #else /* __FreeBSD__ */ void get_now(mb_timeval_t *tmo) { struct timeval tv; gettimeofday(&tv, NULL); MB_TIMEVAL_SET(tmo, tv.tv_sec, tv.tv_usec); } #endif /* __FreeBSD__ */