Compare commits

...

5 Commits

82 changed files with 308 additions and 431 deletions

View File

@ -12,8 +12,6 @@ jobs:
with: with:
channel: 'stable' channel: 'stable'
- run: flutter pub get - run: flutter pub get
- run: flutter pub run tool/publish/comment_dependency_overrides.dart
- run: flutter pub get
- run: flutter pub run tool/publish/check_version.dart ${GITHUB_REF} - run: flutter pub run tool/publish/check_version.dart ${GITHUB_REF}
- name: Setup credentials - name: Setup credentials
run: | run: |

View File

@ -1,3 +1,7 @@
## 2.4.0
- Require minimum Dart 3.0.0 and Flutter 3.10.0
- Fix a parsing bug when the name property in RoundedCorner was null
## 2.3.2 ## 2.3.2
- Fix a bug when running on the web due to [bitwise operations difference](https://dart.dev/guides/language/numbers#bitwise-operations). - Fix a bug when running on the web due to [bitwise operations difference](https://dart.dev/guides/language/numbers#bitwise-operations).

View File

@ -8,26 +8,52 @@ linter:
avoid_print: false avoid_print: false
always_declare_return_types: true always_declare_return_types: true
avoid_bool_literals_in_conditional_expressions: true
avoid_double_and_int_checks: true
avoid_dynamic_calls: true avoid_dynamic_calls: true
avoid_equals_and_hash_code_on_mutable_classes: true
avoid_escaping_inner_quotes: true avoid_escaping_inner_quotes: true
avoid_final_parameters: true avoid_final_parameters: true
avoid_function_literals_in_foreach_calls: true
avoid_js_rounded_ints: true
avoid_positional_boolean_parameters: true
avoid_redundant_argument_values: true
avoid_returning_null_for_future: true avoid_returning_null_for_future: true
avoid_setters_without_getters: true avoid_setters_without_getters: true
avoid_type_to_string: true
avoid_unused_constructor_parameters: true
cancel_subscriptions: true cancel_subscriptions: true
cast_nullable_to_non_nullable: true cast_nullable_to_non_nullable: true
close_sinks: true close_sinks: true
collection_methods_unrelated_type: true
combinators_ordering: true
conditional_uri_does_not_exist: true
dangling_library_doc_comments: true
deprecated_consistency: true
implicit_reopen: true
invalid_case_patterns: true
leading_newlines_in_multiline_strings: true
library_annotations: true
no_adjacent_strings_in_list: true no_adjacent_strings_in_list: true
no_default_cases: true no_default_cases: true
noop_primitive_operations: true
omit_local_variable_types: true omit_local_variable_types: true
only_throw_errors: true only_throw_errors: true
prefer_if_elements_to_conditional_expressions: true
prefer_relative_imports: true prefer_relative_imports: true
prefer_single_quotes: true prefer_single_quotes: true
sort_child_properties_last: true sort_child_properties_last: true
sort_pub_dependencies: true sort_pub_dependencies: true
test_types_in_equals: true test_types_in_equals: true
unawaited_futures: true unawaited_futures: true
unnecessary_breaks: true
unnecessary_library_directive: true
unnecessary_parenthesis: true unnecessary_parenthesis: true
unnecessary_statements: true unnecessary_statements: true
unnecessary_to_list_in_spreads: true
unsafe_html: true unsafe_html: true
use_enums: true
use_if_null_to_convert_nulls_to_bools: true
use_named_constants: true
use_raw_strings: true use_raw_strings: true
use_super_parameters: true use_super_parameters: true

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,130 @@
import 'dart:ui';
import 'package:flutter/material.dart' hide Image;
import 'package:flutter/material.dart' as material;
import 'package:lottie/lottie.dart';
/// This example shows how to cache the animation as a List<Image>.
/// After the initial cache of each frame, drawing the animation is almost free
/// in term of CPU usage.
/// The animation will run at a specific framerate (not FrameRate.max) and specific size
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// Pre-load the animation for simplicity in this example
var animation = await AssetLottie('assets/AndroidWave.json').load();
// Pick a specific size for our cache.
// In a real app, we may want to defer choosing the size after an initial
// Layout (ie. using LayoutBuilder)
var cachedAnimation = CachedLottie(const Size(150, 200), animation);
runApp(_Example(
lottie: cachedAnimation,
));
}
class _Example extends StatelessWidget {
final CachedLottie lottie;
const _Example({required this.lottie});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Cache'),
),
body: ListView(
children: [
for (var i = 0; i < 20; i++)
Stack(
children: [
for (var j = 0; j < 50; j++)
Transform.translate(
offset: Offset(j.toDouble() * 20, 0),
child: CachedLottiePlayer(
lottie: lottie,
),
)
],
),
],
),
),
);
}
}
class CachedLottie {
final Size size;
final LottieComposition composition;
final List<Image?> images;
late final _drawable = LottieDrawable(composition);
CachedLottie(this.size, this.composition)
: images = List.filled(composition.durationFrames.ceil(), null);
Duration get duration => composition.duration;
Image imageAt(BuildContext context, double progress) {
var index = (images.length * progress).round() % images.length;
return images[index] ??= _takeImage(context, progress);
}
Image _takeImage(BuildContext context, double progress) {
var recorder = PictureRecorder();
var canvas = Canvas(recorder);
var devicePixelRatio = View.of(context).devicePixelRatio;
_drawable
..setProgress(progress)
..draw(canvas, Offset.zero & (size * devicePixelRatio));
var picture = recorder.endRecording();
return picture.toImageSync((size.width * devicePixelRatio).round(),
(size.height * devicePixelRatio).round());
}
}
class CachedLottiePlayer extends StatefulWidget {
final CachedLottie lottie;
final AnimationController? controller;
const CachedLottiePlayer({
super.key,
required this.lottie,
this.controller,
});
@override
State<CachedLottiePlayer> createState() => _CachedLottiePlayerState();
}
class _CachedLottiePlayerState extends State<CachedLottiePlayer>
with TickerProviderStateMixin {
late final AnimationController _autoController =
AnimationController(vsync: this, duration: widget.lottie.duration)
..repeat();
@override
Widget build(BuildContext context) {
var controller = widget.controller ?? _autoController;
return AnimatedBuilder(
animation: controller,
builder: (context, _) {
var image = widget.lottie.imageAt(context, controller.value);
return material.RawImage(
image: image,
width: widget.lottie.size.width,
height: widget.lottie.size.height,
);
},
);
}
@override
void dispose() {
_autoController.dispose();
super.dispose();
}
}

View File

@ -16,8 +16,8 @@ EXTERNAL SOURCES:
SPEC CHECKSUMS: SPEC CHECKSUMS:
FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24
path_provider_foundation: c68054786f1b4f3343858c1e1d0caaded73f0be9 path_provider_foundation: eaf5b3e458fc0e5fbb9940fb09980e853fe058b8
PODFILE CHECKSUM: 353c8bcc5d5b0994e508d035b5431cfe18c1dea7 PODFILE CHECKSUM: 353c8bcc5d5b0994e508d035b5431cfe18c1dea7
COCOAPODS: 1.12.0 COCOAPODS: 1.12.1

View File

@ -5,10 +5,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: archive name: archive
sha256: d6347d54a2d8028e0437e3c099f66fdb8ae02c4720c1e7534c9f24c10351f85d sha256: "0c8368c9b3f0abbc193b9d6133649a614204b528982bebc7026372d61677ce3a"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.3.6" version: "3.3.7"
async: async:
dependency: transitive dependency: transitive
description: description:
@ -61,10 +61,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: crypto name: crypto
sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67 sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.2" version: "3.0.3"
fake_async: fake_async:
dependency: transitive dependency: transitive
description: description:
@ -77,10 +77,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: ffi name: ffi
sha256: a38574032c5f1dd06c4aee541789906c12ccaab8ba01446e800d9c5b79c4a978 sha256: ed5337a5660c506388a9f012be0288fb38b49020ce2b45fe1f8b8323fe429f99
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.1" version: "2.0.2"
file: file:
dependency: transitive dependency: transitive
description: description:
@ -127,10 +127,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: http name: http
sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482" sha256: "4c3f04bfb64d3efd508d06b41b825542f08122d30bda4933fb95c069d22a4fa3"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.13.5" version: "1.0.0"
http_parser: http_parser:
dependency: transitive dependency: transitive
description: description:
@ -151,25 +151,25 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: lints name: lints
sha256: "5e4a9cd06d447758280a8ac2405101e0e2094d2a1dbdd3756aec3fe7775ba593" sha256: "6b0206b0bf4f04961fc5438198ccb3a885685cd67d4d4a32cc20ad7f8adbe015"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.1" version: "2.1.0"
logging: logging:
dependency: "direct main" dependency: "direct main"
description: description:
name: logging name: logging
sha256: "04094f2eb032cbb06c6f6e8d3607edcfcb0455e2bb6cbc010cb01171dcb64e6d" sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.1.1" version: "1.2.0"
lottie: lottie:
dependency: "direct main" dependency: "direct main"
description: description:
path: ".." path: ".."
relative: true relative: true
source: path source: path
version: "2.3.2" version: "2.4.0"
matcher: matcher:
dependency: transitive dependency: transitive
description: description:
@ -206,34 +206,34 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: path_provider name: path_provider
sha256: c7edf82217d4b2952b2129a61d3ad60f1075b9299e629e149a8d2e39c2e6aad4 sha256: "3087813781ab814e4157b172f1a11c46be20179fcc9bea043e0fba36bc0acaa2"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.14" version: "2.0.15"
path_provider_android: path_provider_android:
dependency: transitive dependency: transitive
description: description:
name: path_provider_android name: path_provider_android
sha256: "019f18c9c10ae370b08dce1f3e3b73bc9f58e7f087bb5e921f06529438ac0ae7" sha256: "2cec049d282c7f13c594b4a73976b0b4f2d7a1838a6dd5aaf7bd9719196bee86"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.24" version: "2.0.27"
path_provider_foundation: path_provider_foundation:
dependency: transitive dependency: transitive
description: description:
name: path_provider_foundation name: path_provider_foundation
sha256: "818b2dc38b0f178e0ea3f7cf3b28146faab11375985d815942a68eee11c2d0f7" sha256: "1995d88ec2948dac43edf8fe58eb434d35d22a2940ecee1a9fefcd62beee6eb3"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.2.1" version: "2.2.3"
path_provider_linux: path_provider_linux:
dependency: transitive dependency: transitive
description: description:
name: path_provider_linux name: path_provider_linux
sha256: "2ae08f2216225427e64ad224a24354221c2c7907e448e6e0e8b57b1eb9f10ad1" sha256: ffbb8cc9ed2c9ec0e4b7a541e56fd79b138e8f47d2fb86815f15358a349b3b57
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.10" version: "2.1.11"
path_provider_platform_interface: path_provider_platform_interface:
dependency: transitive dependency: transitive
description: description:
@ -246,10 +246,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: path_provider_windows name: path_provider_windows
sha256: f53720498d5a543f9607db4b0e997c4b5438884de25b0f73098cc2671a51b130 sha256: d3f80b32e83ec208ac95253e0cd4d298e104fbc63cb29c5c69edaed43b0c69d6
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.5" version: "2.1.6"
platform: platform:
dependency: transitive dependency: transitive
description: description:
@ -270,10 +270,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: pointycastle name: pointycastle
sha256: c3120a968135aead39699267f4c74bc9a08e4e909e86bc1b0af5bfd78691123c sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.7.2" version: "3.7.3"
process: process:
dependency: transitive dependency: transitive
description: description:
@ -339,10 +339,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: typed_data name: typed_data
sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5" sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.3.1" version: "1.3.2"
vector_math: vector_math:
dependency: transitive dependency: transitive
description: description:
@ -355,10 +355,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: win32 name: win32
sha256: c9ebe7ee4ab0c2194e65d3a07d8c54c5d00bb001b76081c4a04cdb8448b59e46 sha256: "5a751eddf9db89b3e5f9d50c20ab8612296e4e8db69009788d6c8b060a84191c"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.1.3" version: "4.1.4"
xdg_directories: xdg_directories:
dependency: transitive dependency: transitive
description: description:
@ -368,5 +368,5 @@ packages:
source: hosted source: hosted
version: "1.0.0" version: "1.0.0"
sdks: sdks:
dart: ">=3.0.0-0 <4.0.0" dart: ">=3.0.0 <4.0.0"
flutter: ">=3.3.0" flutter: ">=3.10.0"

