Compare commits
5 Commits
Author | SHA1 | Date | |
---|---|---|---|
434ae88aa8 | |||
6b752d829c | |||
124ba6997b | |||
fdc4018f57 | |||
b61ea14116 |
2
.github/workflows/publish-on-pub.yaml
vendored
@ -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: |
|
||||||
|
@ -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).
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
1
example/assets/Tests/1669133489622.json
Normal file
130
example/lib/examples/draw_cache.dart
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
@ -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
|
||||||
|
@ -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"
|
||||||
|
@ -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:
|
||||||
|
@ -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;
|
||||||
|
@ -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.
|
||||||
|
@ -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)
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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'
|
||||||
'}';
|
'}';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
|
@ -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,
|
||||||
|
@ -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');
|
||||||
|
@ -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:
|
||||||
|
@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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();
|
||||||
|
@ -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();
|
||||||
|
@ -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();
|
||||||
|
@ -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();
|
||||||
|
@ -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();
|
||||||
|
@ -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');
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
@ -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();
|
||||||
|
@ -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();
|
||||||
|
@ -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();
|
||||||
|
@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
@ -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');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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();
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
@ -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:
|
||||||
|
@ -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 ':'");
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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!);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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();
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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, {
|
||||||
|
@ -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});
|
||||||
|
|
||||||
|
@ -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});
|
||||||
|
|
||||||
|
@ -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});
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
60
pubspec.lock
@ -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"
|
||||||
|
@ -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
|
||||||
|
@ -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'))));
|
||||||
|
@ -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());
|
||||||
|
@ -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()))!;
|
||||||
|
@ -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());
|
||||||
|
@ -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()))!;
|
||||||
|
|
||||||
|
BIN
test/goldens/all/Tests/1669133489622.png
Normal file
After Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 60 KiB |
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 63 KiB |
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 27 KiB |
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 27 KiB |
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 63 KiB |
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 63 KiB |
@ -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
|
||||||
|
@ -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);
|
|
||||||
}
|
|