OLD | NEW |
| (Empty) |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 import 'dart:sky' as sky; | |
6 | |
7 typedef void Callback(double timeStamp); | |
8 | |
9 bool _haveScheduledVisualUpdate = false; | |
10 int _nextCallbackId = 1; | |
11 | |
12 final List<Callback> _persistentCallbacks = new List<Callback>(); | |
13 Map<int, Callback> _transientCallbacks = new Map<int, Callback>(); | |
14 | |
15 void _beginFrame(double timeStamp) { | |
16 _haveScheduledVisualUpdate = false; | |
17 | |
18 Map<int, Callback> callbacks = _transientCallbacks; | |
19 _transientCallbacks = new Map<int, Callback>(); | |
20 | |
21 callbacks.forEach((id, callback) { | |
22 callback(timeStamp); | |
23 }); | |
24 | |
25 for (Callback callback in _persistentCallbacks) | |
26 callback(timeStamp); | |
27 } | |
28 | |
29 void init() { | |
30 assert(sky.window == null); | |
31 sky.view.setBeginFrameCallback(_beginFrame); | |
32 } | |
33 | |
34 void addPersistentFrameCallback(Callback callback) { | |
35 assert(sky.window == null); | |
36 _persistentCallbacks.add(callback); | |
37 } | |
38 | |
39 int requestAnimationFrame(Callback callback) { | |
40 if (sky.window != null) | |
41 return sky.window.requestAnimationFrame(callback); | |
42 int id = _nextCallbackId++; | |
43 _transientCallbacks[id] = callback; | |
44 ensureVisualUpdate(); | |
45 return id; | |
46 } | |
47 | |
48 void cancelAnimationFrame(int id) { | |
49 if (sky.window != null) | |
50 return sky.window.cancelAnimationFrame(id); | |
51 _transientCallbacks.remove(id); | |
52 } | |
53 | |
54 void ensureVisualUpdate() { | |
55 assert(sky.window == null); | |
56 if (_haveScheduledVisualUpdate) | |
57 return; | |
58 sky.view.scheduleFrame(); | |
59 _haveScheduledVisualUpdate = true; | |
60 } | |
OLD | NEW |