Chromium Code Reviews| 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 |
|
leviw_travelin_and_unemployed
2014/01/09 00:49:54
Isn't there a method to transcribe Unicode directi
|
| + || 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; |