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 10 matching lines...) Expand all Loading... |
21 * | 21 * |
22 */ | 22 */ |
23 | 23 |
24 #ifndef BreakingContextInlineHeaders_h | 24 #ifndef BreakingContextInlineHeaders_h |
25 #define BreakingContextInlineHeaders_h | 25 #define BreakingContextInlineHeaders_h |
26 | 26 |
27 #include "core/rendering/InlineIterator.h" | 27 #include "core/rendering/InlineIterator.h" |
28 #include "core/rendering/InlineTextBox.h" | 28 #include "core/rendering/InlineTextBox.h" |
29 #include "core/rendering/RenderCombineText.h" | 29 #include "core/rendering/RenderCombineText.h" |
30 #include "core/rendering/RenderInline.h" | 30 #include "core/rendering/RenderInline.h" |
| 31 #include "core/rendering/RenderLayer.h" |
| 32 #include "core/rendering/RenderListMarker.h" |
| 33 #include "core/rendering/RenderRubyRun.h" |
31 #include "core/rendering/break_lines.h" | 34 #include "core/rendering/break_lines.h" |
| 35 #include "core/rendering/line/LineBreaker.h" |
32 #include "core/rendering/line/LineInfo.h" | 36 #include "core/rendering/line/LineInfo.h" |
33 #include "core/rendering/line/LineWidth.h" | 37 #include "core/rendering/line/LineWidth.h" |
34 #include "core/rendering/line/TrailingObjects.h" | 38 #include "core/rendering/line/TrailingObjects.h" |
35 #include "core/rendering/shapes/ShapeInsideInfo.h" | 39 #include "core/rendering/shapes/ShapeInsideInfo.h" |
36 #include "core/rendering/svg/RenderSVGInlineText.h" | 40 #include "core/rendering/svg/RenderSVGInlineText.h" |
37 | 41 |
38 namespace WebCore { | 42 namespace WebCore { |
39 | 43 |
40 // We don't let our line box tree for a single line get any deeper than this. | 44 // We don't let our line box tree for a single line get any deeper than this. |
41 const unsigned cMaxLineDepth = 200; | 45 const unsigned cMaxLineDepth = 200; |
42 | 46 |
43 struct RenderTextInfo { | |
44 RenderTextInfo(); | |
45 ~RenderTextInfo(); | |
46 | |
47 RenderText* m_text; | |
48 LazyLineBreakIterator m_lineBreakIterator; | |
49 const Font* m_font; | |
50 }; | |
51 | |
52 class WordMeasurement { | 47 class WordMeasurement { |
53 public: | 48 public: |
54 WordMeasurement() | 49 WordMeasurement() |
55 : renderer(0) | 50 : renderer(0) |
56 , width(0) | 51 , width(0) |
57 , startOffset(0) | 52 , startOffset(0) |
58 , endOffset(0) | 53 , endOffset(0) |
59 { | 54 { |
60 } | 55 } |
61 | 56 |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 bool m_collapseWhiteSpace; | 160 bool m_collapseWhiteSpace; |
166 bool m_startingNewParagraph; | 161 bool m_startingNewParagraph; |
167 bool m_allowImagesToBreak; | 162 bool m_allowImagesToBreak; |
168 bool m_atEnd; | 163 bool m_atEnd; |
169 | 164 |
170 LineMidpointState& m_lineMidpointState; | 165 LineMidpointState& m_lineMidpointState; |
171 | 166 |
172 TrailingObjects m_trailingObjects; | 167 TrailingObjects m_trailingObjects; |
173 }; | 168 }; |
174 | 169 |
175 enum WhitespacePosition { LeadingWhitespace, TrailingWhitespace }; | |
176 | |
177 inline bool shouldCollapseWhiteSpace(const RenderStyle* style, const LineInfo& l
ineInfo, WhitespacePosition whitespacePosition) | 170 inline bool shouldCollapseWhiteSpace(const RenderStyle* style, const LineInfo& l
ineInfo, WhitespacePosition whitespacePosition) |
178 { | 171 { |
179 // CSS2 16.6.1 | 172 // CSS2 16.6.1 |
180 // If a space (U+0020) at the beginning of a line has 'white-space' set to '
normal', 'nowrap', or 'pre-line', it is removed. | 173 // If a space (U+0020) at the beginning of a line has 'white-space' set to '
normal', 'nowrap', or 'pre-line', it is removed. |
181 // If a space (U+0020) at the end of a line has 'white-space' set to 'normal
', 'nowrap', or 'pre-line', it is also removed. | 174 // If a space (U+0020) at the end of a line has 'white-space' set to 'normal
', 'nowrap', or 'pre-line', it is also removed. |
182 // If spaces (U+0020) or tabs (U+0009) at the end of a line have 'white-spac
e' set to 'pre-wrap', UAs may visually collapse them. | 175 // If spaces (U+0020) or tabs (U+0009) at the end of a line have 'white-spac
e' set to 'pre-wrap', UAs may visually collapse them. |
183 return style->collapseWhiteSpace() | 176 return style->collapseWhiteSpace() |
184 || (whitespacePosition == TrailingWhitespace && style->whiteSpace() == P
RE_WRAP && (!lineInfo.isEmpty() || !lineInfo.previousLineBrokeCleanly())); | 177 || (whitespacePosition == TrailingWhitespace && style->whiteSpace() == P
RE_WRAP && (!lineInfo.isEmpty() || !lineInfo.previousLineBrokeCleanly())); |
185 } | 178 } |
186 | 179 |
(...skipping 758 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
945 | 938 |
946 if (!m_current.object()->isFloatingOrOutOfFlowPositioned()) { | 939 if (!m_current.object()->isFloatingOrOutOfFlowPositioned()) { |
947 m_lastObject = m_current.object(); | 940 m_lastObject = m_current.object(); |
948 if (m_lastObject->isReplaced() && m_autoWrap && (!m_lastObject->isImage(
) || m_allowImagesToBreak) && (!m_lastObject->isListMarker() || toRenderListMark
er(m_lastObject)->isInside())) { | 941 if (m_lastObject->isReplaced() && m_autoWrap && (!m_lastObject->isImage(
) || m_allowImagesToBreak) && (!m_lastObject->isListMarker() || toRenderListMark
er(m_lastObject)->isInside())) { |
949 m_width.commit(); | 942 m_width.commit(); |
950 m_lineBreak.moveToStartOf(m_nextObject); | 943 m_lineBreak.moveToStartOf(m_nextObject); |
951 } | 944 } |
952 } | 945 } |
953 } | 946 } |
954 | 947 |
955 InlineIterator BreakingContext::handleEndOfLine() | 948 inline IndentTextOrNot requiresIndent(bool isFirstLine, bool isAfterHardLineBrea
k, RenderStyle* style) |
956 { | 949 { |
957 ShapeInsideInfo* shapeInfo = m_block->layoutShapeInsideInfo(); | 950 if (isFirstLine) |
958 bool segmentAllowsOverflow = !shapeInfo || !shapeInfo->hasSegments(); | 951 return IndentText; |
| 952 if (isAfterHardLineBreak && style->textIndentLine() == TextIndentEachLine) |
| 953 return IndentText; |
959 | 954 |
960 if (m_lineBreak == m_resolver.position() && (!m_lineBreak.object() || !m_lin
eBreak.object()->isBR()) && segmentAllowsOverflow) { | 955 return DoNotIndentText; |
961 // we just add as much as possible | |
962 if (m_blockStyle->whiteSpace() == PRE && !m_current.offset()) { | |
963 m_lineBreak.moveTo(m_lastObject, m_lastObject->isText() ? m_lastObje
ct->length() : 0); | |
964 } else if (m_lineBreak.object()) { | |
965 // Don't ever break in the middle of a word if we can help it. | |
966 // There's no room at all. We just have to be on this line, | |
967 // even though we'll spill out. | |
968 m_lineBreak.moveTo(m_current.object(), m_current.offset()); | |
969 } | |
970 } | |
971 | |
972 // FIXME Bug 100049: We do not need to consume input in a multi-segment line | |
973 // unless no segment will. | |
974 // make sure we consume at least one char/object. | |
975 if (m_lineBreak == m_resolver.position() && segmentAllowsOverflow) | |
976 m_lineBreak.increment(); | |
977 | |
978 // Sanity check our midpoints. | |
979 m_lineMidpointState.checkMidpoints(m_lineBreak); | |
980 | |
981 m_trailingObjects.updateMidpointsForTrailingBoxes(m_lineMidpointState, m_lin
eBreak, TrailingObjects::CollapseFirstSpace); | |
982 | |
983 // We might have made lineBreak an iterator that points past the end | |
984 // of the object. Do this adjustment to make it point to the start | |
985 // of the next object instead to avoid confusing the rest of the | |
986 // code. | |
987 if (m_lineBreak.offset()) { | |
988 // This loop enforces the invariant that line breaks should never point | |
989 // at an empty inline. See http://crbug.com/305904. | |
990 do { | |
991 m_lineBreak.setOffset(m_lineBreak.offset() - 1); | |
992 m_lineBreak.increment(); | |
993 } while (!m_lineBreak.atEnd() && isEmptyInline(m_lineBreak.object())); | |
994 } | |
995 | |
996 return m_lineBreak; | |
997 } | 956 } |
998 | 957 |
999 } | 958 } |
1000 | 959 |
1001 #endif // BreakingContextInlineHeaders_h | 960 #endif // BreakingContextInlineHeaders_h |
OLD | NEW |