summaryrefslogtreecommitdiff
path: root/Source/WebCore/rendering/SimpleLineLayoutResolver.h
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2016-05-24 08:28:08 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2016-05-24 08:28:08 +0000
commita4e969f4965059196ca948db781e52f7cfebf19e (patch)
tree6ca352808c8fdc52006a0f33f6ae3c593b23867d /Source/WebCore/rendering/SimpleLineLayoutResolver.h
parent41386e9cb918eed93b3f13648cbef387e371e451 (diff)
downloadWebKitGtk-tarball-a4e969f4965059196ca948db781e52f7cfebf19e.tar.gz
webkitgtk-2.12.3webkitgtk-2.12.3
Diffstat (limited to 'Source/WebCore/rendering/SimpleLineLayoutResolver.h')
-rw-r--r--Source/WebCore/rendering/SimpleLineLayoutResolver.h161
1 files changed, 41 insertions, 120 deletions
diff --git a/Source/WebCore/rendering/SimpleLineLayoutResolver.h b/Source/WebCore/rendering/SimpleLineLayoutResolver.h
index 052f66d0a..ef3900fed 100644
--- a/Source/WebCore/rendering/SimpleLineLayoutResolver.h
+++ b/Source/WebCore/rendering/SimpleLineLayoutResolver.h
@@ -28,7 +28,7 @@
#include "LayoutRect.h"
#include "RenderBlockFlow.h"
-#include "RenderText.h"
+#include "SimpleLineLayoutFlowContents.h"
#include "SimpleLineLayoutFunctions.h"
#include <wtf/Vector.h>
#include <wtf/text/WTFString.h>
@@ -50,6 +50,7 @@ private:
};
class RunResolver {
+ WTF_MAKE_FAST_ALLOCATED;
public:
class Iterator;
@@ -60,35 +61,42 @@ public:
unsigned start() const;
unsigned end() const;
- LayoutRect rect() const;
- FloatPoint baseline() const;
- String text() const;
+ FloatRect rect() const;
+ int baselinePosition() const;
+ StringView text() const;
+ bool isEndOfLine() const;
unsigned lineIndex() const;
private:
+ float computeBaselinePosition() const;
+
const Iterator& m_iterator;
};
class Iterator {
+ friend class Run;
+ friend class RunResolver;
+ friend class LineResolver;
public:
Iterator(const RunResolver&, unsigned runIndex, unsigned lineIndex);
Iterator& operator++();
+ Iterator& operator--();
bool operator==(const Iterator&) const;
bool operator!=(const Iterator&) const;
Run operator*() const;
+ private:
+ const SimpleLineLayout::Run& simpleRun() const;
+ unsigned lineIndex() const { return m_lineIndex; }
Iterator& advance();
Iterator& advanceLines(unsigned);
-
const RunResolver& resolver() const { return m_resolver; }
- const SimpleLineLayout::Run& simpleRun() const;
- unsigned lineIndex() const { return m_lineIndex; }
+ bool inQuirksMode() const { return m_resolver.m_inQuirksMode; }
- private:
const RunResolver& m_resolver;
unsigned m_runIndex;
unsigned m_lineIndex;
@@ -96,21 +104,27 @@ public:
RunResolver(const RenderBlockFlow&, const Layout&);
+ const RenderBlockFlow& flow() const { return m_flowRenderer; }
Iterator begin() const;
Iterator end() const;
Range<Iterator> rangeForRect(const LayoutRect&) const;
+ Range<Iterator> rangeForRenderer(const RenderObject&) const;
private:
- unsigned lineIndexForHeight(LayoutUnit) const;
+ enum class IndexType { First, Last };
+ unsigned lineIndexForHeight(LayoutUnit, IndexType) const;
+ const RenderBlockFlow& m_flowRenderer;
const Layout& m_layout;
- const String m_string;
+ const FlowContents m_flowContents;
const LayoutUnit m_lineHeight;
const LayoutUnit m_baseline;
const LayoutUnit m_borderAndPaddingBefore;
const float m_ascent;
const float m_descent;
+ const float m_visualOverflowOffset;
+ const bool m_inQuirksMode;
};
class LineResolver {
@@ -125,7 +139,7 @@ public:
bool operator==(const Iterator&) const;
bool operator!=(const Iterator&) const;
- const LayoutRect operator*() const;
+ const FloatRect operator*() const;
private:
RunResolver::Iterator m_runIterator;
@@ -146,11 +160,6 @@ private:
RunResolver runResolver(const RenderBlockFlow&, const Layout&);
LineResolver lineResolver(const RenderBlockFlow&, const Layout&);
-inline RunResolver::Run::Run(const Iterator& iterator)
- : m_iterator(iterator)
-{
-}
-
inline unsigned RunResolver::Run::start() const
{
return m_iterator.simpleRun().start;
@@ -161,48 +170,38 @@ inline unsigned RunResolver::Run::end() const
return m_iterator.simpleRun().end;
}
-inline LayoutRect RunResolver::Run::rect() const
+inline int RunResolver::Run::baselinePosition() const
{
- auto& resolver = m_iterator.resolver();
- auto& run = m_iterator.simpleRun();
-
- float baselinePosition = resolver.m_lineHeight * m_iterator.lineIndex() + resolver.m_baseline;
- LayoutPoint linePosition(LayoutUnit::fromFloatFloor(run.left), roundToInt(baselinePosition - resolver.m_ascent + resolver.m_borderAndPaddingBefore));
- LayoutSize lineSize(LayoutUnit::fromFloatCeil(run.right) - LayoutUnit::fromFloatFloor(run.left), resolver.m_ascent + resolver.m_descent);
- return LayoutRect(linePosition, lineSize);
+ return roundToInt(computeBaselinePosition());
}
-inline FloatPoint RunResolver::Run::baseline() const
+inline bool RunResolver::Run::isEndOfLine() const
{
- auto& resolver = m_iterator.resolver();
- auto& run = m_iterator.simpleRun();
-
- float baselinePosition = resolver.m_lineHeight * m_iterator.lineIndex() + resolver.m_baseline;
- return FloatPoint(run.left, roundToInt(baselinePosition + resolver.m_borderAndPaddingBefore));
+ return m_iterator.simpleRun().isEndOfLine;
}
-inline String RunResolver::Run::text() const
+inline unsigned RunResolver::Run::lineIndex() const
{
- auto& resolver = m_iterator.resolver();
- auto& run = m_iterator.simpleRun();
- return resolver.m_string.substringSharingImpl(run.start, run.end - run.start);
+ return m_iterator.lineIndex();
}
-inline unsigned RunResolver::Run::lineIndex() const
+inline RunResolver::Iterator& RunResolver::Iterator::operator++()
{
- return m_iterator.lineIndex();
+ return advance();
}
-inline RunResolver::Iterator::Iterator(const RunResolver& resolver, unsigned runIndex, unsigned lineIndex)
- : m_resolver(resolver)
- , m_runIndex(runIndex)
- , m_lineIndex(lineIndex)
+inline float RunResolver::Run::computeBaselinePosition() const
{
+ auto& resolver = m_iterator.resolver();
+ return resolver.m_lineHeight * lineIndex() + resolver.m_baseline + resolver.m_borderAndPaddingBefore;
}
-inline RunResolver::Iterator& RunResolver::Iterator::operator++()
+inline RunResolver::Iterator& RunResolver::Iterator::operator--()
{
- return advance();
+ --m_runIndex;
+ if (simpleRun().isEndOfLine)
+ --m_lineIndex;
+ return *this;
}
inline bool RunResolver::Iterator::operator==(const Iterator& other) const
@@ -221,45 +220,11 @@ inline RunResolver::Run RunResolver::Iterator::operator*() const
return Run(*this);
}
-inline RunResolver::Iterator& RunResolver::Iterator::advance()
-{
- if (simpleRun().isEndOfLine)
- ++m_lineIndex;
- ++m_runIndex;
- return *this;
-}
-
-inline RunResolver::Iterator& RunResolver::Iterator::advanceLines(unsigned lineCount)
-{
- unsigned runCount = m_resolver.m_layout.runCount();
- if (runCount == m_resolver.m_layout.lineCount()) {
- m_runIndex = std::min(runCount, m_runIndex + lineCount);
- m_lineIndex = m_runIndex;
- return *this;
- }
- unsigned target = m_lineIndex + lineCount;
- while (m_lineIndex < target && m_runIndex < runCount)
- advance();
-
- return *this;
-}
-
inline const SimpleLineLayout::Run& RunResolver::Iterator::simpleRun() const
{
return m_resolver.m_layout.runAt(m_runIndex);
}
-inline RunResolver::RunResolver(const RenderBlockFlow& flow, const Layout& layout)
- : m_layout(layout)
- , m_string(toRenderText(*flow.firstChild()).text())
- , m_lineHeight(lineHeightFromFlow(flow))
- , m_baseline(baselineFromFlow(flow))
- , m_borderAndPaddingBefore(flow.borderAndPaddingBefore())
- , m_ascent(flow.style().font().fontMetrics().ascent())
- , m_descent(flow.style().font().fontMetrics().descent())
-{
-}
-
inline RunResolver::Iterator RunResolver::begin() const
{
return Iterator(*this, 0, 0);
@@ -270,34 +235,6 @@ inline RunResolver::Iterator RunResolver::end() const
return Iterator(*this, m_layout.runCount(), m_layout.lineCount());
}
-inline unsigned RunResolver::lineIndexForHeight(LayoutUnit height) const
-{
- ASSERT(m_lineHeight);
- float y = std::max<float>(height - m_borderAndPaddingBefore - m_baseline + m_ascent, 0);
- return std::min<unsigned>(y / m_lineHeight, m_layout.lineCount() - 1);
-}
-
-inline Range<RunResolver::Iterator> RunResolver::rangeForRect(const LayoutRect& rect) const
-{
- if (!m_lineHeight)
- return Range<Iterator>(begin(), end());
-
- unsigned firstLine = lineIndexForHeight(rect.y());
- unsigned lastLine = lineIndexForHeight(rect.maxY());
-
- auto rangeBegin = begin().advanceLines(firstLine);
- if (rangeBegin == end())
- return Range<Iterator>(end(), end());
- auto rangeEnd = rangeBegin;
- rangeEnd.advanceLines(lastLine - firstLine + 1);
- return Range<Iterator>(rangeBegin, rangeEnd);
-}
-
-inline LineResolver::Iterator::Iterator(RunResolver::Iterator runIterator)
- : m_runIterator(runIterator)
-{
-}
-
inline LineResolver::Iterator& LineResolver::Iterator::operator++()
{
m_runIterator.advanceLines(1);
@@ -314,22 +251,6 @@ inline bool LineResolver::Iterator::operator!=(const Iterator& other) const
return m_runIterator != other.m_runIterator;
}
-inline const LayoutRect LineResolver::Iterator::operator*() const
-{
- unsigned currentLine = m_runIterator.lineIndex();
- auto it = m_runIterator;
- LayoutRect rect = (*it).rect();
- while (it.advance().lineIndex() == currentLine)
- rect.unite((*it).rect());
-
- return rect;
-}
-
-inline LineResolver::LineResolver(const RenderBlockFlow& flow, const Layout& layout)
- : m_runResolver(flow, layout)
-{
-}
-
inline LineResolver::Iterator LineResolver::begin() const
{
return Iterator(m_runResolver.begin());