summaryrefslogtreecommitdiffstats
path: root/libs/minikin/LineBreaker.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/minikin/LineBreaker.cpp')
-rw-r--r--libs/minikin/LineBreaker.cpp24
1 files changed, 12 insertions, 12 deletions
diff --git a/libs/minikin/LineBreaker.cpp b/libs/minikin/LineBreaker.cpp
index 22c3954..9c4ff6f 100644
--- a/libs/minikin/LineBreaker.cpp
+++ b/libs/minikin/LineBreaker.cpp
@@ -122,17 +122,13 @@ static bool isLineBreakingHyphen(uint16_t c) {
// to addCandidate.
float LineBreaker::addStyleRun(MinikinPaint* paint, const FontCollection* typeface,
FontStyle style, size_t start, size_t end, bool isRtl) {
- Layout layout; // performance TODO: move layout to self object to reduce allocation cost?
float width = 0.0f;
int bidiFlags = isRtl ? kBidi_Force_RTL : kBidi_Force_LTR;
float hyphenPenalty = 0.0;
if (paint != nullptr) {
- layout.setFontCollection(typeface);
- layout.doLayout(mTextBuf.data(), start, end - start, mTextBuf.size(), bidiFlags, style,
- *paint);
- layout.getAdvances(mCharWidths.data() + start);
- width = layout.getAdvance();
+ width = Layout::measureText(mTextBuf.data(), start, end - start, mTextBuf.size(), bidiFlags,
+ style, *paint, typeface, mCharWidths.data() + start);
// a heuristic that seems to perform well
hyphenPenalty = 0.5 * paint->size * paint->scaleX * mLineWidths.getLineWidth(0);
@@ -192,13 +188,17 @@ float LineBreaker::addStyleRun(MinikinPaint* paint, const FontCollection* typefa
uint8_t hyph = mHyphBuf[j - wordStart];
if (hyph) {
paint->hyphenEdit = hyph;
- layout.doLayout(mTextBuf.data(), lastBreak, j - lastBreak,
- mTextBuf.size(), bidiFlags, style, *paint);
- ParaWidth hyphPostBreak = lastBreakWidth + layout.getAdvance();
+
+ const float firstPartWidth = Layout::measureText(mTextBuf.data(),
+ lastBreak, j - lastBreak, mTextBuf.size(), bidiFlags, style,
+ *paint, typeface, nullptr);
+ ParaWidth hyphPostBreak = lastBreakWidth + firstPartWidth;
paint->hyphenEdit = 0;
- layout.doLayout(mTextBuf.data(), j, afterWord - j,
- mTextBuf.size(), bidiFlags, style, *paint);
- ParaWidth hyphPreBreak = postBreak - layout.getAdvance();
+
+ const float secondPartWith = Layout::measureText(mTextBuf.data(), j,
+ afterWord - j, mTextBuf.size(), bidiFlags, style, *paint,
+ typeface, nullptr);
+ ParaWidth hyphPreBreak = postBreak - secondPartWith;
addWordBreak(j, hyphPreBreak, hyphPostBreak, hyphenPenalty, hyph);
}
}