+RenderObject* RenderRubyRun::layoutSpecialExcludedChild(bool relayoutChildren)
+{
+ // Don't bother positioning the RenderRubyRun yet.
+ RenderRubyText* rt = rubyText();
+ if (!rt)
+ return 0;
+ if (relayoutChildren)
+ rt->setChildNeedsLayout(true, false);
+ rt->layoutIfNeeded();
+ return rt;
+}
+
+void RenderRubyRun::layout()
+{
+ RenderBlock::layout();
+
+ // Place the RenderRubyText such that its bottom is flush with the lineTop of the first line of the RenderRubyBase.
+ RenderRubyText* rt = rubyText();
+ if (!rt)
+ return;
+
+ int lastLineRubyTextBottom = rt->logicalHeight();
+ int firstLineRubyTextTop = 0;
+ RootInlineBox* rootBox = rt->lastRootBox();
+ if (rootBox) {
+ // In order to align, we have to ignore negative leading.
+ firstLineRubyTextTop = rt->firstRootBox()->logicalTopLayoutOverflow();
+ lastLineRubyTextBottom = rootBox->logicalBottomLayoutOverflow();
+ }
+
+ if (!style()->isFlippedLinesWritingMode()) {
+ int firstLineTop = 0;
+ if (RenderRubyBase* rb = rubyBase()) {
+ RootInlineBox* rootBox = rb->firstRootBox();
+ if (rootBox)
+ firstLineTop = rootBox->logicalTopLayoutOverflow();
+ firstLineTop += rb->logicalTop();
+ }
+
+ rt->setLogicalTop(-lastLineRubyTextBottom + firstLineTop);
+ } else {
+ int lastLineBottom = logicalHeight();
+ if (RenderRubyBase* rb = rubyBase()) {
+ RootInlineBox* rootBox = rb->lastRootBox();
+ if (rootBox)
+ lastLineBottom = rootBox->logicalBottomLayoutOverflow();
+ lastLineBottom += rb->logicalTop();
+ }
+
+ rt->setLogicalTop(-firstLineRubyTextTop + lastLineBottom);
+ }
+
+ // Update our overflow to account for the new RenderRubyText position.
+ m_overflow.clear();
+ addOverflowFromBlockChildren();
+}
+