From 01c7482e990fac13ffa1a46893ff39ab627dfb67 Mon Sep 17 00:00:00 2001 From: Jason Simmons Date: Thu, 18 Apr 2019 09:44:22 -0700 Subject: [PATCH] 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 --- .../src/flutter/third_party/txt/src/minikin/LineBreaker.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/engine/src/flutter/third_party/txt/src/minikin/LineBreaker.cpp b/engine/src/flutter/third_party/txt/src/minikin/LineBreaker.cpp index 7ecee7e2c1c..35f7d9da2bd 100644 --- a/engine/src/flutter/third_party/txt/src/minikin/LineBreaker.cpp +++ b/engine/src/flutter/third_party/txt/src/minikin/LineBreaker.cpp @@ -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,