Title: [88122] trunk/Source/WebCore
- Revision
- 88122
- Author
- [email protected]
- Date
- 2011-06-04 12:34:29 -0700 (Sat, 04 Jun 2011)
Log Message
2011-06-04 Eric Seidel <[email protected]>
Reviewed by Adam Barth.
Add InlineWalker class to hold state for repeated calls to bidiNext
https://bugs.webkit.org/show_bug.cgi?id=60724
This is one more little step towards removing (naked) bidiNext usage.
More refactoring is required before all callers of bidiNext can move
onto using an InlineWalker instead of bidiNext directly.
No change in behavior, thus no tests.
* rendering/InlineIterator.h:
(WebCore::InlineWalker::InlineWalker):
(WebCore::InlineWalker::root):
(WebCore::InlineWalker::current):
(WebCore::InlineWalker::atEndOfInline):
(WebCore::InlineWalker::atEnd):
(WebCore::InlineWalker::advance):
* rendering/RenderBlock.cpp:
(WebCore::RenderBlock::simplifiedNormalFlowLayout):
* rendering/RenderBlockLineLayout.cpp:
(WebCore::RenderBlock::layoutInlineChildren):
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (88121 => 88122)
--- trunk/Source/WebCore/ChangeLog 2011-06-04 19:20:00 UTC (rev 88121)
+++ trunk/Source/WebCore/ChangeLog 2011-06-04 19:34:29 UTC (rev 88122)
@@ -1,3 +1,28 @@
+2011-06-04 Eric Seidel <[email protected]>
+
+ Reviewed by Adam Barth.
+
+ Add InlineWalker class to hold state for repeated calls to bidiNext
+ https://bugs.webkit.org/show_bug.cgi?id=60724
+
+ This is one more little step towards removing (naked) bidiNext usage.
+ More refactoring is required before all callers of bidiNext can move
+ onto using an InlineWalker instead of bidiNext directly.
+
+ No change in behavior, thus no tests.
+
+ * rendering/InlineIterator.h:
+ (WebCore::InlineWalker::InlineWalker):
+ (WebCore::InlineWalker::root):
+ (WebCore::InlineWalker::current):
+ (WebCore::InlineWalker::atEndOfInline):
+ (WebCore::InlineWalker::atEnd):
+ (WebCore::InlineWalker::advance):
+ * rendering/RenderBlock.cpp:
+ (WebCore::RenderBlock::simplifiedNormalFlowLayout):
+ * rendering/RenderBlockLineLayout.cpp:
+ (WebCore::RenderBlock::layoutInlineChildren):
+
2011-06-04 Sam Weinig <[email protected]>
Reviewed by Anders Carlsson.
Modified: trunk/Source/WebCore/rendering/InlineIterator.h (88121 => 88122)
--- trunk/Source/WebCore/rendering/InlineIterator.h 2011-06-04 19:20:00 UTC (rev 88121)
+++ trunk/Source/WebCore/rendering/InlineIterator.h 2011-06-04 19:34:29 UTC (rev 88122)
@@ -246,6 +246,38 @@
m_pos++;
}
+class InlineWalker {
+public:
+ InlineWalker(RenderObject* root)
+ : m_root(root)
+ , m_current(0)
+ , m_atEndOfInline(false)
+ {
+ // FIXME: This class should be taught how to do the skipInlines codepath as well.
+ m_current = bidiFirstNotSkippingInlines(m_root);
+ }
+
+ RenderObject* root() { return m_root; }
+ RenderObject* current() { return m_current; }
+
+ bool atEndOfInline() { return m_atEndOfInline; }
+ bool atEnd() const { return !m_current; }
+
+ RenderObject* advance()
+ {
+ // FIXME: Eventually skipInlines and observer will be a members.
+ bool skipInlines = false;
+ InlineBidiResolver* observer = 0;
+ m_current = bidiNext(m_root, m_current, observer, skipInlines, &m_atEndOfInline);
+ return m_current;
+ }
+private:
+ RenderObject* m_root;
+ RenderObject* m_current;
+ bool m_skipInlines;
+ bool m_atEndOfInline;
+};
+
inline void InlineIterator::increment(InlineBidiResolver* resolver)
{
if (!m_obj)
Modified: trunk/Source/WebCore/rendering/RenderBlock.cpp (88121 => 88122)
--- trunk/Source/WebCore/rendering/RenderBlock.cpp 2011-06-04 19:20:00 UTC (rev 88121)
+++ trunk/Source/WebCore/rendering/RenderBlock.cpp 2011-06-04 19:34:29 UTC (rev 88122)
@@ -2093,18 +2093,16 @@
{
if (childrenInline()) {
ListHashSet<RootInlineBox*> lineBoxes;
- bool endOfInline = false;
- RenderObject* o = bidiFirstNotSkippingInlines(this);
- while (o) {
+ for (InlineWalker walker(this); !walker.atEnd(); walker.advance()) {
+ RenderObject* o = walker.current();
if (!o->isPositioned() && (o->isReplaced() || o->isFloating())) {
o->layoutIfNeeded();
if (toRenderBox(o)->inlineBoxWrapper()) {
RootInlineBox* box = toRenderBox(o)->inlineBoxWrapper()->root();
lineBoxes.add(box);
}
- } else if (o->isText() || (o->isRenderInline() && !endOfInline))
+ } else if (o->isText() || (o->isRenderInline() && !walker.atEndOfInline()))
o->setNeedsLayout(false);
- o = bidiNext(this, o, 0, false, &endOfInline);
}
// FIXME: Glyph overflow will get lost in this case, but not really a big deal.
Modified: trunk/Source/WebCore/rendering/RenderBlockLineLayout.cpp (88121 => 88122)
--- trunk/Source/WebCore/rendering/RenderBlockLineLayout.cpp 2011-06-04 19:20:00 UTC (rev 88121)
+++ trunk/Source/WebCore/rendering/RenderBlockLineLayout.cpp 2011-06-04 19:34:29 UTC (rev 88122)
@@ -1148,11 +1148,10 @@
if (firstChild()) {
// layout replaced elements
- bool endOfInline = false;
- RenderObject* o = bidiFirstNotSkippingInlines(this);
Vector<FloatWithRect> floats;
bool hasInlineChild = false;
- while (o) {
+ for (InlineWalker walker(this); !walker.atEnd(); walker.advance()) {
+ RenderObject* o = walker.current();
if (!hasInlineChild && o->isInline())
hasInlineChild = true;
@@ -1175,14 +1174,13 @@
toRenderBox(o)->dirtyLineBoxes(layoutState.isFullLayout());
o->layoutIfNeeded();
}
- } else if (o->isText() || (o->isRenderInline() && !endOfInline)) {
+ } else if (o->isText() || (o->isRenderInline() && !walker.atEndOfInline())) {
if (!o->isText())
toRenderInline(o)->updateAlwaysCreateLineBoxes();
if (layoutState.isFullLayout() || o->selfNeedsLayout())
dirtyLineBoxesForRenderer(o, layoutState.isFullLayout());
o->setNeedsLayout(false);
}
- o = bidiNext(this, o, 0, false, &endOfInline);
}
layoutRunsAndFloats(layoutState, hasInlineChild, floats);
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes