Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(980)

Unified Diff: Source/core/layout/line/InlineIterator.h

Issue 1164933006: Create LineLayout api (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: rebase + nits Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/layout/line/EllipsisBox.cpp ('k') | Source/core/layout/line/LineBreaker.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/layout/line/InlineIterator.h
diff --git a/Source/core/layout/line/InlineIterator.h b/Source/core/layout/line/InlineIterator.h
index c1ac1669354237899a338634a85c375c7bea0e2b..20a8fa299df5d93b9e7ff347360f378f283793e3 100644
--- a/Source/core/layout/line/InlineIterator.h
+++ b/Source/core/layout/line/InlineIterator.h
@@ -27,6 +27,9 @@
#include "core/layout/LayoutBlockFlow.h"
#include "core/layout/LayoutInline.h"
#include "core/layout/LayoutText.h"
+#include "core/layout/api/LineLayoutBlockFlow.h"
+#include "core/layout/api/LineLayoutInline.h"
+#include "core/layout/api/LineLayoutText.h"
#include "wtf/StdLibExtras.h"
@@ -50,7 +53,7 @@ public:
{
}
- InlineIterator(LayoutObject* root, LayoutObject* o, unsigned p)
+ InlineIterator(LineLayoutItem root, LineLayoutItem o, unsigned p)
: m_root(root)
, m_obj(o)
, m_nextBreakablePosition(-1)
@@ -60,27 +63,27 @@ public:
void clear() { moveTo(0, 0); }
- void moveToStartOf(LayoutObject* object)
+ void moveToStartOf(LineLayoutItem object)
{
moveTo(object, 0);
}
- void moveTo(LayoutObject* object, unsigned offset, int nextBreak = -1)
+ void moveTo(LineLayoutItem object, unsigned offset, int nextBreak = -1)
{
m_obj = object;
m_pos = offset;
m_nextBreakablePosition = nextBreak;
}
- LayoutObject* object() const { return m_obj; }
- void setObject(LayoutObject* object) { m_obj = object; }
+ LineLayoutItem object() const { return m_obj; }
+ void setObject(LineLayoutItem object) { m_obj = object; }
int nextBreakablePosition() const { return m_nextBreakablePosition; }
void setNextBreakablePosition(int position) { m_nextBreakablePosition = position; }
unsigned offset() const { return m_pos; }
void setOffset(unsigned position) { m_pos = position; }
- LayoutObject* root() const { return m_root; }
+ LineLayoutItem root() const { return m_root; }
void fastIncrementInTextNode();
void increment(InlineBidiResolver* = nullptr, IncrementRule = FastIncrementInTextNode);
@@ -88,13 +91,13 @@ public:
inline bool atTextParagraphSeparator() const
{
- return m_obj && m_obj->preservesNewline() && m_obj->isText() && toLayoutText(m_obj)->textLength()
- && !toLayoutText(m_obj)->isWordBreak() && toLayoutText(m_obj)->characterAt(m_pos) == '\n';
+ return m_obj && m_obj.preservesNewline() && m_obj.isText() && LineLayoutText(m_obj).textLength()
+ && !LineLayoutText(m_obj).isWordBreak() && LineLayoutText(m_obj).characterAt(m_pos) == '\n';
}
inline bool atParagraphSeparator() const
{
- return (m_obj && m_obj->isBR()) || atTextParagraphSeparator();
+ return (m_obj && m_obj.isBR()) || atTextParagraphSeparator();
}
UChar characterAt(unsigned) const;
@@ -103,8 +106,8 @@ public:
ALWAYS_INLINE WTF::Unicode::Direction direction() const;
private:
- LayoutObject* m_root;
- LayoutObject* m_obj;
+ LineLayoutItem m_root;
+ LineLayoutItem m_obj;
int m_nextBreakablePosition;
unsigned m_pos;
@@ -129,7 +132,7 @@ static inline WTF::Unicode::Direction embedCharFromDirection(TextDirection dir,
}
template <class Observer>
-static inline void notifyObserverEnteredObject(Observer* observer, LayoutObject* object)
+static inline void notifyObserverEnteredObject(Observer* observer, LineLayoutItem object)
{
if (!observer || !object || !object->isLayoutInline())
return;
@@ -156,7 +159,7 @@ static inline void notifyObserverEnteredObject(Observer* observer, LayoutObject*
}
template <class Observer>
-static inline void notifyObserverWillExitObject(Observer* observer, LayoutObject* object)
+static inline void notifyObserverWillExitObject(Observer* observer, LineLayoutItem object)
{
if (!observer || !object || !object->isLayoutInline())
return;
@@ -174,7 +177,7 @@ static inline void notifyObserverWillExitObject(Observer* observer, LayoutObject
observer->embed(WTF::Unicode::PopDirectionalFormat, FromStyleOrDOM);
}
-static inline bool isIteratorTarget(LayoutObject* object)
+static inline bool isIteratorTarget(LineLayoutItem object)
{
ASSERT(object); // The iterator will of course return 0, but its not an expected argument to this function.
return object->isText() || object->isFloating() || object->isOutOfFlowPositioned() || object->isReplaced();
@@ -186,15 +189,15 @@ enum EmptyInlineBehavior {
IncludeEmptyInlines,
};
-static bool isEmptyInline(LayoutObject* object)
+static bool isEmptyInline(LineLayoutItem object)
{
if (!object->isLayoutInline())
return false;
- for (LayoutObject* curr = toLayoutInline(object)->firstChild(); curr; curr = curr->nextSibling()) {
+ for (LineLayoutItem curr = LineLayoutInline(object).firstChild(); curr; curr = curr->nextSibling()) {
if (curr->isFloatingOrOutOfFlowPositioned())
continue;
- if (curr->isText() && toLayoutText(curr)->isAllCollapsibleWhitespace())
+ if (curr->isText() && LineLayoutText(curr).isAllCollapsibleWhitespace())
continue;
if (!isEmptyInline(curr))
@@ -207,9 +210,9 @@ static bool isEmptyInline(LayoutObject* object)
// 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).
template <class Observer>
-static inline LayoutObject* bidiNextShared(LayoutObject* root, LayoutObject* current, Observer* observer = 0, EmptyInlineBehavior emptyInlineBehavior = SkipEmptyInlines, bool* endOfInlinePtr = nullptr)
+static inline LineLayoutItem bidiNextShared(LineLayoutItem root, LineLayoutItem current, Observer* observer = 0, EmptyInlineBehavior emptyInlineBehavior = SkipEmptyInlines, bool* endOfInlinePtr = nullptr)
{
- LayoutObject* next = nullptr;
+ LineLayoutItem next = nullptr;
// oldEndOfInline denotes if when we last stopped iterating if we were at the end of an inline.
bool oldEndOfInline = endOfInlinePtr ? *endOfInlinePtr : false;
bool endOfInline = false;
@@ -265,28 +268,28 @@ static inline LayoutObject* bidiNextShared(LayoutObject* root, LayoutObject* cur
}
template <class Observer>
-static inline LayoutObject* bidiNextSkippingEmptyInlines(LayoutObject* root, LayoutObject* current, Observer* observer)
+static inline LineLayoutItem bidiNextSkippingEmptyInlines(LineLayoutItem root, LineLayoutItem current, Observer* observer)
{
// The SkipEmptyInlines callers never care about endOfInlinePtr.
return bidiNextShared(root, current, observer, SkipEmptyInlines);
}
// This makes callers cleaner as they don't have to specify a type for the observer when not providing one.
-static inline LayoutObject* bidiNextSkippingEmptyInlines(LayoutObject* root, LayoutObject* current)
+static inline LineLayoutItem bidiNextSkippingEmptyInlines(LineLayoutItem root, LineLayoutItem current)
{
InlineBidiResolver* observer = nullptr;
return bidiNextSkippingEmptyInlines(root, current, observer);
}
-static inline LayoutObject* bidiNextIncludingEmptyInlines(LayoutObject* root, LayoutObject* current, bool* endOfInlinePtr = nullptr)
+static inline LineLayoutItem bidiNextIncludingEmptyInlines(LineLayoutItem root, LineLayoutItem current, bool* endOfInlinePtr = nullptr)
{
InlineBidiResolver* observer = nullptr; // Callers who include empty inlines, never use an observer.
return bidiNextShared(root, current, observer, IncludeEmptyInlines, endOfInlinePtr);
}
-static inline LayoutObject* bidiFirstSkippingEmptyInlines(LayoutBlockFlow* root, BidiRunList<BidiRun>& runs, InlineBidiResolver* resolver = nullptr)
+static inline LineLayoutItem bidiFirstSkippingEmptyInlines(LineLayoutBlockFlow root, BidiRunList<BidiRun>& runs, InlineBidiResolver* resolver = nullptr)
{
- LayoutObject* o = root->firstChild();
+ LineLayoutItem o = root.firstChild();
if (!o)
return nullptr;
@@ -312,9 +315,9 @@ static inline LayoutObject* bidiFirstSkippingEmptyInlines(LayoutBlockFlow* root,
}
// FIXME: This method needs to be renamed when bidiNext finds a good name.
-static inline LayoutObject* bidiFirstIncludingEmptyInlines(LayoutBlock* root)
+static inline LineLayoutItem bidiFirstIncludingEmptyInlines(LineLayoutBlockFlow root)
{
- LayoutObject* o = root->firstChild();
+ LineLayoutItem o = root.firstChild();
// If either there are no children to walk, or the first one is correct
// then just return it.
if (!o || o->isLayoutInline() || isIteratorTarget(o))
@@ -326,8 +329,8 @@ static inline LayoutObject* bidiFirstIncludingEmptyInlines(LayoutBlock* root)
inline void InlineIterator::fastIncrementInTextNode()
{
ASSERT(m_obj);
- ASSERT(m_obj->isText());
- ASSERT(m_pos <= toLayoutText(m_obj)->textLength());
+ ASSERT(m_obj.isText());
+ ASSERT(m_pos <= LineLayoutText(m_obj).textLength());
if (m_pos < INT_MAX)
m_pos++;
}
@@ -337,7 +340,7 @@ inline void InlineIterator::fastIncrementInTextNode()
class InlineWalker {
public:
InlineWalker(LayoutBlock* root)
- : m_root(root)
+ : m_root(LineLayoutItem(root))
, m_current(nullptr)
, m_atEndOfInline(false)
{
@@ -345,21 +348,21 @@ public:
m_current = bidiFirstIncludingEmptyInlines(m_root);
}
- LayoutBlock* root() { return m_root; }
- LayoutObject* current() { return m_current; }
+ LineLayoutBlockFlow root() { return m_root; }
+ LineLayoutItem current() { return m_current; }
bool atEndOfInline() { return m_atEndOfInline; }
bool atEnd() const { return !m_current; }
- LayoutObject* advance()
+ LineLayoutItem advance()
{
// FIXME: Support SkipEmptyInlines and observer parameters.
m_current = bidiNextIncludingEmptyInlines(m_root, m_current, &m_atEndOfInline);
return m_current;
}
private:
- LayoutBlock* m_root;
- LayoutObject* m_current;
+ LineLayoutBlockFlow m_root;
+ LineLayoutItem m_current;
bool m_atEndOfInline;
};
@@ -368,7 +371,7 @@ static inline bool endOfLineHasIsolatedObjectAncestor(const InlineIterator& isol
if (!isolatedIterator.object() || !isIsolated(isolatedIterator.object()->style()->unicodeBidi()))
return false;
- LayoutObject* innerIsolatedObject = isolatedIterator.object();
+ LineLayoutItem innerIsolatedObject = isolatedIterator.object();
while (innerIsolatedObject && innerIsolatedObject != isolatedIterator.root()) {
if (innerIsolatedObject == ancestorItertor.object())
return true;
@@ -389,9 +392,9 @@ inline void InlineIterator::increment(InlineBidiResolver* resolver, IncrementRul
return;
}
- if (m_obj->isText()) {
+ if (m_obj.isText()) {
fastIncrementInTextNode();
- if (m_pos < toLayoutText(m_obj)->textLength())
+ if (m_pos < LineLayoutText(m_obj).textLength())
return;
}
// bidiNext can return 0, so use moveTo instead of moveToStartOf
@@ -405,10 +408,10 @@ inline bool InlineIterator::atEnd() const
inline UChar InlineIterator::characterAt(unsigned index) const
{
- if (!m_obj || !m_obj->isText())
+ if (!m_obj || !m_obj.isText())
return 0;
- return toLayoutText(m_obj)->characterAt(index);
+ return LineLayoutText(m_obj).characterAt(index);
}
inline UChar InlineIterator::current() const
@@ -429,8 +432,8 @@ ALWAYS_INLINE WTF::Unicode::Direction InlineIterator::direction() const
if (UChar c = current())
return WTF::Unicode::direction(c);
- if (m_obj && m_obj->isListMarker())
- return m_obj->style()->isLeftToRightDirection() ? WTF::Unicode::LeftToRight : WTF::Unicode::RightToLeft;
+ if (m_obj && m_obj.isListMarker())
+ return m_obj.style()->isLeftToRightDirection() ? WTF::Unicode::LeftToRight : WTF::Unicode::RightToLeft;
return WTF::Unicode::OtherNeutral;
}
@@ -480,7 +483,7 @@ template <>
inline int InlineBidiResolver::findFirstTrailingSpaceAtRun(BidiRun* run)
{
ASSERT(run);
- LayoutObject* lastObject = run->m_object;
+ LineLayoutItem lastObject = LineLayoutItem(run->m_object);
if (!lastObject->isText())
return run->m_stop;
@@ -514,16 +517,16 @@ inline bool InlineBidiResolver::needsToApplyL1Rule(BidiRunList<BidiRun>& runs)
return true;
}
-static inline bool isIsolatedInline(LayoutObject* object)
+static inline bool isIsolatedInline(LineLayoutItem object)
{
ASSERT(object);
return object->isLayoutInline() && isIsolated(object->style()->unicodeBidi());
}
-static inline LayoutObject* highestContainingIsolateWithinRoot(LayoutObject* object, LayoutObject* root)
+static inline LineLayoutItem highestContainingIsolateWithinRoot(LineLayoutItem object, LineLayoutItem root)
{
ASSERT(object);
- LayoutObject* containingIsolateObj = 0;
+ LineLayoutItem containingIsolateObj = 0;
while (object && object != root) {
if (isIsolatedInline(object))
containingIsolateObj = object;
@@ -535,7 +538,7 @@ static inline LayoutObject* highestContainingIsolateWithinRoot(LayoutObject* obj
static inline unsigned numberOfIsolateAncestors(const InlineIterator& iter)
{
- LayoutObject* object = iter.object();
+ LineLayoutItem object = iter.object();
if (!object)
return 0;
unsigned count = 0;
@@ -549,7 +552,7 @@ static inline unsigned numberOfIsolateAncestors(const InlineIterator& iter)
// FIXME: This belongs on InlineBidiResolver, except it's a template specialization
// of BidiResolver which knows nothing about LayoutObjects.
-static inline BidiRun* addPlaceholderRunForIsolatedInline(InlineBidiResolver& resolver, LayoutObject* obj, unsigned pos)
+static inline BidiRun* addPlaceholderRunForIsolatedInline(InlineBidiResolver& resolver, LineLayoutItem obj, unsigned pos)
{
ASSERT(obj);
BidiRun* isolatedRun = new BidiRun(pos, pos, obj, resolver.context(), resolver.dir());
@@ -560,7 +563,7 @@ static inline BidiRun* addPlaceholderRunForIsolatedInline(InlineBidiResolver& re
return isolatedRun;
}
-static inline BidiRun* createRun(int start, int end, LayoutObject* obj, InlineBidiResolver& resolver)
+static inline BidiRun* createRun(int start, int end, LineLayoutItem obj, InlineBidiResolver& resolver)
{
return new BidiRun(start, end, obj, resolver.context(), resolver.dir());
}
@@ -599,7 +602,7 @@ public:
void commitExplicitEmbedding(BidiRunList<BidiRun>&) { }
BidiRunList<BidiRun>& runs() { return m_runs; }
- void addFakeRunIfNecessary(LayoutObject* obj, unsigned pos, unsigned end, InlineBidiResolver& resolver)
+ void addFakeRunIfNecessary(LineLayoutItem obj, unsigned pos, unsigned end, InlineBidiResolver& resolver)
{
// We only need to add a fake run for a given isolated span once during each call to createBidiRunsForLine.
// We'll be called for every span inside the isolated span so we just ignore subsequent calls.
@@ -623,7 +626,7 @@ private:
BidiRunList<BidiRun>& m_runs;
};
-static void inline appendRunObjectIfNecessary(LayoutObject* obj, unsigned start, unsigned end, InlineBidiResolver& resolver, AppendRunBehavior behavior, IsolateTracker& tracker)
+static void inline appendRunObjectIfNecessary(LineLayoutItem obj, unsigned start, unsigned end, InlineBidiResolver& resolver, AppendRunBehavior behavior, IsolateTracker& tracker)
{
// Trailing space code creates empty BidiRun objects, start == end, so
// that case needs to be handled specifically.
@@ -645,7 +648,7 @@ static void inline appendRunObjectIfNecessary(LayoutObject* obj, unsigned start,
}
}
-static void adjustMidpointsAndAppendRunsForObjectIfNeeded(LayoutObject* obj, unsigned start, unsigned end, InlineBidiResolver& resolver, AppendRunBehavior behavior, IsolateTracker& tracker)
+static void adjustMidpointsAndAppendRunsForObjectIfNeeded(LineLayoutItem obj, unsigned start, unsigned end, InlineBidiResolver& resolver, AppendRunBehavior behavior, IsolateTracker& tracker)
{
if (start > end || LayoutBlockFlow::shouldSkipCreatingRunsForObject(obj))
return;
@@ -687,7 +690,7 @@ static void adjustMidpointsAndAppendRunsForObjectIfNeeded(LayoutObject* obj, uns
}
}
-static inline void addFakeRunIfNecessary(LayoutObject* obj, unsigned start, unsigned end, InlineBidiResolver& resolver, IsolateTracker& tracker)
+static inline void addFakeRunIfNecessary(LineLayoutItem obj, unsigned start, unsigned end, InlineBidiResolver& resolver, IsolateTracker& tracker)
{
tracker.setMidpointStateForRootIsolate(resolver.midpointState());
adjustMidpointsAndAppendRunsForObjectIfNeeded(obj, start, obj->length(), resolver, AppendingFakeRun, tracker);
@@ -702,7 +705,7 @@ inline void InlineBidiResolver::appendRun(BidiRunList<BidiRun>& runs)
// FIXME: Could this initialize from this->inIsolate() instead of walking up the layout tree?
IsolateTracker isolateTracker(runs, numberOfIsolateAncestors(m_sor));
int start = m_sor.offset();
- LayoutObject* obj = m_sor.object();
+ LineLayoutItem obj = m_sor.object();
while (obj && obj != m_eor.object() && obj != m_endOfRunAtEndOfLine.object()) {
if (isolateTracker.inIsolate())
addFakeRunIfNecessary(obj, start, obj->length(), *this, isolateTracker);
« no previous file with comments | « Source/core/layout/line/EllipsisBox.cpp ('k') | Source/core/layout/line/LineBreaker.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698