diff --git a/lib/web_ui/dev/goldens_lock.yaml b/lib/web_ui/dev/goldens_lock.yaml
index 8bb0d377fa78e..7e6a15eedcff3 100644
--- a/lib/web_ui/dev/goldens_lock.yaml
+++ b/lib/web_ui/dev/goldens_lock.yaml
@@ -1,2 +1,2 @@
repository: https://github.com/flutter/goldens.git
-revision: 44f00682eee2afd7042c02ce802199c1c4ff223e
+revision: 99caeb1bcb8b7a856a78bd8d55816cc97db56112
diff --git a/lib/web_ui/lib/src/engine/text/canvas_paragraph.dart b/lib/web_ui/lib/src/engine/text/canvas_paragraph.dart
index 8ff98e0d211a1..670a9b32cec50 100644
--- a/lib/web_ui/lib/src/engine/text/canvas_paragraph.dart
+++ b/lib/web_ui/lib/src/engine/text/canvas_paragraph.dart
@@ -128,14 +128,6 @@ class CanvasParagraph implements EngineParagraph {
return domElement.clone(true) as html.HtmlElement;
}
- double _getParagraphAlignOffset() {
- final EngineLineMetrics? longestLine = _layoutService.longestLine;
- if (longestLine != null) {
- return longestLine.left;
- }
- return 0.0;
- }
-
html.HtmlElement _createDomElement() {
final html.HtmlElement rootElement =
domRenderer.createElement('p') as html.HtmlElement;
@@ -149,9 +141,13 @@ class CanvasParagraph implements EngineParagraph {
// to insert our own
breaks based on layout results.
..whiteSpace = 'pre';
- final double alignOffset = _getParagraphAlignOffset();
- if (alignOffset != 0.0) {
- cssStyle.marginLeft = '${alignOffset}px';
+ if (width > longestLine) {
+ // In this case, we set the width so that the CSS text-align property
+ // works correctly.
+ // When `longestLine` is >= `paragraph.width` that means the DOM element
+ // will automatically size itself to fit the longest line, so there's no
+ // need to set an explicit width.
+ cssStyle.width = '${width}px';
}
if (paragraphStyle._maxLines != null || paragraphStyle._ellipsis != null) {
diff --git a/lib/web_ui/test/golden_tests/engine/canvas_paragraph/general_test.dart b/lib/web_ui/test/golden_tests/engine/canvas_paragraph/general_test.dart
index 7a2d7dcc1b614..8c4538897ddb0 100644
--- a/lib/web_ui/test/golden_tests/engine/canvas_paragraph/general_test.dart
+++ b/lib/web_ui/test/golden_tests/engine/canvas_paragraph/general_test.dart
@@ -4,6 +4,7 @@
// @dart = 2.6
import 'dart:async';
+import 'dart:math' as math;
import 'package:test/bootstrap/browser.dart';
import 'package:test/test.dart';
@@ -153,6 +154,50 @@ void testMain() async {
return takeScreenshot(canvas, bounds, 'canvas_paragraph_align_dom');
});
+ void testAlignAndTransform(EngineCanvas canvas) {
+ CanvasParagraph paragraph;
+
+ void build(CanvasParagraphBuilder builder) {
+ builder.pushStyle(EngineTextStyle.only(color: white));
+ builder.addText('Lorem ');
+ builder.pushStyle(EngineTextStyle.only(color: red));
+ builder.addText('ipsum\n');
+ builder.pushStyle(EngineTextStyle.only(color: yellow));
+ builder.addText('dolor');
+ }
+
+ void drawParagraphAt(Offset offset, TextAlign align) {
+ paragraph = rich(
+ ParagraphStyle(fontFamily: 'Roboto', fontSize: 20.0, textAlign: align),
+ build,
+ )..layout(constrain(150.0));
+ canvas.save();
+ canvas.translate(offset.dx, offset.dy);
+ canvas.rotate(math.pi / 4);
+ final Rect rect =
+ Rect.fromLTRB(0.0, 0.0, 150.0, paragraph.height);
+ canvas.drawRect(rect, SurfacePaintData()..color = black);
+ canvas.drawParagraph(paragraph, Offset.zero);
+ canvas.restore();
+ }
+
+ drawParagraphAt(Offset(50.0, 0.0), TextAlign.left);
+ drawParagraphAt(Offset(150.0, 0.0), TextAlign.center);
+ drawParagraphAt(Offset(250.0, 0.0), TextAlign.right);
+ }
+
+ test('alignment and transform', () {
+ final canvas = BitmapCanvas(bounds, RenderStrategy());
+ testAlignAndTransform(canvas);
+ return takeScreenshot(canvas, bounds, 'canvas_paragraph_align_transform');
+ });
+
+ test('alignment and transform (DOM)', () {
+ final canvas = DomCanvas(domRenderer.createElement('flt-picture'));
+ testAlignAndTransform(canvas);
+ return takeScreenshot(canvas, bounds, 'canvas_paragraph_align_transform_dom');
+ });
+
test('paints spans with varying heights/baselines', () {
final canvas = BitmapCanvas(bounds, RenderStrategy());
diff --git a/lib/web_ui/test/text/canvas_paragraph_builder_test.dart b/lib/web_ui/test/text/canvas_paragraph_builder_test.dart
index 929cdba0ddf31..8567abd18eeb9 100644
--- a/lib/web_ui/test/text/canvas_paragraph_builder_test.dart
+++ b/lib/web_ui/test/text/canvas_paragraph_builder_test.dart
@@ -217,10 +217,10 @@ void testMain() async {
);
// Should break "Hello world" into "Hello" and " world".
- paragraph.layout(ParagraphConstraints(width: 70.0));
+ paragraph.layout(ParagraphConstraints(width: 75.0));
expect(
paragraph.toDomElement().outerHtml,
- '
' + '
' '' 'Hello' '' @@ -349,7 +349,7 @@ void testMain() async { paragraph.layout(ParagraphConstraints(width: 180.0)); expect( paragraph.toDomElement().outerHtml, - '
' + '
'
''
'First
Second
'
''