Apply the paint offset to the bounds rectangle for shader masks (#10458)
Fixes https://github.com/flutter/flutter/issues/10424
This commit is contained in:
parent
cb959724cb
commit
07275405f8
@ -416,7 +416,7 @@ class PaintingContext {
|
|||||||
_stopRecordingIfNeeded();
|
_stopRecordingIfNeeded();
|
||||||
final ShaderMaskLayer shaderLayer = new ShaderMaskLayer(
|
final ShaderMaskLayer shaderLayer = new ShaderMaskLayer(
|
||||||
shader: shader,
|
shader: shader,
|
||||||
maskRect: maskRect,
|
maskRect: maskRect.shift(offset),
|
||||||
blendMode: blendMode,
|
blendMode: blendMode,
|
||||||
);
|
);
|
||||||
_appendLayer(shaderLayer);
|
_appendLayer(shaderLayer);
|
||||||
|
@ -834,8 +834,8 @@ class RenderShaderMask extends RenderProxyBox {
|
|||||||
void paint(PaintingContext context, Offset offset) {
|
void paint(PaintingContext context, Offset offset) {
|
||||||
if (child != null) {
|
if (child != null) {
|
||||||
assert(needsCompositing);
|
assert(needsCompositing);
|
||||||
final Rect rect = Offset.zero & size;
|
final Shader shader = _shaderCallback(offset & size);
|
||||||
context.pushShaderMask(offset, _shaderCallback(rect), rect, _blendMode, super.paint);
|
context.pushShaderMask(offset, shader, Offset.zero & size, _blendMode, super.paint);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,4 +22,28 @@ void main() {
|
|||||||
final Widget child = new Container(width: 100.0, height: 100.0);
|
final Widget child = new Container(width: 100.0, height: 100.0);
|
||||||
await tester.pumpWidget(new ShaderMask(child: child, shaderCallback: createShader));
|
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)));
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user