| Index: third_party/WebKit/Source/core/layout/LayoutMultiColumnSet.cpp
|
| diff --git a/third_party/WebKit/Source/core/layout/LayoutMultiColumnSet.cpp b/third_party/WebKit/Source/core/layout/LayoutMultiColumnSet.cpp
|
| index c2ffb57d6b0f1d4e116b43903d8f17fd1b3ab2ff..d3452bcc13463522bd1bbbb9d673da64e22637b8 100644
|
| --- a/third_party/WebKit/Source/core/layout/LayoutMultiColumnSet.cpp
|
| +++ b/third_party/WebKit/Source/core/layout/LayoutMultiColumnSet.cpp
|
| @@ -476,4 +476,75 @@ LayoutRect LayoutMultiColumnSet::flowThreadPortionRect() const
|
| return portionRect;
|
| }
|
|
|
| +bool LayoutMultiColumnSet::computeColumnRuleBounds(const LayoutPoint& paintOffset, Vector<LayoutRect>& columnRuleBounds) const
|
| +{
|
| + if (flowThread()->isLayoutPagedFlowThread())
|
| + return false;
|
| +
|
| + // Reference: https://www.w3.org/TR/css3-multicol/#column-gaps-and-rules
|
| + const ComputedStyle& blockStyle = multiColumnBlockFlow()->styleRef();
|
| + bool ruleTransparent = blockStyle.columnRuleIsTransparent();
|
| + EBorderStyle ruleStyle = blockStyle.columnRuleStyle();
|
| + LayoutUnit ruleThickness(blockStyle.columnRuleWidth());
|
| + LayoutUnit colGap = columnGap();
|
| + bool renderRule = ruleStyle > BorderStyleHidden && !ruleTransparent;
|
| + if (!renderRule)
|
| + return false;
|
| +
|
| + unsigned colCount = actualColumnCount();
|
| + if (colCount <= 1)
|
| + return false;
|
| +
|
| + bool leftToRight = style()->isLeftToRightDirection();
|
| + LayoutUnit currLogicalLeftOffset = leftToRight ? LayoutUnit() : contentLogicalWidth();
|
| + LayoutUnit ruleAdd = borderAndPaddingLogicalLeft();
|
| + LayoutUnit ruleLogicalLeft = leftToRight ? LayoutUnit() : contentLogicalWidth();
|
| + LayoutUnit inlineDirectionSize = pageLogicalWidth();
|
| +
|
| + for (unsigned i = 0; i < colCount; i++) {
|
| + // Move to the next position.
|
| + if (leftToRight) {
|
| + ruleLogicalLeft += inlineDirectionSize + colGap / 2;
|
| + currLogicalLeftOffset += inlineDirectionSize + colGap;
|
| + } else {
|
| + ruleLogicalLeft -= (inlineDirectionSize + colGap / 2);
|
| + currLogicalLeftOffset -= (inlineDirectionSize + colGap);
|
| + }
|
| +
|
| + // Now compute the final bounds.
|
| + if (i < colCount - 1) {
|
| + LayoutUnit ruleLeft, ruleRight, ruleTop, ruleBottom;
|
| + if (isHorizontalWritingMode()) {
|
| + ruleLeft = paintOffset.x() + ruleLogicalLeft - ruleThickness / 2 + ruleAdd;
|
| + ruleRight = ruleLeft + ruleThickness;
|
| + ruleTop = paintOffset.y() + borderTop() + paddingTop();
|
| + ruleBottom = ruleTop + contentHeight();
|
| + } else {
|
| + ruleLeft = paintOffset.x() + borderLeft() + paddingLeft();
|
| + ruleRight = ruleLeft + contentWidth();
|
| + ruleTop = paintOffset.y() + ruleLogicalLeft - ruleThickness / 2 + ruleAdd;
|
| + ruleBottom = ruleTop + ruleThickness;
|
| + }
|
| +
|
| + columnRuleBounds.append(LayoutRect(ruleLeft, ruleTop, ruleRight - ruleLeft, ruleBottom - ruleTop));
|
| + }
|
| +
|
| + ruleLogicalLeft = currLogicalLeftOffset;
|
| + }
|
| + return true;
|
| +}
|
| +
|
| +LayoutRect LayoutMultiColumnSet::localOverflowRectForPaintInvalidation() const
|
| +{
|
| + LayoutRect blockFlowBounds = LayoutBlockFlow::localOverflowRectForPaintInvalidation();
|
| +
|
| + // Now add in column rule bounds, if present.
|
| + Vector<LayoutRect> columnRuleBounds;
|
| + if (computeColumnRuleBounds(LayoutPoint(), columnRuleBounds)) {
|
| + for (auto& bound : columnRuleBounds)
|
| + blockFlowBounds.unite(bound);
|
| + }
|
| + return blockFlowBounds;
|
| +}
|
| +
|
| } // namespace blink
|
|
|