summaryrefslogtreecommitdiff
path: root/libs/minikin
diff options
context:
space:
mode:
authorSeigo Nonaka <nona@google.com>2023-08-04 09:24:22 +0900
committerSeigo Nonaka <nona@google.com>2023-08-04 09:26:35 +0900
commitd8667cfede991cbe14d9e4268231032403444608 (patch)
tree822803af616ed5ed9227ecb928bad7672c094437 /libs/minikin
parent92c5bb53965c5e2c7b03d1239c2e80c2b73fdc58 (diff)
downloadminikin-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.cpp58
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;