Add an adjustment to the line width check in LineBreaker::addWordBreak (flutter/engine#8623)

currentLineWidth is the width passed into Paragraph layout, which comes
from the maxIntrinsicWidth returned by a previous call to Paragraph layout.
That width is calculated by Layout::measureText.

postBreak is calculated from the character widths in the LineBreaker.

A slight mismatch between these two widths may unnecessarily cause the
insertion of desperate breaks in addWordBreak.  Adding some slack to
currentLineWidth works around this.

Fixes https://github.com/flutter/flutter/issues/30347
This commit is contained in:
Jason Simmons 2019-04-18 09:44:22 -07:00 committed by GitHub
parent 2c605f4e8b
commit 01c7482e99

View File

@ -238,7 +238,10 @@ void LineBreaker::addWordBreak(size_t offset,
HyphenationType hyph) {
Candidate cand;
ParaWidth width = mCandidates.back().preBreak;
if (postBreak - width > currentLineWidth()) {
// libtxt: add a fudge factor to this comparison. The currentLineWidth passed
// by the framework is based on maxIntrinsicWidth/Layout::measureText
// calculations that may not precisely match the postBreak width.
if (postBreak - width > currentLineWidth() + 0.00001) {
// Add desperate breaks.
// Note: these breaks are based on the shaping of the (non-broken) original
// text; they are imprecise especially in the presence of kerning,