dfb28d4c435c0b884b8f172d7ac112c967ffffac
[WebKit-https.git] / Source / WebCore / rendering / SimpleLineLayoutFlowContents.cpp
1 /*
2  * Copyright (C) 2014 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "SimpleLineLayoutFlowContents.h"
28
29 #include "RenderBlockFlow.h"
30
31 namespace WebCore {
32 namespace SimpleLineLayout {
33
34 FlowContents::FlowContents(const RenderBlockFlow& flow)
35     : m_flow(flow)
36     , m_style(flow.style())
37     , m_lineBreakIterator(downcast<RenderText>(*flow.firstChild()).text(), flow.style().locale())
38 {
39 }
40
41 unsigned FlowContents::findNextBreakablePosition(unsigned position)
42 {
43     String string = m_lineBreakIterator.string();
44     return nextBreakablePosition<LChar, false>(m_lineBreakIterator, string.characters8(), string.length(), position);
45 }
46
47 unsigned FlowContents::findNextNonWhitespacePosition(unsigned position, unsigned& spaceCount) const
48 {
49     String string = m_lineBreakIterator.string();
50     unsigned length = string.length();
51     const LChar* text = string.characters8();
52     spaceCount = 0;
53     for (; position < length; ++position) {
54         bool isSpace = text[position] == ' ';
55         if (!(isSpace || text[position] == '\t' || (!m_style.preserveNewline && text[position] == '\n')))
56             return position;
57         if (isSpace)
58             ++spaceCount;
59     }
60     return length;
61 }
62
63 float FlowContents::textWidth(unsigned from, unsigned to, float xPosition) const
64 {
65     String string = m_lineBreakIterator.string();
66     unsigned length = string.length();
67     if (m_style.font.isFixedPitch() || (!from && to == length)) {
68         const RenderText& renderer = downcast<RenderText>(*m_flow.firstChild());
69         return renderer.width(from, to - from, m_style.font, xPosition, nullptr, nullptr);
70     }
71
72     TextRun run(string.characters8() + from, to - from);
73     run.setXPos(xPosition);
74     run.setCharactersLength(length - from);
75     run.setTabSize(!!m_style.tabWidth, m_style.tabWidth);
76     ASSERT(run.charactersLength() >= run.length());
77     return m_style.font.width(run);
78 }
79
80 bool FlowContents::resolveRendererPositions(const RenderText& renderer, unsigned& startPosition, unsigned& endPosition) const
81 {
82     ASSERT(&renderer == downcast<RenderText>(m_flow.firstChild()));
83     startPosition = 0;
84     endPosition = renderer.text()->length();
85     return true;
86 }
87
88 const RenderText& FlowContents::renderer(unsigned) const
89 {
90     return downcast<RenderText>(*m_flow.firstChild());
91 }
92
93 }
94 }