View File

@ -3,7 +3,7 @@ description: A sample app for the Lottie player
publish_to: none publish_to: none
environment: environment:
sdk: ">=2.18.0 <3.0.0" sdk: "^3.0.0"
dependencies: dependencies:
flutter: flutter:

View File

@ -10,7 +10,7 @@ export 'src/options.dart' show LottieOptions;
export 'src/providers/asset_provider.dart' show AssetLottie; export 'src/providers/asset_provider.dart' show AssetLottie;
export 'src/providers/file_provider.dart' show FileLottie; export 'src/providers/file_provider.dart' show FileLottie;
export 'src/providers/load_image.dart' show LottieImageProviderFactory; export 'src/providers/load_image.dart' show LottieImageProviderFactory;
export 'src/providers/lottie_provider.dart' show LottieProvider, LottieCache; export 'src/providers/lottie_provider.dart' show LottieCache, LottieProvider;
export 'src/providers/memory_provider.dart' show MemoryLottie; export 'src/providers/memory_provider.dart' show MemoryLottie;
export 'src/providers/network_provider.dart' show NetworkLottie; export 'src/providers/network_provider.dart' show NetworkLottie;
export 'src/raw_lottie.dart' show RawLottie; export 'src/raw_lottie.dart' show RawLottie;

View File

