Skip to content

Commit 0f90e65

Browse files
authored
Revert "[web] Calculate align offset for each paragraph line (LineMetrics.left) (flutter#14537)" (flutter#14569)
This reverts commit 1ecfdcb.
1 parent a09ff7c commit 0f90e65

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
@@ -666,7 +666,6 @@ class BitmapCanvas extends EngineCanvas with SaveStackTracking {
666666
double x,
667667
double y,
668668
) {
669-
x += line.left;
670669
final double letterSpacing = style.letterSpacing;
671670
if (letterSpacing == null || letterSpacing == 0.0) {
672671
ctx.fillText(line.text, x, y);
@@ -713,10 +712,11 @@ class BitmapCanvas extends EngineCanvas with SaveStackTracking {
713712
}
714713
_applyPaint(paragraph._paint.paintData);
715714

715+
final double x = offset.dx + paragraph._alignOffset;
716716
double y = offset.dy + paragraph.alphabeticBaseline;
717717
final int len = lines.length;
718718
for (int i = 0; i < len; i++) {
719-
_drawTextLine(style, lines[i], offset.dx, y);
719+
_drawTextLine(style, lines[i], x, y);
720720
y += paragraph._lineHeight;
721721
}
722722
_resetPaint();

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
@@ -800,9 +800,7 @@ class ParagraphRuler {
800800
final int len = constraintCache.length;
801801
for (int i = 0; i < len; i++) {
802802
final MeasurementResult item = constraintCache[i];
803-
if (item.constraintWidth == constraints.width &&
804-
item.textAlign == paragraph._textAlign &&
805-
item.textDirection == paragraph._textDirection) {
803+
if (item.constraintWidth == constraints.width) {
806804
return item;
807805
}
808806
}
@@ -854,13 +852,7 @@ class MeasurementResult {
854852
/// of each laid out line.
855853
final List<EngineLineMetrics> lines;
856854

857-
/// The text align value of the paragraph.
858-
final ui.TextAlign textAlign;
859-
860-
/// The text direction of the paragraph.
861-
final ui.TextDirection textDirection;
862-
863-
MeasurementResult(
855+
const MeasurementResult(
864856
this.constraintWidth, {
865857
@required this.isSingleLine,
866858
@required this.width,
@@ -872,8 +864,6 @@ class MeasurementResult {
872864
@required this.alphabeticBaseline,
873865
@required this.ideographicBaseline,
874866
@required this.lines,
875-
@required this.textAlign,
876-
@required this.textDirection,
877867
}) : assert(constraintWidth != null),
878868
assert(isSingleLine != null),
879869
assert(width != null),
@@ -882,7 +872,5 @@ class MeasurementResult {
882872
assert(minIntrinsicWidth != null),
883873
assert(maxIntrinsicWidth != null),
884874
assert(alphabeticBaseline != null),
885-
assert(ideographicBaseline != null),
886-
assert(textAlign != null),
887-
assert(textDirection != null);
875+
assert(ideographicBaseline != null);
888876
}

0 commit comments

Comments
 (0)