++
diff --git a/packages/flutter_shaders/example/analysis_options.yaml b/packages/flutter_shaders/example/analysis_options.yaml
deleted file mode 100644
index f9b3034..0000000
--- a/packages/flutter_shaders/example/analysis_options.yaml
+++ /dev/null
@@ -1 +0,0 @@
-include: package:flutter_lints/flutter.yaml
diff --git a/packages/flutter_shaders/example/pubspec.yaml b/packages/flutter_shaders/example/pubspec.yaml
index aaffbe4..640182d 100644
--- a/packages/flutter_shaders/example/pubspec.yaml
+++ b/packages/flutter_shaders/example/pubspec.yaml
@@ -10,11 +10,12 @@
- shaders/solid_color.frag
- shaders/blank.frag
-dev_dependencies:
+dependencies:
flutter:
sdk: flutter
+
+dev_dependencies:
flutter_shaders:
path: ../
flutter_test:
sdk: flutter
- flutter_lints: ^1.0.0
diff --git a/packages/flutter_shaders/example/test/animated_sampler_test.dart b/packages/flutter_shaders/example/test/animated_sampler_test.dart
index 59fb472..cc485e5 100644
--- a/packages/flutter_shaders/example/test/animated_sampler_test.dart
+++ b/packages/flutter_shaders/example/test/animated_sampler_test.dart
@@ -10,7 +10,6 @@
import 'package:flutter_shaders/flutter_shaders.dart';
import 'package:flutter_test/flutter_test.dart';
-
final Float64List _transform = Matrix4.identity().storage;
void main() {
@@ -18,35 +17,39 @@
await ShaderBuilder.precacheShader('shaders/sampler.frag');
});
- testWidgets('AnimatedSampler captures child widgets in texture', (WidgetTester tester) async {
+ testWidgets('AnimatedSampler captures child widgets in texture',
+ (WidgetTester tester) async {
final GlobalKey globalKey = GlobalKey();
bool usedShader = false;
- await tester.pumpWidget(
- MaterialApp(home: RepaintBoundary(
+ await tester.pumpWidget(MaterialApp(
+ home: RepaintBoundary(
key: globalKey,
- child: ShaderBuilder(
- assetKey: 'shaders/sampler.frag',
- (BuildContext context, FragmentShader shader, Widget? child) {
- return AnimatedSampler((ui.Image image, Size size, Offset offset, Canvas canvas) {
- usedShader = true;
- final ImageShader sampler = ImageShader(image, TileMode.clamp, TileMode.clamp, _transform);
- shader.setFloat(0, size.width);
- shader.setFloat(1, size.height);
- shader.setSampler(0, sampler);
+ child: ShaderBuilder(assetKey: 'shaders/sampler.frag',
+ (BuildContext context, FragmentShader shader, Widget? child) {
+ return AnimatedSampler(
+ (ui.Image image, Size size, Offset offset, Canvas canvas) {
+ usedShader = true;
+ final ImageShader sampler =
+ ImageShader(image, TileMode.clamp, TileMode.clamp, _transform);
+ shader.setFloat(0, size.width);
+ shader.setFloat(1, size.height);
+ shader.setSampler(0, sampler);
- canvas.translate(offset.dx, offset.dy);
- canvas.drawRect(Offset.zero & size, Paint()..shader = shader);
- }, child: Container(color: Colors.red));
- }),
- ),
- ));
+ canvas.translate(offset.dx, offset.dy);
+ canvas.drawRect(Offset.zero & size, Paint()..shader = shader);
+ }, child: Container(color: Colors.red));
+ }),
+ ),
+ ));
expect(usedShader, true);
ByteData? snapshot;
await tester.runAsync(() async {
snapshot = await (await (globalKey.currentContext?.findRenderObject()
- as RenderRepaintBoundary?)!.toImage()).toByteData(format: ui.ImageByteFormat.rawStraightRgba);
+ as RenderRepaintBoundary?)!
+ .toImage())
+ .toByteData(format: ui.ImageByteFormat.rawStraightRgba);
});
// Validate that color is Colors.red from child widget.
diff --git a/packages/flutter_shaders/example/test/shader_builder_test.dart b/packages/flutter_shaders/example/test/shader_builder_test.dart
index 0601a28..37c9175 100644
--- a/packages/flutter_shaders/example/test/shader_builder_test.dart
+++ b/packages/flutter_shaders/example/test/shader_builder_test.dart
@@ -9,7 +9,8 @@
void main() {
testWidgets('Can cache fragment shaders', (WidgetTester tester) async {
bool shaderLoaded = false;
- final Widget child = ShaderBuilder((BuildContext context, FragmentShader shader, Widget? child) {
+ final Widget child = ShaderBuilder(
+ (BuildContext context, FragmentShader shader, Widget? child) {
shaderLoaded = true;
return child ?? const SizedBox();
}, assetKey: 'shaders/solid_color.frag');
@@ -26,7 +27,8 @@
// Shader is still cached with a new widget.
bool sameShaderLoaded = false;
- await tester.pumpWidget(ShaderBuilder((BuildContext context, FragmentShader shader, Widget? child) {
+ await tester.pumpWidget(ShaderBuilder(
+ (BuildContext context, FragmentShader shader, Widget? child) {
sameShaderLoaded = true;
return child ?? const SizedBox();
}, assetKey: 'shaders/solid_color.frag'));
@@ -34,18 +36,22 @@
expect(sameShaderLoaded, true);
});
- testWidgets('ShaderBuilder.precacheShader reports flutter error if invalid asset is provided', (WidgetTester tester) async {
+ testWidgets(
+ 'ShaderBuilder.precacheShader reports flutter error if invalid asset is provided',
+ (WidgetTester tester) async {
await ShaderBuilder.precacheShader('shaders/bogus.frag');
expect(tester.takeException(), isNotNull);
});
- testWidgets('ShaderBuilder.precacheShader makes shader available '
- 'synchronously when future completes', (WidgetTester tester) async {
+ testWidgets(
+ 'ShaderBuilder.precacheShader makes shader available '
+ 'synchronously when future completes', (WidgetTester tester) async {
await ShaderBuilder.precacheShader('shaders/sampler.frag');
bool shaderLoaded = false;
- await tester.pumpWidget(ShaderBuilder((BuildContext context, FragmentShader shader, Widget? child) {
+ await tester.pumpWidget(ShaderBuilder(
+ (BuildContext context, FragmentShader shader, Widget? child) {
shaderLoaded = true;
return child ?? const SizedBox();
}, assetKey: 'shaders/sampler.frag'));
@@ -53,14 +59,19 @@
expect(shaderLoaded, true);
});
- testWidgets('ShaderBuilder.precacheShader reports flutter error if invalid asset is provided', (WidgetTester tester) async {
+ testWidgets(
+ 'ShaderBuilder.precacheShader reports flutter error if invalid asset is provided',
+ (WidgetTester tester) async {
await ShaderBuilder.precacheShader('shaders/bogus.frag');
expect(tester.takeException(), isNotNull);
});
- testWidgets('ShaderBuilder reports flutter error if invalid asset is provided', (WidgetTester tester) async {
- await tester.pumpWidget(ShaderBuilder((BuildContext context, FragmentShader shader, Widget? child) {
+ testWidgets(
+ 'ShaderBuilder reports flutter error if invalid asset is provided',
+ (WidgetTester tester) async {
+ await tester.pumpWidget(ShaderBuilder(
+ (BuildContext context, FragmentShader shader, Widget? child) {
return child ?? const SizedBox();
}, assetKey: 'shaders/bogus.frag'));
diff --git a/packages/flutter_shaders/lib/src/animated_sampler.dart b/packages/flutter_shaders/lib/src/animated_sampler.dart
index 4961edd..b1f917e 100644
--- a/packages/flutter_shaders/lib/src/animated_sampler.dart
+++ b/packages/flutter_shaders/lib/src/animated_sampler.dart
@@ -8,7 +8,8 @@
import 'package:flutter/rendering.dart';
/// A callback for the [AnimatedSamplerBuilder] widget.
-typedef AnimatedSamplerBuilder = void Function(ui.Image, Size, Offset offset, ui.Canvas);
+typedef AnimatedSamplerBuilder = void Function(
+ ui.Image, Size, Offset offset, ui.Canvas);
/// A widget that allows access to a snapshot of the child widgets for painting
/// with a sampler applied to a [FragmentProgram].
@@ -52,7 +53,8 @@
/// caching during expensive animations.
class AnimatedSampler extends StatelessWidget {
/// Create a new [AnimatedSampler].
- const AnimatedSampler(this.builder, {
+ const AnimatedSampler(
+ this.builder, {
required this.child,
super.key,
this.enabled = true,
@@ -80,7 +82,7 @@
}
class _ShaderSamplerImpl extends SingleChildRenderObjectWidget {
- const _ShaderSamplerImpl(this.builder, { super.child, required this.enabled });
+ const _ShaderSamplerImpl(this.builder, {super.child, required this.enabled});
final AnimatedSamplerBuilder builder;
final bool enabled;
@@ -95,7 +97,8 @@
}
@override
- void updateRenderObject(BuildContext context, covariant RenderObject renderObject) {
+ void updateRenderObject(
+ BuildContext context, covariant RenderObject renderObject) {
(renderObject as _RenderShaderSamplerBuilderWidget)
..devicePixelRatio = MediaQuery.of(context).devicePixelRatio
..builder = builder
@@ -106,16 +109,14 @@
// A render object that conditionally converts its child into a [ui.Image]
// and then paints it in place of the child.
class _RenderShaderSamplerBuilderWidget extends RenderProxyBox {
-
// Create a new [_RenderSnapshotWidget].
_RenderShaderSamplerBuilderWidget({
required double devicePixelRatio,
required AnimatedSamplerBuilder builder,
required bool enabled,
- }) : _devicePixelRatio = devicePixelRatio,
- _builder = builder,
- _enabled = enabled;
-
+ }) : _devicePixelRatio = devicePixelRatio,
+ _builder = builder,
+ _enabled = enabled;
/// The device pixel ratio used to create the child image.
double get devicePixelRatio => _devicePixelRatio;
@@ -175,14 +176,16 @@
// children from this layer.
ui.Image? _paintAndDetachToImage() {
final OffsetLayer offsetLayer = OffsetLayer();
- final PaintingContext context = PaintingContext(offsetLayer, Offset.zero & size);
+ final PaintingContext context =
+ PaintingContext(offsetLayer, Offset.zero & size);
super.paint(context, Offset.zero);
// This ignore is here because this method is protected by the `PaintingContext`. Adding a new
// method that performs the work of `_paintAndDetachToImage` would avoid the need for this, but
// that would conflict with our goals of minimizing painting context.
// ignore: invalid_use_of_protected_member
context.stopRecordingIfNeeded();
- final ui.Image image = offsetLayer.toImageSync(Offset.zero & size, pixelRatio: devicePixelRatio);
+ final ui.Image image = offsetLayer.toImageSync(Offset.zero & size,
+ pixelRatio: devicePixelRatio);
offsetLayer.dispose();
return image;
}
diff --git a/packages/flutter_shaders/lib/src/shader_builder.dart b/packages/flutter_shaders/lib/src/shader_builder.dart
index 54afc4c..912aa8e 100644
--- a/packages/flutter_shaders/lib/src/shader_builder.dart
+++ b/packages/flutter_shaders/lib/src/shader_builder.dart
@@ -7,7 +7,8 @@
import 'package:flutter/widgets.dart';
/// A callback used by [ShaderBuilder].
-typedef ShaderBuilderCallback = Widget Function(BuildContext, ui.FragmentShader, Widget?);
+typedef ShaderBuilderCallback = Widget Function(
+ BuildContext, ui.FragmentShader, Widget?);
/// A widget that loads and caches [FragmentProgram]s based on the asset key.
///
@@ -37,7 +38,8 @@
/// ```
class ShaderBuilder extends StatefulWidget {
/// Create a new [ShaderBuilder].
- const ShaderBuilder(this.builder, {
+ const ShaderBuilder(
+ this.builder, {
super.key,
required this.assetKey,
this.child,
@@ -66,10 +68,12 @@
if (_ShaderBuilderState._shaderCache.containsKey(assetKey)) {
return Future<void>.value();
}
- return ui.FragmentProgram.fromAsset(assetKey).then((ui.FragmentProgram program) {
- _ShaderBuilderState._shaderCache[assetKey] = program;
+ return ui.FragmentProgram.fromAsset(assetKey).then(
+ (ui.FragmentProgram program) {
+ _ShaderBuilderState._shaderCache[assetKey] = program;
}, onError: (Object error, StackTrace stackTrace) {
- FlutterError.reportError(FlutterErrorDetails(exception: error, stack: stackTrace));
+ FlutterError.reportError(
+ FlutterErrorDetails(exception: error, stack: stackTrace));
});
}
}
@@ -78,7 +82,8 @@
ui.FragmentProgram? program;
ui.FragmentShader? shader;
- static final Map<String, ui.FragmentProgram> _shaderCache = <String, ui.FragmentProgram>{};
+ static final Map<String, ui.FragmentProgram> _shaderCache =
+ <String, ui.FragmentProgram>{};
@override
void initState() {
@@ -111,7 +116,8 @@
_shaderCache[assetKey] = program;
});
}, onError: (Object error, StackTrace stackTrace) {
- FlutterError.reportError(FlutterErrorDetails(exception: error, stack: stackTrace));
+ FlutterError.reportError(
+ FlutterErrorDetails(exception: error, stack: stackTrace));
});
}