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) 2014 Adobe Systems Inc. | 5 * Copyright (C) 2014 Adobe Systems Inc. |
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. |
11 * | 11 * |
12 * This library is distributed in the hope that it will be useful, | 12 * This library is distributed in the hope that it will be useful, |
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
15 * Library General Public License for more details. | 15 * Library General Public License for more details. |
16 * | 16 * |
17 * You should have received a copy of the GNU Library General Public License | 17 * You should have received a copy of the GNU Library General Public License |
18 * along with this library; see the file COPYING.LIB. If not, write to | 18 * along with this library; see the file COPYING.LIB. If not, write to |
19 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | 19 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
20 * Boston, MA 02110-1301, USA. | 20 * Boston, MA 02110-1301, USA. |
21 * | 21 * |
22 */ | 22 */ |
23 | 23 |
24 #include "config.h" | 24 #include "config.h" |
25 #include "core/layout/line/TrailingObjects.h" | 25 #include "core/layout/line/TrailingObjects.h" |
26 | 26 |
| 27 #include "core/layout/line/BreakingContextInlineHeaders.h" |
27 #include "core/layout/line/InlineIterator.h" | 28 #include "core/layout/line/InlineIterator.h" |
28 | 29 |
29 namespace blink { | 30 namespace blink { |
30 | 31 |
31 void TrailingObjects::updateMidpointsForTrailingObjects(LineMidpointState& lineM
idpointState, const InlineIterator& lBreak, CollapseFirstSpaceOrNot collapseFirs
tSpace) | 32 void TrailingObjects::updateMidpointsForTrailingObjects(LineMidpointState& lineM
idpointState, const InlineIterator& lBreak, CollapseFirstSpaceOrNot collapseFirs
tSpace) |
32 { | 33 { |
33 if (!m_whitespace) | 34 if (!m_whitespace) |
34 return; | 35 return; |
35 | 36 |
36 // This object is either going to be part of the last midpoint, or it is goi
ng to be the actual endpoint. | 37 // This object is either going to be part of the last midpoint, or it is goi
ng to be the actual endpoint. |
37 // 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. | 38 // 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. |
38 if (lineMidpointState.numMidpoints() % 2) { | 39 if (lineMidpointState.numMidpoints() % 2) { |
39 // Find the trailing space object's midpoint. | 40 // Find the trailing space object's midpoint. |
40 int trailingSpaceMidpoint = lineMidpointState.numMidpoints() - 1; | 41 int trailingSpaceMidpoint = lineMidpointState.numMidpoints() - 1; |
41 for ( ; trailingSpaceMidpoint > 0 && lineMidpointState.midpoints()[trail
ingSpaceMidpoint].object() != m_whitespace; --trailingSpaceMidpoint) { } | 42 for ( ; trailingSpaceMidpoint > 0 && lineMidpointState.midpoints()[trail
ingSpaceMidpoint].object() != m_whitespace; --trailingSpaceMidpoint) { } |
42 ASSERT(trailingSpaceMidpoint >= 0); | 43 ASSERT(trailingSpaceMidpoint >= 0); |
43 if (collapseFirstSpace == CollapseFirstSpace) | 44 if (collapseFirstSpace == CollapseFirstSpace) |
44 lineMidpointState.midpoints()[trailingSpaceMidpoint].setOffset(lineM
idpointState.midpoints()[trailingSpaceMidpoint].offset() -1); | 45 lineMidpointState.midpoints()[trailingSpaceMidpoint].setOffset(lineM
idpointState.midpoints()[trailingSpaceMidpoint].offset() -1); |
45 | 46 |
46 // Now make sure every single trailingPositionedBox following the traili
ngSpaceMidpoint properly stops and starts | 47 // Now make sure every single trailingPositionedBox following the traili
ngSpaceMidpoint properly stops and starts |
47 // ignoring spaces. | 48 // ignoring spaces. |
48 size_t currentMidpoint = trailingSpaceMidpoint + 1; | 49 size_t currentMidpoint = trailingSpaceMidpoint + 1; |
49 for (size_t i = 0; i < m_objects.size(); ++i) { | 50 for (size_t i = 0; i < m_objects.size(); ++i) { |
50 if (currentMidpoint >= lineMidpointState.numMidpoints()) { | 51 if (currentMidpoint >= lineMidpointState.numMidpoints()) { |
51 // We don't have a midpoint for this box yet. | 52 // We don't have a midpoint for this box yet. |
52 lineMidpointState.ensureLineBoxInsideIgnoredSpaces(m_objects[i])
; | 53 ensureLineBoxInsideIgnoredSpaces(&lineMidpointState, m_objects[i
]); |
53 } else { | 54 } else { |
54 ASSERT(lineMidpointState.midpoints()[currentMidpoint].object() =
= m_objects[i]); | 55 ASSERT(lineMidpointState.midpoints()[currentMidpoint].object() =
= m_objects[i]); |
55 ASSERT(lineMidpointState.midpoints()[currentMidpoint + 1].object
() == m_objects[i]); | 56 ASSERT(lineMidpointState.midpoints()[currentMidpoint + 1].object
() == m_objects[i]); |
56 } | 57 } |
57 currentMidpoint += 2; | 58 currentMidpoint += 2; |
58 } | 59 } |
59 } else if (!lBreak.object()) { | 60 } else if (!lBreak.object()) { |
60 ASSERT(collapseFirstSpace == CollapseFirstSpace); | 61 ASSERT(collapseFirstSpace == CollapseFirstSpace); |
61 // Add a new end midpoint that stops right at the very end. | 62 // Add a new end midpoint that stops right at the very end. |
62 unsigned length = m_whitespace->textLength(); | 63 unsigned length = m_whitespace->textLength(); |
63 unsigned pos = length >= 2 ? length - 2 : UINT_MAX; | 64 unsigned pos = length >= 2 ? length - 2 : UINT_MAX; |
64 InlineIterator endMid(0, m_whitespace, pos); | 65 InlineIterator endMid(0, LineLayoutItem(m_whitespace), pos); |
65 lineMidpointState.startIgnoringSpaces(endMid); | 66 lineMidpointState.startIgnoringSpaces(endMid); |
66 for (size_t i = 0; i < m_objects.size(); ++i) { | 67 for (size_t i = 0; i < m_objects.size(); ++i) { |
67 lineMidpointState.ensureLineBoxInsideIgnoredSpaces(m_objects[i]); | 68 ensureLineBoxInsideIgnoredSpaces(&lineMidpointState, m_objects[i]); |
68 } | 69 } |
69 } | 70 } |
70 } | 71 } |
71 | 72 |
72 } | 73 } |
OLD | NEW |