| Index: third_party/WebKit/Source/core/layout/svg/line/SVGRootInlineBox.cpp
|
| diff --git a/third_party/WebKit/Source/core/layout/svg/line/SVGRootInlineBox.cpp b/third_party/WebKit/Source/core/layout/svg/line/SVGRootInlineBox.cpp
|
| index 05b78e9f01f1f7e71473e89d33ef0718278edb20..dc9ce84caf51890504915a11995412655fbe20ad 100644
|
| --- a/third_party/WebKit/Source/core/layout/svg/line/SVGRootInlineBox.cpp
|
| +++ b/third_party/WebKit/Source/core/layout/svg/line/SVGRootInlineBox.cpp
|
| @@ -69,67 +69,60 @@ void SVGRootInlineBox::computePerCharacterLayoutInformation() {
|
| // Perform SVG text layout phase four
|
| // Position & resize all SVGInlineText/FlowBoxes in the inline box tree,
|
| // resize the root box as well as the LayoutSVGText parent block.
|
| - LayoutRect childRect;
|
| - layoutChildBoxes(this, &childRect);
|
| - layoutRootBox(childRect);
|
| + LayoutRect childRect = layoutInlineBoxes(*this);
|
| +
|
| + // Finally, assign the root block position, now that all content is laid out.
|
| + LineLayoutBlockFlow parentBlock = block();
|
| + parentBlock.setLocation(childRect.location());
|
| + parentBlock.setSize(childRect.size());
|
| +
|
| + adjustInlineBoxesToBlockSpace(*this);
|
| +
|
| + setLineTopBottomPositions(LayoutUnit(), logicalHeight(), LayoutUnit(),
|
| + logicalHeight());
|
| }
|
|
|
| -void SVGRootInlineBox::layoutChildBoxes(InlineFlowBox* start,
|
| - LayoutRect* childRect) {
|
| - for (InlineBox* child = start->firstChild(); child;
|
| - child = child->nextOnLine()) {
|
| - LayoutRect boxRect;
|
| - if (child->isSVGInlineTextBox()) {
|
| - ASSERT(child->getLineLayoutItem().isSVGInlineText());
|
| -
|
| - SVGInlineTextBox* textBox = toSVGInlineTextBox(child);
|
| - boxRect = textBox->calculateBoundaries();
|
| - textBox->setX(boxRect.x());
|
| - textBox->setY(boxRect.y());
|
| - textBox->setLogicalWidth(boxRect.width());
|
| - textBox->setLogicalHeight(boxRect.height());
|
| - } else {
|
| - // Skip generated content.
|
| - if (!child->getLineLayoutItem().node())
|
| - continue;
|
| -
|
| - SVGInlineFlowBox* flowBox = toSVGInlineFlowBox(child);
|
| - layoutChildBoxes(flowBox);
|
| -
|
| - boxRect = flowBox->calculateBoundaries();
|
| - flowBox->setX(boxRect.x());
|
| - flowBox->setY(boxRect.y());
|
| - flowBox->setLogicalWidth(boxRect.width());
|
| - flowBox->setLogicalHeight(boxRect.height());
|
| - }
|
| - if (childRect)
|
| - childRect->unite(boxRect);
|
| +LayoutRect SVGRootInlineBox::layoutInlineBoxes(InlineBox& box) {
|
| + LayoutRect rect;
|
| + if (box.isSVGInlineTextBox()) {
|
| + rect = toSVGInlineTextBox(box).calculateBoundaries();
|
| + } else {
|
| + for (InlineBox* child = toInlineFlowBox(box).firstChild(); child;
|
| + child = child->nextOnLine())
|
| + rect.unite(layoutInlineBoxes(*child));
|
| }
|
| +
|
| + box.setX(rect.x());
|
| + box.setY(rect.y());
|
| + box.setLogicalWidth(box.isHorizontal() ? rect.width() : rect.height());
|
| + LayoutUnit logicalHeight = box.isHorizontal() ? rect.height() : rect.width();
|
| + if (box.isSVGInlineTextBox())
|
| + toSVGInlineTextBox(box).setLogicalHeight(logicalHeight);
|
| + else if (box.isSVGInlineFlowBox())
|
| + toSVGInlineFlowBox(box).setLogicalHeight(logicalHeight);
|
| + else
|
| + toSVGRootInlineBox(box).setLogicalHeight(logicalHeight);
|
| +
|
| + return rect;
|
| }
|
|
|
| -void SVGRootInlineBox::layoutRootBox(const LayoutRect& childRect) {
|
| +void SVGRootInlineBox::adjustInlineBoxesToBlockSpace(InlineBox& box) {
|
| LineLayoutBlockFlow parentBlock = block();
|
| + LayoutRect rect(box.topLeft(), box.size());
|
| + // In layoutChildBoxes(), the box was laid out in physical SVG coordinates.
|
| + rect.moveBy(-parentBlock.location());
|
| + // Convert physical coordinates into "physical coordinates in flipped block
|
| + // direction".
|
| + parentBlock.flipForWritingMode(rect);
|
| + box.setX(rect.x());
|
| + box.setY(rect.y());
|
| +
|
| + if (!box.isInlineFlowBox())
|
| + return;
|
|
|
| - // Finally, assign the root block position, now that all content is laid out.
|
| - LayoutRect boundingRect = childRect;
|
| - parentBlock.setLocation(boundingRect.location());
|
| - parentBlock.setSize(boundingRect.size());
|
| -
|
| - // Position all children relative to the parent block.
|
| - for (InlineBox* child = firstChild(); child; child = child->nextOnLine()) {
|
| - // Skip generated content.
|
| - if (!child->getLineLayoutItem().node())
|
| - continue;
|
| - child->move(LayoutSize(-childRect.x(), -childRect.y()));
|
| - }
|
| -
|
| - // Position ourselves.
|
| - setX(LayoutUnit());
|
| - setY(LayoutUnit());
|
| - setLogicalWidth(childRect.width());
|
| - setLogicalHeight(childRect.height());
|
| - setLineTopBottomPositions(LayoutUnit(), boundingRect.height(), LayoutUnit(),
|
| - boundingRect.height());
|
| + for (InlineBox* child = toInlineFlowBox(box).firstChild(); child;
|
| + child = child->nextOnLine())
|
| + adjustInlineBoxesToBlockSpace(*child);
|
| }
|
|
|
| InlineBox* SVGRootInlineBox::closestLeafChildForPosition(
|
|
|