Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(124)

Side by Side Diff: Source/core/rendering/line/BreakingContextInlineHeaders.h

Issue 120493004: Set m_pos as private in InlineIterator, and use getter and setter functions (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « Source/core/rendering/RenderBlockLineLayout.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
107 inline void ensureLineBoxInsideIgnoredSpaces(LineMidpointState& lineMidpointStat e, RenderObject* renderer) 107 inline void ensureLineBoxInsideIgnoredSpaces(LineMidpointState& lineMidpointStat e, RenderObject* renderer)
108 { 108 {
109 InlineIterator midpoint(0, renderer, 0); 109 InlineIterator midpoint(0, renderer, 0);
110 stopIgnoringSpaces(lineMidpointState, midpoint); 110 stopIgnoringSpaces(lineMidpointState, midpoint);
111 startIgnoringSpaces(lineMidpointState, midpoint); 111 startIgnoringSpaces(lineMidpointState, midpoint);
112 } 112 }
113 113
114 // Adding a pair of midpoints before a character will split it out into a new li ne box. 114 // Adding a pair of midpoints before a character will split it out into a new li ne box.
115 inline void ensureCharacterGetsLineBox(LineMidpointState& lineMidpointState, Inl ineIterator& textParagraphSeparator) 115 inline void ensureCharacterGetsLineBox(LineMidpointState& lineMidpointState, Inl ineIterator& textParagraphSeparator)
116 { 116 {
117 InlineIterator midpoint(0, textParagraphSeparator.object(), textParagraphSep arator.m_pos); 117 InlineIterator midpoint(0, textParagraphSeparator.object(), textParagraphSep arator.offset());
118 startIgnoringSpaces(lineMidpointState, InlineIterator(0, textParagraphSepara tor.object(), textParagraphSeparator.m_pos - 1)); 118 startIgnoringSpaces(lineMidpointState, InlineIterator(0, textParagraphSepara tor.object(), textParagraphSeparator.offset() - 1));
119 stopIgnoringSpaces(lineMidpointState, InlineIterator(0, textParagraphSeparat or.object(), textParagraphSeparator.m_pos)); 119 stopIgnoringSpaces(lineMidpointState, InlineIterator(0, textParagraphSeparat or.object(), textParagraphSeparator.offset()));
120 } 120 }
121 121
122 class TrailingObjects { 122 class TrailingObjects {
123 public: 123 public:
124 TrailingObjects(); 124 TrailingObjects();
125 void setTrailingWhitespace(RenderText*); 125 void setTrailingWhitespace(RenderText*);
126 void clear(); 126 void clear();
127 void appendBoxIfNeeded(RenderBox*); 127 void appendBoxIfNeeded(RenderBox*);
128 128
129 enum CollapseFirstSpaceOrNot { DoNotCollapseFirstSpace, CollapseFirstSpace } ; 129 enum CollapseFirstSpaceOrNot { DoNotCollapseFirstSpace, CollapseFirstSpace } ;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 return; 167 return;
168 168
169 // This object is either going to be part of the last midpoint, or it is goi ng to be the actual endpoint. 169 // This object is either going to be part of the last midpoint, or it is goi ng to be the actual endpoint.
170 // In both cases we just decrease our pos by 1 level to exclude the space, a llowing it to - in effect - collapse into the newline. 170 // In both cases we just decrease our pos by 1 level to exclude the space, a llowing it to - in effect - collapse into the newline.
171 if (lineMidpointState.numMidpoints % 2) { 171 if (lineMidpointState.numMidpoints % 2) {
172 // Find the trailing space object's midpoint. 172 // Find the trailing space object's midpoint.
173 int trailingSpaceMidpoint = lineMidpointState.numMidpoints - 1; 173 int trailingSpaceMidpoint = lineMidpointState.numMidpoints - 1;
174 for ( ; trailingSpaceMidpoint > 0 && lineMidpointState.midpoints[trailin gSpaceMidpoint].object() != m_whitespace; --trailingSpaceMidpoint) { } 174 for ( ; trailingSpaceMidpoint > 0 && lineMidpointState.midpoints[trailin gSpaceMidpoint].object() != m_whitespace; --trailingSpaceMidpoint) { }
175 ASSERT(trailingSpaceMidpoint >= 0); 175 ASSERT(trailingSpaceMidpoint >= 0);
176 if (collapseFirstSpace == CollapseFirstSpace) 176 if (collapseFirstSpace == CollapseFirstSpace)
177 lineMidpointState.midpoints[trailingSpaceMidpoint].m_pos--; 177 lineMidpointState.midpoints[trailingSpaceMidpoint].setOffset(lineMid pointState.midpoints[trailingSpaceMidpoint].offset() -1);
178 178
179 // Now make sure every single trailingPositionedBox following the traili ngSpaceMidpoint properly stops and starts 179 // Now make sure every single trailingPositionedBox following the traili ngSpaceMidpoint properly stops and starts
180 // ignoring spaces. 180 // ignoring spaces.
181 size_t currentMidpoint = trailingSpaceMidpoint + 1; 181 size_t currentMidpoint = trailingSpaceMidpoint + 1;
182 for (size_t i = 0; i < m_boxes.size(); ++i) { 182 for (size_t i = 0; i < m_boxes.size(); ++i) {
183 if (currentMidpoint >= lineMidpointState.numMidpoints) { 183 if (currentMidpoint >= lineMidpointState.numMidpoints) {
184 // We don't have a midpoint for this box yet. 184 // We don't have a midpoint for this box yet.
185 ensureLineBoxInsideIgnoredSpaces(lineMidpointState, m_boxes[i]); 185 ensureLineBoxInsideIgnoredSpaces(lineMidpointState, m_boxes[i]);
186 } else { 186 } else {
187 ASSERT(lineMidpointState.midpoints[currentMidpoint].object() == m_boxes[i]); 187 ASSERT(lineMidpointState.midpoints[currentMidpoint].object() == m_boxes[i]);
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after
520 { 520 {
521 RenderBox* floatBox = toRenderBox(m_current.object()); 521 RenderBox* floatBox = toRenderBox(m_current.object());
522 FloatingObject* floatingObject = m_block->insertFloatingObject(floatBox); 522 FloatingObject* floatingObject = m_block->insertFloatingObject(floatBox);
523 // check if it fits in the current line. 523 // check if it fits in the current line.
524 // If it does, position it now, otherwise, position 524 // If it does, position it now, otherwise, position
525 // it after moving to next line (in newLine() func) 525 // it after moving to next line (in newLine() func)
526 // FIXME: Bug 110372: Properly position multiple stacked floats with non-rec tangular shape outside. 526 // FIXME: Bug 110372: Properly position multiple stacked floats with non-rec tangular shape outside.
527 if (m_floatsFitOnLine && m_width.fitsOnLine(m_block->logicalWidthForFloat(fl oatingObject))) { 527 if (m_floatsFitOnLine && m_width.fitsOnLine(m_block->logicalWidthForFloat(fl oatingObject))) {
528 m_block->positionNewFloatOnLine(floatingObject, m_lastFloatFromPreviousL ine, m_lineInfo, m_width); 528 m_block->positionNewFloatOnLine(floatingObject, m_lastFloatFromPreviousL ine, m_lineInfo, m_width);
529 if (m_lineBreak.object() == m_current.object()) { 529 if (m_lineBreak.object() == m_current.object()) {
530 ASSERT(!m_lineBreak.m_pos); 530 ASSERT(!m_lineBreak.offset());
531 m_lineBreak.increment(); 531 m_lineBreak.increment();
532 } 532 }
533 } else { 533 } else {
534 m_floatsFitOnLine = false; 534 m_floatsFitOnLine = false;
535 } 535 }
536 // Update prior line break context characters, using U+FFFD (OBJECT REPLACEM ENT CHARACTER) for floating element. 536 // Update prior line break context characters, using U+FFFD (OBJECT REPLACEM ENT CHARACTER) for floating element.
537 m_renderTextInfo.m_lineBreakIterator.updatePriorContext(replacementCharacter ); 537 m_renderTextInfo.m_lineBreakIterator.updatePriorContext(replacementCharacter );
538 } 538 }
539 539
540 // This is currently just used for list markers and inline flows that have line boxes. Neither should 540 // This is currently just used for list markers and inline flows that have line boxes. Neither should
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
626 m_width.addUncommittedWidth(replacedLogicalWidth); 626 m_width.addUncommittedWidth(replacedLogicalWidth);
627 } 627 }
628 if (m_current.object()->isRubyRun()) 628 if (m_current.object()->isRubyRun())
629 m_width.applyOverhang(toRenderRubyRun(m_current.object()), m_lastObject, m_nextObject); 629 m_width.applyOverhang(toRenderRubyRun(m_current.object()), m_lastObject, m_nextObject);
630 // Update prior line break context characters, using U+FFFD (OBJECT REPLACEM ENT CHARACTER) for replaced element. 630 // Update prior line break context characters, using U+FFFD (OBJECT REPLACEM ENT CHARACTER) for replaced element.
631 m_renderTextInfo.m_lineBreakIterator.updatePriorContext(replacementCharacter ); 631 m_renderTextInfo.m_lineBreakIterator.updatePriorContext(replacementCharacter );
632 } 632 }
633 633
634 inline bool iteratorIsBeyondEndOfRenderCombineText(const InlineIterator& iter, R enderCombineText* renderer) 634 inline bool iteratorIsBeyondEndOfRenderCombineText(const InlineIterator& iter, R enderCombineText* renderer)
635 { 635 {
636 return iter.object() == renderer && iter.m_pos >= renderer->textLength(); 636 return iter.object() == renderer && iter.offset() >= renderer->textLength();
637 } 637 }
638 638
639 inline void nextCharacter(UChar& currentCharacter, UChar& lastCharacter, UChar& secondToLastCharacter) 639 inline void nextCharacter(UChar& currentCharacter, UChar& lastCharacter, UChar& secondToLastCharacter)
640 { 640 {
641 secondToLastCharacter = lastCharacter; 641 secondToLastCharacter = lastCharacter;
642 lastCharacter = currentCharacter; 642 lastCharacter = currentCharacter;
643 } 643 }
644 644
645 inline float firstPositiveWidth(const WordMeasurements& wordMeasurements) 645 inline float firstPositiveWidth(const WordMeasurements& wordMeasurements)
646 { 646 {
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
712 ASSERT(run.charactersLength() >= run.length()); 712 ASSERT(run.charactersLength() >= run.length());
713 713
714 run.setCharacterScanForCodePath(!text->canUseSimpleFontCodePath()); 714 run.setCharacterScanForCodePath(!text->canUseSimpleFontCodePath());
715 run.setTabSize(!collapseWhiteSpace, text->style()->tabSize()); 715 run.setTabSize(!collapseWhiteSpace, text->style()->tabSize());
716 run.setXPos(xPos); 716 run.setXPos(xPos);
717 return font.width(run, fallbackFonts, &glyphOverflow); 717 return font.width(run, fallbackFonts, &glyphOverflow);
718 } 718 }
719 719
720 inline bool BreakingContext::handleText(WordMeasurements& wordMeasurements, bool & hyphenated) 720 inline bool BreakingContext::handleText(WordMeasurements& wordMeasurements, bool & hyphenated)
721 { 721 {
722 if (!m_current.m_pos) 722 if (!m_current.offset())
723 m_appliedStartWidth = false; 723 m_appliedStartWidth = false;
724 724
725 RenderText* renderText = toRenderText(m_current.object()); 725 RenderText* renderText = toRenderText(m_current.object());
726 726
727 bool isSVGText = renderText->isSVGInlineText(); 727 bool isSVGText = renderText->isSVGInlineText();
728 728
729 if (renderText->style()->hasTextCombine() && m_current.object()->isCombineTe xt() && !toRenderCombineText(m_current.object())->isCombined()) { 729 if (renderText->style()->hasTextCombine() && m_current.object()->isCombineTe xt() && !toRenderCombineText(m_current.object())->isCombined()) {
730 RenderCombineText* combineRenderer = toRenderCombineText(m_current.objec t()); 730 RenderCombineText* combineRenderer = toRenderCombineText(m_current.objec t());
731 combineRenderer->combineText(); 731 combineRenderer->combineText();
732 // The length of the renderer's text may have changed. Increment stale i terator positions 732 // The length of the renderer's text may have changed. Increment stale i terator positions
733 if (iteratorIsBeyondEndOfRenderCombineText(m_lineBreak, combineRenderer) ) { 733 if (iteratorIsBeyondEndOfRenderCombineText(m_lineBreak, combineRenderer) ) {
734 ASSERT(iteratorIsBeyondEndOfRenderCombineText(m_resolver.position(), combineRenderer)); 734 ASSERT(iteratorIsBeyondEndOfRenderCombineText(m_resolver.position(), combineRenderer));
735 m_lineBreak.increment(); 735 m_lineBreak.increment();
736 m_resolver.position().increment(&m_resolver); 736 m_resolver.position().increment(&m_resolver);
737 } 737 }
738 } 738 }
739 739
740 RenderStyle* style = renderText->style(m_lineInfo.isFirstLine()); 740 RenderStyle* style = renderText->style(m_lineInfo.isFirstLine());
741 const Font& font = style->font(); 741 const Font& font = style->font();
742 bool isFixedPitch = font.isFixedPitch(); 742 bool isFixedPitch = font.isFixedPitch();
743 743
744 unsigned lastSpace = m_current.m_pos; 744 unsigned lastSpace = m_current.offset();
745 float wordSpacing = m_currentStyle->wordSpacing(); 745 float wordSpacing = m_currentStyle->wordSpacing();
746 float lastSpaceWordSpacing = 0; 746 float lastSpaceWordSpacing = 0;
747 float wordSpacingForWordMeasurement = 0; 747 float wordSpacingForWordMeasurement = 0;
748 748
749 float wrapW = m_width.uncommittedWidth() + inlineLogicalWidth(m_current.obje ct(), !m_appliedStartWidth, true); 749 float wrapW = m_width.uncommittedWidth() + inlineLogicalWidth(m_current.obje ct(), !m_appliedStartWidth, true);
750 float charWidth = 0; 750 float charWidth = 0;
751 // Auto-wrapping text should wrap in the middle of a word only if it could n ot wrap before the word, 751 // Auto-wrapping text should wrap in the middle of a word only if it could n ot wrap before the word,
752 // which is only possible if the word is the first thing on the line, that i s, if |w| is zero. 752 // which is only possible if the word is the first thing on the line, that i s, if |w| is zero.
753 bool breakWords = m_currentStyle->breakWords() && ((m_autoWrap && !m_width.c ommittedWidth()) || m_currWS == PRE); 753 bool breakWords = m_currentStyle->breakWords() && ((m_autoWrap && !m_width.c ommittedWidth()) || m_currWS == PRE);
754 bool midWordBreak = false; 754 bool midWordBreak = false;
755 bool breakAll = m_currentStyle->wordBreak() == BreakAllWordBreak && m_autoWr ap; 755 bool breakAll = m_currentStyle->wordBreak() == BreakAllWordBreak && m_autoWr ap;
756 float hyphenWidth = 0; 756 float hyphenWidth = 0;
757 757
758 if (isSVGText) { 758 if (isSVGText) {
759 breakWords = false; 759 breakWords = false;
760 breakAll = false; 760 breakAll = false;
761 } 761 }
762 762
763 if (renderText->isWordBreak()) { 763 if (renderText->isWordBreak()) {
764 m_width.commit(); 764 m_width.commit();
765 m_lineBreak.moveToStartOf(m_current.object()); 765 m_lineBreak.moveToStartOf(m_current.object());
766 ASSERT(m_current.m_pos == renderText->textLength()); 766 ASSERT(m_current.offset() == renderText->textLength());
767 } 767 }
768 768
769 if (m_renderTextInfo.m_text != renderText) { 769 if (m_renderTextInfo.m_text != renderText) {
770 m_renderTextInfo.m_text = renderText; 770 m_renderTextInfo.m_text = renderText;
771 m_renderTextInfo.m_font = &font; 771 m_renderTextInfo.m_font = &font;
772 m_renderTextInfo.createLayout(renderText, m_width.currentWidth(), m_coll apseWhiteSpace); 772 m_renderTextInfo.createLayout(renderText, m_width.currentWidth(), m_coll apseWhiteSpace);
773 m_renderTextInfo.m_lineBreakIterator.resetStringAndReleaseIterator(rende rText->text(), style->locale()); 773 m_renderTextInfo.m_lineBreakIterator.resetStringAndReleaseIterator(rende rText->text(), style->locale());
774 } else if (m_renderTextInfo.m_layout && m_renderTextInfo.m_font != &font) { 774 } else if (m_renderTextInfo.m_layout && m_renderTextInfo.m_font != &font) {
775 m_renderTextInfo.m_font = &font; 775 m_renderTextInfo.m_font = &font;
776 m_renderTextInfo.createLayout(renderText, m_width.currentWidth(), m_coll apseWhiteSpace); 776 m_renderTextInfo.createLayout(renderText, m_width.currentWidth(), m_coll apseWhiteSpace);
777 } 777 }
778 778
779 TextLayout* textLayout = m_renderTextInfo.m_layout.get(); 779 TextLayout* textLayout = m_renderTextInfo.m_layout.get();
780 780
781 // Non-zero only when kerning is enabled and TextLayout isn't used, in which case we measure 781 // Non-zero only when kerning is enabled and TextLayout isn't used, in which case we measure
782 // words with their trailing space, then subtract its width. 782 // words with their trailing space, then subtract its width.
783 float wordTrailingSpaceWidth = (font.typesettingFeatures() & Kerning) && !te xtLayout ? font.width(RenderBlockFlow::constructTextRun(renderText, font, &space , 1, style)) + wordSpacing : 0; 783 float wordTrailingSpaceWidth = (font.typesettingFeatures() & Kerning) && !te xtLayout ? font.width(RenderBlockFlow::constructTextRun(renderText, font, &space , 1, style)) + wordSpacing : 0;
784 784
785 UChar lastCharacter = m_renderTextInfo.m_lineBreakIterator.lastCharacter(); 785 UChar lastCharacter = m_renderTextInfo.m_lineBreakIterator.lastCharacter();
786 UChar secondToLastCharacter = m_renderTextInfo.m_lineBreakIterator.secondToL astCharacter(); 786 UChar secondToLastCharacter = m_renderTextInfo.m_lineBreakIterator.secondToL astCharacter();
787 for (; m_current.m_pos < renderText->textLength(); m_current.fastIncrementIn TextNode()) { 787 for (; m_current.offset() < renderText->textLength(); m_current.fastIncremen tInTextNode()) {
788 bool previousCharacterIsSpace = m_currentCharacterIsSpace; 788 bool previousCharacterIsSpace = m_currentCharacterIsSpace;
789 bool previousCharacterShouldCollapseIfPreWap = m_currentCharacterShouldC ollapseIfPreWap; 789 bool previousCharacterShouldCollapseIfPreWap = m_currentCharacterShouldC ollapseIfPreWap;
790 UChar c = m_current.current(); 790 UChar c = m_current.current();
791 m_currentCharacterShouldCollapseIfPreWap = m_currentCharacterIsSpace = c == ' ' || c == '\t' || (!m_preservesNewline && (c == '\n')); 791 m_currentCharacterShouldCollapseIfPreWap = m_currentCharacterIsSpace = c == ' ' || c == '\t' || (!m_preservesNewline && (c == '\n'));
792 792
793 if (!m_collapseWhiteSpace || !m_currentCharacterIsSpace) 793 if (!m_collapseWhiteSpace || !m_currentCharacterIsSpace)
794 m_lineInfo.setEmpty(false, m_block, &m_width); 794 m_lineInfo.setEmpty(false, m_block, &m_width);
795 795
796 if (c == softHyphen && m_autoWrap && !hyphenWidth) { 796 if (c == softHyphen && m_autoWrap && !hyphenWidth) {
797 hyphenWidth = measureHyphenWidth(renderText, font); 797 hyphenWidth = measureHyphenWidth(renderText, font);
798 m_width.addUncommittedWidth(hyphenWidth); 798 m_width.addUncommittedWidth(hyphenWidth);
799 } 799 }
800 800
801 bool applyWordSpacing = false; 801 bool applyWordSpacing = false;
802 802
803 if ((breakAll || breakWords) && !midWordBreak) { 803 if ((breakAll || breakWords) && !midWordBreak) {
804 wrapW += charWidth; 804 wrapW += charWidth;
805 bool midWordBreakIsBeforeSurrogatePair = U16_IS_LEAD(c) && m_current .m_pos + 1 < renderText->textLength() && U16_IS_TRAIL((*renderText)[m_current.m_ pos + 1]); 805 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.m_pos, midWordBreakIsBef oreSurrogatePair ? 2 : 1, font, m_width.committedWidth() + wrapW, isFixedPitch, m_collapseWhiteSpace, 0, textLayout); 806 charWidth = textWidth(renderText, m_current.offset(), midWordBreakIs BeforeSurrogatePair ? 2 : 1, font, m_width.committedWidth() + wrapW, isFixedPitc h, m_collapseWhiteSpace, 0, textLayout);
807 midWordBreak = m_width.committedWidth() + wrapW + charWidth > m_widt h.availableWidth(); 807 midWordBreak = m_width.committedWidth() + wrapW + charWidth > m_widt h.availableWidth();
808 } 808 }
809 809
810 int nextBreakablePosition = m_current.nextBreakablePosition(); 810 int nextBreakablePosition = m_current.nextBreakablePosition();
811 bool betweenWords = c == '\n' || (m_currWS != PRE && !m_atStart && isBre akable(m_renderTextInfo.m_lineBreakIterator, m_current.m_pos, nextBreakablePosit ion)); 811 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); 812 m_current.setNextBreakablePosition(nextBreakablePosition);
813 813
814 if (betweenWords || midWordBreak) { 814 if (betweenWords || midWordBreak) {
815 bool stoppedIgnoringSpaces = false; 815 bool stoppedIgnoringSpaces = false;
816 if (m_ignoringSpaces) { 816 if (m_ignoringSpaces) {
817 lastSpaceWordSpacing = 0; 817 lastSpaceWordSpacing = 0;
818 if (!m_currentCharacterIsSpace) { 818 if (!m_currentCharacterIsSpace) {
819 // Stop ignoring spaces and begin at this 819 // Stop ignoring spaces and begin at this
820 // new point. 820 // new point.
821 m_ignoringSpaces = false; 821 m_ignoringSpaces = false;
822 wordSpacingForWordMeasurement = 0; 822 wordSpacingForWordMeasurement = 0;
823 lastSpace = m_current.m_pos; // e.g., "Foo goo", don't ad d in any of the ignored spaces. 823 lastSpace = m_current.offset(); // e.g., "Foo goo", don't add in any of the ignored spaces.
824 stopIgnoringSpaces(m_lineMidpointState, InlineIterator(0, m_ current.object(), m_current.m_pos)); 824 stopIgnoringSpaces(m_lineMidpointState, InlineIterator(0, m_ current.object(), m_current.offset()));
825 stoppedIgnoringSpaces = true; 825 stoppedIgnoringSpaces = true;
826 } else { 826 } else {
827 // Just keep ignoring these spaces. 827 // Just keep ignoring these spaces.
828 nextCharacter(c, lastCharacter, secondToLastCharacter); 828 nextCharacter(c, lastCharacter, secondToLastCharacter);
829 continue; 829 continue;
830 } 830 }
831 } 831 }
832 832
833 wordMeasurements.grow(wordMeasurements.size() + 1); 833 wordMeasurements.grow(wordMeasurements.size() + 1);
834 WordMeasurement& wordMeasurement = wordMeasurements.last(); 834 WordMeasurement& wordMeasurement = wordMeasurements.last();
835 835
836 wordMeasurement.renderer = renderText; 836 wordMeasurement.renderer = renderText;
837 wordMeasurement.endOffset = m_current.m_pos; 837 wordMeasurement.endOffset = m_current.offset();
838 wordMeasurement.startOffset = lastSpace; 838 wordMeasurement.startOffset = lastSpace;
839 839
840 float additionalTmpW; 840 float additionalTmpW;
841 if (wordTrailingSpaceWidth && c == ' ') 841 if (wordTrailingSpaceWidth && c == ' ')
842 additionalTmpW = textWidth(renderText, lastSpace, m_current.m_po s + 1 - lastSpace, font, m_width.currentWidth(), isFixedPitch, m_collapseWhiteSp ace, &wordMeasurement.fallbackFonts, textLayout) - wordTrailingSpaceWidth; 842 additionalTmpW = textWidth(renderText, lastSpace, m_current.offs et() + 1 - lastSpace, font, m_width.currentWidth(), isFixedPitch, m_collapseWhit eSpace, &wordMeasurement.fallbackFonts, textLayout) - wordTrailingSpaceWidth;
843 else 843 else
844 additionalTmpW = textWidth(renderText, lastSpace, m_current.m_po s - lastSpace, font, m_width.currentWidth(), isFixedPitch, m_collapseWhiteSpace, &wordMeasurement.fallbackFonts, textLayout); 844 additionalTmpW = textWidth(renderText, lastSpace, m_current.offs et() - lastSpace, font, m_width.currentWidth(), isFixedPitch, m_collapseWhiteSpa ce, &wordMeasurement.fallbackFonts, textLayout);
845 845
846 wordMeasurement.width = additionalTmpW + wordSpacingForWordMeasureme nt; 846 wordMeasurement.width = additionalTmpW + wordSpacingForWordMeasureme nt;
847 additionalTmpW += lastSpaceWordSpacing; 847 additionalTmpW += lastSpaceWordSpacing;
848 m_width.addUncommittedWidth(additionalTmpW); 848 m_width.addUncommittedWidth(additionalTmpW);
849 if (!m_appliedStartWidth) { 849 if (!m_appliedStartWidth) {
850 m_width.addUncommittedWidth(inlineLogicalWidth(m_current.object( ), true, false)); 850 m_width.addUncommittedWidth(inlineLogicalWidth(m_current.object( ), true, false));
851 m_appliedStartWidth = true; 851 m_appliedStartWidth = true;
852 } 852 }
853 853
854 if (m_lastFloatFromPreviousLine) 854 if (m_lastFloatFromPreviousLine)
855 updateSegmentsForShapes(m_block, m_lastFloatFromPreviousLine, wo rdMeasurements, m_width, m_lineInfo.isFirstLine()); 855 updateSegmentsForShapes(m_block, m_lastFloatFromPreviousLine, wo rdMeasurements, m_width, m_lineInfo.isFirstLine());
856 856
857 applyWordSpacing = wordSpacing && m_currentCharacterIsSpace; 857 applyWordSpacing = wordSpacing && m_currentCharacterIsSpace;
858 858
859 if (!m_width.committedWidth() && m_autoWrap && !m_width.fitsOnLine() ) 859 if (!m_width.committedWidth() && m_autoWrap && !m_width.fitsOnLine() )
860 m_width.fitBelowFloats(); 860 m_width.fitBelowFloats();
861 861
862 if (m_autoWrap || breakWords) { 862 if (m_autoWrap || breakWords) {
863 // If we break only after white-space, consider the current char acter 863 // If we break only after white-space, consider the current char acter
864 // as candidate width for this line. 864 // as candidate width for this line.
865 bool lineWasTooWide = false; 865 bool lineWasTooWide = false;
866 if (m_width.fitsOnLine() && m_currentCharacterIsSpace && m_curre ntStyle->breakOnlyAfterWhiteSpace() && !midWordBreak) { 866 if (m_width.fitsOnLine() && m_currentCharacterIsSpace && m_curre ntStyle->breakOnlyAfterWhiteSpace() && !midWordBreak) {
867 float charWidth = textWidth(renderText, m_current.m_pos, 1, font, m_width.currentWidth(), isFixedPitch, m_collapseWhiteSpace, &wordMeasureme nt.fallbackFonts, textLayout) + (applyWordSpacing ? wordSpacing : 0); 867 float charWidth = textWidth(renderText, m_current.offset(), 1, font, m_width.currentWidth(), isFixedPitch, m_collapseWhiteSpace, &wordMeasur ement.fallbackFonts, textLayout) + (applyWordSpacing ? wordSpacing : 0);
868 // Check if line is too big even without the extra space 868 // Check if line is too big even without the extra space
869 // at the end of the line. If it is not, do nothing. 869 // at the end of the line. If it is not, do nothing.
870 // If the line needs the extra whitespace to be too long, 870 // If the line needs the extra whitespace to be too long,
871 // then move the line break to the space and skip all 871 // then move the line break to the space and skip all
872 // additional whitespace. 872 // additional whitespace.
873 if (!m_width.fitsOnLine(charWidth)) { 873 if (!m_width.fitsOnLine(charWidth)) {
874 lineWasTooWide = true; 874 lineWasTooWide = true;
875 m_lineBreak.moveTo(m_current.object(), m_current.m_pos, m_current.nextBreakablePosition()); 875 m_lineBreak.moveTo(m_current.object(), m_current.offset( ), m_current.nextBreakablePosition());
876 skipTrailingWhitespace(m_lineBreak, m_lineInfo); 876 skipTrailingWhitespace(m_lineBreak, m_lineInfo);
877 } 877 }
878 } 878 }
879 if (lineWasTooWide || !m_width.fitsOnLine()) { 879 if (lineWasTooWide || !m_width.fitsOnLine()) {
880 if (m_lineBreak.atTextParagraphSeparator()) { 880 if (m_lineBreak.atTextParagraphSeparator()) {
881 if (!stoppedIgnoringSpaces && m_current.m_pos > 0) 881 if (!stoppedIgnoringSpaces && m_current.offset() > 0)
882 ensureCharacterGetsLineBox(m_lineMidpointState, m_cu rrent); 882 ensureCharacterGetsLineBox(m_lineMidpointState, m_cu rrent);
883 m_lineBreak.increment(); 883 m_lineBreak.increment();
884 m_lineInfo.setPreviousLineBrokeCleanly(true); 884 m_lineInfo.setPreviousLineBrokeCleanly(true);
885 wordMeasurement.endOffset = m_lineBreak.m_pos; 885 wordMeasurement.endOffset = m_lineBreak.offset();
886 } 886 }
887 if (m_lineBreak.object() && m_lineBreak.m_pos && m_lineBreak .object()->isText() && toRenderText(m_lineBreak.object())->textLength() && toRen derText(m_lineBreak.object())->characterAt(m_lineBreak.m_pos - 1) == softHyphen) 887 if (m_lineBreak.object() && m_lineBreak.offset() && m_lineBr eak.object()->isText() && toRenderText(m_lineBreak.object())->textLength() && to RenderText(m_lineBreak.object())->characterAt(m_lineBreak.offset() - 1) == softH yphen)
888 hyphenated = true; 888 hyphenated = true;
889 if (m_lineBreak.m_pos && m_lineBreak.m_pos != (unsigned)word Measurement.endOffset && !wordMeasurement.width) { 889 if (m_lineBreak.offset() && m_lineBreak.offset() != (unsigne d)wordMeasurement.endOffset && !wordMeasurement.width) {
890 if (charWidth) { 890 if (charWidth) {
891 wordMeasurement.endOffset = m_lineBreak.m_pos; 891 wordMeasurement.endOffset = m_lineBreak.offset();
892 wordMeasurement.width = charWidth; 892 wordMeasurement.width = charWidth;
893 } 893 }
894 } 894 }
895 // Didn't fit. Jump to the end unless there's still an oppor tunity to collapse whitespace. 895 // Didn't fit. Jump to the end unless there's still an oppor tunity to collapse whitespace.
896 if (m_ignoringSpaces || !m_collapseWhiteSpace || !m_currentC haracterIsSpace || !previousCharacterIsSpace) { 896 if (m_ignoringSpaces || !m_collapseWhiteSpace || !m_currentC haracterIsSpace || !previousCharacterIsSpace) {
897 m_atEnd = true; 897 m_atEnd = true;
898 return false; 898 return false;
899 } 899 }
900 } else { 900 } else {
901 if (!betweenWords || (midWordBreak && !m_autoWrap)) 901 if (!betweenWords || (midWordBreak && !m_autoWrap))
902 m_width.addUncommittedWidth(-additionalTmpW); 902 m_width.addUncommittedWidth(-additionalTmpW);
903 if (hyphenWidth) { 903 if (hyphenWidth) {
904 // Subtract the width of the soft hyphen out since we fi t on a line. 904 // Subtract the width of the soft hyphen out since we fi t on a line.
905 m_width.addUncommittedWidth(-hyphenWidth); 905 m_width.addUncommittedWidth(-hyphenWidth);
906 hyphenWidth = 0; 906 hyphenWidth = 0;
907 } 907 }
908 } 908 }
909 } 909 }
910 910
911 if (c == '\n' && m_preservesNewline) { 911 if (c == '\n' && m_preservesNewline) {
912 if (!stoppedIgnoringSpaces && m_current.m_pos > 0) 912 if (!stoppedIgnoringSpaces && m_current.offset())
913 ensureCharacterGetsLineBox(m_lineMidpointState, m_current); 913 ensureCharacterGetsLineBox(m_lineMidpointState, m_current);
914 m_lineBreak.moveTo(m_current.object(), m_current.m_pos, m_curren t.nextBreakablePosition()); 914 m_lineBreak.moveTo(m_current.object(), m_current.offset(), m_cur rent.nextBreakablePosition());
915 m_lineBreak.increment(); 915 m_lineBreak.increment();
916 m_lineInfo.setPreviousLineBrokeCleanly(true); 916 m_lineInfo.setPreviousLineBrokeCleanly(true);
917 return true; 917 return true;
918 } 918 }
919 919
920 if (m_autoWrap && betweenWords) { 920 if (m_autoWrap && betweenWords) {
921 m_width.commit(); 921 m_width.commit();
922 wrapW = 0; 922 wrapW = 0;
923 m_lineBreak.moveTo(m_current.object(), m_current.m_pos, m_curren t.nextBreakablePosition()); 923 m_lineBreak.moveTo(m_current.object(), m_current.offset(), m_cur rent.nextBreakablePosition());
924 // Auto-wrapping text should not wrap in the middle of a word on ce it has had an 924 // Auto-wrapping text should not wrap in the middle of a word on ce it has had an
925 // opportunity to break after a word. 925 // opportunity to break after a word.
926 breakWords = false; 926 breakWords = false;
927 } 927 }
928 928
929 if (midWordBreak && !U16_IS_TRAIL(c) && !(category(c) & (Mark_NonSpa cing | Mark_Enclosing | Mark_SpacingCombining))) { 929 if (midWordBreak && !U16_IS_TRAIL(c) && !(category(c) & (Mark_NonSpa cing | Mark_Enclosing | Mark_SpacingCombining))) {
930 // Remember this as a breakable position in case 930 // Remember this as a breakable position in case
931 // adding the end width forces a break. 931 // adding the end width forces a break.
932 m_lineBreak.moveTo(m_current.object(), m_current.m_pos, m_curren t.nextBreakablePosition()); 932 m_lineBreak.moveTo(m_current.object(), m_current.offset(), m_cur rent.nextBreakablePosition());
933 midWordBreak &= (breakWords || breakAll); 933 midWordBreak &= (breakWords || breakAll);
934 } 934 }
935 935
936 if (betweenWords) { 936 if (betweenWords) {
937 lastSpaceWordSpacing = applyWordSpacing ? wordSpacing : 0; 937 lastSpaceWordSpacing = applyWordSpacing ? wordSpacing : 0;
938 wordSpacingForWordMeasurement = (applyWordSpacing && wordMeasure ment.width) ? wordSpacing : 0; 938 wordSpacingForWordMeasurement = (applyWordSpacing && wordMeasure ment.width) ? wordSpacing : 0;
939 lastSpace = m_current.m_pos; 939 lastSpace = m_current.offset();
940 } 940 }
941 941
942 if (!m_ignoringSpaces && m_currentStyle->collapseWhiteSpace()) { 942 if (!m_ignoringSpaces && m_currentStyle->collapseWhiteSpace()) {
943 // If we encounter a newline, or if we encounter a 943 // If we encounter a newline, or if we encounter a
944 // second space, we need to go ahead and break up this 944 // second space, we need to go ahead and break up this
945 // run and enter a mode where we start collapsing spaces. 945 // run and enter a mode where we start collapsing spaces.
946 if (m_currentCharacterIsSpace && previousCharacterIsSpace) { 946 if (m_currentCharacterIsSpace && previousCharacterIsSpace) {
947 m_ignoringSpaces = true; 947 m_ignoringSpaces = true;
948 948
949 // We just entered a mode where we are ignoring 949 // We just entered a mode where we are ignoring
950 // spaces. Create a midpoint to terminate the run 950 // spaces. Create a midpoint to terminate the run
951 // before the second space. 951 // before the second space.
952 startIgnoringSpaces(m_lineMidpointState, m_startOfIgnoredSpa ces); 952 startIgnoringSpaces(m_lineMidpointState, m_startOfIgnoredSpa ces);
953 m_trailingObjects.updateMidpointsForTrailingBoxes(m_lineMidp ointState, InlineIterator(), TrailingObjects::DoNotCollapseFirstSpace); 953 m_trailingObjects.updateMidpointsForTrailingBoxes(m_lineMidp ointState, InlineIterator(), TrailingObjects::DoNotCollapseFirstSpace);
954 } 954 }
955 } 955 }
956 } else if (m_ignoringSpaces) { 956 } else if (m_ignoringSpaces) {
957 // Stop ignoring spaces and begin at this 957 // Stop ignoring spaces and begin at this
958 // new point. 958 // new point.
959 m_ignoringSpaces = false; 959 m_ignoringSpaces = false;
960 lastSpaceWordSpacing = applyWordSpacing ? wordSpacing : 0; 960 lastSpaceWordSpacing = applyWordSpacing ? wordSpacing : 0;
961 wordSpacingForWordMeasurement = (applyWordSpacing && wordMeasurement s.last().width) ? wordSpacing : 0; 961 wordSpacingForWordMeasurement = (applyWordSpacing && wordMeasurement s.last().width) ? wordSpacing : 0;
962 lastSpace = m_current.m_pos; // e.g., "Foo goo", don't add in any of the ignored spaces. 962 lastSpace = m_current.offset(); // e.g., "Foo goo", don't add in any of the ignored spaces.
963 stopIgnoringSpaces(m_lineMidpointState, InlineIterator(0, m_current. object(), m_current.m_pos)); 963 stopIgnoringSpaces(m_lineMidpointState, InlineIterator(0, m_current. object(), m_current.offset()));
964 } 964 }
965 965
966 if (isSVGText && m_current.m_pos > 0) { 966 if (isSVGText && m_current.offset()) {
967 // Force creation of new InlineBoxes for each absolute positioned ch aracter (those that start new text chunks). 967 // Force creation of new InlineBoxes for each absolute positioned ch aracter (those that start new text chunks).
968 if (toRenderSVGInlineText(renderText)->characterStartsNewTextChunk(m _current.m_pos)) 968 if (toRenderSVGInlineText(renderText)->characterStartsNewTextChunk(m _current.offset()))
969 ensureCharacterGetsLineBox(m_lineMidpointState, m_current); 969 ensureCharacterGetsLineBox(m_lineMidpointState, m_current);
970 } 970 }
971 971
972 if (m_currentCharacterIsSpace && !previousCharacterIsSpace) { 972 if (m_currentCharacterIsSpace && !previousCharacterIsSpace) {
973 m_startOfIgnoredSpaces.setObject(m_current.object()); 973 m_startOfIgnoredSpaces.setObject(m_current.object());
974 m_startOfIgnoredSpaces.m_pos = m_current.m_pos; 974 m_startOfIgnoredSpaces.setOffset(m_current.offset());
975 } 975 }
976 976
977 if (!m_currentCharacterIsSpace && previousCharacterShouldCollapseIfPreWa p) { 977 if (!m_currentCharacterIsSpace && previousCharacterShouldCollapseIfPreWa p) {
978 if (m_autoWrap && m_currentStyle->breakOnlyAfterWhiteSpace()) 978 if (m_autoWrap && m_currentStyle->breakOnlyAfterWhiteSpace())
979 m_lineBreak.moveTo(m_current.object(), m_current.m_pos, m_curren t.nextBreakablePosition()); 979 m_lineBreak.moveTo(m_current.object(), m_current.offset(), m_cur rent.nextBreakablePosition());
980 } 980 }
981 981
982 if (m_collapseWhiteSpace && m_currentCharacterIsSpace && !m_ignoringSpac es) 982 if (m_collapseWhiteSpace && m_currentCharacterIsSpace && !m_ignoringSpac es)
983 m_trailingObjects.setTrailingWhitespace(toRenderText(m_current.objec t())); 983 m_trailingObjects.setTrailingWhitespace(toRenderText(m_current.objec t()));
984 else if (!m_currentStyle->collapseWhiteSpace() || !m_currentCharacterIsS pace) 984 else if (!m_currentStyle->collapseWhiteSpace() || !m_currentCharacterIsS pace)
985 m_trailingObjects.clear(); 985 m_trailingObjects.clear();
986 986
987 m_atStart = false; 987 m_atStart = false;
988 nextCharacter(c, lastCharacter, secondToLastCharacter); 988 nextCharacter(c, lastCharacter, secondToLastCharacter);
989 } 989 }
990 990
991 m_renderTextInfo.m_lineBreakIterator.setPriorContext(lastCharacter, secondTo LastCharacter); 991 m_renderTextInfo.m_lineBreakIterator.setPriorContext(lastCharacter, secondTo LastCharacter);
992 992
993 wordMeasurements.grow(wordMeasurements.size() + 1); 993 wordMeasurements.grow(wordMeasurements.size() + 1);
994 WordMeasurement& wordMeasurement = wordMeasurements.last(); 994 WordMeasurement& wordMeasurement = wordMeasurements.last();
995 wordMeasurement.renderer = renderText; 995 wordMeasurement.renderer = renderText;
996 996
997 // IMPORTANT: current.m_pos is > length here! 997 // IMPORTANT: current.m_pos is > length here!
998 float additionalTmpW = m_ignoringSpaces ? 0 : textWidth(renderText, lastSpac e, m_current.m_pos - lastSpace, font, m_width.currentWidth(), isFixedPitch, m_co llapseWhiteSpace, &wordMeasurement.fallbackFonts, textLayout); 998 float additionalTmpW = m_ignoringSpaces ? 0 : textWidth(renderText, lastSpac e, m_current.offset() - lastSpace, font, m_width.currentWidth(), isFixedPitch, m _collapseWhiteSpace, &wordMeasurement.fallbackFonts, textLayout);
999 wordMeasurement.startOffset = lastSpace; 999 wordMeasurement.startOffset = lastSpace;
1000 wordMeasurement.endOffset = m_current.m_pos; 1000 wordMeasurement.endOffset = m_current.offset();
1001 wordMeasurement.width = m_ignoringSpaces ? 0 : additionalTmpW + wordSpacingF orWordMeasurement; 1001 wordMeasurement.width = m_ignoringSpaces ? 0 : additionalTmpW + wordSpacingF orWordMeasurement;
1002 additionalTmpW += lastSpaceWordSpacing; 1002 additionalTmpW += lastSpaceWordSpacing;
1003 m_width.addUncommittedWidth(additionalTmpW + inlineLogicalWidth(m_current.ob ject(), !m_appliedStartWidth, m_includeEndWidth)); 1003 m_width.addUncommittedWidth(additionalTmpW + inlineLogicalWidth(m_current.ob ject(), !m_appliedStartWidth, m_includeEndWidth));
1004 m_includeEndWidth = false; 1004 m_includeEndWidth = false;
1005 1005
1006 if (!m_width.fitsOnLine()) { 1006 if (!m_width.fitsOnLine()) {
1007 if (!hyphenated && m_lineBreak.previousInSameNode() == softHyphen) { 1007 if (!hyphenated && m_lineBreak.previousInSameNode() == softHyphen) {
1008 hyphenated = true; 1008 hyphenated = true;
1009 m_atEnd = true; 1009 m_atEnd = true;
1010 } 1010 }
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
1086 InlineIterator* midpoints = lineMidpointState.midpoints.data(); 1086 InlineIterator* midpoints = lineMidpointState.midpoints.data();
1087 InlineIterator& endpoint = midpoints[lineMidpointState.numMidpoints - 2] ; 1087 InlineIterator& endpoint = midpoints[lineMidpointState.numMidpoints - 2] ;
1088 const InlineIterator& startpoint = midpoints[lineMidpointState.numMidpoi nts - 1]; 1088 const InlineIterator& startpoint = midpoints[lineMidpointState.numMidpoi nts - 1];
1089 InlineIterator currpoint = endpoint; 1089 InlineIterator currpoint = endpoint;
1090 while (!currpoint.atEnd() && currpoint != startpoint && currpoint != lBr eak) 1090 while (!currpoint.atEnd() && currpoint != startpoint && currpoint != lBr eak)
1091 currpoint.increment(); 1091 currpoint.increment();
1092 if (currpoint == lBreak) { 1092 if (currpoint == lBreak) {
1093 // We hit the line break before the start point. Shave off the start point. 1093 // We hit the line break before the start point. Shave off the start point.
1094 lineMidpointState.numMidpoints--; 1094 lineMidpointState.numMidpoints--;
1095 if (endpoint.object()->style()->collapseWhiteSpace() && endpoint.obj ect()->isText()) 1095 if (endpoint.object()->style()->collapseWhiteSpace() && endpoint.obj ect()->isText())
1096 endpoint.m_pos--; 1096 endpoint.setOffset(endpoint.offset() - 1);
1097 } 1097 }
1098 } 1098 }
1099 } 1099 }
1100 1100
1101 InlineIterator BreakingContext::handleEndOfLine() 1101 InlineIterator BreakingContext::handleEndOfLine()
1102 { 1102 {
1103 ShapeInsideInfo* shapeInfo = m_block->layoutShapeInsideInfo(); 1103 ShapeInsideInfo* shapeInfo = m_block->layoutShapeInsideInfo();
1104 bool segmentAllowsOverflow = !shapeInfo || !shapeInfo->hasSegments(); 1104 bool segmentAllowsOverflow = !shapeInfo || !shapeInfo->hasSegments();
1105 1105
1106 if (m_lineBreak == m_resolver.position() && (!m_lineBreak.object() || !m_lin eBreak.object()->isBR()) && segmentAllowsOverflow) { 1106 if (m_lineBreak == m_resolver.position() && (!m_lineBreak.object() || !m_lin eBreak.object()->isBR()) && segmentAllowsOverflow) {
1107 // we just add as much as possible 1107 // we just add as much as possible
1108 if (m_blockStyle->whiteSpace() == PRE && !m_current.m_pos) { 1108 if (m_blockStyle->whiteSpace() == PRE && !m_current.offset()) {
1109 m_lineBreak.moveTo(m_lastObject, m_lastObject->isText() ? m_lastObje ct->length() : 0); 1109 m_lineBreak.moveTo(m_lastObject, m_lastObject->isText() ? m_lastObje ct->length() : 0);
1110 } else if (m_lineBreak.object()) { 1110 } else if (m_lineBreak.object()) {
1111 // Don't ever break in the middle of a word if we can help it. 1111 // Don't ever break in the middle of a word if we can help it.
1112 // There's no room at all. We just have to be on this line, 1112 // There's no room at all. We just have to be on this line,
1113 // even though we'll spill out. 1113 // even though we'll spill out.
1114 m_lineBreak.moveTo(m_current.object(), m_current.m_pos); 1114 m_lineBreak.moveTo(m_current.object(), m_current.offset());
1115 } 1115 }
1116 } 1116 }
1117 1117
1118 // FIXME Bug 100049: We do not need to consume input in a multi-segment line 1118 // FIXME Bug 100049: We do not need to consume input in a multi-segment line
1119 // unless no segment will. 1119 // unless no segment will.
1120 // make sure we consume at least one char/object. 1120 // make sure we consume at least one char/object.
1121 if (m_lineBreak == m_resolver.position() && segmentAllowsOverflow) 1121 if (m_lineBreak == m_resolver.position() && segmentAllowsOverflow)
1122 m_lineBreak.increment(); 1122 m_lineBreak.increment();
1123 1123
1124 // Sanity check our midpoints. 1124 // Sanity check our midpoints.
1125 checkMidpoints(m_lineMidpointState, m_lineBreak); 1125 checkMidpoints(m_lineMidpointState, m_lineBreak);
1126 1126
1127 m_trailingObjects.updateMidpointsForTrailingBoxes(m_lineMidpointState, m_lin eBreak, TrailingObjects::CollapseFirstSpace); 1127 m_trailingObjects.updateMidpointsForTrailingBoxes(m_lineMidpointState, m_lin eBreak, TrailingObjects::CollapseFirstSpace);
1128 1128
1129 // We might have made lineBreak an iterator that points past the end 1129 // We might have made lineBreak an iterator that points past the end
1130 // of the object. Do this adjustment to make it point to the start 1130 // of the object. Do this adjustment to make it point to the start
1131 // of the next object instead to avoid confusing the rest of the 1131 // of the next object instead to avoid confusing the rest of the
1132 // code. 1132 // code.
1133 if (m_lineBreak.m_pos > 0) { 1133 if (m_lineBreak.offset()) {
1134 // This loop enforces the invariant that line breaks should never point 1134 // This loop enforces the invariant that line breaks should never point
1135 // at an empty inline. See http://crbug.com/305904. 1135 // at an empty inline. See http://crbug.com/305904.
1136 do { 1136 do {
1137 m_lineBreak.m_pos--; 1137 m_lineBreak.setOffset(m_lineBreak.offset() - 1);
1138 m_lineBreak.increment(); 1138 m_lineBreak.increment();
1139 } while (!m_lineBreak.atEnd() && isEmptyInline(m_lineBreak.object())); 1139 } while (!m_lineBreak.atEnd() && isEmptyInline(m_lineBreak.object()));
1140 } 1140 }
1141 1141
1142 return m_lineBreak; 1142 return m_lineBreak;
1143 } 1143 }
1144 1144
1145 } 1145 }
1146 1146
1147 #endif // BreakingContextInlineHeaders_h 1147 #endif // BreakingContextInlineHeaders_h
OLDNEW
« no previous file with comments | « Source/core/rendering/RenderBlockLineLayout.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698