From 07275405f8347d9fb9d1e8e7cf64b220e60c26a2 Mon Sep 17 00:00:00 2001 From: Jason Simmons Date: Fri, 2 Jun 2017 16:09:51 -0700 Subject: [PATCH] Apply the paint offset to the bounds rectangle for shader masks (#10458) Fixes https://github.com/flutter/flutter/issues/10424 --- .../flutter/lib/src/rendering/object.dart | 2 +- .../flutter/lib/src/rendering/proxy_box.dart | 4 ++-- .../test/widgets/shader_mask_test.dart | 24 +++++++++++++++++++ 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/packages/flutter/lib/src/rendering/object.dart b/packages/flutter/lib/src/rendering/object.dart index ccf30cd65e..4e4bae3fad 100644 --- a/packages/flutter/lib/src/rendering/object.dart +++ b/packages/flutter/lib/src/rendering/object.dart @@ -416,7 +416,7 @@ class PaintingContext { _stopRecordingIfNeeded(); final ShaderMaskLayer shaderLayer = new ShaderMaskLayer( shader: shader, - maskRect: maskRect, + maskRect: maskRect.shift(offset), blendMode: blendMode, ); _appendLayer(shaderLayer); diff --git a/packages/flutter/lib/src/rendering/proxy_box.dart b/packages/flutter/lib/src/rendering/proxy_box.dart index b4c4446d59..1dfd41691b 100644 --- a/packages/flutter/lib/src/rendering/proxy_box.dart +++ b/packages/flutter/lib/src/rendering/proxy_box.dart @@ -834,8 +834,8 @@ class RenderShaderMask extends RenderProxyBox { void paint(PaintingContext context, Offset offset) { if (child != null) { assert(needsCompositing); - final Rect rect = Offset.zero & size; - context.pushShaderMask(offset, _shaderCallback(rect), rect, _blendMode, super.paint); + final Shader shader = _shaderCallback(offset & size); + context.pushShaderMask(offset, shader, Offset.zero & size, _blendMode, super.paint); } } } diff --git a/packages/flutter/test/widgets/shader_mask_test.dart b/packages/flutter/test/widgets/shader_mask_test.dart index e79ec9c2b0..7987139e31 100644 --- a/packages/flutter/test/widgets/shader_mask_test.dart +++ b/packages/flutter/test/widgets/shader_mask_test.dart @@ -22,4 +22,28 @@ void main() { final Widget child = new Container(width: 100.0, height: 100.0); await tester.pumpWidget(new ShaderMask(child: child, shaderCallback: createShader)); }); + + testWidgets('Bounds rect includes offset', (WidgetTester tester) async { + Rect shaderBounds; + Shader recordShaderBounds(Rect bounds) { + shaderBounds = bounds; + return createShader(bounds); + } + + final Widget widget = new Align( + alignment: FractionalOffset.center, + child: new SizedBox( + width: 400.0, + height: 400.0, + child: new ShaderMask( + shaderCallback: recordShaderBounds, + child: new Container(width: 100.0, height: 100.0) + ), + ), + ); + await tester.pumpWidget(widget); + + // The shader bounds rectangle should reflect the position of the centered SizedBox. + expect(shaderBounds, equals(new Rect.fromLTWH(200.0, 100.0, 400.0, 400.0))); + }); }