mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
The converters are still in a separate target that must be included manually. This allows targets that depend on FML but not Dart runtime not have to depend on the runtime. Adds a test that includes this target and tests image decompression from assets. There is also a test for the standalone DartConvertor in shell_unittests but not in fml_unittests be cause FML uni-tests cannot yet launch a VM. I will work on adding fixtures for those.
141 lines
3.9 KiB
Dart
141 lines
3.9 KiB
Dart
// 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.
|
|
|
|
import 'dart:convert' show utf8, json;
|
|
import 'dart:isolate';
|
|
import 'dart:typed_data';
|
|
import 'dart:ui';
|
|
|
|
void main() {}
|
|
|
|
void nativeReportTimingsCallback(List<int> timings) native 'NativeReportTimingsCallback';
|
|
void nativeOnBeginFrame(int microseconds) native 'NativeOnBeginFrame';
|
|
void nativeOnPointerDataPacket(List<int> sequences) native 'NativeOnPointerDataPacket';
|
|
|
|
@pragma('vm:entry-point')
|
|
void reportTimingsMain() {
|
|
window.onReportTimings = (List<FrameTiming> timings) {
|
|
List<int> timestamps = [];
|
|
for (FrameTiming t in timings) {
|
|
for (FramePhase phase in FramePhase.values) {
|
|
timestamps.add(t.timestampInMicroseconds(phase));
|
|
}
|
|
}
|
|
nativeReportTimingsCallback(timestamps);
|
|
};
|
|
}
|
|
|
|
@pragma('vm:entry-point')
|
|
void onBeginFrameMain() {
|
|
window.onBeginFrame = (Duration beginTime) {
|
|
nativeOnBeginFrame(beginTime.inMicroseconds);
|
|
};
|
|
}
|
|
|
|
@pragma('vm:entry-point')
|
|
void onPointerDataPacketMain() {
|
|
window.onPointerDataPacket = (PointerDataPacket packet) {
|
|
List<int> sequence= <int>[];
|
|
for (PointerData data in packet.data) {
|
|
sequence.add(PointerChange.values.indexOf(data.change));
|
|
}
|
|
nativeOnPointerDataPacket(sequence);
|
|
};
|
|
}
|
|
|
|
@pragma('vm:entry-point')
|
|
void emptyMain() {}
|
|
|
|
@pragma('vm:entry-point')
|
|
void dummyReportTimingsMain() {
|
|
window.onReportTimings = (List<FrameTiming> timings) {};
|
|
}
|
|
|
|
@pragma('vm:entry-point')
|
|
void fixturesAreFunctionalMain() {
|
|
sayHiFromFixturesAreFunctionalMain();
|
|
}
|
|
|
|
void sayHiFromFixturesAreFunctionalMain() native 'SayHiFromFixturesAreFunctionalMain';
|
|
|
|
void notifyNative() native 'NotifyNative';
|
|
|
|
void secondaryIsolateMain(String message) {
|
|
print('Secondary isolate got message: ' + message);
|
|
notifyNative();
|
|
}
|
|
|
|
@pragma('vm:entry-point')
|
|
void testCanLaunchSecondaryIsolate() {
|
|
Isolate.spawn(secondaryIsolateMain, 'Hello from root isolate.');
|
|
notifyNative();
|
|
}
|
|
|
|
@pragma('vm:entry-point')
|
|
void testSkiaResourceCacheSendsResponse() {
|
|
final PlatformMessageResponseCallback callback = (ByteData data) {
|
|
if (data == null) {
|
|
throw 'Response must not be null.';
|
|
}
|
|
final String response = utf8.decode(data.buffer.asUint8List());
|
|
final List<bool> jsonResponse = json.decode(response).cast<bool>();
|
|
if (jsonResponse[0] != true) {
|
|
throw 'Response was not true';
|
|
}
|
|
notifyNative();
|
|
};
|
|
const String jsonRequest = '''{
|
|
"method": "Skia.setResourceCacheMaxBytes",
|
|
"args": 10000
|
|
}''';
|
|
window.sendPlatformMessage(
|
|
'flutter/skia',
|
|
Uint8List.fromList(utf8.encode(jsonRequest)).buffer.asByteData(),
|
|
callback,
|
|
);
|
|
}
|
|
|
|
void notifyWidthHeight(int width, int height) native 'NotifyWidthHeight';
|
|
|
|
@pragma('vm:entry-point')
|
|
void canCreateImageFromDecompressedData() {
|
|
const int imageWidth = 10;
|
|
const int imageHeight = 10;
|
|
final Uint8List pixels = Uint8List.fromList(List<int>.generate(
|
|
imageWidth * imageHeight * 4,
|
|
(int i) => i % 4 < 2 ? 0x00 : 0xFF,
|
|
));
|
|
|
|
|
|
decodeImageFromPixels(
|
|
pixels, imageWidth, imageHeight, PixelFormat.rgba8888,
|
|
(Image image) {
|
|
notifyWidthHeight(image.width, image.height);
|
|
});
|
|
}
|
|
|
|
@pragma('vm:entry-point')
|
|
void canAccessIsolateLaunchData() {
|
|
notifyMessage(utf8.decode(window.getPersistentIsolateData().buffer.asUint8List()));
|
|
}
|
|
|
|
void notifyMessage(String string) native 'NotifyMessage';
|
|
|
|
@pragma('vm:entry-point')
|
|
void canConvertMappings() {
|
|
sendFixtureMapping(getFixtureMapping());
|
|
}
|
|
|
|
List<int> getFixtureMapping() native 'GetFixtureMapping';
|
|
void sendFixtureMapping(List<int> list) native 'SendFixtureMapping';
|
|
|
|
@pragma('vm:entry-point')
|
|
void canDecompressImageFromAsset() {
|
|
decodeImageFromList(Uint8List.fromList(getFixtureImage()), (Image result) {
|
|
notifyWidthHeight(result.width, result.height);
|
|
});
|
|
}
|
|
|
|
List<int> getFixtureImage() native 'GetFixtureImage';
|