UNPKG

fieldkit

Version:

Basic building blocks for computational design projects. Written in CoffeeScript for browser and server environments.

59 lines (51 loc) 2.37 kB
// Updated requestAnimationFrame polyfill that uses new high-resolution timestamp // // References: // http://paulirish.com/2011/requestanimationframe-for-smart-animating/ // https://gist.github.com/1579671 // http://updates.html5rocks.com/2012/05/requestAnimationFrame-API-now-with-sub-millisecond-precision // // Note: this is my initial stab at it, *requires additional testing* (function () { var lastTime = 0, vendors = ['ms', 'moz', 'webkit', 'o'], // Feature check for performance (high-resolution timers) hasPerformance = !!(window.performance && window.performance.now); for(var x = 0, max = vendors.length; x < max && !window.requestAnimationFrame; x += 1) { window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame']; window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame'] || window[vendors[x]+'CancelRequestAnimationFrame']; } if (!window.requestAnimationFrame) { window.requestAnimationFrame = function(callback, element) { var currTime = new Date().getTime(); var timeToCall = Math.max(0, 16 - (currTime - lastTime)); var id = window.setTimeout(function() { callback(currTime + timeToCall); }, timeToCall); lastTime = currTime + timeToCall; return id; }; } if (!window.cancelAnimationFrame) { window.cancelAnimationFrame = function(id) { clearTimeout(id); }; } // Add new wrapper for browsers that don't have performance if (!hasPerformance) { // Store reference to existing rAF and initial startTime var rAF = window.requestAnimationFrame, startTime = +new Date; // Override window rAF to include wrapped callback window.requestAnimationFrame = function (callback, element) { // Wrap the given callback to pass in performance timestamp var wrapped = function (timestamp) { // Get performance-style timestamp var performanceTimestamp = (timestamp < 1e12) ? timestamp : timestamp - startTime; return callback(performanceTimestamp); }; // Call original rAF with wrapped callback rAF(wrapped, element); } } })();