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

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

Issue 1119663002: Making Unicode character names consistent (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebase patch Created 5 years, 7 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/layout/LayoutTreeAsText.cpp ('k') | Source/core/layout/line/InlineIterator.h » ('j') | 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 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 if (it.object()->isFloatingOrOutOfFlowPositioned()) 187 if (it.object()->isFloatingOrOutOfFlowPositioned())
188 return false; 188 return false;
189 189
190 if (it.object()->isLayoutInline() && !alwaysRequiresLineBox(it.object()) && !requiresLineBoxForContent(toLayoutInline(it.object()), lineInfo)) 190 if (it.object()->isLayoutInline() && !alwaysRequiresLineBox(it.object()) && !requiresLineBoxForContent(toLayoutInline(it.object()), lineInfo))
191 return false; 191 return false;
192 192
193 if (!shouldCollapseWhiteSpace(it.object()->styleRef(), lineInfo, whitespaceP osition) || it.object()->isBR()) 193 if (!shouldCollapseWhiteSpace(it.object()->styleRef(), lineInfo, whitespaceP osition) || it.object()->isBR())
194 return true; 194 return true;
195 195
196 UChar current = it.current(); 196 UChar current = it.current();
197 bool notJustWhitespace = current != space && current != characterTabulation && current != softHyphen && (current != newlineCharacter || it.object()->preserv esNewline()); 197 bool notJustWhitespace = current != spaceCharacter && current != tabulationC haracter && current != softHyphenCharacter && (current != newlineCharacter || it .object()->preservesNewline());
198 return notJustWhitespace || isEmptyInline(it.object()); 198 return notJustWhitespace || isEmptyInline(it.object());
199 } 199 }
200 200
201 inline void setStaticPositions(LayoutBlockFlow* block, LayoutBox* child) 201 inline void setStaticPositions(LayoutBlockFlow* block, LayoutBox* child)
202 { 202 {
203 ASSERT(child->isOutOfFlowPositioned()); 203 ASSERT(child->isOutOfFlowPositioned());
204 // FIXME: The math here is actually not really right. It's a best-guess appr oximation that 204 // FIXME: The math here is actually not really right. It's a best-guess appr oximation that
205 // will work for the common cases 205 // will work for the common cases
206 LayoutObject* containerBlock = child->container(); 206 LayoutObject* containerBlock = child->container();
207 LayoutUnit blockHeight = block->logicalHeight(); 207 LayoutUnit blockHeight = block->logicalHeight();
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after
572 m_layoutTextInfo.m_text = layoutText; 572 m_layoutTextInfo.m_text = layoutText;
573 m_layoutTextInfo.m_font = &font; 573 m_layoutTextInfo.m_font = &font;
574 m_layoutTextInfo.m_lineBreakIterator.resetStringAndReleaseIterator(layou tText->text(), style.locale()); 574 m_layoutTextInfo.m_lineBreakIterator.resetStringAndReleaseIterator(layou tText->text(), style.locale());
575 } else if (m_layoutTextInfo.m_font != &font) { 575 } else if (m_layoutTextInfo.m_font != &font) {
576 m_layoutTextInfo.m_font = &font; 576 m_layoutTextInfo.m_font = &font;
577 } 577 }
578 578
579 // Non-zero only when kerning is enabled, in which case we measure 579 // Non-zero only when kerning is enabled, in which case we measure
580 // words with their trailing space, then subtract its width. 580 // words with their trailing space, then subtract its width.
581 float wordTrailingSpaceWidth = (font.fontDescription().typesettingFeatures() & Kerning) ? 581 float wordTrailingSpaceWidth = (font.fontDescription().typesettingFeatures() & Kerning) ?
582 font.width(constructTextRun(layoutText, font, &space, 1, style, style.di rection())) + wordSpacing 582 font.width(constructTextRun(layoutText, font, &spaceCharacter, 1, style, style.direction())) + wordSpacing
583 : 0; 583 : 0;
584 584
585 UChar lastCharacter = m_layoutTextInfo.m_lineBreakIterator.lastCharacter(); 585 UChar lastCharacter = m_layoutTextInfo.m_lineBreakIterator.lastCharacter();
586 UChar secondToLastCharacter = m_layoutTextInfo.m_lineBreakIterator.secondToL astCharacter(); 586 UChar secondToLastCharacter = m_layoutTextInfo.m_lineBreakIterator.secondToL astCharacter();
587 for (; m_current.offset() < layoutText->textLength(); m_current.fastIncremen tInTextNode()) { 587 for (; m_current.offset() < layoutText->textLength(); m_current.fastIncremen tInTextNode()) {
588 bool previousCharacterIsSpace = m_currentCharacterIsSpace; 588 bool previousCharacterIsSpace = m_currentCharacterIsSpace;
589 bool previousCharacterShouldCollapseIfPreWap = m_currentCharacterShouldC ollapseIfPreWap; 589 bool previousCharacterShouldCollapseIfPreWap = m_currentCharacterShouldC ollapseIfPreWap;
590 UChar c = m_current.current(); 590 UChar c = m_current.current();
591 m_currentCharacterShouldCollapseIfPreWap = m_currentCharacterIsSpace = c == space || c == characterTabulation || (!m_preservesNewline && (c == newlineCh aracter)); 591 m_currentCharacterShouldCollapseIfPreWap = m_currentCharacterIsSpace = c == spaceCharacter || c == tabulationCharacter || (!m_preservesNewline && (c == newlineCharacter));
592 592
593 if (!m_collapseWhiteSpace || !m_currentCharacterIsSpace) 593 if (!m_collapseWhiteSpace || !m_currentCharacterIsSpace)
594 m_lineInfo.setEmpty(false, m_block, &m_width); 594 m_lineInfo.setEmpty(false, m_block, &m_width);
595 595
596 if (c == softHyphen && m_autoWrap && !hyphenWidth) { 596 if (c == softHyphenCharacter && m_autoWrap && !hyphenWidth) {
597 hyphenWidth = measureHyphenWidth(layoutText, font, textDirectionFrom Unicode(m_resolver.position().direction())); 597 hyphenWidth = measureHyphenWidth(layoutText, font, textDirectionFrom Unicode(m_resolver.position().direction()));
598 m_width.addUncommittedWidth(hyphenWidth); 598 m_width.addUncommittedWidth(hyphenWidth);
599 } 599 }
600 600
601 bool applyWordSpacing = false; 601 bool applyWordSpacing = false;
602 602
603 if (breakWords && !midWordBreak) { 603 if (breakWords && !midWordBreak) {
604 wrapW += charWidth; 604 wrapW += charWidth;
605 bool midWordBreakIsBeforeSurrogatePair = U16_IS_LEAD(c) && m_current .offset() + 1 < layoutText->textLength() && U16_IS_TRAIL((*layoutText)[m_current .offset() + 1]); 605 bool midWordBreakIsBeforeSurrogatePair = U16_IS_LEAD(c) && m_current .offset() + 1 < layoutText->textLength() && U16_IS_TRAIL((*layoutText)[m_current .offset() + 1]);
606 charWidth = textWidth(layoutText, m_current.offset(), midWordBreakIs BeforeSurrogatePair ? 2 : 1, font, m_width.committedWidth() + wrapW, m_collapseW hiteSpace); 606 charWidth = textWidth(layoutText, m_current.offset(), midWordBreakIs BeforeSurrogatePair ? 2 : 1, font, m_width.committedWidth() + wrapW, m_collapseW hiteSpace);
(...skipping 24 matching lines...) Expand all
631 } 631 }
632 632
633 wordMeasurements.grow(wordMeasurements.size() + 1); 633 wordMeasurements.grow(wordMeasurements.size() + 1);
634 WordMeasurement& wordMeasurement = wordMeasurements.last(); 634 WordMeasurement& wordMeasurement = wordMeasurements.last();
635 635
636 wordMeasurement.layoutText = layoutText; 636 wordMeasurement.layoutText = layoutText;
637 wordMeasurement.endOffset = m_current.offset(); 637 wordMeasurement.endOffset = m_current.offset();
638 wordMeasurement.startOffset = lastSpace; 638 wordMeasurement.startOffset = lastSpace;
639 639
640 float additionalTempWidth; 640 float additionalTempWidth;
641 if (wordTrailingSpaceWidth && c == space) 641 if (wordTrailingSpaceWidth && c == spaceCharacter)
642 additionalTempWidth = textWidth(layoutText, lastSpace, m_current .offset() + 1 - lastSpace, font, m_width.currentWidth(), m_collapseWhiteSpace, & wordMeasurement.fallbackFonts) - wordTrailingSpaceWidth; 642 additionalTempWidth = textWidth(layoutText, lastSpace, m_current .offset() + 1 - lastSpace, font, m_width.currentWidth(), m_collapseWhiteSpace, & wordMeasurement.fallbackFonts) - wordTrailingSpaceWidth;
643 else 643 else
644 additionalTempWidth = textWidth(layoutText, lastSpace, m_current .offset() - lastSpace, font, m_width.currentWidth(), m_collapseWhiteSpace, &word Measurement.fallbackFonts); 644 additionalTempWidth = textWidth(layoutText, lastSpace, m_current .offset() - lastSpace, font, m_width.currentWidth(), m_collapseWhiteSpace, &word Measurement.fallbackFonts);
645 645
646 wordMeasurement.width = additionalTempWidth + wordSpacingForWordMeas urement; 646 wordMeasurement.width = additionalTempWidth + wordSpacingForWordMeas urement;
647 additionalTempWidth += lastSpaceWordSpacing; 647 additionalTempWidth += lastSpaceWordSpacing;
648 m_width.addUncommittedWidth(additionalTempWidth); 648 m_width.addUncommittedWidth(additionalTempWidth);
649 649
650 if (m_collapseWhiteSpace && previousCharacterIsSpace && m_currentCha racterIsSpace && additionalTempWidth) 650 if (m_collapseWhiteSpace && previousCharacterIsSpace && m_currentCha racterIsSpace && additionalTempWidth)
651 m_width.setTrailingWhitespaceWidth(additionalTempWidth); 651 m_width.setTrailingWhitespaceWidth(additionalTempWidth);
(...skipping 26 matching lines...) Expand all
678 } 678 }
679 } 679 }
680 if (lineWasTooWide || !m_width.fitsOnLine()) { 680 if (lineWasTooWide || !m_width.fitsOnLine()) {
681 if (m_lineBreak.atTextParagraphSeparator()) { 681 if (m_lineBreak.atTextParagraphSeparator()) {
682 if (!stoppedIgnoringSpaces && m_current.offset() > 0) 682 if (!stoppedIgnoringSpaces && m_current.offset() > 0)
683 m_lineMidpointState.ensureCharacterGetsLineBox(m_cur rent); 683 m_lineMidpointState.ensureCharacterGetsLineBox(m_cur rent);
684 m_lineBreak.increment(); 684 m_lineBreak.increment();
685 m_lineInfo.setPreviousLineBrokeCleanly(true); 685 m_lineInfo.setPreviousLineBrokeCleanly(true);
686 wordMeasurement.endOffset = m_lineBreak.offset(); 686 wordMeasurement.endOffset = m_lineBreak.offset();
687 } 687 }
688 if (m_lineBreak.object() && m_lineBreak.offset() && m_lineBr eak.object()->isText() && toLayoutText(m_lineBreak.object())->textLength() && to LayoutText(m_lineBreak.object())->characterAt(m_lineBreak.offset() - 1) == softH yphen) 688 if (m_lineBreak.object() && m_lineBreak.offset() && m_lineBr eak.object()->isText() && toLayoutText(m_lineBreak.object())->textLength() && to LayoutText(m_lineBreak.object())->characterAt(m_lineBreak.offset() - 1) == softH yphenCharacter)
689 hyphenated = true; 689 hyphenated = true;
690 if (m_lineBreak.offset() && m_lineBreak.offset() != (unsigne d)wordMeasurement.endOffset && !wordMeasurement.width) { 690 if (m_lineBreak.offset() && m_lineBreak.offset() != (unsigne d)wordMeasurement.endOffset && !wordMeasurement.width) {
691 if (charWidth) { 691 if (charWidth) {
692 wordMeasurement.endOffset = m_lineBreak.offset(); 692 wordMeasurement.endOffset = m_lineBreak.offset();
693 wordMeasurement.width = charWidth; 693 wordMeasurement.width = charWidth;
694 } 694 }
695 } 695 }
696 // Didn't fit. Jump to the end unless there's still an oppor tunity to collapse whitespace. 696 // Didn't fit. Jump to the end unless there's still an oppor tunity to collapse whitespace.
697 if (m_ignoringSpaces || !m_collapseWhiteSpace || !m_currentC haracterIsSpace || !previousCharacterIsSpace) { 697 if (m_ignoringSpaces || !m_collapseWhiteSpace || !m_currentC haracterIsSpace || !previousCharacterIsSpace) {
698 m_atEnd = true; 698 m_atEnd = true;
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
809 809
810 LayoutUnit inlineLogicalTempWidth = inlineLogicalWidth(m_current.object(), ! m_appliedStartWidth, m_includeEndWidth); 810 LayoutUnit inlineLogicalTempWidth = inlineLogicalWidth(m_current.object(), ! m_appliedStartWidth, m_includeEndWidth);
811 m_width.addUncommittedWidth(additionalTempWidth + inlineLogicalTempWidth); 811 m_width.addUncommittedWidth(additionalTempWidth + inlineLogicalTempWidth);
812 812
813 if (m_collapseWhiteSpace && m_currentCharacterIsSpace && additionalTempWidth ) 813 if (m_collapseWhiteSpace && m_currentCharacterIsSpace && additionalTempWidth )
814 m_width.setTrailingWhitespaceWidth(additionalTempWidth + inlineLogicalTe mpWidth); 814 m_width.setTrailingWhitespaceWidth(additionalTempWidth + inlineLogicalTe mpWidth);
815 815
816 m_includeEndWidth = false; 816 m_includeEndWidth = false;
817 817
818 if (!m_width.fitsOnLine()) { 818 if (!m_width.fitsOnLine()) {
819 if (!hyphenated && m_lineBreak.previousInSameNode() == softHyphen) { 819 if (!hyphenated && m_lineBreak.previousInSameNode() == softHyphenCharact er) {
820 hyphenated = true; 820 hyphenated = true;
821 m_atEnd = true; 821 m_atEnd = true;
822 } 822 }
823 } 823 }
824 return false; 824 return false;
825 } 825 }
826 826
827 inline void BreakingContext::commitAndUpdateLineBreakIfNeeded() 827 inline void BreakingContext::commitAndUpdateLineBreakIfNeeded()
828 { 828 {
829 bool checkForBreak = m_autoWrap; 829 bool checkForBreak = m_autoWrap;
830 if (m_width.committedWidth() && !m_width.fitsOnLine() && m_lineBreak.object( ) && m_currWS == NOWRAP) { 830 if (m_width.committedWidth() && !m_width.fitsOnLine() && m_lineBreak.object( ) && m_currWS == NOWRAP) {
831 checkForBreak = true; 831 checkForBreak = true;
832 } else if (m_nextObject && m_current.object()->isText() && m_nextObject->isT ext() && !m_nextObject->isBR() && (m_autoWrap || m_nextObject->style()->autoWrap ())) { 832 } else if (m_nextObject && m_current.object()->isText() && m_nextObject->isT ext() && !m_nextObject->isBR() && (m_autoWrap || m_nextObject->style()->autoWrap ())) {
833 if (m_autoWrap && m_currentCharacterIsSpace) { 833 if (m_autoWrap && m_currentCharacterIsSpace) {
834 checkForBreak = true; 834 checkForBreak = true;
835 } else { 835 } else {
836 LayoutText* nextText = toLayoutText(m_nextObject); 836 LayoutText* nextText = toLayoutText(m_nextObject);
837 if (nextText->textLength()) { 837 if (nextText->textLength()) {
838 UChar c = nextText->characterAt(0); 838 UChar c = nextText->characterAt(0);
839 // If the next item on the line is text, and if we did not end w ith 839 // If the next item on the line is text, and if we did not end w ith
840 // a space, then the next text run continues our word (and so it needs to 840 // a space, then the next text run continues our word (and so it needs to
841 // keep adding to the uncommitted width. Just update and continu e. 841 // keep adding to the uncommitted width. Just update and continu e.
842 checkForBreak = !m_currentCharacterIsSpace && (c == space || c = = characterTabulation || (c == newlineCharacter && !m_nextObject->preservesNewli ne())); 842 checkForBreak = !m_currentCharacterIsSpace && (c == spaceCharact er || c == tabulationCharacter || (c == newlineCharacter && !m_nextObject->prese rvesNewline()));
843 } else if (nextText->isWordBreak()) { 843 } else if (nextText->isWordBreak()) {
844 checkForBreak = true; 844 checkForBreak = true;
845 } 845 }
846 846
847 if (!m_width.fitsOnLine() && !m_width.committedWidth()) 847 if (!m_width.fitsOnLine() && !m_width.committedWidth())
848 m_width.fitBelowFloats(m_lineInfo.isFirstLine()); 848 m_width.fitBelowFloats(m_lineInfo.isFirstLine());
849 849
850 bool canPlaceOnLine = m_width.fitsOnLine() || !m_autoWrapWasEverTrue OnLine; 850 bool canPlaceOnLine = m_width.fitsOnLine() || !m_autoWrapWasEverTrue OnLine;
851 if (canPlaceOnLine && checkForBreak) { 851 if (canPlaceOnLine && checkForBreak) {
852 m_width.commit(); 852 m_width.commit();
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
898 898
899 if (style.textIndentType() == TextIndentHanging) 899 if (style.textIndentType() == TextIndentHanging)
900 shouldIndentText = shouldIndentText == IndentText ? DoNotIndentText : In dentText; 900 shouldIndentText = shouldIndentText == IndentText ? DoNotIndentText : In dentText;
901 901
902 return shouldIndentText; 902 return shouldIndentText;
903 } 903 }
904 904
905 } 905 }
906 906
907 #endif // BreakingContextInlineHeaders_h 907 #endif // BreakingContextInlineHeaders_h
OLDNEW
« no previous file with comments | « Source/core/layout/LayoutTreeAsText.cpp ('k') | Source/core/layout/line/InlineIterator.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698