summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSeigo Nonaka <nona@google.com>2023-08-04 09:24:22 +0900
committerSeigo Nonaka <nona@google.com>2023-08-14 15:09:43 +0900
commit5acda99cd5b09646299e2cc1a7cd398b35f1a5dc (patch)
treeafefd5abc2ca2bc095ef715a17ee499811208f52
parent70807c293247dd56bf4f06053f075187de81ba50 (diff)
downloadminikin-5acda99cd5b09646299e2cc1a7cd398b35f1a5dc.tar.gz
[2nd attempt] 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 Test: CtsTextTestCases Change-Id: I74d1e388326a927c9b9df0f8de95b7562d42ce26
-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 40603e2..50acae6 100644
--- a/libs/minikin/OptimalLineBreaker.cpp
+++ b/libs/minikin/OptimalLineBreaker.cpp
@@ -167,37 +167,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;