@ -144,7 +144,7 @@ abstract class BaseStrokeContent
} }
var alpha = var alpha =
((parentAlpha / 255.0 * _opacityAnimation.value / 100.0) * 255).round(); ((parentAlpha / 255.0 * _opacityAnimation.value / 100.0) * 255).round();
paint.setAlpha(alpha.clamp(0, 255).toInt()); paint.setAlpha(alpha.clamp(0, 255));
paint.strokeWidth = _widthAnimation.value * parentMatrix.getScale(); paint.strokeWidth = _widthAnimation.value * parentMatrix.getScale();
if (paint.strokeWidth <= 0) { if (paint.strokeWidth <= 0) {
// Android draws a hairline stroke for 0, After Effects doesn't. // Android draws a hairline stroke for 0, After Effects doesn't.

View File

@ -58,12 +58,14 @@ class ContentGroup implements DrawingContent, PathContent, KeyPathElement {
lottieDrawable, lottieDrawable,
layer, layer,
shapeGroup.name, shapeGroup.name,
shapeGroup.hidden,
contentsFromModels(lottieDrawable, layer, shapeGroup.items), contentsFromModels(lottieDrawable, layer, shapeGroup.items),
findTransform(shapeGroup.items)); findTransform(shapeGroup.items),
hidden: shapeGroup.hidden);
ContentGroup.copy(this._lottieDrawable, BaseLayer layer, this.name, ContentGroup.copy(this._lottieDrawable, BaseLayer layer, this.name,
this._hidden, this._contents, AnimatableTransform? transform) { this._contents, AnimatableTransform? transform,
{required bool hidden})
: _hidden = hidden {
if (transform != null) { if (transform != null) {
_transformAnimation = transform.createAnimation() _transformAnimation = transform.createAnimation()
..addAnimationsToLayer(layer) ..addAnimationsToLayer(layer)

View File

@ -89,7 +89,7 @@ class FillContent implements DrawingContent, KeyPathElementContent {
_paint.color = _colorAnimation.value; _paint.color = _colorAnimation.value;
var alpha = var alpha =
((parentAlpha / 255.0 * _opacityAnimation.value / 100.0) * 255).round(); ((parentAlpha / 255.0 * _opacityAnimation.value / 100.0) * 255).round();
_paint.setAlpha(alpha.clamp(0, 255).toInt()); _paint.setAlpha(alpha.clamp(0, 255));
if (lottieDrawable.antiAliasingSuggested) { if (lottieDrawable.antiAliasingSuggested) {
_paint.isAntiAlias = true; _paint.isAntiAlias = true;
} }

View File

@ -135,7 +135,7 @@ class GradientFillContent implements DrawingContent, KeyPathElementContent {
var alpha = var alpha =
((parentAlpha / 255.0 * _opacityAnimation.value / 100.0) * 255).round(); ((parentAlpha / 255.0 * _opacityAnimation.value / 100.0) * 255).round();
_paint.setAlpha(alpha.clamp(0, 255).toInt()); _paint.setAlpha(alpha.clamp(0, 255));
if (lottieDrawable.antiAliasingSuggested) { if (lottieDrawable.antiAliasingSuggested) {
_paint.isAntiAlias = true; _paint.isAntiAlias = true;
} }
@ -175,8 +175,7 @@ class GradientFillContent implements DrawingContent, KeyPathElementContent {
var gradientColor = _colorAnimation.value; var gradientColor = _colorAnimation.value;
var colors = _applyDynamicColorsIfNeeded(gradientColor.colors); var colors = _applyDynamicColorsIfNeeded(gradientColor.colors);
var positions = gradientColor.positions; var positions = gradientColor.positions;
gradient = Gradient.linear( gradient = Gradient.linear(startPoint, endPoint, colors, positions);
startPoint, endPoint, colors, positions, TileMode.clamp);
_linearGradientCache[gradientHash] = gradient; _linearGradientCache[gradientHash] = gradient;
return gradient; return gradient;
} }
@ -200,8 +199,7 @@ class GradientFillContent implements DrawingContent, KeyPathElementContent {
if (radius <= 0) { if (radius <= 0) {
radius = 0.001; radius = 0.001;
} }
gradient = gradient = Gradient.radial(startPoint, radius, colors, positions);
Gradient.radial(startPoint, radius, colors, positions, TileMode.clamp);
_radialGradientCache[gradientHash] = gradient; _radialGradientCache[gradientHash] = gradient;
return gradient; return gradient;
} }

View File

@ -50,19 +50,14 @@ class MergePathsContent implements PathContent, GreedyContent {
switch (_mergePaths.mode) { switch (_mergePaths.mode) {
case MergePathsMode.merge: case MergePathsMode.merge:
_addPaths(); _addPaths();
break;
case MergePathsMode.add: case MergePathsMode.add:
_opFirstPathWithRest(PathOperation.union); _opFirstPathWithRest(PathOperation.union);
break;
case MergePathsMode.substract: case MergePathsMode.substract:
_opFirstPathWithRest(PathOperation.reverseDifference); _opFirstPathWithRest(PathOperation.reverseDifference);
break;
case MergePathsMode.intersect: case MergePathsMode.intersect:
_opFirstPathWithRest(PathOperation.intersect); _opFirstPathWithRest(PathOperation.intersect);
break;
case MergePathsMode.excludeIntersections: case MergePathsMode.excludeIntersections:
_opFirstPathWithRest(PathOperation.xor); _opFirstPathWithRest(PathOperation.xor);
break;
} }
return _path; return _path;

View File

@ -108,10 +108,8 @@ class PolystarContent implements PathContent, KeyPathElementContent {
switch (_polystarShape.type) { switch (_polystarShape.type) {
case PolystarShapeType.star: case PolystarShapeType.star:
_createStarPath(); _createStarPath();
break;
case PolystarShapeType.polygon: case PolystarShapeType.polygon:
_createPolygonPath(); _createPolygonPath();
break;
} }
_path.close(); _path.close();
@ -253,7 +251,7 @@ class PolystarContent implements PathContent, KeyPathElementContent {
_path.moveTo(x, y); _path.moveTo(x, y);
currentAngle += anglePerPoint; currentAngle += anglePerPoint;
var numPoints = points.ceil().toDouble(); var numPoints = points.toDouble();
for (var i = 0; i < numPoints; i++) { for (var i = 0; i < numPoints; i++) {
previousX = x; previousX = x;
previousY = y; previousY = y;

View File

@ -79,7 +79,8 @@ class RepeaterContent
newContents = newContents.reversed.toList(); newContents = newContents.reversed.toList();
_contentGroup = ContentGroup.copy( _contentGroup = ContentGroup.copy(
lottieDrawable, layer, 'Repeater', _repeater.hidden, newContents, null); lottieDrawable, layer, 'Repeater', newContents, null,
hidden: _repeater.hidden);
} }
@override @override

View File

@ -216,7 +216,7 @@ class RoundedCornersContent implements ShapeModifierContent {
this.shapeData = shapeData = this.shapeData = shapeData =
ShapeData(newCurves, initialPoint: Offset.zero, closed: false); ShapeData(newCurves, initialPoint: Offset.zero, closed: false);
} }
shapeData.setClosed(isClosed); shapeData.isClosed = isClosed;
return shapeData; return shapeData;
} }

View File

@ -5,12 +5,12 @@ import '../cubic_curve_data.dart';
class ShapeData { class ShapeData {
final List<CubicCurveData> curves; final List<CubicCurveData> curves;
Offset _initialPoint; Offset _initialPoint;
bool _closed; bool isClosed;
ShapeData(List<CubicCurveData> curves, {Offset? initialPoint, bool? closed}) ShapeData(List<CubicCurveData> curves, {Offset? initialPoint, bool? closed})
: curves = curves.toList(), : curves = curves.toList(),
_initialPoint = initialPoint ?? Offset.zero, _initialPoint = initialPoint ?? Offset.zero,
_closed = closed ?? false; isClosed = closed ?? false;
ShapeData.empty() : this([]); ShapeData.empty() : this([]);
@ -22,17 +22,9 @@ class ShapeData {
return _initialPoint; return _initialPoint;
} }
void setClosed(bool closed) {
_closed = closed;
}
bool get isClosed {
return _closed;
}
void interpolateBetween( void interpolateBetween(
ShapeData shapeData1, ShapeData shapeData2, double percentage) { ShapeData shapeData1, ShapeData shapeData2, double percentage) {
_closed = shapeData1.isClosed || shapeData2.isClosed; isClosed = shapeData1.isClosed || shapeData2.isClosed;
if (shapeData1.curves.length != shapeData2.curves.length) { if (shapeData1.curves.length != shapeData2.curves.length) {
// TODO(xha): decide what to do? We don't have access to the LottieDrawble // TODO(xha): decide what to do? We don't have access to the LottieDrawble
@ -86,7 +78,7 @@ class ShapeData {
String toString() { String toString() {
return 'ShapeData{' return 'ShapeData{'
'numCurves=${curves.length}' 'numCurves=${curves.length}'
'closed=$_closed' 'closed=$isClosed'
'}'; '}';
} }
} }

View File

@ -1,7 +1,9 @@
import 'dart:ui'; import 'dart:ui';
import 'package:flutter/foundation.dart';
enum Justification { leftAlign, rightAlign, center } enum Justification { leftAlign, rightAlign, center }
@immutable
class DocumentData { class DocumentData {
final String text; final String text;
final String? fontName; final String? fontName;
@ -19,7 +21,7 @@ class DocumentData {
final Offset? boxPosition; final Offset? boxPosition;
final Offset? boxSize; final Offset? boxSize;
DocumentData({ const DocumentData({
required this.text, required this.text,
this.fontName, this.fontName,
required this.size, required this.size,

View File

@ -1,5 +1,7 @@
import 'package:flutter/foundation.dart';
import 'content/shape_group.dart'; import 'content/shape_group.dart';
@immutable
class FontCharacter { class FontCharacter {
static int hashFor(String character, String fontFamily, String style) { static int hashFor(String character, String fontFamily, String style) {
var result = character.hashCode; var result = character.hashCode;
@ -15,7 +17,7 @@ class FontCharacter {
final String style; final String style;
final String fontFamily; final String fontFamily;
FontCharacter( const FontCharacter(
{required this.shapes, {required this.shapes,
required this.character, required this.character,
required this.size, required this.size,

View File

@ -363,7 +363,6 @@ abstract class BaseLayer implements DrawingContent, KeyPathElement {
_contentPaint.setAlpha(255); _contentPaint.setAlpha(255);
canvas.drawRect(bounds, _contentPaint); canvas.drawRect(bounds, _contentPaint);
} }
break;
case MaskMode.maskModeAdd: case MaskMode.maskModeAdd:
if (mask.isInverted) { if (mask.isInverted) {
_applyInvertedAddMask( _applyInvertedAddMask(
@ -372,7 +371,6 @@ abstract class BaseLayer implements DrawingContent, KeyPathElement {
_applyAddMask( _applyAddMask(
canvas, matrix, mask, maskAnimation, opacityAnimation); canvas, matrix, mask, maskAnimation, opacityAnimation);
} }
break;
case MaskMode.maskModeSubstract: case MaskMode.maskModeSubstract:
if (i == 0) { if (i == 0) {
_contentPaint.color = const ui.Color(0xFF000000); _contentPaint.color = const ui.Color(0xFF000000);
@ -385,7 +383,6 @@ abstract class BaseLayer implements DrawingContent, KeyPathElement {
_applySubtractMask( _applySubtractMask(
canvas, matrix, mask, maskAnimation, opacityAnimation); canvas, matrix, mask, maskAnimation, opacityAnimation);
} }
break;
case MaskMode.maskModeIntersect: case MaskMode.maskModeIntersect:
if (mask.isInverted) { if (mask.isInverted) {
_applyInvertedIntersectMask( _applyInvertedIntersectMask(
@ -394,7 +391,6 @@ abstract class BaseLayer implements DrawingContent, KeyPathElement {
_applyIntersectMask( _applyIntersectMask(
canvas, bounds, matrix, mask, maskAnimation, opacityAnimation); canvas, bounds, matrix, mask, maskAnimation, opacityAnimation);
} }
break;
} }
} }
L.beginSection('Layer#restoreLayer'); L.beginSection('Layer#restoreLayer');

View File

@ -50,7 +50,6 @@ class CompositionLayer extends BaseLayer {
case MatteType.add: case MatteType.add:
case MatteType.invert: case MatteType.invert:
mattedLayer = layer; mattedLayer = layer;
break;
case MatteType.luma: case MatteType.luma:
case MatteType.lumaInverted: case MatteType.lumaInverted:
case MatteType.none: case MatteType.none:

View File

@ -195,8 +195,7 @@ class TextLayer extends BaseLayer {
void _drawGlyphTextLine(Characters text, DocumentData documentData, Font font, void _drawGlyphTextLine(Characters text, DocumentData documentData, Font font,
Canvas canvas, double parentScale, double fontScale, double tracking) { Canvas canvas, double parentScale, double fontScale, double tracking) {
for (var c in text) { for (var c in text) {
var characterHash = var characterHash = FontCharacter.hashFor(c, font.family, font.style);
FontCharacter.hashFor(c.toString(), font.family, font.style);
var character = _composition.characters[characterHash]; var character = _composition.characters[characterHash];
if (character == null) { if (character == null) {
// Something is wrong. Potentially, they didn't export the text as a glyph. // Something is wrong. Potentially, they didn't export the text as a glyph.
@ -269,14 +268,11 @@ class TextLayer extends BaseLayer {
switch (documentData.justification) { switch (documentData.justification) {
case Justification.leftAlign: case Justification.leftAlign:
canvas.translate(lineStart, lineOffset); canvas.translate(lineStart, lineOffset);
break;
case Justification.rightAlign: case Justification.rightAlign:
canvas.translate(lineStart + boxWidth - lineWidth, lineOffset); canvas.translate(lineStart + boxWidth - lineWidth, lineOffset);
break;
case Justification.center: case Justification.center:
canvas.translate( canvas.translate(
lineStart + boxWidth / 2.0 - lineWidth / 2.0, lineOffset); lineStart + boxWidth / 2.0 - lineWidth / 2.0, lineOffset);
break;
} }
} }

View File

@ -47,7 +47,6 @@ class AnimatablePathValueParser {
switch (reader.selectName(_names)) { switch (reader.selectName(_names)) {
case 0: case 0:
pathAnimation = AnimatablePathValueParser.parse(reader, composition); pathAnimation = AnimatablePathValueParser.parse(reader, composition);
break;
case 1: case 1:
if (reader.peek() == Token.string) { if (reader.peek() == Token.string) {
hasExpressions = true; hasExpressions = true;
@ -55,7 +54,6 @@ class AnimatablePathValueParser {
} else { } else {
xAnimation = AnimatableValueParser.parseFloat(reader, composition); xAnimation = AnimatableValueParser.parseFloat(reader, composition);
} }
break;
case 2: case 2:
if (reader.peek() == Token.string) { if (reader.peek() == Token.string) {
hasExpressions = true; hasExpressions = true;
@ -63,7 +61,6 @@ class AnimatablePathValueParser {
} else { } else {
yAnimation = AnimatableValueParser.parseFloat(reader, composition); yAnimation = AnimatableValueParser.parseFloat(reader, composition);
} }
break;
default: default:
reader.skipName(); reader.skipName();
reader.skipValue(); reader.skipValue();

View File

@ -21,7 +21,6 @@ class AnimatableTextPropertiesParser {
switch (reader.selectName(_propertiesNames)) { switch (reader.selectName(_propertiesNames)) {
case 0: case 0:
anim = _parseAnimatableTextProperties(reader, composition); anim = _parseAnimatableTextProperties(reader, composition);
break;
default: default:
reader.skipName(); reader.skipName();
reader.skipValue(); reader.skipValue();
@ -47,16 +46,12 @@ class AnimatableTextPropertiesParser {
switch (reader.selectName(_animatablePropertiesNames)) { switch (reader.selectName(_animatablePropertiesNames)) {
case 0: case 0:
color = AnimatableValueParser.parseColor(reader, composition); color = AnimatableValueParser.parseColor(reader, composition);
break;
case 1: case 1:
stroke = AnimatableValueParser.parseColor(reader, composition); stroke = AnimatableValueParser.parseColor(reader, composition);
break;
case 2: case 2:
strokeWidth = AnimatableValueParser.parseFloat(reader, composition); strokeWidth = AnimatableValueParser.parseFloat(reader, composition);
break;
case 3: case 3:
tracking = AnimatableValueParser.parseFloat(reader, composition); tracking = AnimatableValueParser.parseFloat(reader, composition);
break;
default: default:
reader.skipName(); reader.skipName();
reader.skipValue(); reader.skipValue();

View File

@ -45,21 +45,17 @@ class AnimatableTransformParser {
case 0: case 0:
anchorPoint = anchorPoint =
AnimatablePathValueParser.parse(reader, composition); AnimatablePathValueParser.parse(reader, composition);
break;
default: default:
reader.skipName(); reader.skipName();
reader.skipValue(); reader.skipValue();
} }
} }
reader.endObject(); reader.endObject();
break;
case 1: case 1:
position = position =
AnimatablePathValueParser.parseSplitPath(reader, composition); AnimatablePathValueParser.parseSplitPath(reader, composition);
break;
case 2: case 2:
scale = AnimatableValueParser.parseScale(reader, composition); scale = AnimatableValueParser.parseScale(reader, composition);
break;
case 3: case 3:
case 4: case 4:
if (name == 3) { if (name == 3) {
@ -79,33 +75,25 @@ class AnimatableTransformParser {
rotation.keyframes.add(Keyframe(composition, rotation.keyframes.add(Keyframe(composition,
startValue: 0.0, startValue: 0.0,
endValue: 0.0, endValue: 0.0,
interpolator: null,
startFrame: 0.0, startFrame: 0.0,
endFrame: composition.endFrame)); endFrame: composition.endFrame));
} else if (rotation.keyframes.first.startValue == null) { } else if (rotation.keyframes.first.startValue == null) {
rotation.keyframes.first = Keyframe(composition, rotation.keyframes.first = Keyframe(composition,
startValue: 0.0, startValue: 0.0,
endValue: 0.0, endValue: 0.0,
interpolator: null,
startFrame: 0.0, startFrame: 0.0,
endFrame: composition.endFrame); endFrame: composition.endFrame);
} }
break;
case 5: case 5:
opacity = AnimatableValueParser.parseInteger(reader, composition); opacity = AnimatableValueParser.parseInteger(reader, composition);
break;
case 6: case 6:
startOpacity = AnimatableValueParser.parseFloat(reader, composition); startOpacity = AnimatableValueParser.parseFloat(reader, composition);
break;
case 7: case 7:
endOpacity = AnimatableValueParser.parseFloat(reader, composition); endOpacity = AnimatableValueParser.parseFloat(reader, composition);
break;
case 8: case 8:
skew = AnimatableValueParser.parseFloat(reader, composition); skew = AnimatableValueParser.parseFloat(reader, composition);
break;
case 9: case 9:
skewAngle = AnimatableValueParser.parseFloat(reader, composition); skewAngle = AnimatableValueParser.parseFloat(reader, composition);
break;
default: default:
reader.skipName(); reader.skipName();
reader.skipValue(); reader.skipValue();

View File

@ -22,7 +22,6 @@ class BlurEffectParser {
} }
} }
reader.endArray(); reader.endArray();
break;
default: default:
reader.skipName(); reader.skipName();
reader.skipValue(); reader.skipValue();
@ -40,7 +39,6 @@ class BlurEffectParser {
switch (reader.selectName(_innerBlurEffectNames)) { switch (reader.selectName(_innerBlurEffectNames)) {
case 0: case 0:
isCorrectType = reader.nextInt() == 0; isCorrectType = reader.nextInt() == 0;
break;
case 1: case 1:
if (isCorrectType) { if (isCorrectType) {
blurEffect = BlurEffect( blurEffect = BlurEffect(
@ -48,7 +46,6 @@ class BlurEffectParser {
} else { } else {
reader.skipValue(); reader.skipValue();
} }
break;
default: default:
reader.skipName(); reader.skipName();
reader.skipValue(); reader.skipValue();

View File

@ -25,21 +25,16 @@ class CircleShapeParser {
switch (reader.selectName(_names)) { switch (reader.selectName(_names)) {
case 0: case 0:
name = reader.nextString(); name = reader.nextString();
break;
case 1: case 1:
position = position =
AnimatablePathValueParser.parseSplitPath(reader, composition); AnimatablePathValueParser.parseSplitPath(reader, composition);
break;
case 2: case 2:
size = AnimatableValueParser.parsePoint(reader, composition); size = AnimatableValueParser.parsePoint(reader, composition);
break;
case 3: case 3:
hidden = reader.nextBoolean(); hidden = reader.nextBoolean();
break;
case 4: case 4:
// "d" is 2 for normal and 3 for reversed. // "d" is 2 for normal and 3 for reversed.
reversed = reader.nextInt() == 3; reversed = reader.nextInt() == 3;
break;
default: default:
reader.skipName(); reader.skipName();
reader.skipValue(); reader.skipValue();

View File

@ -37,7 +37,6 @@ class ContentModelParser {
break typeLoop; break typeLoop;
case 1: case 1:
d = reader.nextInt(); d = reader.nextInt();
break;
default: default:
reader.skipName(); reader.skipName();
reader.skipValue(); reader.skipValue();
@ -52,46 +51,32 @@ class ContentModelParser {
switch (type) { switch (type) {
case 'gr': case 'gr':
model = ShapeGroupParser.parse(reader, composition); model = ShapeGroupParser.parse(reader, composition);
break;
case 'st': case 'st':
model = ShapeStrokeParser.parse(reader, composition); model = ShapeStrokeParser.parse(reader, composition);
break;
case 'gs': case 'gs':
model = GradientStrokeParser.parse(reader, composition); model = GradientStrokeParser.parse(reader, composition);
break;
case 'fl': case 'fl':
model = ShapeFillParser.parse(reader, composition); model = ShapeFillParser.parse(reader, composition);
break;
case 'gf': case 'gf':
model = GradientFillParser.parse(reader, composition); model = GradientFillParser.parse(reader, composition);
break;
case 'tr': case 'tr':
model = AnimatableTransformParser.parse(reader, composition); model = AnimatableTransformParser.parse(reader, composition);
break;
case 'sh': case 'sh':
model = ShapePathParser.parse(reader, composition); model = ShapePathParser.parse(reader, composition);
break;
case 'el': case 'el':
model = CircleShapeParser.parse(reader, composition, d); model = CircleShapeParser.parse(reader, composition, d);
break;
case 'rc': case 'rc':
model = RectangleShapeParser.parse(reader, composition); model = RectangleShapeParser.parse(reader, composition);
break;
case 'tm': case 'tm':
model = ShapeTrimPathParser.parse(reader, composition); model = ShapeTrimPathParser.parse(reader, composition);
break;
case 'sr': case 'sr':
model = PolystarShapeParser.parse(reader, composition, d: d); model = PolystarShapeParser.parse(reader, composition, d: d);
break;
case 'mm': case 'mm':
model = MergePathsParser.parse(reader); model = MergePathsParser.parse(reader);
break;
case 'rp': case 'rp':
model = RepeaterParser.parse(reader, composition); model = RepeaterParser.parse(reader, composition);
break;
case 'rd': case 'rd':
model = RoundedCornersParser.parse(reader, composition); model = RoundedCornersParser.parse(reader, composition);
break;
default: default:
composition.addWarning('Unknown shape type $type'); composition.addWarning('Unknown shape type $type');
} }

View File

@ -39,13 +39,10 @@ DocumentData documentDataParser(JsonReader reader) {
switch (reader.selectName(_names)) { switch (reader.selectName(_names)) {
case 0: case 0:
text = reader.nextString(); text = reader.nextString();
break;
case 1: case 1:
fontName = reader.nextString(); fontName = reader.nextString();
break;
case 2: case 2:
size = reader.nextDouble(); size = reader.nextDouble();
break;
case 3: case 3:
var justificationInt = reader.nextInt(); var justificationInt = reader.nextInt();
if (justificationInt > Justification.center.index || if (justificationInt > Justification.center.index ||
@ -54,38 +51,28 @@ DocumentData documentDataParser(JsonReader reader) {
} else { } else {
justification = Justification.values[justificationInt]; justification = Justification.values[justificationInt];
} }
break;
case 4: case 4:
tracking = reader.nextInt(); tracking = reader.nextInt();
break;
case 5: case 5:
lineHeight = reader.nextDouble(); lineHeight = reader.nextDouble();
break;
case 6: case 6:
baselineShift = reader.nextDouble(); baselineShift = reader.nextDouble();
break;
case 7: case 7:
fillColor = JsonUtils.jsonToColor(reader); fillColor = JsonUtils.jsonToColor(reader);
break;
case 8: case 8:
strokeColor = JsonUtils.jsonToColor(reader); strokeColor = JsonUtils.jsonToColor(reader);
break;
case 9: case 9:
strokeWidth = reader.nextDouble(); strokeWidth = reader.nextDouble();
break;
case 10: case 10:
strokeOverFill = reader.nextBoolean(); strokeOverFill = reader.nextBoolean();
break;
case 11: case 11:
reader.beginArray(); reader.beginArray();
boxPosition = Offset(reader.nextDouble(), reader.nextDouble()); boxPosition = Offset(reader.nextDouble(), reader.nextDouble());
reader.endArray(); reader.endArray();
break;
case 12: case 12:
reader.beginArray(); reader.beginArray();
boxSize = Offset(reader.nextDouble(), reader.nextDouble()); boxSize = Offset(reader.nextDouble(), reader.nextDouble());
reader.endArray(); reader.endArray();
break;
default: default:
reader.skipName(); reader.skipName();
reader.skipValue(); reader.skipValue();

View File

@ -27,7 +27,6 @@ class DropShadowEffectParser {
_maybeParseInnerEffect(reader, composition); _maybeParseInnerEffect(reader, composition);
} }
reader.endArray(); reader.endArray();
break;
default: default:
reader.skipName(); reader.skipName();
reader.skipValue(); reader.skipValue();
@ -62,30 +61,23 @@ class DropShadowEffectParser {
switch (reader.selectName(_innerEffectNames)) { switch (reader.selectName(_innerEffectNames)) {
case 0: case 0:
currentEffectName = reader.nextString(); currentEffectName = reader.nextString();
break;
case 1: case 1:
switch (currentEffectName) { switch (currentEffectName) {
case 'Shadow Color': case 'Shadow Color':
_color = AnimatableValueParser.parseColor(reader, composition); _color = AnimatableValueParser.parseColor(reader, composition);
break;
case 'Opacity': case 'Opacity':
_opacity = AnimatableValueParser.parseFloat(reader, composition); _opacity = AnimatableValueParser.parseFloat(reader, composition);
break;
case 'Direction': case 'Direction':
_direction = _direction =
AnimatableValueParser.parseFloat(reader, composition); AnimatableValueParser.parseFloat(reader, composition);
break;
case 'Distance': case 'Distance':
_distance = AnimatableValueParser.parseFloat(reader, composition); _distance = AnimatableValueParser.parseFloat(reader, composition);
break;
case 'Softness': case 'Softness':
_radius = AnimatableValueParser.parseFloat(reader, composition); _radius = AnimatableValueParser.parseFloat(reader, composition);
break;
default: default:
reader.skipValue(); reader.skipValue();
break; break;
} }
break;
default: default:
reader.skipName(); reader.skipName();
reader.skipValue(); reader.skipValue();

View File

@ -24,19 +24,14 @@ class FontCharacterParser {
switch (reader.selectName(_names)) { switch (reader.selectName(_names)) {
case 0: case 0:
character = reader.nextString(); character = reader.nextString();
break;
case 1: case 1:
size = reader.nextDouble(); size = reader.nextDouble();
break;
case 2: case 2:
width = reader.nextDouble(); width = reader.nextDouble();
break;
case 3: case 3:
style = reader.nextString(); style = reader.nextString();
break;
case 4: case 4:
fontFamily = reader.nextString(); fontFamily = reader.nextString();
break;
case 5: case 5:
reader.beginObject(); reader.beginObject();
while (reader.hasNext()) { while (reader.hasNext()) {
@ -48,14 +43,12 @@ class FontCharacterParser {
as ShapeGroup); as ShapeGroup);
} }
reader.endArray(); reader.endArray();
break;
default: default:
reader.skipName(); reader.skipName();
reader.skipValue(); reader.skipValue();
} }
} }
reader.endObject(); reader.endObject();
break;
default: default:
reader.skipName(); reader.skipName();
reader.skipValue(); reader.skipValue();

View File

@ -18,16 +18,12 @@ class FontParser {
switch (reader.selectName(_names)) { switch (reader.selectName(_names)) {
case 0: case 0:
family = reader.nextString(); family = reader.nextString();
break;
case 1: case 1:
name = reader.nextString(); name = reader.nextString();
break;
case 2: case 2:
style = reader.nextString(); style = reader.nextString();
break;
case 3: case 3:
ascent = reader.nextDouble(); ascent = reader.nextDouble();
break;
default: default:
reader.skipName(); reader.skipName();
reader.skipValue(); reader.skipValue();

View File

@ -69,17 +69,13 @@ class GradientColorParser {
case 0: case 0:
// position // position
positions[colorIndex] = value; positions[colorIndex] = value;
break;
case 1: case 1:
r = (value * 255).round(); r = (value * 255).round();
break;
case 2: case 2:
g = (value * 255).round(); g = (value * 255).round();
break;
case 3: case 3:
var b = (value * 255).round(); var b = (value * 255).round();
colors[colorIndex] = Color.fromARGB(255, r, g, b); colors[colorIndex] = Color.fromARGB(255, r, g, b);
break;
} }
} }

View File

@ -31,7 +31,6 @@ class GradientFillParser {
switch (reader.selectName(_names)) { switch (reader.selectName(_names)) {
case 0: case 0:
name = reader.nextString(); name = reader.nextString();
break;
case 1: case 1:
var points = -1; var points = -1;
reader.beginObject(); reader.beginObject();
@ -39,39 +38,30 @@ class GradientFillParser {
switch (reader.selectName(_gradientNames)) { switch (reader.selectName(_gradientNames)) {
case 0: case 0:
points = reader.nextInt(); points = reader.nextInt();
break;
case 1: case 1:
color = AnimatableValueParser.parseGradientColor( color = AnimatableValueParser.parseGradientColor(
reader, composition, points); reader, composition, points);
break;
default: default:
reader.skipName(); reader.skipName();
reader.skipValue(); reader.skipValue();
} }
} }
reader.endObject(); reader.endObject();
break;
case 2: case 2:
opacity = AnimatableValueParser.parseInteger(reader, composition); opacity = AnimatableValueParser.parseInteger(reader, composition);
break;
case 3: case 3:
gradientType = gradientType =
reader.nextInt() == 1 ? GradientType.linear : GradientType.radial; reader.nextInt() == 1 ? GradientType.linear : GradientType.radial;
break;
case 4: case 4:
startPoint = AnimatableValueParser.parsePoint(reader, composition); startPoint = AnimatableValueParser.parsePoint(reader, composition);
break;
case 5: case 5:
endPoint = AnimatableValueParser.parsePoint(reader, composition); endPoint = AnimatableValueParser.parsePoint(reader, composition);
break;
case 6: case 6:
fillType = reader.nextInt() == 1 fillType = reader.nextInt() == 1
? PathFillType.nonZero ? PathFillType.nonZero
: PathFillType.evenOdd; : PathFillType.evenOdd;
break;
case 7: case 7:
hidden = reader.nextBoolean(); hidden = reader.nextBoolean();
break;
default: default:
reader.skipName(); reader.skipName();
reader.skipValue(); reader.skipValue();
@ -90,8 +80,6 @@ class GradientFillParser {
opacity: opacity, opacity: opacity,
startPoint: startPoint!, startPoint: startPoint!,
endPoint: endPoint!, endPoint: endPoint!,
highlightLength: null,
highlightAngle: null,
hidden: hidden, hidden: hidden,
); );
} }

View File

@ -40,7 +40,6 @@ class GradientStrokeParser {
switch (reader.selectName(_names)) { switch (reader.selectName(_names)) {
case 0: case 0:
name = reader.nextString(); name = reader.nextString();
break;
case 1: case 1:
var points = -1; var points = -1;
reader.beginObject(); reader.beginObject();
@ -48,46 +47,34 @@ class GradientStrokeParser {
switch (reader.selectName(_gradientNames)) { switch (reader.selectName(_gradientNames)) {
case 0: case 0:
points = reader.nextInt(); points = reader.nextInt();
break;
case 1: case 1:
color = AnimatableValueParser.parseGradientColor( color = AnimatableValueParser.parseGradientColor(
reader, composition, points); reader, composition, points);
break;
default: default:
reader.skipName(); reader.skipName();
reader.skipValue(); reader.skipValue();
} }
} }
reader.endObject(); reader.endObject();
break;
case 2: case 2:
opacity = AnimatableValueParser.parseInteger(reader, composition); opacity = AnimatableValueParser.parseInteger(reader, composition);
break;
case 3: case 3:
gradientType = gradientType =
reader.nextInt() == 1 ? GradientType.linear : GradientType.radial; reader.nextInt() == 1 ? GradientType.linear : GradientType.radial;
break;
case 4: case 4:
startPoint = AnimatableValueParser.parsePoint(reader, composition); startPoint = AnimatableValueParser.parsePoint(reader, composition);
break;
case 5: case 5:
endPoint = AnimatableValueParser.parsePoint(reader, composition); endPoint = AnimatableValueParser.parsePoint(reader, composition);
break;
case 6: case 6:
width = AnimatableValueParser.parseFloat(reader, composition); width = AnimatableValueParser.parseFloat(reader, composition);
break;
case 7: case 7:
capType = LineCapType.values[reader.nextInt() - 1]; capType = LineCapType.values[reader.nextInt() - 1];
break;
case 8: case 8:
joinType = LineJoinType.values[reader.nextInt() - 1]; joinType = LineJoinType.values[reader.nextInt() - 1];
break;
case 9: case 9:
miterLimit = reader.nextDouble(); miterLimit = reader.nextDouble();
break;
case 10: case 10:
hidden = reader.nextBoolean(); hidden = reader.nextBoolean();
break;
case 11: case 11:
reader.beginArray(); reader.beginArray();
while (reader.hasNext()) { while (reader.hasNext()) {
@ -98,10 +85,8 @@ class GradientStrokeParser {
switch (reader.selectName(_dashPatternNames)) { switch (reader.selectName(_dashPatternNames)) {
case 0: case 0:
n = reader.nextString(); n = reader.nextString();
break;
case 1: case 1:
val = AnimatableValueParser.parseFloat(reader, composition); val = AnimatableValueParser.parseFloat(reader, composition);
break;
default: default:
reader.skipName(); reader.skipName();
reader.skipValue(); reader.skipValue();
@ -121,7 +106,6 @@ class GradientStrokeParser {
// If there is only 1 value then it is assumed to be equal parts on and off. // If there is only 1 value then it is assumed to be equal parts on and off.
lineDashPattern.add(lineDashPattern[0]); lineDashPattern.add(lineDashPattern[0]);
} }
break;
default: default:
reader.skipName(); reader.skipName();
reader.skipValue(); reader.skipValue();

View File

@ -35,8 +35,14 @@ class JsonUtils {
return _jsonArrayToPoint(reader); return _jsonArrayToPoint(reader);
case Token.beginObject: case Token.beginObject:
return _jsonObjectToPoint(reader); return _jsonObjectToPoint(reader);
// ignore: no_default_cases case Token.nullToken:
default: return Offset.zero;
case Token.endArray:
case Token.endObject:
case Token.name:
case Token.string:
case Token.boolean:
case Token.endDocument:
throw Exception('Unknown point starts with ${reader.peek()}'); throw Exception('Unknown point starts with ${reader.peek()}');
} }
} }
@ -73,10 +79,8 @@ class JsonUtils {
switch (reader.selectName(_pointNames)) { switch (reader.selectName(_pointNames)) {
case 0: case 0:
x = valueFromObject(reader); x = valueFromObject(reader);
break;
case 1: case 1:
y = valueFromObject(reader); y = valueFromObject(reader);
break;
default: default:
reader.skipName(); reader.skipName();
reader.skipValue(); reader.skipValue();
@ -99,8 +103,14 @@ class JsonUtils {
} }
reader.endArray(); reader.endArray();
return val; return val;
// ignore: no_default_cases case Token.endArray:
default: case Token.beginObject:
case Token.endObject:
case Token.name:
case Token.string:
case Token.boolean:
case Token.nullToken:
case Token.endDocument:
throw Exception('Unknown value for token of type $token'); throw Exception('Unknown value for token of type $token');
} }
} }

View File

@ -58,28 +58,20 @@ class KeyframeParser {
switch (reader.selectName(_names)) { switch (reader.selectName(_names)) {
case 0: case 0:
startFrame = reader.nextDouble(); startFrame = reader.nextDouble();
break;
case 1: case 1:
startValue = valueParser(reader); startValue = valueParser(reader);
break;
case 2: case 2:
endValue = valueParser(reader); endValue = valueParser(reader);
break;
case 3: case 3:
cp1 = JsonUtils.jsonToPoint(reader); cp1 = JsonUtils.jsonToPoint(reader);
break;
case 4: case 4:
cp2 = JsonUtils.jsonToPoint(reader); cp2 = JsonUtils.jsonToPoint(reader);
break;
case 5: case 5:
hold = reader.nextInt() == 1; hold = reader.nextInt() == 1;
break;
case 6: case 6:
pathCp1 = JsonUtils.jsonToPoint(reader); pathCp1 = JsonUtils.jsonToPoint(reader);
break;
case 7: case 7:
pathCp2 = JsonUtils.jsonToPoint(reader); pathCp2 = JsonUtils.jsonToPoint(reader);
break;
default: default:
reader.skipValue(); reader.skipValue();
} }
@ -96,12 +88,13 @@ class KeyframeParser {
interpolator = _linearInterpolator; interpolator = _linearInterpolator;
} }
var keyframe = Keyframe<T>(composition, var keyframe = Keyframe<T>(
startValue: startValue, composition,
endValue: endValue, startValue: startValue,
interpolator: interpolator, endValue: endValue,
startFrame: startFrame, interpolator: interpolator,
endFrame: null); startFrame: startFrame,
);
keyframe.pathCp1 = pathCp1; keyframe.pathCp1 = pathCp1;
keyframe.pathCp2 = pathCp2; keyframe.pathCp2 = pathCp2;
return keyframe; return keyframe;
@ -136,13 +129,10 @@ class KeyframeParser {
switch (reader.selectName(_names)) { switch (reader.selectName(_names)) {
case 0: // t case 0: // t
startFrame = reader.nextDouble(); startFrame = reader.nextDouble();
break;
case 1: // s case 1: // s
startValue = valueParser(reader); startValue = valueParser(reader);
break;
case 2: // e case 2: // e
endValue = valueParser(reader); endValue = valueParser(reader);
break;
case 3: // o case 3: // o
if (reader.peek() == Token.beginObject) { if (reader.peek() == Token.beginObject) {
reader.beginObject(); reader.beginObject();
@ -166,7 +156,6 @@ class KeyframeParser {
} }
reader.endArray(); reader.endArray();
} }
break;
case 1: // y case 1: // y
if (reader.peek() == Token.number) { if (reader.peek() == Token.number) {
xCp1y = reader.nextDouble(); xCp1y = reader.nextDouble();
@ -181,7 +170,6 @@ class KeyframeParser {
} }
reader.endArray(); reader.endArray();
} }
break;
default: default:
reader.skipValue(); reader.skipValue();
} }
@ -192,7 +180,6 @@ class KeyframeParser {
} else { } else {
cp1 = JsonUtils.jsonToPoint(reader); cp1 = JsonUtils.jsonToPoint(reader);
} }
break;
case 4: // i case 4: // i
if (reader.peek() == Token.beginObject) { if (reader.peek() == Token.beginObject) {
reader.beginObject(); reader.beginObject();
@ -216,7 +203,6 @@ class KeyframeParser {
} }
reader.endArray(); reader.endArray();
} }
break;
case 1: // y case 1: // y
if (reader.peek() == Token.number) { if (reader.peek() == Token.number) {
xCp2y = reader.nextDouble(); xCp2y = reader.nextDouble();
@ -231,7 +217,6 @@ class KeyframeParser {
} }
reader.endArray(); reader.endArray();
} }
break;
default: default:
reader.skipValue(); reader.skipValue();
} }
@ -242,16 +227,12 @@ class KeyframeParser {
} else { } else {
cp2 = JsonUtils.jsonToPoint(reader); cp2 = JsonUtils.jsonToPoint(reader);
} }
break;
case 5: // h case 5: // h
hold = reader.nextInt() == 1; hold = reader.nextInt() == 1;
break;
case 6: // to case 6: // to
pathCp1 = JsonUtils.jsonToPoint(reader); pathCp1 = JsonUtils.jsonToPoint(reader);
break;
case 7: // ti case 7: // ti
pathCp2 = JsonUtils.jsonToPoint(reader); pathCp2 = JsonUtils.jsonToPoint(reader);
break;
default: default:
reader.skipValue(); reader.skipValue();
} }

View File

@ -44,7 +44,6 @@ class KeyframesParser {
keyframes.add(KeyframeParser.parse(reader, composition, valueParser, keyframes.add(KeyframeParser.parse(reader, composition, valueParser,
animated: false, multiDimensional: multiDimensional)); animated: false, multiDimensional: multiDimensional));
} }
break;
default: default:
reader.skipValue(); reader.skipValue();
} }

View File

@ -58,7 +58,6 @@ class LayerParser {
id: -1, id: -1,
layerType: LayerType.preComp, layerType: LayerType.preComp,
parentId: -1, parentId: -1,
refId: null,
masks: <Mask>[], masks: <Mask>[],
transform: AnimatableTransform(), transform: AnimatableTransform(),
solidWidth: 0, solidWidth: 0,
@ -68,11 +67,8 @@ class LayerParser {
startFrame: 0, startFrame: 0,
preCompWidth: bounds.width, preCompWidth: bounds.width,
preCompHeight: bounds.height, preCompHeight: bounds.height,
text: null,
textProperties: null,
inOutKeyframes: <Keyframe<double>>[], inOutKeyframes: <Keyframe<double>>[],
matteType: MatteType.none, matteType: MatteType.none,
timeRemapping: null,
isHidden: false); isHidden: false);
} }
@ -117,13 +113,10 @@ class LayerParser {
switch (reader.selectName(_names)) { switch (reader.selectName(_names)) {
case 0: case 0:
layerName = reader.nextString(); layerName = reader.nextString();
break;
case 1: case 1:
layerId = reader.nextInt(); layerId = reader.nextInt();
break;
case 2: case 2:
refId = reader.nextString(); refId = reader.nextString();
break;
case 3: case 3:
var layerTypeInt = reader.nextInt(); var layerTypeInt = reader.nextInt();
if (layerTypeInt < LayerType.unknown.index) { if (layerTypeInt < LayerType.unknown.index) {
@ -131,23 +124,17 @@ class LayerParser {
} else { } else {
layerType = LayerType.unknown; layerType = LayerType.unknown;
} }
break;
case 4: case 4:
parentId = reader.nextInt(); parentId = reader.nextInt();
break;
case 5: case 5:
solidWidth = reader.nextInt(); solidWidth = reader.nextInt();
break;
case 6: case 6:
solidHeight = reader.nextInt(); solidHeight = reader.nextInt();
break;
case 7: case 7:
solidColor = MiscUtils.parseColor(reader.nextString(), solidColor = MiscUtils.parseColor(reader.nextString(),
warningCallback: composition.addWarning); warningCallback: composition.addWarning);
break;
case 8: case 8:
transform = AnimatableTransformParser.parse(reader, composition); transform = AnimatableTransformParser.parse(reader, composition);
break;
case 9: case 9:
var matteTypeIndex = reader.nextInt(); var matteTypeIndex = reader.nextInt();
if (matteTypeIndex >= MatteType.values.length) { if (matteTypeIndex >= MatteType.values.length) {
@ -161,7 +148,6 @@ class LayerParser {
composition.addWarning('Unsupported matte type: Luma Inverted'); composition.addWarning('Unsupported matte type: Luma Inverted');
} }
composition.incrementMatteOrMaskCount(1); composition.incrementMatteOrMaskCount(1);
break;
case 10: case 10:
reader.beginArray(); reader.beginArray();
while (reader.hasNext()) { while (reader.hasNext()) {
@ -169,7 +155,6 @@ class LayerParser {
} }
composition.incrementMatteOrMaskCount(masks.length); composition.incrementMatteOrMaskCount(masks.length);
reader.endArray(); reader.endArray();
break;
case 11: case 11:
reader.beginArray(); reader.beginArray();
while (reader.hasNext()) { while (reader.hasNext()) {
@ -179,7 +164,6 @@ class LayerParser {
} }
} }
reader.endArray(); reader.endArray();
break;
case 12: case 12:
reader.beginObject(); reader.beginObject();
while (reader.hasNext()) { while (reader.hasNext()) {
@ -187,7 +171,6 @@ class LayerParser {
case 0: case 0:
text = AnimatableValueParser.parseDocumentData( text = AnimatableValueParser.parseDocumentData(
reader, composition); reader, composition);
break;
case 1: case 1:
reader.beginArray(); reader.beginArray();
if (reader.hasNext()) { if (reader.hasNext()) {
@ -198,14 +181,12 @@ class LayerParser {
reader.skipValue(); reader.skipValue();
} }
reader.endArray(); reader.endArray();
break;
default: default:
reader.skipName(); reader.skipName();
reader.skipValue(); reader.skipValue();
} }
} }
reader.endObject(); reader.endObject();
break;
case 13: case 13:
reader.beginArray(); reader.beginArray();
var effectNames = <String>[]; var effectNames = <String>[];
@ -221,11 +202,9 @@ class LayerParser {
dropShadowEffect = dropShadowEffect =
DropShadowEffectParser().parse(reader, composition); DropShadowEffectParser().parse(reader, composition);
} }
break;
case 1: case 1:
var effectName = reader.nextString(); var effectName = reader.nextString();
effectNames.add(effectName); effectNames.add(effectName);
break;
default: default:
reader.skipName(); reader.skipName();
reader.skipValue(); reader.skipValue();
@ -238,34 +217,24 @@ class LayerParser {
"Lottie doesn't support layer effects. If you are using them for " "Lottie doesn't support layer effects. If you are using them for "
' fills, strokes, trim paths etc. then try adding them directly as contents ' ' fills, strokes, trim paths etc. then try adding them directly as contents '
' in your shape. Found: $effectNames'); ' in your shape. Found: $effectNames');
break;
case 14: case 14:
timeStretch = reader.nextDouble(); timeStretch = reader.nextDouble();
break;
case 15: case 15:
startFrame = reader.nextDouble(); startFrame = reader.nextDouble();
break;
case 16: case 16:
preCompWidth = reader.nextInt(); preCompWidth = reader.nextInt();
break;
case 17: case 17:
preCompHeight = reader.nextInt(); preCompHeight = reader.nextInt();
break;
case 18: case 18:
inFrame = reader.nextDouble(); inFrame = reader.nextDouble();
break;
case 19: case 19:
outFrame = reader.nextDouble(); outFrame = reader.nextDouble();
break;
case 20: case 20:
timeRemapping = AnimatableValueParser.parseFloat(reader, composition); timeRemapping = AnimatableValueParser.parseFloat(reader, composition);
break;
case 21: case 21:
cl = reader.nextString(); cl = reader.nextString();
break;
case 22: case 22:
hidden = reader.nextBoolean(); hidden = reader.nextBoolean();
break;
default: default:
reader.skipName(); reader.skipName();
reader.skipValue(); reader.skipValue();
@ -277,11 +246,7 @@ class LayerParser {
// Before the in frame // Before the in frame
if (inFrame > 0) { if (inFrame > 0) {
var preKeyframe = Keyframe<double>(composition, var preKeyframe = Keyframe<double>(composition,
startValue: 0.0, startValue: 0.0, endValue: 0.0, startFrame: 0.0, endFrame: inFrame);
endValue: 0.0,
interpolator: null,
startFrame: 0.0,
endFrame: inFrame);
inOutKeyframes.add(preKeyframe); inOutKeyframes.add(preKeyframe);
} }
@ -289,7 +254,6 @@ class LayerParser {
var visibleKeyframe = Keyframe<double>(composition, var visibleKeyframe = Keyframe<double>(composition,
startValue: 1.0, startValue: 1.0,
endValue: 1.0, endValue: 1.0,
interpolator: null,
startFrame: inFrame, startFrame: inFrame,
endFrame: outFrame); endFrame: outFrame);
inOutKeyframes.add(visibleKeyframe); inOutKeyframes.add(visibleKeyframe);
@ -297,7 +261,6 @@ class LayerParser {
var outKeyframe = Keyframe<double>(composition, var outKeyframe = Keyframe<double>(composition,
startValue: 0.0, startValue: 0.0,
endValue: 0.0, endValue: 0.0,
interpolator: null,
startFrame: outFrame, startFrame: outFrame,
endFrame: double.maxFinite); endFrame: double.maxFinite);
inOutKeyframes.add(outKeyframe); inOutKeyframes.add(outKeyframe);

View File

@ -33,20 +33,15 @@ class LottieCompositionParser {
while (reader.hasNext()) { while (reader.hasNext()) {
switch (reader.selectName(_names)) { switch (reader.selectName(_names)) {
case 0: case 0:
parameters.bounds.width = reader.nextInt().round(); parameters.bounds.width = reader.nextInt();
break;
case 1: case 1:
parameters.bounds.height = reader.nextInt().round(); parameters.bounds.height = reader.nextInt();
break;
case 2: case 2:
parameters.startFrame = reader.nextDouble(); parameters.startFrame = reader.nextDouble();
break;
case 3: case 3:
parameters.endFrame = reader.nextDouble() - 0.01; parameters.endFrame = reader.nextDouble() - 0.01;
break;
case 4: case 4:
parameters.frameRate = reader.nextDouble(); parameters.frameRate = reader.nextDouble();
break;
case 5: case 5:
var version = reader.nextString(); var version = reader.nextString();
var versions = version.split('.'); var versions = version.split('.');
@ -57,24 +52,18 @@ class LottieCompositionParser {
majorVersion, minorVersion, patchVersion, 4, 4, 0)) { majorVersion, minorVersion, patchVersion, 4, 4, 0)) {
composition.addWarning('Lottie only supports bodymovin >= 4.4.0'); composition.addWarning('Lottie only supports bodymovin >= 4.4.0');
} }
break;
case 6: case 6:
_parseLayers( _parseLayers(
reader, composition, parameters.layers, parameters.layerMap); reader, composition, parameters.layers, parameters.layerMap);
break;
case 7: case 7:
_parseAssets( _parseAssets(
reader, composition, parameters.precomps, parameters.images); reader, composition, parameters.precomps, parameters.images);
break;
case 8: case 8:
_parseFonts(reader, parameters.fonts); _parseFonts(reader, parameters.fonts);
break;
case 9: case 9:
_parseChars(reader, composition, parameters.characters); _parseChars(reader, composition, parameters.characters);
break;
case 10: case 10:
_parseMarkers(reader, composition, parameters.markers); _parseMarkers(reader, composition, parameters.markers);
break;
default: default:
reader.skipName(); reader.skipName();
reader.skipValue(); reader.skipValue();
@ -136,7 +125,6 @@ class LottieCompositionParser {
switch (reader.selectName(_assetsNames)) { switch (reader.selectName(_assetsNames)) {
case 0: case 0:
id = reader.nextString(); id = reader.nextString();
break;
case 1: case 1:
reader.beginArray(); reader.beginArray();
while (reader.hasNext()) { while (reader.hasNext()) {
@ -145,19 +133,14 @@ class LottieCompositionParser {
layers.add(layer); layers.add(layer);
} }
reader.endArray(); reader.endArray();
break;
case 2: case 2:
width = reader.nextInt(); width = reader.nextInt();
break;
case 3: case 3:
height = reader.nextInt(); height = reader.nextInt();
break;
case 4: case 4:
imageFileName = reader.nextString(); imageFileName = reader.nextString();
break;
case 5: case 5:
relativeFolder = reader.nextString(); relativeFolder = reader.nextString();
break;
default: default:
reader.skipName(); reader.skipName();
reader.skipValue(); reader.skipValue();
@ -192,7 +175,6 @@ class LottieCompositionParser {
fonts[font.name] = font; fonts[font.name] = font;
} }
reader.endArray(); reader.endArray();
break;
default: default:
reader.skipName(); reader.skipName();
reader.skipValue(); reader.skipValue();
@ -226,13 +208,10 @@ class LottieCompositionParser {
switch (reader.selectName(_markerNames)) { switch (reader.selectName(_markerNames)) {
case 0: case 0:
comment = reader.nextString(); comment = reader.nextString();
break;
case 1: case 1:
frame = reader.nextDouble(); frame = reader.nextDouble();
break;
case 2: case 2:
durationFrames = reader.nextDouble(); durationFrames = reader.nextDouble();
break;
default: default:
reader.skipName(); reader.skipName();
reader.skipValue(); reader.skipValue();

View File

@ -23,33 +23,25 @@ class MaskParser {
switch (modeName) { switch (modeName) {
case 'a': case 'a':
maskMode = MaskMode.maskModeAdd; maskMode = MaskMode.maskModeAdd;
break;
case 's': case 's':
maskMode = MaskMode.maskModeSubstract; maskMode = MaskMode.maskModeSubstract;
break;
case 'n': case 'n':
maskMode = MaskMode.maskModeNone; maskMode = MaskMode.maskModeNone;
break;
case 'i': case 'i':
composition.addWarning( composition.addWarning(
'Animation contains intersect masks. They are not supported but will be treated like add masks.'); 'Animation contains intersect masks. They are not supported but will be treated like add masks.');
maskMode = MaskMode.maskModeIntersect; maskMode = MaskMode.maskModeIntersect;
break;
default: default:
composition.addWarning( composition.addWarning(
'Unknown mask mode $modeName. Defaulting to Add.'); 'Unknown mask mode $modeName. Defaulting to Add.');
maskMode = MaskMode.maskModeAdd; maskMode = MaskMode.maskModeAdd;
} }
break;
case 'pt': case 'pt':
maskPath = AnimatableValueParser.parseShapeData(reader, composition); maskPath = AnimatableValueParser.parseShapeData(reader, composition);
break;
case 'o': case 'o':
opacity = AnimatableValueParser.parseInteger(reader, composition); opacity = AnimatableValueParser.parseInteger(reader, composition);
break;
case 'inv': case 'inv':
inverted = reader.nextBoolean(); inverted = reader.nextBoolean();
break;
default: default:
reader.skipValue(); reader.skipValue();
} }

View File

@ -16,13 +16,10 @@ class MergePathsParser {
switch (reader.selectName(_names)) { switch (reader.selectName(_names)) {
case 0: case 0:
name = reader.nextString(); name = reader.nextString();
break;
case 1: case 1:
mode = MergePaths.modeForId(reader.nextInt()); mode = MergePaths.modeForId(reader.nextInt());
break;
case 2: case 2:
hidden = reader.nextBoolean(); hidden = reader.nextBoolean();
break;
default: default:
reader.skipName(); reader.skipName();
reader.skipValue(); reader.skipValue();

View File

@ -43,7 +43,6 @@ class JsonScope {
..write('[') ..write('[')
..write(pathIndices[i]) ..write(pathIndices[i])
..write(']'); ..write(']');
break;
case emptyObject: case emptyObject:
case danglingName: case danglingName:
@ -52,7 +51,6 @@ class JsonScope {
if (pathNames[i] != null) { if (pathNames[i] != null) {
result.write(pathNames[i]); result.write(pathNames[i]);
} }
break;
case nonEmptyDocument: case nonEmptyDocument:
case emptyDocument: case emptyDocument:

View File

@ -200,7 +200,6 @@ class JsonUtf8Reader extends JsonReader {
return _peeked = peekedEndArray; return _peeked = peekedEndArray;
case $semicolon: case $semicolon:
_checkLenient(); _checkLenient();
break;
case $comma: case $comma:
break; break;
default: default:
@ -218,7 +217,6 @@ class JsonUtf8Reader extends JsonReader {
return _peeked = peekedEndObject; return _peeked = peekedEndObject;
case $semicolon: case $semicolon:
_checkLenient(); // fall-through _checkLenient(); // fall-through
break;
case $comma: case $comma:
break; break;
default: default:
@ -262,7 +260,6 @@ class JsonUtf8Reader extends JsonReader {
if (buffer.request(1) && buffer.getByte(0) == $greaterThan) { if (buffer.request(1) && buffer.getByte(0) == $greaterThan) {
buffer.readByte(); // Consume '>'. buffer.readByte(); // Consume '>'.
} }
break;
default: default:
throw syntaxError("Expected ':'"); throw syntaxError("Expected ':'");
} }

View File

@ -31,41 +31,30 @@ class PolystarShapeParser {
switch (reader.selectName(_names)) { switch (reader.selectName(_names)) {
case 0: case 0:
name = reader.nextString(); name = reader.nextString();
break;
case 1: case 1:
type = PolystarShapeType.forValue(reader.nextInt()); type = PolystarShapeType.forValue(reader.nextInt());
break;
case 2: case 2:
points = AnimatableValueParser.parseFloat(reader, composition); points = AnimatableValueParser.parseFloat(reader, composition);
break;
case 3: case 3:
position = position =
AnimatablePathValueParser.parseSplitPath(reader, composition); AnimatablePathValueParser.parseSplitPath(reader, composition);
break;
case 4: case 4:
rotation = AnimatableValueParser.parseFloat(reader, composition); rotation = AnimatableValueParser.parseFloat(reader, composition);
break;
case 5: case 5:
outerRadius = AnimatableValueParser.parseFloat(reader, composition); outerRadius = AnimatableValueParser.parseFloat(reader, composition);
break;
case 6: case 6:
outerRoundedness = outerRoundedness =
AnimatableValueParser.parseFloat(reader, composition); AnimatableValueParser.parseFloat(reader, composition);
break;
case 7: case 7:
innerRadius = AnimatableValueParser.parseFloat(reader, composition); innerRadius = AnimatableValueParser.parseFloat(reader, composition);
break;
case 8: case 8:
innerRoundedness = innerRoundedness =
AnimatableValueParser.parseFloat(reader, composition); AnimatableValueParser.parseFloat(reader, composition);
break;
case 9: case 9:
hidden = reader.nextBoolean(); hidden = reader.nextBoolean();
break;
case 10: case 10:
// "d" is 2 for normal and 3 for reversed. // "d" is 2 for normal and 3 for reversed.
reversed = reader.nextInt() == 3; reversed = reader.nextInt() == 3;
break;
default: default:
reader.skipName(); reader.skipName();
reader.skipValue(); reader.skipValue();

View File

@ -25,20 +25,15 @@ class RectangleShapeParser {
switch (reader.selectName(_names)) { switch (reader.selectName(_names)) {
case 0: case 0:
name = reader.nextString(); name = reader.nextString();
break;
case 1: case 1:
position = position =
AnimatablePathValueParser.parseSplitPath(reader, composition); AnimatablePathValueParser.parseSplitPath(reader, composition);
break;
case 2: case 2:
size = AnimatableValueParser.parsePoint(reader, composition); size = AnimatableValueParser.parsePoint(reader, composition);
break;
case 3: case 3:
roundedness = AnimatableValueParser.parseFloat(reader, composition); roundedness = AnimatableValueParser.parseFloat(reader, composition);
break;
case 4: case 4:
hidden = reader.nextBoolean(); hidden = reader.nextBoolean();
break;
default: default:
reader.skipValue(); reader.skipValue();
} }

View File

@ -23,19 +23,14 @@ class RepeaterParser {
switch (reader.selectName(_names)) { switch (reader.selectName(_names)) {
case 0: case 0:
name = reader.nextString(); name = reader.nextString();
break;
case 1: case 1:
copies = AnimatableValueParser.parseFloat(reader, composition); copies = AnimatableValueParser.parseFloat(reader, composition);
break;
case 2: case 2:
offset = AnimatableValueParser.parseFloat(reader, composition); offset = AnimatableValueParser.parseFloat(reader, composition);
break;
case 3: case 3:
transform = AnimatableTransformParser.parse(reader, composition); transform = AnimatableTransformParser.parse(reader, composition);
break;
case 4: case 4:
hidden = reader.nextBoolean(); hidden = reader.nextBoolean();
break;
default: default:
reader.skipValue(); reader.skipValue();
} }

View File

@ -21,18 +21,15 @@ class RoundedCornersParser {
switch (reader.selectName(_names)) { switch (reader.selectName(_names)) {
case 0: //nm case 0: //nm
name = reader.nextString(); name = reader.nextString();
break;
case 1: // r case 1: // r
cornerRadius = AnimatableValueParser.parseFloat(reader, composition); cornerRadius = AnimatableValueParser.parseFloat(reader, composition);
break;
case 2: // hd case 2: // hd
hidden = reader.nextBoolean(); hidden = reader.nextBoolean();
break;
default: default:
reader.skipValue(); reader.skipValue();
} }
} }
return hidden ? null : RoundedCorners(name!, cornerRadius!); return hidden ? null : RoundedCorners(name ?? '', cornerRadius!);
} }
} }

View File

@ -23,16 +23,12 @@ ShapeData shapeDataParser(JsonReader reader) {
switch (reader.selectName(_names)) { switch (reader.selectName(_names)) {
case 0: case 0:
closed = reader.nextBoolean(); closed = reader.nextBoolean();
break;
case 1: case 1:
pointsArray = JsonUtils.jsonToPoints(reader); pointsArray = JsonUtils.jsonToPoints(reader);
break;
case 2: case 2:
inTangents = JsonUtils.jsonToPoints(reader); inTangents = JsonUtils.jsonToPoints(reader);
break;
case 3: case 3:
outTangents = JsonUtils.jsonToPoints(reader); outTangents = JsonUtils.jsonToPoints(reader);
break;
default: default:
reader.skipName(); reader.skipName();
reader.skipValue(); reader.skipValue();
@ -51,7 +47,7 @@ ShapeData shapeDataParser(JsonReader reader) {
if (pointsArray.isEmpty) { if (pointsArray.isEmpty) {
return ShapeData(<CubicCurveData>[], return ShapeData(<CubicCurveData>[],
initialPoint: const Offset(0, 0), closed: false); initialPoint: Offset.zero, closed: false);
} }
var length = pointsArray.length; var length = pointsArray.length;

View File

@ -25,22 +25,16 @@ class ShapeFillParser {
switch (reader.selectName(_names)) { switch (reader.selectName(_names)) {
case 0: case 0:
name = reader.nextString(); name = reader.nextString();
break;
case 1: case 1:
color = AnimatableValueParser.parseColor(reader, composition); color = AnimatableValueParser.parseColor(reader, composition);
break;
case 2: case 2:
opacity = AnimatableValueParser.parseInteger(reader, composition); opacity = AnimatableValueParser.parseInteger(reader, composition);
break;
case 3: case 3:
fillEnabled = reader.nextBoolean(); fillEnabled = reader.nextBoolean();
break;
case 4: case 4:
fillTypeInt = reader.nextInt(); fillTypeInt = reader.nextInt();
break;
case 5: case 5:
hidden = reader.nextBoolean(); hidden = reader.nextBoolean();
break;
default: default:
reader.skipName(); reader.skipName();
reader.skipValue(); reader.skipValue();

View File

@ -18,10 +18,8 @@ class ShapeGroupParser {
switch (reader.selectName(_names)) { switch (reader.selectName(_names)) {
case 0: case 0:
name = reader.nextString(); name = reader.nextString();
break;
case 1: case 1:
hidden = reader.nextBoolean(); hidden = reader.nextBoolean();
break;
case 2: case 2:
reader.beginArray(); reader.beginArray();
while (reader.hasNext()) { while (reader.hasNext()) {
@ -31,7 +29,6 @@ class ShapeGroupParser {
} }
} }
reader.endArray(); reader.endArray();
break;
default: default:
reader.skipValue(); reader.skipValue();
} }

View File

@ -20,16 +20,12 @@ class ShapePathParser {
switch (reader.selectName(_names)) { switch (reader.selectName(_names)) {
case 0: case 0:
name = reader.nextString(); name = reader.nextString();
break;
case 1: case 1:
ind = reader.nextInt(); ind = reader.nextInt();
break;
case 2: case 2:
shape = AnimatableValueParser.parseShapeData(reader, composition); shape = AnimatableValueParser.parseShapeData(reader, composition);
break;
case 3: case 3:
hidden = reader.nextBoolean(); hidden = reader.nextBoolean();
break;
default: default:
reader.skipValue(); reader.skipValue();
} }

View File

@ -32,28 +32,20 @@ class ShapeStrokeParser {
switch (reader.selectName(_names)) { switch (reader.selectName(_names)) {
case 0: case 0:
name = reader.nextString(); name = reader.nextString();
break;
case 1: case 1:
color = AnimatableValueParser.parseColor(reader, composition); color = AnimatableValueParser.parseColor(reader, composition);
break;
case 2: case 2:
width = AnimatableValueParser.parseFloat(reader, composition); width = AnimatableValueParser.parseFloat(reader, composition);
break;
case 3: case 3:
opacity = AnimatableValueParser.parseInteger(reader, composition); opacity = AnimatableValueParser.parseInteger(reader, composition);
break;
case 4: case 4:
capType = LineCapType.values[reader.nextInt() - 1]; capType = LineCapType.values[reader.nextInt() - 1];
break;
case 5: case 5:
joinType = LineJoinType.values[reader.nextInt() - 1]; joinType = LineJoinType.values[reader.nextInt() - 1];
break;
case 6: case 6:
miterLimit = reader.nextDouble(); miterLimit = reader.nextDouble();
break;
case 7: case 7:
hidden = reader.nextBoolean(); hidden = reader.nextBoolean();
break;
case 8: case 8:
reader.beginArray(); reader.beginArray();
while (reader.hasNext()) { while (reader.hasNext()) {
@ -65,10 +57,8 @@ class ShapeStrokeParser {
switch (reader.selectName(_dashPatternNames)) { switch (reader.selectName(_dashPatternNames)) {
case 0: case 0:
n = reader.nextString(); n = reader.nextString();
break;
case 1: case 1:
val = AnimatableValueParser.parseFloat(reader, composition); val = AnimatableValueParser.parseFloat(reader, composition);
break;
default: default:
reader.skipName(); reader.skipName();
reader.skipValue(); reader.skipValue();
@ -79,12 +69,10 @@ class ShapeStrokeParser {
switch (n) { switch (n) {
case 'o': case 'o':
offset = val; offset = val;
break;
case 'd': case 'd':
case 'g': case 'g':
composition.hasDashPattern = true; composition.hasDashPattern = true;
lineDashPattern.add(val!); lineDashPattern.add(val!);
break;
} }
} }
reader.endArray(); reader.endArray();
@ -93,7 +81,6 @@ class ShapeStrokeParser {
// If there is only 1 value then it is assumed to be equal parts on and off. // If there is only 1 value then it is assumed to be equal parts on and off.
lineDashPattern.add(lineDashPattern.first); lineDashPattern.add(lineDashPattern.first);
} }
break;
default: default:
reader.skipValue(); reader.skipValue();
} }

View File

@ -20,22 +20,16 @@ class ShapeTrimPathParser {
switch (reader.selectName(_names)) { switch (reader.selectName(_names)) {
case 0: case 0:
start = AnimatableValueParser.parseFloat(reader, composition); start = AnimatableValueParser.parseFloat(reader, composition);
break;
case 1: case 1:
end = AnimatableValueParser.parseFloat(reader, composition); end = AnimatableValueParser.parseFloat(reader, composition);
break;
case 2: case 2:
offset = AnimatableValueParser.parseFloat(reader, composition); offset = AnimatableValueParser.parseFloat(reader, composition);
break;
case 3: case 3:
name = reader.nextString(); name = reader.nextString();
break;
case 4: case 4:
type = ShapeTrimPath.typeForId(reader.nextInt()); type = ShapeTrimPath.typeForId(reader.nextInt());
break;
case 5: case 5:
hidden = reader.nextBoolean(); hidden = reader.nextBoolean();
break;
default: default:
reader.skipValue(); reader.skipValue();
} }

View File

@ -8,6 +8,7 @@ import '../lottie_image_asset.dart';
import 'load_image.dart'; import 'load_image.dart';
import 'lottie_provider.dart'; import 'lottie_provider.dart';
@immutable
class AssetLottie extends LottieProvider { class AssetLottie extends LottieProvider {
AssetLottie( AssetLottie(
this.assetName, { this.assetName, {

View File

@ -1,4 +1,5 @@
import 'dart:ui' as ui; import 'dart:ui' as ui;
import 'package:flutter/foundation.dart';
import 'package:path/path.dart' as p; import 'package:path/path.dart' as p;
import '../composition.dart'; import '../composition.dart';
import '../lottie_image_asset.dart'; import '../lottie_image_asset.dart';
@ -6,6 +7,7 @@ import 'load_image.dart';
import 'lottie_provider.dart'; import 'lottie_provider.dart';
import 'provider_io.dart' if (dart.library.html) 'provider_web.dart' as io; import 'provider_io.dart' if (dart.library.html) 'provider_web.dart' as io;
@immutable
class FileLottie extends LottieProvider { class FileLottie extends LottieProvider {
FileLottie(this.file, {super.imageProviderFactory}); FileLottie(this.file, {super.imageProviderFactory});

View File

@ -1,5 +1,5 @@
import 'dart:typed_data';
import 'dart:ui' as ui; import 'dart:ui' as ui;
import 'package:flutter/foundation.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:path/path.dart' as p; import 'package:path/path.dart' as p;
import '../composition.dart'; import '../composition.dart';
@ -7,6 +7,7 @@ import '../lottie_image_asset.dart';
import 'load_image.dart'; import 'load_image.dart';
import 'lottie_provider.dart'; import 'lottie_provider.dart';
@immutable
class MemoryLottie extends LottieProvider { class MemoryLottie extends LottieProvider {
MemoryLottie(this.bytes, {super.imageProviderFactory}); MemoryLottie(this.bytes, {super.imageProviderFactory});

View File

@ -8,6 +8,7 @@ import 'load_image.dart';
import 'lottie_provider.dart'; import 'lottie_provider.dart';
import 'provider_io.dart' if (dart.library.html) 'provider_web.dart' as network; import 'provider_io.dart' if (dart.library.html) 'provider_web.dart' as network;
@immutable
class NetworkLottie extends LottieProvider { class NetworkLottie extends LottieProvider {
NetworkLottie(this.url, {this.headers, super.imageProviderFactory}); NetworkLottie(this.url, {this.headers, super.imageProviderFactory});

View File

@ -13,7 +13,7 @@ class GammaEvaluator {
// IEC 61966-2-1:1999 // IEC 61966-2-1:1999
return linear <= 0.0031308 return linear <= 0.0031308
? linear * 12.92 ? linear * 12.92
: ((pow(linear, 1.0 / 2.4) * 1.055) - 0.055).toDouble(); : ((pow(linear, 1.0 / 2.4) * 1.055) - 0.055);
} }
// Electro-optical conversion function for the sRGB color space // Electro-optical conversion function for the sRGB color space

View File

@ -104,16 +104,13 @@ class Utils {
newStart -= length; newStart -= length;
} }
var tempPath = var tempPath = pathMeasure.extractPath(newStart, newEnd);
pathMeasure.extractPath(newStart, newEnd, startWithMoveTo: true);
if (newEnd > length) { if (newEnd > length) {
var tempPath2 = var tempPath2 = pathMeasure.extractPath(0, newEnd % length);
pathMeasure.extractPath(0, newEnd % length, startWithMoveTo: true);
tempPath.addPath(tempPath2, Offset.zero); tempPath.addPath(tempPath2, Offset.zero);
} else if (newStart < 0) { } else if (newStart < 0) {
var tempPath2 = pathMeasure.extractPath(length + newStart, length, var tempPath2 = pathMeasure.extractPath(length + newStart, length);
startWithMoveTo: true);
tempPath.addPath(tempPath2, Offset.zero); tempPath.addPath(tempPath2, Offset.zero);
} }
path.set(tempPath); path.set(tempPath);

View File

@ -1,5 +1,7 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/painting.dart'; import 'package:flutter/painting.dart';
@immutable
class DropShadow { class DropShadow {
final Color color; final Color color;
final double direction; final double direction;

View File

@ -5,34 +5,34 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: _fe_analyzer_shared name: _fe_analyzer_shared
sha256: a36ec4843dc30ea6bf652bf25e3448db6c5e8bcf4aa55f063a5d1dad216d8214 sha256: ae92f5d747aee634b87f89d9946000c2de774be1d6ac3e58268224348cd0101a
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "58.0.0" version: "61.0.0"
analyzer: analyzer:
dependency: "direct dev" dependency: "direct dev"
description: description:
name: analyzer name: analyzer
sha256: cc4242565347e98424ce9945c819c192ec0838cb9d1f6aa4a97cc96becbc5b27 sha256: ea3d8652bda62982addfd92fdc2d0214e5f82e43325104990d4f4c4a2a313562
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.10.0" version: "5.13.0"
archive: archive:
dependency: "direct main" dependency: "direct main"
description: description:
name: archive name: archive
sha256: d6347d54a2d8028e0437e3c099f66fdb8ae02c4720c1e7534c9f24c10351f85d sha256: "0c8368c9b3f0abbc193b9d6133649a614204b528982bebc7026372d61677ce3a"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.3.6" version: "3.3.7"
args: args:
dependency: transitive dependency: transitive
description: description:
name: args name: args
sha256: "4cab82a83ffef80b262ddedf47a0a8e56ee6fbf7fe21e6e768b02792034dd440" sha256: c372bb384f273f0c2a8aaaa226dad84dc27c8519a691b888725dec59518ad53a
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.4.0" version: "2.4.1"
async: async:
dependency: transitive dependency: transitive
description: description:
@ -85,18 +85,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: crypto name: crypto
sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67 sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.2" version: "3.0.3"
dart_style: dart_style:
dependency: "direct dev" dependency: "direct dev"
description: description:
name: dart_style name: dart_style
sha256: "6d691edde054969f0e0f26abb1b30834b5138b963793e56f69d3a9a4435e6352" sha256: f4f1f73ab3fd2afcbcca165ee601fe980d966af6a21b5970c6c9376955c528ad
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.3.0" version: "2.3.1"
fake_async: fake_async:
dependency: transitive dependency: transitive
description: description:
@ -109,10 +109,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: file name: file
sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.1.4" version: "7.0.0"
flutter: flutter:
dependency: "direct main" dependency: "direct main"
description: flutter description: flutter
@ -135,10 +135,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: glob name: glob
sha256: "4515b5b6ddb505ebdd242a5f2cc5d22d3d6a80013789debfbda7777f47ea308c" sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.1" version: "2.1.2"
js: js:
dependency: transitive dependency: transitive
description: description:
@ -151,10 +151,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: lints name: lints
sha256: "5e4a9cd06d447758280a8ac2405101e0e2094d2a1dbdd3756aec3fe7775ba593" sha256: "6b0206b0bf4f04961fc5438198ccb3a885685cd67d4d4a32cc20ad7f8adbe015"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.1" version: "2.1.0"
matcher: matcher:
dependency: transitive dependency: transitive
description: description:
@ -199,18 +199,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: pointycastle name: pointycastle
sha256: c3120a968135aead39699267f4c74bc9a08e4e909e86bc1b0af5bfd78691123c sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.7.2" version: "3.7.3"
pub_semver: pub_semver:
dependency: transitive dependency: transitive
description: description:
name: pub_semver name: pub_semver
sha256: "307de764d305289ff24ad257ad5c5793ce56d04947599ad68b3baa124105fc17" sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.3" version: "2.1.4"
sky_engine: sky_engine:
dependency: transitive dependency: transitive
description: flutter description: flutter
@ -268,10 +268,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: typed_data name: typed_data
sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5" sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.3.1" version: "1.3.2"
vector_math: vector_math:
dependency: "direct main" dependency: "direct main"
description: description:
@ -284,18 +284,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: watcher name: watcher
sha256: "6a7f46926b01ce81bfc339da6a7f20afbe7733eff9846f6d6a5466aa4c6667c0" sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.2" version: "1.1.0"
yaml: yaml:
dependency: "direct dev" dependency: "direct dev"
description: description:
name: yaml name: yaml
sha256: "23812a9b125b48d4007117254bca50abb6c712352927eece9e155207b1db2370" sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.1.1" version: "3.1.2"
sdks: sdks:
dart: ">=3.0.0-0 <4.0.0" dart: ">=3.0.0 <4.0.0"
flutter: ">=3.3.0" flutter: ">=3.10.0"

View File

@ -1,11 +1,11 @@
name: lottie name: lottie
description: Render After Effects animations natively on Flutter. This package is a pure Dart implementation of a Lottie player. description: Render After Effects animations natively on Flutter. This package is a pure Dart implementation of a Lottie player.
version: 2.3.2 version: 2.4.0
repository: https://github.com/xvrh/lottie-flutter repository: https://github.com/xvrh/lottie-flutter
environment: environment:
sdk: '>=2.18.0 <3.0.0' sdk: '^3.0.0'
flutter: '>=3.3.0' flutter: '>=3.10.0'
dependencies: dependencies:
archive: ^3.0.0 archive: ^3.0.0

View File

@ -9,8 +9,8 @@ import 'utils.dart';
void main() { void main() {
testWidgets('Can specify ImageProvider with zip file ', (tester) async { testWidgets('Can specify ImageProvider with zip file ', (tester) async {
var size = const Size(500, 400); var size = const Size(500, 400);
tester.binding.window.physicalSizeTestValue = size; tester.view.physicalSize = size;
tester.binding.window.devicePixelRatioTestValue = 1.0; tester.view.devicePixelRatio = 1.0;
var callCount = 0; var callCount = 0;
ImageProvider imageProviderFactory(LottieImageAsset image) { ImageProvider imageProviderFactory(LottieImageAsset image) {
@ -32,8 +32,8 @@ void main() {
testWidgets('Can specify image delegate', (tester) async { testWidgets('Can specify image delegate', (tester) async {
var size = const Size(500, 400); var size = const Size(500, 400);
tester.binding.window.physicalSizeTestValue = size; tester.view.physicalSize = size;
tester.binding.window.devicePixelRatioTestValue = 1.0; tester.view.devicePixelRatio = 1.0;
var image = await tester.runAsync(() async => var image = await tester.runAsync(() async =>
loadImage(FileImage(File('example/assets/Images/WeAccept/img_0.png')))); loadImage(FileImage(File('example/assets/Images/WeAccept/img_0.png'))));

View File

@ -276,7 +276,7 @@ void main() {
testGolden( testGolden(
'Null Color Filter', 'Null Color Filter',
ValueDelegate.colorFilter(['**'], value: null), ValueDelegate.colorFilter(['**']),
); );
testGolden( testGolden(
@ -320,8 +320,8 @@ void main() {
testWidgets('warningShimmer', (tester) async { testWidgets('warningShimmer', (tester) async {
var size = const Size(500, 400); var size = const Size(500, 400);
tester.binding.window.physicalSizeTestValue = size; tester.view.physicalSize = size;
tester.binding.window.devicePixelRatioTestValue = 1.0; tester.view.devicePixelRatio = 1.0;
var composition = await LottieComposition.fromBytes( var composition = await LottieComposition.fromBytes(
File('test/data/warningShimmer.json').readAsBytesSync()); File('test/data/warningShimmer.json').readAsBytesSync());

View File

@ -10,8 +10,8 @@ void main() {
testWidgets('Mirror animation', (tester) async { testWidgets('Mirror animation', (tester) async {
var size = const Size(500, 400); var size = const Size(500, 400);
tester.binding.window.physicalSizeTestValue = size; tester.view.physicalSize = size;
tester.binding.window.devicePixelRatioTestValue = 1.0; tester.view.devicePixelRatio = 1.0;
var composition = (await tester.runAsync(() => var composition = (await tester.runAsync(() =>
FileLottie(File('$root/Tests/MatteTimeStretchScan.json')).load()))!; FileLottie(File('$root/Tests/MatteTimeStretchScan.json')).load()))!;

View File

@ -9,8 +9,8 @@ import 'utils.dart';
void main() { void main() {
testWidgets('Animations with stroke', (tester) async { testWidgets('Animations with stroke', (tester) async {
var size = const Size(500, 400); var size = const Size(500, 400);
tester.binding.window.physicalSizeTestValue = size; tester.view.physicalSize = size;
tester.binding.window.devicePixelRatioTestValue = 1.0; tester.view.devicePixelRatio = 1.0;
var composition = await LottieComposition.fromBytes( var composition = await LottieComposition.fromBytes(
File('example/assets/17297-fireworks.json').readAsBytesSync()); File('example/assets/17297-fireworks.json').readAsBytesSync());

View File

@ -14,8 +14,8 @@ void main() {
.where((f) => const ['.json', '.zip'].contains(p.extension(f.path)))) { .where((f) => const ['.json', '.zip'].contains(p.extension(f.path)))) {
testWidgets('Goldens ${asset.path}', (tester) async { testWidgets('Goldens ${asset.path}', (tester) async {
var size = const Size(500, 400); var size = const Size(500, 400);
tester.binding.window.physicalSizeTestValue = size; tester.view.physicalSize = size;
tester.binding.window.devicePixelRatioTestValue = 1.0; tester.view.devicePixelRatio = 1.0;
var composition = var composition =
(await tester.runAsync(() => FileLottie(asset).load()))!; (await tester.runAsync(() => FileLottie(asset).load()))!;

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 63 KiB

View File

@ -79,7 +79,7 @@ class DartProject {
} }
void _visitDirectory(Directory directory, List<DartFile> files, void _visitDirectory(Directory directory, List<DartFile> files,
{bool isRoot = true}) { {required bool isRoot}) {
var directoryContent = directory.listSync(); var directoryContent = directory.listSync();
// On ne visite pas les sous dossiers qui contiennent un autre package // On ne visite pas les sous dossiers qui contiennent un autre package

View File

@ -1,16 +0,0 @@
import 'dart:convert';
import 'dart:io';
void main() {
var pubspec = File('pubspec.yaml');
var content = pubspec.readAsStringSync();
var overrides = '''
dependency_overrides:
pedantic: ^1.9.0''';
content = content.replaceAll(
overrides, LineSplitter.split(overrides).map((l) => '#$l').join('\n'));
pubspec.writeAsStringSync(content);
}