blob: bcf6368ee95efff0a29d241f5d4aeafc25862789 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.6
part of engine;
const String assetChannel = 'flutter/assets';
class Engine extends RuntimeDelegate {
final Animator _animator;
final dynamic _runtimeController;
final AssetManager _assetManager;
final dynamic _delegate;
Engine(this._animator, this._runtimeController, this._assetManager,
this._delegate);
@override
String get defaultRouteName => _initialRoute ?? '/';
String _initialRoute;
bool get haveSurface => true;
ViewportMetrics _viewportMetrics;
set viewportMetrics(ViewportMetrics metrics) {
final bool dimensionsChanged =
_viewportMetrics.physicalHeight != metrics.physicalHeight ||
_viewportMetrics.physicalWidth != metrics.physicalWidth;
_viewportMetrics = metrics;
_runtimeController.viewportMetrics = _viewportMetrics;
if (_animator != null) {
if (dimensionsChanged) {
_animator.setDimensionChangePending();
}
if (haveSurface) {
scheduleFrame();
}
}
}
@override
void scheduleFrame({bool regenerateLayerTree = true}) {
_animator.requestFrame(regenerateLayerTree);
}
@override
void render(LayerTree layerTree) {
if (layerTree == null) {
return;
}
final ui.Size frameSize = ui.Size(
_viewportMetrics.physicalWidth, _viewportMetrics.physicalHeight);
if (frameSize.isEmpty) {
return;
}
layerTree.frameSize = frameSize;
layerTree.devicePixelRatio = _viewportMetrics.devicePixelRatio;
_animator.render(layerTree);
}
@override
void handlePlatformMessage(PlatformMessage message) {
if (message.channel == assetChannel) {
handleAssetPlatformMessage(message);
} else {
_delegate.onEngineHandlePlatformMessage(message);
}
}
void handleAssetPlatformMessage(PlatformMessage message) {
final PlatformMessageResponse response = message.response;
if (response == null) {
return;
}
final String asset = utf8.decode(message.data.buffer.asUint8List());
if (_assetManager != null) {
_assetManager.load(asset).then((ByteData data) {
if (data != null) {
response.complete(data.buffer.asUint8List());
} else {
response.completeEmpty();
}
});
} else {
response.completeEmpty();
}
}
@override
FontCollection getFontCollection() => null;
}
class Animator {
void setDimensionChangePending() {}
void render(LayerTree layerTree) {}
void requestFrame(bool regenerateLayerTree) {}
}