diff options
Diffstat (limited to 'Source/WebCore/rendering/InlineIterator.h')
-rw-r--r-- | Source/WebCore/rendering/InlineIterator.h | 55 |
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; } |