Unverified Commit 3f43d9f3 authored by xubaolin's avatar xubaolin Committed by GitHub

Reland "Clipping if only one character text overflows (#99146)" (#102130)

Fixes a text clipping edge case.
parent e3f75609
...@@ -599,6 +599,15 @@ class TextPainter { ...@@ -599,6 +599,15 @@ class TextPainter {
return _paragraph!.didExceedMaxLines; return _paragraph!.didExceedMaxLines;
} }
/// The distance from the left edge of the leftmost glyph to the right edge of
/// the rightmost glyph in the paragraph.
///
/// Valid only after [layout] has been called.
double get longestLine {
assert(!_debugNeedsLayout);
return _paragraph!.longestLine;
}
double? _lastMinWidth; double? _lastMinWidth;
double? _lastMaxWidth; double? _lastMaxWidth;
......
...@@ -630,6 +630,12 @@ class RenderParagraph extends RenderBox ...@@ -630,6 +630,12 @@ class RenderParagraph extends RenderBox
@visibleForTesting @visibleForTesting
bool get debugHasOverflowShader => _overflowShader != null; bool get debugHasOverflowShader => _overflowShader != null;
/// Whether this paragraph currently has overflow and needs clipping.
///
/// Used to test this object. Not for use in production.
@visibleForTesting
bool get debugNeedsClipping => _needsClipping;
void _layoutText({ double minWidth = 0.0, double maxWidth = double.infinity }) { void _layoutText({ double minWidth = 0.0, double maxWidth = double.infinity }) {
final bool widthMatters = softWrap || overflow == TextOverflow.ellipsis; final bool widthMatters = softWrap || overflow == TextOverflow.ellipsis;
_textPainter.layout( _textPainter.layout(
...@@ -781,7 +787,7 @@ class RenderParagraph extends RenderBox ...@@ -781,7 +787,7 @@ class RenderParagraph extends RenderBox
size = constraints.constrain(textSize); size = constraints.constrain(textSize);
final bool didOverflowHeight = size.height < textSize.height || textDidExceedMaxLines; final bool didOverflowHeight = size.height < textSize.height || textDidExceedMaxLines;
final bool didOverflowWidth = size.width < textSize.width; final bool didOverflowWidth = size.width < textSize.width || size.width < _textPainter.longestLine;
// TODO(abarth): We're only measuring the sizes of the line boxes here. If // TODO(abarth): We're only measuring the sizes of the line boxes here. If
// the glyphs draw outside the line boxes, we might think that there isn't // the glyphs draw outside the line boxes, we might think that there isn't
// visual overflow when there actually is visual overflow. This can become // visual overflow when there actually is visual overflow. This can become
......
...@@ -326,6 +326,24 @@ void main() { ...@@ -326,6 +326,24 @@ void main() {
expect(paragraph.debugHasOverflowShader, isFalse); expect(paragraph.debugHasOverflowShader, isFalse);
}, skip: isBrowser); // https://github.com/flutter/flutter/issues/61018 }, skip: isBrowser); // https://github.com/flutter/flutter/issues/61018
test('one character clip test', () {
// Regressing test for https://github.com/flutter/flutter/issues/99140
final RenderParagraph paragraph = RenderParagraph(
const TextSpan(
text: '7',
style: TextStyle(fontFamily: 'Ahem', fontSize: 60.0),
),
textDirection: TextDirection.ltr,
maxLines: 1,
);
// Lay out in a narrow box to force clipping.
// The text width is 60 bigger than the constraints width.
layout(paragraph, constraints: BoxConstraints.tight(const Size(50.0, 200.0)));
expect(paragraph.debugNeedsClipping, true);
}, skip: isBrowser); // https://github.com/flutter/flutter/issues/61018
test('maxLines', () { test('maxLines', () {
final RenderParagraph paragraph = RenderParagraph( final RenderParagraph paragraph = RenderParagraph(
const TextSpan( const TextSpan(
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment