Files
Qlyra/test/rlottie_engine_test.dart
T

67 lines
2.2 KiB
Dart

import 'dart:io';
import 'dart:ui' as ui;
import 'package:flutter/foundation.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:komet/core/media/rlottie/rlottie_engine.dart';
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
test('rlottie engine renders a real clip into ui.Image frames', () async {
final libPath = Platform.environment['RLOTTIE_LIB'];
if (libPath == null || !File(libPath).existsSync()) {
markTestSkipped('set RLOTTIE_LIB to librlottie.so to run');
return;
}
RlottieEngine.debugLibraryPath = libPath;
expect(RlottieEngine.instance.available, isTrue,
reason: 'library should open');
final json = File('assets/lottie/ic_settings.json').readAsStringSync();
const px = 256;
final clip = await RlottieEngine.instance
.acquire('poc://ic_settings', px, inlineJson: json);
expect(clip, isNotNull);
expect(clip!.frameCount, greaterThan(1));
expect(clip.durationMs, greaterThan(0));
final target = clip.frameCount;
final deadline = DateTime.now().add(const Duration(seconds: 20));
while (clip.ready.value < target && DateTime.now().isBefore(deadline)) {
await Future<void>.delayed(const Duration(milliseconds: 20));
}
expect(clip.ready.value, target, reason: 'all frames decoded');
final mid = clip.frameAt(target ~/ 2);
expect(mid, isNotNull);
expect(mid!.width, px);
expect(mid.height, px);
final data = await mid.toByteData(format: ui.ImageByteFormat.rawRgba);
final bytes = data!.buffer.asUint8List();
var opaque = 0;
var transparent = 0;
for (var i = 3; i < bytes.length; i += 4) {
if (bytes[i] == 0) {
transparent++;
} else if (bytes[i] > 250) {
opaque++;
}
}
expect(opaque, greaterThan(0), reason: 'gear pixels present');
expect(transparent, greaterThan(0), reason: 'transparent background present');
final png = await mid.toByteData(format: ui.ImageByteFormat.png);
final out = Platform.environment['RLOTTIE_PNG_OUT'];
if (out != null) {
File(out).writeAsBytesSync(png!.buffer.asUint8List());
debugPrint('wrote decoded frame PNG: $out');
}
RlottieEngine.instance.release(clip);
});
}