OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2000 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 2000 Lars Knoll (knoll@kde.org) |
3 * Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r
ight reserved. | 3 * Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r
ight reserved. |
4 * Copyright (C) 2010 Google Inc. All rights reserved. | 4 * Copyright (C) 2010 Google Inc. All rights reserved. |
5 * Copyright (C) 2013 Adobe Systems Incorporated. | 5 * Copyright (C) 2013 Adobe Systems Incorporated. |
6 * | 6 * |
7 * This library is free software; you can redistribute it and/or | 7 * This library is free software; you can redistribute it and/or |
8 * modify it under the terms of the GNU Library General Public | 8 * modify it under the terms of the GNU Library General Public |
9 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
10 * version 2 of the License, or (at your option) any later version. | 10 * version 2 of the License, or (at your option) any later version. |
(...skipping 680 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
691 width.updateCurrentShapeSegment(); | 691 width.updateCurrentShapeSegment(); |
692 width.updateAvailableWidth(); | 692 width.updateAvailableWidth(); |
693 } | 693 } |
694 | 694 |
695 inline float measureHyphenWidth(RenderText* renderer, const Font& font) | 695 inline float measureHyphenWidth(RenderText* renderer, const Font& font) |
696 { | 696 { |
697 RenderStyle* style = renderer->style(); | 697 RenderStyle* style = renderer->style(); |
698 return font.width(RenderBlockFlow::constructTextRun(renderer, font, style->h
yphenString().string(), style)); | 698 return font.width(RenderBlockFlow::constructTextRun(renderer, font, style->h
yphenString().string(), style)); |
699 } | 699 } |
700 | 700 |
701 ALWAYS_INLINE float textWidth(RenderText* text, unsigned from, unsigned len, con
st Font& font, float xPos, bool isFixedPitch, bool collapseWhiteSpace, HashSet<c
onst SimpleFontData*>* fallbackFonts = 0, TextLayout* layout = 0) | 701 ALWAYS_INLINE float textWidth(RenderText* text, unsigned from, unsigned len, con
st Font& font, float xPos, bool isFixedPitch, WTF::Unicode::Direction direction,
bool collapseWhiteSpace, HashSet<const SimpleFontData*>* fallbackFonts = 0, Tex
tLayout* layout = 0) |
702 { | 702 { |
| 703 TextDirection textDirection = direction == WTF::Unicode::RightToLeft |
| 704 || direction == WTF::Unicode::RightToLeftArabic ? RTL : LTR; |
703 GlyphOverflow glyphOverflow; | 705 GlyphOverflow glyphOverflow; |
704 if (isFixedPitch || (!from && len == text->textLength()) || text->style()->h
asTextCombine()) | 706 if (isFixedPitch || (!from && len == text->textLength()) || text->style()->h
asTextCombine()) |
705 return text->width(from, len, font, xPos, fallbackFonts, &glyphOverflow)
; | 707 return text->width(from, len, font, xPos, textDirection, fallbackFonts,
&glyphOverflow); |
706 | 708 |
707 if (layout) | 709 if (layout) |
708 return Font::width(*layout, from, len, fallbackFonts); | 710 return Font::width(*layout, from, len, fallbackFonts); |
709 | 711 |
710 TextRun run = RenderBlockFlow::constructTextRun(text, font, text, from, len,
text->style()); | 712 TextRun run = RenderBlockFlow::constructTextRun(text, font, text, from, len,
text->style(), textDirection); |
711 run.setCharactersLength(text->textLength() - from); | 713 run.setCharactersLength(text->textLength() - from); |
712 ASSERT(run.charactersLength() >= run.length()); | 714 ASSERT(run.charactersLength() >= run.length()); |
713 | 715 |
714 run.setCharacterScanForCodePath(!text->canUseSimpleFontCodePath()); | 716 run.setCharacterScanForCodePath(!text->canUseSimpleFontCodePath()); |
715 run.setTabSize(!collapseWhiteSpace, text->style()->tabSize()); | 717 run.setTabSize(!collapseWhiteSpace, text->style()->tabSize()); |
716 run.setXPos(xPos); | 718 run.setXPos(xPos); |
717 return font.width(run, fallbackFonts, &glyphOverflow); | 719 return font.width(run, fallbackFonts, &glyphOverflow); |
718 } | 720 } |
719 | 721 |
720 inline bool BreakingContext::handleText(WordMeasurements& wordMeasurements, bool
& hyphenated) | 722 inline bool BreakingContext::handleText(WordMeasurements& wordMeasurements, bool
& hyphenated) |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
796 if (c == softHyphen && m_autoWrap && !hyphenWidth) { | 798 if (c == softHyphen && m_autoWrap && !hyphenWidth) { |
797 hyphenWidth = measureHyphenWidth(renderText, font); | 799 hyphenWidth = measureHyphenWidth(renderText, font); |
798 m_width.addUncommittedWidth(hyphenWidth); | 800 m_width.addUncommittedWidth(hyphenWidth); |
799 } | 801 } |
800 | 802 |
801 bool applyWordSpacing = false; | 803 bool applyWordSpacing = false; |
802 | 804 |
803 if ((breakAll || breakWords) && !midWordBreak) { | 805 if ((breakAll || breakWords) && !midWordBreak) { |
804 wrapW += charWidth; | 806 wrapW += charWidth; |
805 bool midWordBreakIsBeforeSurrogatePair = U16_IS_LEAD(c) && m_current
.offset() + 1 < renderText->textLength() && U16_IS_TRAIL((*renderText)[m_current
.offset() + 1]); | 807 bool midWordBreakIsBeforeSurrogatePair = U16_IS_LEAD(c) && m_current
.offset() + 1 < renderText->textLength() && U16_IS_TRAIL((*renderText)[m_current
.offset() + 1]); |
806 charWidth = textWidth(renderText, m_current.offset(), midWordBreakIs
BeforeSurrogatePair ? 2 : 1, font, m_width.committedWidth() + wrapW, isFixedPitc
h, m_collapseWhiteSpace, 0, textLayout); | 808 charWidth = textWidth(renderText, m_current.offset(), midWordBreakIs
BeforeSurrogatePair ? 2 : 1, font, m_width.committedWidth() + wrapW, isFixedPitc
h, m_resolver.position().direction(), m_collapseWhiteSpace, 0, textLayout); |
807 midWordBreak = m_width.committedWidth() + wrapW + charWidth > m_widt
h.availableWidth(); | 809 midWordBreak = m_width.committedWidth() + wrapW + charWidth > m_widt
h.availableWidth(); |
808 } | 810 } |
809 | 811 |
810 int nextBreakablePosition = m_current.nextBreakablePosition(); | 812 int nextBreakablePosition = m_current.nextBreakablePosition(); |
811 bool betweenWords = c == '\n' || (m_currWS != PRE && !m_atStart && isBre
akable(m_renderTextInfo.m_lineBreakIterator, m_current.offset(), nextBreakablePo
sition)); | 813 bool betweenWords = c == '\n' || (m_currWS != PRE && !m_atStart && isBre
akable(m_renderTextInfo.m_lineBreakIterator, m_current.offset(), nextBreakablePo
sition)); |
812 m_current.setNextBreakablePosition(nextBreakablePosition); | 814 m_current.setNextBreakablePosition(nextBreakablePosition); |
813 | 815 |
814 if (betweenWords || midWordBreak) { | 816 if (betweenWords || midWordBreak) { |
815 bool stoppedIgnoringSpaces = false; | 817 bool stoppedIgnoringSpaces = false; |
816 if (m_ignoringSpaces) { | 818 if (m_ignoringSpaces) { |
(...skipping 15 matching lines...) Expand all Loading... |
832 | 834 |
833 wordMeasurements.grow(wordMeasurements.size() + 1); | 835 wordMeasurements.grow(wordMeasurements.size() + 1); |
834 WordMeasurement& wordMeasurement = wordMeasurements.last(); | 836 WordMeasurement& wordMeasurement = wordMeasurements.last(); |
835 | 837 |
836 wordMeasurement.renderer = renderText; | 838 wordMeasurement.renderer = renderText; |
837 wordMeasurement.endOffset = m_current.offset(); | 839 wordMeasurement.endOffset = m_current.offset(); |
838 wordMeasurement.startOffset = lastSpace; | 840 wordMeasurement.startOffset = lastSpace; |
839 | 841 |
840 float additionalTmpW; | 842 float additionalTmpW; |
841 if (wordTrailingSpaceWidth && c == ' ') | 843 if (wordTrailingSpaceWidth && c == ' ') |
842 additionalTmpW = textWidth(renderText, lastSpace, m_current.offs
et() + 1 - lastSpace, font, m_width.currentWidth(), isFixedPitch, m_collapseWhit
eSpace, &wordMeasurement.fallbackFonts, textLayout) - wordTrailingSpaceWidth; | 844 additionalTmpW = textWidth(renderText, lastSpace, m_current.offs
et() + 1 - lastSpace, font, m_width.currentWidth(), isFixedPitch, m_resolver.pos
ition().direction(), m_collapseWhiteSpace, &wordMeasurement.fallbackFonts, textL
ayout) - wordTrailingSpaceWidth; |
843 else | 845 else |
844 additionalTmpW = textWidth(renderText, lastSpace, m_current.offs
et() - lastSpace, font, m_width.currentWidth(), isFixedPitch, m_collapseWhiteSpa
ce, &wordMeasurement.fallbackFonts, textLayout); | 846 additionalTmpW = textWidth(renderText, lastSpace, m_current.offs
et() - lastSpace, font, m_width.currentWidth(), isFixedPitch, m_resolver.positio
n().direction(), m_collapseWhiteSpace, &wordMeasurement.fallbackFonts, textLayou
t); |
845 | 847 |
846 wordMeasurement.width = additionalTmpW + wordSpacingForWordMeasureme
nt; | 848 wordMeasurement.width = additionalTmpW + wordSpacingForWordMeasureme
nt; |
847 additionalTmpW += lastSpaceWordSpacing; | 849 additionalTmpW += lastSpaceWordSpacing; |
848 m_width.addUncommittedWidth(additionalTmpW); | 850 m_width.addUncommittedWidth(additionalTmpW); |
849 if (!m_appliedStartWidth) { | 851 if (!m_appliedStartWidth) { |
850 m_width.addUncommittedWidth(inlineLogicalWidth(m_current.object(
), true, false)); | 852 m_width.addUncommittedWidth(inlineLogicalWidth(m_current.object(
), true, false)); |
851 m_appliedStartWidth = true; | 853 m_appliedStartWidth = true; |
852 } | 854 } |
853 | 855 |
854 if (m_lastFloatFromPreviousLine) | 856 if (m_lastFloatFromPreviousLine) |
855 updateSegmentsForShapes(m_block, m_lastFloatFromPreviousLine, wo
rdMeasurements, m_width, m_lineInfo.isFirstLine()); | 857 updateSegmentsForShapes(m_block, m_lastFloatFromPreviousLine, wo
rdMeasurements, m_width, m_lineInfo.isFirstLine()); |
856 | 858 |
857 applyWordSpacing = wordSpacing && m_currentCharacterIsSpace; | 859 applyWordSpacing = wordSpacing && m_currentCharacterIsSpace; |
858 | 860 |
859 if (!m_width.committedWidth() && m_autoWrap && !m_width.fitsOnLine()
) | 861 if (!m_width.committedWidth() && m_autoWrap && !m_width.fitsOnLine()
) |
860 m_width.fitBelowFloats(); | 862 m_width.fitBelowFloats(); |
861 | 863 |
862 if (m_autoWrap || breakWords) { | 864 if (m_autoWrap || breakWords) { |
863 // If we break only after white-space, consider the current char
acter | 865 // If we break only after white-space, consider the current char
acter |
864 // as candidate width for this line. | 866 // as candidate width for this line. |
865 bool lineWasTooWide = false; | 867 bool lineWasTooWide = false; |
866 if (m_width.fitsOnLine() && m_currentCharacterIsSpace && m_curre
ntStyle->breakOnlyAfterWhiteSpace() && !midWordBreak) { | 868 if (m_width.fitsOnLine() && m_currentCharacterIsSpace && m_curre
ntStyle->breakOnlyAfterWhiteSpace() && !midWordBreak) { |
867 float charWidth = textWidth(renderText, m_current.offset(),
1, font, m_width.currentWidth(), isFixedPitch, m_collapseWhiteSpace, &wordMeasur
ement.fallbackFonts, textLayout) + (applyWordSpacing ? wordSpacing : 0); | 869 float charWidth = textWidth(renderText, m_current.offset(),
1, font, m_width.currentWidth(), isFixedPitch, m_resolver.position().direction()
, m_collapseWhiteSpace, &wordMeasurement.fallbackFonts, textLayout) + (applyWord
Spacing ? wordSpacing : 0); |
868 // Check if line is too big even without the extra space | 870 // Check if line is too big even without the extra space |
869 // at the end of the line. If it is not, do nothing. | 871 // at the end of the line. If it is not, do nothing. |
870 // If the line needs the extra whitespace to be too long, | 872 // If the line needs the extra whitespace to be too long, |
871 // then move the line break to the space and skip all | 873 // then move the line break to the space and skip all |
872 // additional whitespace. | 874 // additional whitespace. |
873 if (!m_width.fitsOnLine(charWidth)) { | 875 if (!m_width.fitsOnLine(charWidth)) { |
874 lineWasTooWide = true; | 876 lineWasTooWide = true; |
875 m_lineBreak.moveTo(m_current.object(), m_current.offset(
), m_current.nextBreakablePosition()); | 877 m_lineBreak.moveTo(m_current.object(), m_current.offset(
), m_current.nextBreakablePosition()); |
876 skipTrailingWhitespace(m_lineBreak, m_lineInfo); | 878 skipTrailingWhitespace(m_lineBreak, m_lineInfo); |
877 } | 879 } |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
988 nextCharacter(c, lastCharacter, secondToLastCharacter); | 990 nextCharacter(c, lastCharacter, secondToLastCharacter); |
989 } | 991 } |
990 | 992 |
991 m_renderTextInfo.m_lineBreakIterator.setPriorContext(lastCharacter, secondTo
LastCharacter); | 993 m_renderTextInfo.m_lineBreakIterator.setPriorContext(lastCharacter, secondTo
LastCharacter); |
992 | 994 |
993 wordMeasurements.grow(wordMeasurements.size() + 1); | 995 wordMeasurements.grow(wordMeasurements.size() + 1); |
994 WordMeasurement& wordMeasurement = wordMeasurements.last(); | 996 WordMeasurement& wordMeasurement = wordMeasurements.last(); |
995 wordMeasurement.renderer = renderText; | 997 wordMeasurement.renderer = renderText; |
996 | 998 |
997 // IMPORTANT: current.m_pos is > length here! | 999 // IMPORTANT: current.m_pos is > length here! |
998 float additionalTmpW = m_ignoringSpaces ? 0 : textWidth(renderText, lastSpac
e, m_current.offset() - lastSpace, font, m_width.currentWidth(), isFixedPitch, m
_collapseWhiteSpace, &wordMeasurement.fallbackFonts, textLayout); | 1000 float additionalTmpW = m_ignoringSpaces ? 0 : textWidth(renderText, lastSpac
e, m_current.offset() - lastSpace, font, m_width.currentWidth(), isFixedPitch, m
_resolver.position().direction(), m_collapseWhiteSpace, &wordMeasurement.fallbac
kFonts, textLayout); |
999 wordMeasurement.startOffset = lastSpace; | 1001 wordMeasurement.startOffset = lastSpace; |
1000 wordMeasurement.endOffset = m_current.offset(); | 1002 wordMeasurement.endOffset = m_current.offset(); |
1001 wordMeasurement.width = m_ignoringSpaces ? 0 : additionalTmpW + wordSpacingF
orWordMeasurement; | 1003 wordMeasurement.width = m_ignoringSpaces ? 0 : additionalTmpW + wordSpacingF
orWordMeasurement; |
1002 additionalTmpW += lastSpaceWordSpacing; | 1004 additionalTmpW += lastSpaceWordSpacing; |
1003 m_width.addUncommittedWidth(additionalTmpW + inlineLogicalWidth(m_current.ob
ject(), !m_appliedStartWidth, m_includeEndWidth)); | 1005 m_width.addUncommittedWidth(additionalTmpW + inlineLogicalWidth(m_current.ob
ject(), !m_appliedStartWidth, m_includeEndWidth)); |
1004 m_includeEndWidth = false; | 1006 m_includeEndWidth = false; |
1005 | 1007 |
1006 if (!m_width.fitsOnLine()) { | 1008 if (!m_width.fitsOnLine()) { |
1007 if (!hyphenated && m_lineBreak.previousInSameNode() == softHyphen) { | 1009 if (!hyphenated && m_lineBreak.previousInSameNode() == softHyphen) { |
1008 hyphenated = true; | 1010 hyphenated = true; |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1138 m_lineBreak.increment(); | 1140 m_lineBreak.increment(); |
1139 } while (!m_lineBreak.atEnd() && isEmptyInline(m_lineBreak.object())); | 1141 } while (!m_lineBreak.atEnd() && isEmptyInline(m_lineBreak.object())); |
1140 } | 1142 } |
1141 | 1143 |
1142 return m_lineBreak; | 1144 return m_lineBreak; |
1143 } | 1145 } |
1144 | 1146 |
1145 } | 1147 } |
1146 | 1148 |
1147 #endif // BreakingContextInlineHeaders_h | 1149 #endif // BreakingContextInlineHeaders_h |
OLD | NEW |