Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / rendering / line / TrailingObjects.cpp
1 /*
2  * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
3  * Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All right reserved.
4  * Copyright (C) 2010 Google Inc. All rights reserved.
5  * Copyright (C) 2014 Adobe Systems Inc.
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Library General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Library General Public License for more details.
16  *
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
19  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20  * Boston, MA 02110-1301, USA.
21  *
22  */
23
24 #include "config.h"
25 #include "core/rendering/line/TrailingObjects.h"
26
27 #include "core/rendering/InlineIterator.h"
28
29 namespace blink {
30
31 void TrailingObjects::updateMidpointsForTrailingObjects(LineMidpointState& lineMidpointState, const InlineIterator& lBreak, CollapseFirstSpaceOrNot collapseFirstSpace)
32 {
33     if (!m_whitespace)
34         return;
35
36     // This object is either going to be part of the last midpoint, or it is going to be the actual endpoint.
37     // In both cases we just decrease our pos by 1 level to exclude the space, allowing it to - in effect - collapse into the newline.
38     if (lineMidpointState.numMidpoints() % 2) {
39         // Find the trailing space object's midpoint.
40         int trailingSpaceMidpoint = lineMidpointState.numMidpoints() - 1;
41         for ( ; trailingSpaceMidpoint > 0 && lineMidpointState.midpoints()[trailingSpaceMidpoint].object() != m_whitespace; --trailingSpaceMidpoint) { }
42         ASSERT(trailingSpaceMidpoint >= 0);
43         if (collapseFirstSpace == CollapseFirstSpace)
44             lineMidpointState.midpoints()[trailingSpaceMidpoint].setOffset(lineMidpointState.midpoints()[trailingSpaceMidpoint].offset() -1);
45
46         // Now make sure every single trailingPositionedBox following the trailingSpaceMidpoint properly stops and starts
47         // ignoring spaces.
48         size_t currentMidpoint = trailingSpaceMidpoint + 1;
49         for (size_t i = 0; i < m_objects.size(); ++i) {
50             if (currentMidpoint >= lineMidpointState.numMidpoints()) {
51                 // We don't have a midpoint for this box yet.
52                 lineMidpointState.ensureLineBoxInsideIgnoredSpaces(m_objects[i]);
53             } else {
54                 ASSERT(lineMidpointState.midpoints()[currentMidpoint].object() == m_objects[i]);
55                 ASSERT(lineMidpointState.midpoints()[currentMidpoint + 1].object() == m_objects[i]);
56             }
57             currentMidpoint += 2;
58         }
59     } else if (!lBreak.object()) {
60         ASSERT(collapseFirstSpace == CollapseFirstSpace);
61         // Add a new end midpoint that stops right at the very end.
62         unsigned length = m_whitespace->textLength();
63         unsigned pos = length >= 2 ? length - 2 : UINT_MAX;
64         InlineIterator endMid(0, m_whitespace, pos);
65         lineMidpointState.startIgnoringSpaces(endMid);
66         for (size_t i = 0; i < m_objects.size(); ++i) {
67             lineMidpointState.ensureLineBoxInsideIgnoredSpaces(m_objects[i]);
68         }
69     }
70 }
71
72 }