diff options
author | Seigo Nonaka <nona@google.com> | 2023-08-04 09:24:22 +0900 |
---|---|---|
committer | Seigo Nonaka <nona@google.com> | 2023-08-04 09:26:35 +0900 |
commit | d8667cfede991cbe14d9e4268231032403444608 (patch) | |
tree | 822803af616ed5ed9227ecb928bad7672c094437 /libs/minikin | |
parent | 92c5bb53965c5e2c7b03d1239c2e80c2b73fdc58 (diff) | |
download | minikin-d8667cfede991cbe14d9e4268231032403444608.tar.gz |
Do not create word breaker for optimization
Creating WordBreaker is not free and can be skipped in most cases
except for the phrase based line break.
Bug: 294278110
Test: atest TextViewSetTextMeasurePerfTest#timeDraw
Test: minikin_tests
Change-Id: I344e6a39c493ab5d8094b95a3793b43d802b9267
Diffstat (limited to 'libs/minikin')
-rw-r--r-- | libs/minikin/OptimalLineBreaker.cpp | 58 |
1 files changed, 31 insertions, 27 deletions
diff --git a/libs/minikin/OptimalLineBreaker.cpp b/libs/minikin/OptimalLineBreaker.cpp index 13590c6..c264f55 100644 --- a/libs/minikin/OptimalLineBreaker.cpp +++ b/libs/minikin/OptimalLineBreaker.cpp @@ -168,37 +168,41 @@ std::vector<DesperateBreak> populateDesperatePoints(const U16StringPiece& textBu const Range& range, const Run& run) { std::vector<DesperateBreak> out; - bool calculateFallback = true; if (run.lineBreakWordStyle() == LineBreakWordStyle::None) { - calculateFallback = false; - } - - WordBreaker wb; - wb.setText(textBuf.data(), textBuf.length()); - ssize_t next = - wb.followingWithLocale(getEffectiveLocale(run.getLocaleListId()), run.lineBreakStyle(), - LineBreakWordStyle::None, range.getStart()); - - if (!range.contains(next)) { - calculateFallback = false; - } - - ParaWidth width = measured.widths[range.getStart()]; - for (uint32_t i = range.getStart() + 1; i < range.getEnd(); ++i) { - const float w = measured.widths[i]; - if (w == 0) { - continue; // w == 0 means here is not a grapheme bounds. Don't break here. - } - if (calculateFallback && i == (uint32_t)next) { - out.emplace_back(i, width, SCORE_FALLBACK); - next = wb.next(); - if (!range.contains(next)) { - break; + ParaWidth width = measured.widths[range.getStart()]; + for (uint32_t i = range.getStart() + 1; i < range.getEnd(); ++i) { + const float w = measured.widths[i]; + if (w == 0) { + continue; // w == 0 means here is not a grapheme bounds. Don't break here. } - } else { out.emplace_back(i, width, SCORE_DESPERATE); + width += w; + } + } else { + WordBreaker wb; + wb.setText(textBuf.data(), textBuf.length()); + ssize_t next = wb.followingWithLocale(getEffectiveLocale(run.getLocaleListId()), + run.lineBreakStyle(), LineBreakWordStyle::None, + range.getStart()); + + const bool calculateFallback = !range.contains(next); + ParaWidth width = measured.widths[range.getStart()]; + for (uint32_t i = range.getStart() + 1; i < range.getEnd(); ++i) { + const float w = measured.widths[i]; + if (w == 0) { + continue; // w == 0 means here is not a grapheme bounds. Don't break here. + } + if (calculateFallback && i == (uint32_t)next) { + out.emplace_back(i, width, SCORE_FALLBACK); + next = wb.next(); + if (!range.contains(next)) { + break; + } + } else { + out.emplace_back(i, width, SCORE_DESPERATE); + } + width += w; } - width += w; } return out; |