| // Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'dart:sky' as sky; |
| |
| import 'package:sky/base/debug.dart'; |
| |
| typedef void Callback(double timeStamp); |
| |
| bool _haveScheduledVisualUpdate = false; |
| int _nextCallbackId = 1; |
| |
| final List<Callback> _persistentCallbacks = new List<Callback>(); |
| Map<int, Callback> _transientCallbacks = new Map<int, Callback>(); |
| |
| void _beginFrame(double timeStamp) { |
| timeStamp /= timeDilation; |
| |
| _haveScheduledVisualUpdate = false; |
| |
| Map<int, Callback> callbacks = _transientCallbacks; |
| _transientCallbacks = new Map<int, Callback>(); |
| |
| callbacks.forEach((id, callback) { |
| callback(timeStamp); |
| }); |
| |
| for (Callback callback in _persistentCallbacks) |
| callback(timeStamp); |
| } |
| |
| void init() { |
| sky.view.setFrameCallback(_beginFrame); |
| } |
| |
| void addPersistentFrameCallback(Callback callback) { |
| _persistentCallbacks.add(callback); |
| } |
| |
| int requestAnimationFrame(Callback callback) { |
| int id = _nextCallbackId++; |
| _transientCallbacks[id] = callback; |
| ensureVisualUpdate(); |
| return id; |
| } |
| |
| void cancelAnimationFrame(int id) { |
| _transientCallbacks.remove(id); |
| } |
| |
| void ensureVisualUpdate() { |
| if (_haveScheduledVisualUpdate) |
| return; |
| sky.view.scheduleFrame(); |
| _haveScheduledVisualUpdate = true; |
| } |