Skip to content

Commit 6224f52

Browse files
authored
Revert "Reland "[web] Calculate align offset for each paragraph line (LineMetrics.left)" (flutter#14537) (flutter#15151)"
This reverts commit a2bd950.
1 parent ed40334 commit 6224f52

File tree

5 files changed

+107
-291
lines changed

5 files changed

+107
-291
lines changed

lib/web_ui/lib/src/engine/bitmap_canvas.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -437,7 +437,6 @@ class BitmapCanvas extends EngineCanvas {
437437
double y,
438438
) {
439439
html.CanvasRenderingContext2D ctx = _canvasPool.context;
440-
x += line.left;
441440
final double letterSpacing = style.letterSpacing;
442441
if (letterSpacing == null || letterSpacing == 0.0) {
443442
ctx.fillText(line.text, x, y);
@@ -483,10 +482,11 @@ class BitmapCanvas extends EngineCanvas {
483482
}
484483
_applyPaint(paragraph._paint.paintData);
485484

485+
final double x = offset.dx + paragraph._alignOffset;
486486
double y = offset.dy + paragraph.alphabeticBaseline;
487487
final int len = lines.length;
488488
for (int i = 0; i < len; i++) {
489-
_drawTextLine(style, lines[i], offset.dx, y);
489+
_drawTextLine(style, lines[i], x, y);
490490
y += paragraph._lineHeight;
491491
}
492492
return;

lib/web_ui/lib/src/engine/text/measurement.dart

Lines changed: 8 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -416,19 +416,13 @@ class DomTextMeasurementService extends TextMeasurementService {
416416
List<EngineLineMetrics> lines;
417417
if (text != null) {
418418
final double lineWidth = maxIntrinsicWidth;
419-
final double alignOffset = _calculateAlignOffsetForLine(
420-
paragraph: paragraph,
421-
lineWidth: lineWidth,
422-
maxWidth: width,
423-
);
424419
lines = <EngineLineMetrics>[
425420
EngineLineMetrics.withText(
426421
text,
427422
startIndex: 0,
428423
endIndex: text.length,
429424
hardBreak: true,
430425
width: lineWidth,
431-
left: alignOffset,
432426
lineNumber: 0,
433427
),
434428
];
@@ -446,8 +440,6 @@ class DomTextMeasurementService extends TextMeasurementService {
446440
alphabeticBaseline: alphabeticBaseline,
447441
ideographicBaseline: ideographicBaseline,
448442
lines: lines,
449-
textAlign: paragraph._textAlign,
450-
textDirection: paragraph._textDirection,
451443
);
452444
}
453445

@@ -496,8 +488,6 @@ class DomTextMeasurementService extends TextMeasurementService {
496488
alphabeticBaseline: alphabeticBaseline,
497489
ideographicBaseline: ideographicBaseline,
498490
lines: null,
499-
textAlign: paragraph._textAlign,
500-
textDirection: paragraph._textDirection,
501491
);
502492
}
503493

@@ -556,7 +546,7 @@ class CanvasTextMeasurementService extends TextMeasurementService {
556546
// TODO(mdebbar): Check if the whole text can fit in a single-line. Then avoid all this ceremony.
557547
_canvasContext.font = style.cssFontString;
558548
final LinesCalculator linesCalculator =
559-
LinesCalculator(_canvasContext, paragraph, constraints.width);
549+
LinesCalculator(_canvasContext, text, style, constraints.width);
560550
final MinIntrinsicCalculator minIntrinsicCalculator =
561551
MinIntrinsicCalculator(_canvasContext, text, style);
562552
final MaxIntrinsicCalculator maxIntrinsicCalculator =
@@ -607,8 +597,6 @@ class CanvasTextMeasurementService extends TextMeasurementService {
607597
maxIntrinsicWidth: maxIntrinsicCalculator.value,
608598
width: constraints.width,
609599
lines: linesCalculator.lines,
610-
textAlign: paragraph._textAlign,
611-
textDirection: paragraph._textDirection,
612600
);
613601
return result;
614602
}
@@ -714,18 +702,16 @@ int _excludeTrailing(String text, int start, int end, CharPredicate predicate) {
714702
/// During the text layout phase, this class splits the lines of text so that it
715703
/// ends up fitting into the given width constraint.
716704
///
717-
/// It implements the Flutter engine's behavior when it comes to handling
718-
/// ellipsis and max lines.
705+
/// It mimicks the Flutter engine's behavior when it comes to handling ellipsis
706+
/// and max lines.
719707
class LinesCalculator {
720-
LinesCalculator(this._canvasContext, this._paragraph, this._maxWidth);
708+
LinesCalculator(this._canvasContext, this._text, this._style, this._maxWidth);
721709

722710
final html.CanvasRenderingContext2D _canvasContext;
723-
final EngineParagraph _paragraph;
711+
final String _text;
712+
final ParagraphGeometricStyle _style;
724713
final double _maxWidth;
725714

726-
String get _text => _paragraph._plainText;
727-
ParagraphGeometricStyle get _style => _paragraph._geometricStyle;
728-
729715
/// The lines that have been consumed so far.
730716
List<EngineLineMetrics> lines = <EngineLineMetrics>[];
731717

@@ -782,20 +768,12 @@ class LinesCalculator {
782768
start: _lineStart,
783769
end: chunkEndWithoutSpace,
784770
);
785-
final double widthOfResultingLine =
786-
measureSubstring(_lineStart, breakingPoint) + _ellipsisWidth;
787-
final double alignOffset = _calculateAlignOffsetForLine(
788-
paragraph: _paragraph,
789-
lineWidth: widthOfResultingLine,
790-
maxWidth: _maxWidth,
791-
);
792771
lines.add(EngineLineMetrics.withText(
793772
_text.substring(_lineStart, breakingPoint) + _style.ellipsis,
794773
startIndex: _lineStart,
795774
endIndex: chunkEnd,
796775
hardBreak: false,
797-
width: widthOfResultingLine,
798-
left: alignOffset,
776+
width: measureSubstring(_lineStart, breakingPoint) + _ellipsisWidth,
799777
lineNumber: lines.length,
800778
));
801779
} else if (isChunkTooLong) {
@@ -848,19 +826,12 @@ class LinesCalculator {
848826
_whitespacePredicate,
849827
);
850828
final int lineNumber = lines.length;
851-
final double lineWidth = measureSubstring(_lineStart, endWithoutSpace);
852-
final double alignOffset = _calculateAlignOffsetForLine(
853-
paragraph: _paragraph,
854-
lineWidth: lineWidth,
855-
maxWidth: _maxWidth,
856-
);
857829
final EngineLineMetrics metrics = EngineLineMetrics.withText(
858830
_text.substring(_lineStart, endWithoutNewlines),
859831
startIndex: _lineStart,
860832
endIndex: lineEnd,
861833
hardBreak: isHardBreak,
862-
width: lineWidth,
863-
left: alignOffset,
834+
width: measureSubstring(_lineStart, endWithoutSpace),
864835
lineNumber: lineNumber,
865836
);
866837
lines.add(metrics);
@@ -987,30 +958,3 @@ class MaxIntrinsicCalculator {
987958
_lastHardLineEnd = hardLineEnd;
988959
}
989960
}
990-
991-
/// Calculates the offset necessary for the given line to be correctly aligned.
992-
double _calculateAlignOffsetForLine({
993-
@required EngineParagraph paragraph,
994-
@required double lineWidth,
995-
@required double maxWidth,
996-
}) {
997-
final double emptySpace = maxWidth - lineWidth;
998-
// WARNING: the [paragraph] may not be laid out yet at this point. This
999-
// function must not use layout metrics, such as [paragraph.height].
1000-
switch (paragraph._textAlign) {
1001-
case ui.TextAlign.center:
1002-
return emptySpace / 2.0;
1003-
case ui.TextAlign.right:
1004-
return emptySpace;
1005-
case ui.TextAlign.start:
1006-
return paragraph._textDirection == ui.TextDirection.rtl
1007-
? emptySpace
1008-
: 0.0;
1009-
case ui.TextAlign.end:
1010-
return paragraph._textDirection == ui.TextDirection.rtl
1011-
? 0.0
1012-
: emptySpace;
1013-
default:
1014-
return 0.0;
1015-
}
1016-
}

lib/web_ui/lib/src/engine/text/paragraph.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,12 @@ class EngineLineMetrics implements ui.LineMetrics {
2929
this.unscaledAscent,
3030
this.height,
3131
@required this.width,
32-
@required this.left,
32+
this.left,
3333
this.baseline,
3434
@required this.lineNumber,
3535
}) : assert(text != null),
3636
assert(hardBreak != null),
3737
assert(width != null),
38-
assert(left != null),
3938
assert(lineNumber != null && lineNumber >= 0);
4039

4140
/// The textual content representing this line.

lib/web_ui/lib/src/engine/text/ruler.dart

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -815,9 +815,7 @@ class ParagraphRuler {
815815
final int len = constraintCache.length;
816816
for (int i = 0; i < len; i++) {
817817
final MeasurementResult item = constraintCache[i];
818-
if (item.constraintWidth == constraints.width &&
819-
item.textAlign == paragraph._textAlign &&
820-
item.textDirection == paragraph._textDirection) {
818+
if (item.constraintWidth == constraints.width) {
821819
return item;
822820
}
823821
}
@@ -869,13 +867,7 @@ class MeasurementResult {
869867
/// of each laid out line.
870868
final List<EngineLineMetrics> lines;
871869

872-
/// The text align value of the paragraph.
873-
final ui.TextAlign textAlign;
874-
875-
/// The text direction of the paragraph.
876-
final ui.TextDirection textDirection;
877-
878-
MeasurementResult(
870+
const MeasurementResult(
879871
this.constraintWidth, {
880872
@required this.isSingleLine,
881873
@required this.width,
@@ -887,8 +879,6 @@ class MeasurementResult {
887879
@required this.alphabeticBaseline,
888880
@required this.ideographicBaseline,
889881
@required this.lines,
890-
@required textAlign,
891-
@required textDirection,
892882
}) : assert(constraintWidth != null),
893883
assert(isSingleLine != null),
894884
assert(width != null),
@@ -897,7 +887,5 @@ class MeasurementResult {
897887
assert(minIntrinsicWidth != null),
898888
assert(maxIntrinsicWidth != null),
899889
assert(alphabeticBaseline != null),
900-
assert(ideographicBaseline != null),
901-
this.textAlign = textAlign ?? ui.TextAlign.start,
902-
this.textDirection = textDirection ?? ui.TextDirection.ltr;
890+
assert(ideographicBaseline != null);
903891
}

0 commit comments

Comments
 (0)