void RenderRubyRun::layout() { RenderBlock::layout(); RenderRubyText* rt = rubyText(); if (!rt) return; rt->setLogicalLeft(0); // Place the RenderRubyText such that its bottom is flush with the lineTop of the first line of the RenderRubyBase. LayoutUnit lastLineRubyTextBottom = rt->logicalHeight(); LayoutUnit 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() == (style()->rubyPosition() == RubyPositionAfter)) { LayoutUnit firstLineTop = 0; if (RenderRubyBase* rb = rubyBase()) { RootInlineBox* rootBox = rb->firstRootBox(); if (rootBox) firstLineTop = rootBox->logicalTopLayoutOverflow(); firstLineTop += rb->logicalTop(); } rt->setLogicalTop(-lastLineRubyTextBottom + firstLineTop); } else { LayoutUnit 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. computeOverflow(clientLogicalBottom()); }
void RenderRubyRun::layout() { RenderBlockFlow::layout(); RenderRubyText* rt = rubyText(); if (!rt) return; rt->setLogicalLeft(0); // Place the RenderRubyText such that its bottom is flush with the lineTop of the first line of the RenderRubyBase. LayoutUnit lastLineRubyTextBottom = rt->logicalHeight(); LayoutUnit 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 (isHorizontalWritingMode() && rt->style().rubyPosition() == RubyPositionInterCharacter) { // Bopomofo. We need to move the RenderRubyText over to the right side and center it // vertically relative to the base. const Font& font = style().font(); float distanceBetweenBase = max(font.letterSpacing(), 2.0f * rt->style().font().fontMetrics().height()); setWidth(width() + distanceBetweenBase - font.letterSpacing()); if (RenderRubyBase* rb = rubyBase()) { LayoutUnit firstLineTop = 0; LayoutUnit lastLineBottom = logicalHeight(); RootInlineBox* rootBox = rb->firstRootBox(); if (rootBox) firstLineTop = rootBox->logicalTopLayoutOverflow(); firstLineTop += rb->logicalTop(); if (rootBox) lastLineBottom = rootBox->logicalBottomLayoutOverflow(); lastLineBottom += rb->logicalTop(); rt->setX(rb->x() + rb->width() - font.letterSpacing()); LayoutUnit extent = lastLineBottom - firstLineTop; rt->setY(firstLineTop + (extent - rt->height()) / 2); } } else if (style().isFlippedLinesWritingMode() == (style().rubyPosition() == RubyPositionAfter)) { LayoutUnit firstLineTop = 0; if (RenderRubyBase* rb = rubyBase()) { RootInlineBox* rootBox = rb->firstRootBox(); if (rootBox) firstLineTop = rootBox->logicalTopLayoutOverflow(); firstLineTop += rb->logicalTop(); } rt->setLogicalTop(-lastLineRubyTextBottom + firstLineTop); } else { LayoutUnit 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. computeOverflow(clientLogicalBottom()); }