• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright 2013 The Flutter 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
5part of engine;
6
7const String assetChannel = 'flutter/assets';
8
9class Engine extends RuntimeDelegate {
10  final Animator _animator;
11  final dynamic _runtimeController;
12  final AssetManager _assetManager;
13  final dynamic _delegate;
14
15  Engine(this._animator, this._runtimeController, this._assetManager,
16      this._delegate);
17
18  @override
19  String get defaultRouteName => _initialRoute ?? '/';
20
21  String _initialRoute;
22
23  bool get haveSurface => true;
24
25  ViewportMetrics _viewportMetrics;
26  set viewportMetrics(ViewportMetrics metrics) {
27    final bool dimensionsChanged =
28        _viewportMetrics.physicalHeight != metrics.physicalHeight ||
29            _viewportMetrics.physicalWidth != metrics.physicalWidth;
30    _viewportMetrics = metrics;
31    _runtimeController.viewportMetrics = _viewportMetrics;
32    if (_animator != null) {
33      if (dimensionsChanged) {
34        _animator.setDimensionChangePending();
35      }
36      if (haveSurface) {
37        scheduleFrame();
38      }
39    }
40  }
41
42  @override
43  void scheduleFrame({bool regenerateLayerTree = true}) {
44    _animator.requestFrame(regenerateLayerTree);
45  }
46
47  @override
48  void render(LayerTree layerTree) {
49    if (layerTree == null) {
50      return;
51    }
52
53    final ui.Size frameSize = ui.Size(
54        _viewportMetrics.physicalWidth, _viewportMetrics.physicalHeight);
55
56    if (frameSize.isEmpty) {
57      return;
58    }
59
60    layerTree.frameSize = frameSize;
61    _animator.render(layerTree);
62  }
63
64  @override
65  void handlePlatformMessage(PlatformMessage message) {
66    if (message.channel == assetChannel) {
67      handleAssetPlatformMessage(message);
68    } else {
69      _delegate.onEngineHandlePlatformMessage(message);
70    }
71  }
72
73  void handleAssetPlatformMessage(PlatformMessage message) {
74    final PlatformMessageResponse response = message.response;
75    if (response == null) {
76      return;
77    }
78
79    final String asset = utf8.decode(message.data.buffer.asUint8List());
80    if (_assetManager != null) {
81      _assetManager.load(asset).then((ByteData data) {
82        if (data != null) {
83          response.complete(data.buffer.asUint8List());
84        } else {
85          response.completeEmpty();
86        }
87      });
88    } else {
89      response.completeEmpty();
90    }
91  }
92
93  @override
94  FontCollection getFontCollection() => null;
95}
96
97class Animator {
98  void setDimensionChangePending() {}
99  void render(LayerTree layerTree) {}
100  void requestFrame(bool regenerateLayerTree) {}
101}
102