summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/rendering/InlineIterator.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/rendering/InlineIterator.h')
-rw-r--r--Source/WebCore/rendering/InlineIterator.h55
1 files changed, 36 insertions, 19 deletions
diff --git a/Source/WebCore/rendering/InlineIterator.h b/Source/WebCore/rendering/InlineIterator.h
index 75d9763..1f6b21c 100644
--- a/Source/WebCore/rendering/InlineIterator.h
+++ b/Source/WebCore/rendering/InlineIterator.h
@@ -34,15 +34,15 @@ namespace WebCore {
class InlineIterator {
public:
InlineIterator()
- : m_block(0)
+ : m_root(0)
, m_obj(0)
, m_pos(0)
, m_nextBreakablePosition(-1)
{
}
- InlineIterator(RenderBlock* b, RenderObject* o, unsigned p)
- : m_block(b)
+ InlineIterator(RenderObject* root, RenderObject* o, unsigned p)
+ : m_root(root)
, m_obj(o)
, m_pos(p)
, m_nextBreakablePosition(-1)
@@ -63,13 +63,30 @@ public:
m_nextBreakablePosition = nextBreak;
}
- void increment(InlineBidiResolver* resolver = 0);
+ RenderObject* root() const { return m_root; }
+
+ void increment(InlineBidiResolver* = 0);
bool atEnd() const;
+ inline bool atTextParagraphSeparator()
+ {
+ return m_obj && m_obj->preservesNewline() && m_obj->isText() && toRenderText(m_obj)->textLength()
+ && !toRenderText(m_obj)->isWordBreak() && toRenderText(m_obj)->characters()[m_pos] == '\n';
+ }
+
+ inline bool atParagraphSeparator()
+ {
+ return (m_obj && m_obj->isBR()) || atTextParagraphSeparator();
+ }
+
UChar current() const;
ALWAYS_INLINE WTF::Unicode::Direction direction() const;
- RenderBlock* m_block;
+private:
+ RenderObject* m_root;
+
+ // FIXME: These should be private.
+public:
RenderObject* m_obj;
unsigned m_pos;
int m_nextBreakablePosition;
@@ -117,7 +134,7 @@ static inline void notifyResolverWillExitObject(InlineBidiResolver* resolver, Re
// FIXME: This function is misleadingly named. It has little to do with bidi.
// This function will iterate over inlines within a block, optionally notifying
// a bidi resolver as it enters/exits inlines (so it can push/pop embedding levels).
-static inline RenderObject* bidiNext(RenderBlock* block, RenderObject* current, InlineBidiResolver* resolver = 0, bool skipInlines = true, bool* endOfInlinePtr = 0)
+static inline RenderObject* bidiNext(RenderObject* root, RenderObject* current, InlineBidiResolver* resolver = 0, bool skipInlines = true, bool* endOfInlinePtr = 0)
{
RenderObject* next = 0;
bool oldEndOfInline = endOfInlinePtr ? *endOfInlinePtr : false;
@@ -137,7 +154,7 @@ static inline RenderObject* bidiNext(RenderBlock* block, RenderObject* current,
break;
}
- while (current && current != block) {
+ while (current && current != root) {
notifyResolverWillExitObject(resolver, current);
next = current->nextSibling();
@@ -147,7 +164,7 @@ static inline RenderObject* bidiNext(RenderBlock* block, RenderObject* current,
}
current = current->parent();
- if (!skipInlines && current && current != block && current->isRenderInline()) {
+ if (!skipInlines && current && current != root && current->isRenderInline()) {
next = current;
endOfInline = true;
break;
@@ -171,16 +188,16 @@ static inline RenderObject* bidiNext(RenderBlock* block, RenderObject* current,
return next;
}
-static inline RenderObject* bidiFirst(RenderBlock* block, InlineBidiResolver* resolver, bool skipInlines = true)
+static inline RenderObject* bidiFirst(RenderObject* root, InlineBidiResolver* resolver, bool skipInlines = true)
{
- if (!block->firstChild())
+ if (!root->firstChild())
return 0;
- RenderObject* o = block->firstChild();
+ RenderObject* o = root->firstChild();
if (o->isRenderInline()) {
notifyResolverEnteredObject(resolver, o);
if (skipInlines && o->firstChild())
- o = bidiNext(block, o, resolver, skipInlines);
+ o = bidiNext(root, o, resolver, skipInlines);
else {
// Never skip empty inlines.
if (resolver)
@@ -190,7 +207,7 @@ static inline RenderObject* bidiFirst(RenderBlock* block, InlineBidiResolver* re
}
if (o && !o->isText() && !o->isReplaced() && !o->isFloating() && !o->isPositioned())
- o = bidiNext(block, o, resolver, skipInlines);
+ o = bidiNext(root, o, resolver, skipInlines);
if (resolver)
resolver->commitExplicitEmbedding();
@@ -207,7 +224,7 @@ inline void InlineIterator::increment(InlineBidiResolver* resolver)
return;
}
// bidiNext can return 0, so use moveTo instead of moveToStartOf
- moveTo(bidiNext(m_block, m_obj, resolver), 0);
+ moveTo(bidiNext(m_root, m_obj, resolver), 0);
}
inline bool InlineIterator::atEnd() const
@@ -247,13 +264,13 @@ inline void InlineBidiResolver::increment()
template <>
inline void InlineBidiResolver::appendRun()
{
- if (!emptyRun && !m_eor.atEnd()) {
+ if (!m_emptyRun && !m_eor.atEnd()) {
int start = m_sor.m_pos;
RenderObject* obj = m_sor.m_obj;
while (obj && obj != m_eor.m_obj && obj != endOfLine.m_obj) {
- RenderBlock::appendRunsForObject(start, obj->length(), obj, *this);
+ RenderBlock::appendRunsForObject(m_runs, start, obj->length(), obj, *this);
start = 0;
- obj = bidiNext(m_sor.m_block, obj);
+ obj = bidiNext(m_sor.root(), obj);
}
if (obj) {
unsigned pos = obj == m_eor.m_obj ? m_eor.m_pos : UINT_MAX;
@@ -263,9 +280,9 @@ inline void InlineBidiResolver::appendRun()
}
// It's OK to add runs for zero-length RenderObjects, just don't make the run larger than it should be
int end = obj->length() ? pos + 1 : 0;
- RenderBlock::appendRunsForObject(start, end, obj, *this);
+ RenderBlock::appendRunsForObject(m_runs, start, end, obj, *this);
}
-
+
m_eor.increment();
m_sor = m_eor;
}