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