Chromium Code Reviews| Index: Source/core/rendering/RenderGrid.cpp |
| diff --git a/Source/core/rendering/RenderGrid.cpp b/Source/core/rendering/RenderGrid.cpp |
| index 4c4a189f0483c11021b6e2d6e217cec0dcd07a52..f7bec2935cc8579052f5eecbde151c68ac09f0af 100644 |
| --- a/Source/core/rendering/RenderGrid.cpp |
| +++ b/Source/core/rendering/RenderGrid.cpp |
| @@ -1286,14 +1286,15 @@ LayoutUnit RenderGrid::startOfColumnForChild(const RenderBox& child) const |
| LayoutUnit RenderGrid::endOfColumnForChild(const RenderBox& child) const |
| { |
| + bool hasOrthogonalWritingMode = child.isHorizontalWritingMode() != isHorizontalWritingMode(); |
| const GridCoordinate& coordinate = cachedGridCoordinate(child); |
| LayoutUnit startOfColumn = m_columnPositions[coordinate.columns.resolvedInitialPosition.toInt()]; |
| // The grid items should be inside the grid container's border box, that's why they need to be shifted. |
| LayoutUnit columnPosition = startOfColumn + marginStartForChild(child); |
| LayoutUnit endOfColumn = m_columnPositions[coordinate.columns.resolvedFinalPosition.next().toInt()]; |
| - // FIXME: This might not work as expected with orthogonal writing-modes. |
| - LayoutUnit offsetFromColumnPosition = computeOverflowAlignmentOffset(child.style()->justifySelfOverflowAlignment(), startOfColumn, endOfColumn, child.logicalWidth() + child.marginLogicalWidth()); |
| + LayoutUnit childBreadth = hasOrthogonalWritingMode ? child.logicalHeight() + child.marginLogicalHeight() : child.logicalWidth() + child.marginLogicalWidth(); |
| + LayoutUnit offsetFromColumnPosition = computeOverflowAlignmentOffset(child.style()->justifySelfOverflowAlignment(), startOfColumn, endOfColumn, childBreadth); |
| return columnPosition + offsetFromColumnPosition; |
| } |
| @@ -1316,12 +1317,13 @@ LayoutUnit RenderGrid::columnPositionRight(const RenderBox& child) const |
| LayoutUnit RenderGrid::centeredColumnPositionForChild(const RenderBox& child) const |
| { |
| + bool hasOrthogonalWritingMode = child.isHorizontalWritingMode() != isHorizontalWritingMode(); |
| const GridCoordinate& coordinate = cachedGridCoordinate(child); |
| LayoutUnit startOfColumn = m_columnPositions[coordinate.columns.resolvedInitialPosition.toInt()]; |
| LayoutUnit endOfColumn = m_columnPositions[coordinate.columns.resolvedFinalPosition.next().toInt()]; |
| LayoutUnit columnPosition = startOfColumn + marginStartForChild(child); |
| - // FIXME: This might not work as expected with orthogonal writing-modes. |
| - LayoutUnit offsetFromColumnPosition = computeOverflowAlignmentOffset(child.style()->justifySelfOverflowAlignment(), startOfColumn, endOfColumn, child.logicalWidth() + child.marginLogicalWidth()); |
| + LayoutUnit childBreadth = hasOrthogonalWritingMode ? child.logicalHeight() + child.marginLogicalHeight() : child.logicalWidth() + child.marginLogicalWidth(); |
| + LayoutUnit offsetFromColumnPosition = computeOverflowAlignmentOffset(child.style()->justifySelfOverflowAlignment(), startOfColumn, endOfColumn, childBreadth); |
| return columnPosition + offsetFromColumnPosition / 2; |
| } |
| @@ -1332,10 +1334,20 @@ LayoutUnit RenderGrid::columnPositionForChild(const RenderBox& child) const |
| switch (RenderStyle::resolveJustification(style(), child.style(), ItemPositionStretch)) { |
| case ItemPositionSelfStart: |
| - // For orthogonal writing-modes, this computes to 'start' |
| - // FIXME: grid track sizing and positioning do not support orthogonal modes yet. |
| - if (hasOrthogonalWritingMode) |
| - return startOfColumnForChild(child); |
| + // If orthogonal writing-modes, self-start will be based on the child's block-axis |
| + // direction, because it's the one parallel to the alignment property's axis. |
| + if (hasOrthogonalWritingMode) { |
| + switch (child.style()->writingMode()) { |
| + case TopToBottomWritingMode: |
| + return style()->isLeftToRightDirection() ? startOfColumnForChild(child) : endOfColumnForChild(child); |
| + case BottomToTopWritingMode: |
| + return style()->isLeftToRightDirection() ? endOfColumnForChild(child) : startOfColumnForChild(child); |
| + case LeftToRightWritingMode: |
| + return style()->isLeftToRightDirection() ? startOfColumnForChild(child) : endOfColumnForChild(child); |
| + case RightToLeftWritingMode: |
|
Julien - ping for review
2015/01/26 10:42:07
Seems like we could think of it in terms of isFlip
jfernandez
2015/02/06 23:54:19
Acknowledged.
|
| + return style()->isLeftToRightDirection() ? endOfColumnForChild(child) : startOfColumnForChild(child); |
| + } |
| + } |
| // self-start is based on the child's direction. That's why we need to check against the grid container's direction. |
| if (child.style()->direction() != style()->direction()) |
| @@ -1343,10 +1355,18 @@ LayoutUnit RenderGrid::columnPositionForChild(const RenderBox& child) const |
| return startOfColumnForChild(child); |
| case ItemPositionSelfEnd: |
| - // For orthogonal writing-modes, this computes to 'start' |
| - // FIXME: grid track sizing and positioning do not support orthogonal modes yet. |
| - if (hasOrthogonalWritingMode) |
| - return endOfColumnForChild(child); |
| + if (hasOrthogonalWritingMode) { |
|
Julien - ping for review
2015/01/26 10:42:07
// See comment above about the block-axis?
jfernandez
2015/02/06 23:54:19
Done.
|
| + switch (child.style()->writingMode()) { |
| + case TopToBottomWritingMode: |
| + return style()->isLeftToRightDirection() ? endOfColumnForChild(child) : startOfColumnForChild(child); |
| + case BottomToTopWritingMode: |
| + return style()->isLeftToRightDirection() ? startOfColumnForChild(child) : endOfColumnForChild(child); |
| + case LeftToRightWritingMode: |
| + return style()->isLeftToRightDirection() ? endOfColumnForChild(child) : startOfColumnForChild(child); |
| + case RightToLeftWritingMode: |
| + return style()->isLeftToRightDirection() ? startOfColumnForChild(child) : endOfColumnForChild(child); |
| + } |
| + } |
| // self-end is based on the child's direction. That's why we need to check against the grid container's direction. |
| if (child.style()->direction() != style()->direction()) |
| @@ -1385,6 +1405,7 @@ LayoutUnit RenderGrid::columnPositionForChild(const RenderBox& child) const |
| LayoutUnit RenderGrid::endOfRowForChild(const RenderBox& child) const |
| { |
| + bool hasOrthogonalWritingMode = child.isHorizontalWritingMode() != isHorizontalWritingMode(); |
| const GridCoordinate& coordinate = cachedGridCoordinate(child); |
| LayoutUnit startOfRow = m_rowPositions[coordinate.rows.resolvedInitialPosition.toInt()]; |
| @@ -1392,7 +1413,8 @@ LayoutUnit RenderGrid::endOfRowForChild(const RenderBox& child) const |
| LayoutUnit rowPosition = startOfRow + marginBeforeForChild(child); |
| LayoutUnit endOfRow = m_rowPositions[coordinate.rows.resolvedFinalPosition.next().toInt()]; |
| - LayoutUnit offsetFromRowPosition = computeOverflowAlignmentOffset(child.style()->alignSelfOverflowAlignment(), startOfRow, endOfRow, child.logicalHeight() + child.marginLogicalHeight()); |
| + LayoutUnit childBreadth = hasOrthogonalWritingMode ? child.logicalWidth() + child.marginLogicalWidth() : child.logicalHeight() + child.marginLogicalHeight(); |
| + LayoutUnit offsetFromRowPosition = computeOverflowAlignmentOffset(child.style()->alignSelfOverflowAlignment(), startOfRow, endOfRow, childBreadth); |
| return rowPosition + offsetFromRowPosition; |
| } |
| @@ -1410,13 +1432,15 @@ LayoutUnit RenderGrid::startOfRowForChild(const RenderBox& child) const |
| LayoutUnit RenderGrid::centeredRowPositionForChild(const RenderBox& child) const |
| { |
| + bool hasOrthogonalWritingMode = child.isHorizontalWritingMode() != isHorizontalWritingMode(); |
| const GridCoordinate& coordinate = cachedGridCoordinate(child); |
| // The grid items should be inside the grid container's border box, that's why they need to be shifted. |
| LayoutUnit startOfRow = m_rowPositions[coordinate.rows.resolvedInitialPosition.toInt()]; |
| LayoutUnit endOfRow = m_rowPositions[coordinate.rows.resolvedFinalPosition.next().toInt()]; |
| LayoutUnit rowPosition = startOfRow + marginBeforeForChild(child); |
| - LayoutUnit offsetFromRowPosition = computeOverflowAlignmentOffset(child.style()->alignSelfOverflowAlignment(), startOfRow, endOfRow, child.logicalHeight() + child.marginLogicalHeight()); |
| + LayoutUnit childBreadth = hasOrthogonalWritingMode ? child.logicalWidth() + child.marginLogicalWidth() : child.logicalHeight() + child.marginLogicalHeight(); |
| + LayoutUnit offsetFromRowPosition = computeOverflowAlignmentOffset(child.style()->alignSelfOverflowAlignment(), startOfRow, endOfRow, childBreadth); |
| return rowPosition + offsetFromRowPosition / 2; |
| } |
| @@ -1507,10 +1531,20 @@ LayoutUnit RenderGrid::rowPositionForChild(const RenderBox& child) const |
| bool hasOrthogonalWritingMode = child.isHorizontalWritingMode() != isHorizontalWritingMode(); |
| switch (RenderStyle::resolveAlignment(style(), child.style(), ItemPositionStretch)) { |
| case ItemPositionSelfStart: |
| - // If orthogonal writing-modes, this computes to 'start'. |
| - // FIXME: grid track sizing and positioning do not support orthogonal modes yet. |
| - if (hasOrthogonalWritingMode) |
| - return startOfRowForChild(child); |
| + // If orthogonal writing-modes, self-start will be based on the child's inline-axis |
| + // direction, because it's the one parallel to the alignment property's axis. |
| + if (hasOrthogonalWritingMode) { |
| + switch (style()->writingMode()) { |
| + case TopToBottomWritingMode: |
| + return child.style()->isLeftToRightDirection() ? startOfRowForChild(child) : endOfRowForChild(child); |
| + case BottomToTopWritingMode: |
| + return child.style()->isLeftToRightDirection() ? endOfRowForChild(child) : startOfRowForChild(child); |
| + case LeftToRightWritingMode: |
| + return child.style()->isLeftToRightDirection() ? startOfRowForChild(child) : endOfRowForChild(child); |
| + case RightToLeftWritingMode: |
| + return child.style()->isLeftToRightDirection() ? endOfRowForChild(child) : startOfRowForChild(child); |
| + } |
| + } |
| // self-start is based on the child's block axis direction. That's why we need to check against the grid container's block flow. |
| if (child.style()->writingMode() != style()->writingMode()) |
| @@ -1518,10 +1552,20 @@ LayoutUnit RenderGrid::rowPositionForChild(const RenderBox& child) const |
| return startOfRowForChild(child); |
| case ItemPositionSelfEnd: |
| - // If orthogonal writing-modes, this computes to 'end'. |
| - // FIXME: grid track sizing and positioning do not support orthogonal modes yet. |
| - if (hasOrthogonalWritingMode) |
| - return endOfRowForChild(child); |
| + // If orthogonal writing-modes, self-end will be based on the child's inline-axis |
| + // direction, because it's the one parallel to the alignment property's axis. |
| + if (hasOrthogonalWritingMode) { |
| + switch (style()->writingMode()) { |
| + case TopToBottomWritingMode: |
| + return child.style()->isLeftToRightDirection() ? endOfRowForChild(child) : startOfRowForChild(child); |
| + case BottomToTopWritingMode: |
| + return child.style()->isLeftToRightDirection() ? startOfRowForChild(child) : endOfRowForChild(child); |
| + case LeftToRightWritingMode: |
| + return child.style()->isLeftToRightDirection() ? endOfRowForChild(child) : startOfRowForChild(child); |
| + case RightToLeftWritingMode: |
| + return child.style()->isLeftToRightDirection() ? startOfRowForChild(child) : endOfRowForChild(child); |
| + } |
| + } |
| // self-end is based on the child's block axis direction. That's why we need to check against the grid container's block flow. |
| if (child.style()->writingMode() != style()->writingMode()) |
| @@ -1529,22 +1573,12 @@ LayoutUnit RenderGrid::rowPositionForChild(const RenderBox& child) const |
| return endOfRowForChild(child); |
| case ItemPositionLeft: |
| - // The alignment axis (column axis) and the inline axis are parallell in |
| - // orthogonal writing mode. |
| - // FIXME: grid track sizing and positioning do not support orthogonal modes yet. |
| - if (hasOrthogonalWritingMode) |
| - return startOfRowForChild(child); |
| - |
| - // Otherwise this this is equivalent to 'start’. |
| + // The alignment axis (column axis) is orthogonal to the inline axis so this is |
| + // equivalent to 'start'. |
| return startOfRowForChild(child); |
| case ItemPositionRight: |
| - // The alignment axis (column axis) and the inline axis are parallell in |
| - // orthogonal writing mode. |
| - // FIXME: grid track sizing and positioning do not support orthogonal modes yet. |
| - if (hasOrthogonalWritingMode) |
| - return endOfRowForChild(child); |
| - |
| - // Otherwise this this is equivalent to 'start’. |
| + // The alignment axis (column axis) is orthogonal to the inline axis so this is |
| + // equivalent to 'start'. |
| return startOfRowForChild(child); |
| case ItemPositionCenter: |
| return centeredRowPositionForChild(child); |
| @@ -1688,8 +1722,10 @@ LayoutPoint RenderGrid::findChildLogicalPosition(const RenderBox& child, LayoutS |
| LayoutUnit columnPosition = columnPositionForChild(child); |
| // We stored m_columnPositions's data ignoring the direction, hence we might need now |
| // to translate positions from RTL to LTR, as it's more convenient for painting. |
| - if (!style()->isLeftToRightDirection()) |
| - columnPosition = (m_columnPositions[m_columnPositions.size() - 1] + borderAndPaddingLogicalLeft()) - columnPosition - child.logicalWidth(); |
| + if (!style()->isLeftToRightDirection()) { |
| + LayoutUnit childBreadth = hasOrthogonalWritingMode ? child.logicalHeight(): child.logicalWidth(); |
|
Julien - ping for review
2015/01/26 10:42:06
Style: Space before and after ':'.
jfernandez
2015/02/06 23:54:19
Done.
|
| + columnPosition = (m_columnPositions[m_columnPositions.size() - 1] + borderAndPaddingLogicalLeft()) - columnPosition - childBreadth; |
| + } |
| // We stored column's and row's positions without considering orthogonal flows, so now we |
| // need to flip the final LayoutPoint coordinates if that's the case. |