Index: Source/core/rendering/line/BreakingContextInlineHeaders.h |
diff --git a/Source/core/rendering/line/BreakingContextInlineHeaders.h b/Source/core/rendering/line/BreakingContextInlineHeaders.h |
index 74eba9d2ab63a4d4e5abb0a2780ff954cd94be73..625085cac7322c18265d0703bbae2507f22319a6 100644 |
--- a/Source/core/rendering/line/BreakingContextInlineHeaders.h |
+++ b/Source/core/rendering/line/BreakingContextInlineHeaders.h |
@@ -698,16 +698,18 @@ inline float measureHyphenWidth(RenderText* renderer, const Font& font) |
return font.width(RenderBlockFlow::constructTextRun(renderer, font, style->hyphenString().string(), style)); |
} |
-ALWAYS_INLINE float textWidth(RenderText* text, unsigned from, unsigned len, const Font& font, float xPos, bool isFixedPitch, bool collapseWhiteSpace, HashSet<const SimpleFontData*>* fallbackFonts = 0, TextLayout* layout = 0) |
+ALWAYS_INLINE float textWidth(RenderText* text, unsigned from, unsigned len, const Font& font, float xPos, bool isFixedPitch, WTF::Unicode::Direction direction, bool collapseWhiteSpace, HashSet<const SimpleFontData*>* fallbackFonts = 0, TextLayout* layout = 0) |
{ |
+ TextDirection textDirection = direction == WTF::Unicode::RightToLeft |
+ || direction == WTF::Unicode::RightToLeftArabic ? RTL : LTR; |
GlyphOverflow glyphOverflow; |
if (isFixedPitch || (!from && len == text->textLength()) || text->style()->hasTextCombine()) |
- return text->width(from, len, font, xPos, fallbackFonts, &glyphOverflow); |
+ return text->width(from, len, font, xPos, textDirection, fallbackFonts, &glyphOverflow); |
if (layout) |
return Font::width(*layout, from, len, fallbackFonts); |
- TextRun run = RenderBlockFlow::constructTextRun(text, font, text, from, len, text->style()); |
+ TextRun run = RenderBlockFlow::constructTextRun(text, font, text, from, len, text->style(), textDirection); |
run.setCharactersLength(text->textLength() - from); |
ASSERT(run.charactersLength() >= run.length()); |
@@ -803,7 +805,7 @@ inline bool BreakingContext::handleText(WordMeasurements& wordMeasurements, bool |
if ((breakAll || breakWords) && !midWordBreak) { |
wrapW += charWidth; |
bool midWordBreakIsBeforeSurrogatePair = U16_IS_LEAD(c) && m_current.offset() + 1 < renderText->textLength() && U16_IS_TRAIL((*renderText)[m_current.offset() + 1]); |
- charWidth = textWidth(renderText, m_current.offset(), midWordBreakIsBeforeSurrogatePair ? 2 : 1, font, m_width.committedWidth() + wrapW, isFixedPitch, m_collapseWhiteSpace, 0, textLayout); |
+ charWidth = textWidth(renderText, m_current.offset(), midWordBreakIsBeforeSurrogatePair ? 2 : 1, font, m_width.committedWidth() + wrapW, isFixedPitch, m_resolver.position().direction(), m_collapseWhiteSpace, 0, textLayout); |
midWordBreak = m_width.committedWidth() + wrapW + charWidth > m_width.availableWidth(); |
} |
@@ -839,9 +841,9 @@ inline bool BreakingContext::handleText(WordMeasurements& wordMeasurements, bool |
float additionalTmpW; |
if (wordTrailingSpaceWidth && c == ' ') |
- additionalTmpW = textWidth(renderText, lastSpace, m_current.offset() + 1 - lastSpace, font, m_width.currentWidth(), isFixedPitch, m_collapseWhiteSpace, &wordMeasurement.fallbackFonts, textLayout) - wordTrailingSpaceWidth; |
+ additionalTmpW = textWidth(renderText, lastSpace, m_current.offset() + 1 - lastSpace, font, m_width.currentWidth(), isFixedPitch, m_resolver.position().direction(), m_collapseWhiteSpace, &wordMeasurement.fallbackFonts, textLayout) - wordTrailingSpaceWidth; |
else |
- additionalTmpW = textWidth(renderText, lastSpace, m_current.offset() - lastSpace, font, m_width.currentWidth(), isFixedPitch, m_collapseWhiteSpace, &wordMeasurement.fallbackFonts, textLayout); |
+ additionalTmpW = textWidth(renderText, lastSpace, m_current.offset() - lastSpace, font, m_width.currentWidth(), isFixedPitch, m_resolver.position().direction(), m_collapseWhiteSpace, &wordMeasurement.fallbackFonts, textLayout); |
wordMeasurement.width = additionalTmpW + wordSpacingForWordMeasurement; |
additionalTmpW += lastSpaceWordSpacing; |
@@ -864,7 +866,7 @@ inline bool BreakingContext::handleText(WordMeasurements& wordMeasurements, bool |
// as candidate width for this line. |
bool lineWasTooWide = false; |
if (m_width.fitsOnLine() && m_currentCharacterIsSpace && m_currentStyle->breakOnlyAfterWhiteSpace() && !midWordBreak) { |
- float charWidth = textWidth(renderText, m_current.offset(), 1, font, m_width.currentWidth(), isFixedPitch, m_collapseWhiteSpace, &wordMeasurement.fallbackFonts, textLayout) + (applyWordSpacing ? wordSpacing : 0); |
+ float charWidth = textWidth(renderText, m_current.offset(), 1, font, m_width.currentWidth(), isFixedPitch, m_resolver.position().direction(), m_collapseWhiteSpace, &wordMeasurement.fallbackFonts, textLayout) + (applyWordSpacing ? wordSpacing : 0); |
// Check if line is too big even without the extra space |
// at the end of the line. If it is not, do nothing. |
// If the line needs the extra whitespace to be too long, |
@@ -995,7 +997,7 @@ inline bool BreakingContext::handleText(WordMeasurements& wordMeasurements, bool |
wordMeasurement.renderer = renderText; |
// IMPORTANT: current.m_pos is > length here! |
- float additionalTmpW = m_ignoringSpaces ? 0 : textWidth(renderText, lastSpace, m_current.offset() - lastSpace, font, m_width.currentWidth(), isFixedPitch, m_collapseWhiteSpace, &wordMeasurement.fallbackFonts, textLayout); |
+ float additionalTmpW = m_ignoringSpaces ? 0 : textWidth(renderText, lastSpace, m_current.offset() - lastSpace, font, m_width.currentWidth(), isFixedPitch, m_resolver.position().direction(), m_collapseWhiteSpace, &wordMeasurement.fallbackFonts, textLayout); |
wordMeasurement.startOffset = lastSpace; |
wordMeasurement.endOffset = m_current.offset(); |
wordMeasurement.width = m_ignoringSpaces ? 0 : additionalTmpW + wordSpacingForWordMeasurement; |