Chromium Code Reviews| Index: Source/core/rendering/RenderTableSection.cpp |
| diff --git a/Source/core/rendering/RenderTableSection.cpp b/Source/core/rendering/RenderTableSection.cpp |
| index 9504b4c4817b3a21fbd813fb02db63002a579705..83976f3e34e562d95541add711a27bc4961d47c9 100644 |
| --- a/Source/core/rendering/RenderTableSection.cpp |
| +++ b/Source/core/rendering/RenderTableSection.cpp |
| @@ -357,6 +357,42 @@ static void updatePositionIncreasedWithRowHeight(long long extraHeight, long lon |
| remainder += (extraHeight * rowHeight) % totalHeight; |
| } |
| +// This is mainly used to distribute whole extra rowspanning height in percent rows when all spanning rows are |
| +// percent rows. |
| +// Distributing whole extra rowspanning height in percent rows based on the ratios of percent because this method works |
| +// same as percent distribution when only percent rows are present and percent is 100. Also works perfectly fine when |
| +// percent is not equal to 100. |
| +void RenderTableSection::distributeWholeExtraRowSpanHeightToPercentRows(RenderTableCell* cell, int totalPercent, int& extraRowSpanningHeight, Vector<int>& rowsHeight) |
| +{ |
| + if (!extraRowSpanningHeight || !totalPercent) |
| + return; |
| + |
| + const unsigned rowSpan = cell->rowSpan(); |
| + const unsigned rowIndex = cell->rowIndex(); |
| + int remainder = 0; |
| + |
| + int accumulatedPositionIncrease = 0; |
| + for (unsigned row = rowIndex; row < (rowIndex + rowSpan); row++) { |
| + if (m_grid[row].logicalHeight.isPercent()) { |
| + updatePositionIncreasedWithRowHeight(extraRowSpanningHeight, m_grid[row].logicalHeight.percent(), totalPercent, accumulatedPositionIncrease, remainder); |
|
Julien - ping for review
2014/08/15 20:17:09
distributeExtraRowSpanHeightToPercentRows doesn't
suchit.agrawal
2014/08/17 07:16:22
Acknowledged.
|
| + |
| + // While whole extra spanning height is distributing in percent spanning rows, rational parts remains |
| + // in every integer division. So accumulating all remainder part in integer division and when total remainder |
| + // is equvalent to divisor then 1 unit increased in row position. |
| + // Note that this algorithm is biased towards adding more space towards the lower rows. |
| + if (remainder >= totalPercent) { |
| + remainder -= totalPercent; |
| + accumulatedPositionIncrease++; |
| + } |
| + } |
| + m_rowPos[row + 1] += accumulatedPositionIncrease; |
| + } |
| + |
| + ASSERT(!remainder); |
| + |
| + extraRowSpanningHeight -= accumulatedPositionIncrease; |
| +} |
| + |
| void RenderTableSection::distributeExtraRowSpanHeightToAutoRows(RenderTableCell* cell, int totalAutoRowsHeight, int& extraRowSpanningHeight, Vector<int>& rowsHeight) |
| { |
| if (!extraRowSpanningHeight || !totalAutoRowsHeight) |
| @@ -613,9 +649,14 @@ void RenderTableSection::distributeRowSpanHeightToRows(SpanningRenderTableCells& |
| int extraRowSpanningHeight = spanningRowsHeight.spanningCellHeightIgnoringBorderSpacing - spanningRowsHeight.totalRowsHeight; |
| - distributeExtraRowSpanHeightToPercentRows(cell, totalPercent, extraRowSpanningHeight, spanningRowsHeight.rowHeight); |
| - distributeExtraRowSpanHeightToAutoRows(cell, totalAutoRowsHeight, extraRowSpanningHeight, spanningRowsHeight.rowHeight); |
| - distributeExtraRowSpanHeightToRemainingRows(cell, totalRemainingRowsHeight, extraRowSpanningHeight, spanningRowsHeight.rowHeight); |
| + if (totalPercent < 100 && !totalAutoRowsHeight && !totalRemainingRowsHeight) { |
| + // Distributing whole extra rowspanning height in percent row when only non-percent rows height is 0. |
| + distributeWholeExtraRowSpanHeightToPercentRows(cell, totalPercent, extraRowSpanningHeight, spanningRowsHeight.rowHeight); |
| + } else { |
| + distributeExtraRowSpanHeightToPercentRows(cell, totalPercent, extraRowSpanningHeight, spanningRowsHeight.rowHeight); |
| + distributeExtraRowSpanHeightToAutoRows(cell, totalAutoRowsHeight, extraRowSpanningHeight, spanningRowsHeight.rowHeight); |
| + distributeExtraRowSpanHeightToRemainingRows(cell, totalRemainingRowsHeight, extraRowSpanningHeight, spanningRowsHeight.rowHeight); |
| + } |
| ASSERT(!extraRowSpanningHeight); |