blob: cc485e553fb9f6d65c3144bf283cca0c882af7ce [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:typed_data';
import 'dart:ui' as ui;
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter_shaders/flutter_shaders.dart';
import 'package:flutter_test/flutter_test.dart';
final Float64List _transform = Matrix4.identity().storage;
void main() {
setUpAll(() async {
await ShaderBuilder.precacheShader('shaders/sampler.frag');
});
testWidgets('AnimatedSampler captures child widgets in texture',
(WidgetTester tester) async {
final GlobalKey globalKey = GlobalKey();
bool usedShader = false;
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);
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);
});
// Validate that color is Colors.red from child widget.
expect(_readColorFromBuffer(snapshot!, 0), Colors.red.shade500);
});
}
Color _readColorFromBuffer(ByteData data, int offset) {
final int r = data.getUint8(offset);
final int g = data.getUint8(offset + 1);
final int b = data.getUint8(offset + 2);
final int a = data.getUint8(offset + 3);
return Color.fromARGB(a, r, g, b);
}