Index: Source/core/rendering/RenderTableSection.cpp |
diff --git a/Source/core/rendering/RenderTableSection.cpp b/Source/core/rendering/RenderTableSection.cpp |
index b779a5f80271bb4b27681adf620986b14ac4f8b9..870884c85e8d23c18718ef4848f8d6582b94e478 100644 |
--- a/Source/core/rendering/RenderTableSection.cpp |
+++ b/Source/core/rendering/RenderTableSection.cpp |
@@ -484,57 +484,59 @@ static bool compareRowSpanCellsInHeightDistributionOrder(const RenderTableCell* |
return false; |
} |
-bool RenderTableSection::isHeightNeededForRowHavingOnlySpanningCells(unsigned row) |
+unsigned RenderTableSection::calcRowHeightHavingOnlySpanningCells(unsigned row, int& accumulatedCellPositionIncrease, unsigned rowToApplyExtraHeight, unsigned& extraTableHeightToPropgate, Vector<int>& rowsCountWithOnlySpanningCells) |
{ |
+ ASSERT(rowHasOnlySpanningCells(row)); |
+ |
unsigned totalCols = m_grid[row].row.size(); |
if (!totalCols) |
- return false; |
+ return 0; |
+ |
+ unsigned rowHeight = 0; |
for (unsigned col = 0; col < totalCols; col++) { |
const CellStruct& rowSpanCell = cellAt(row, col); |
- if (rowSpanCell.cells.size()) { |
- RenderTableCell* cell = rowSpanCell.cells[0]; |
- const unsigned rowIndex = cell->rowIndex(); |
- const unsigned rowSpan = cell->rowSpan(); |
- int totalRowSpanCellHeight = 0; |
+ if (!rowSpanCell.cells.size()) |
+ continue; |
- for (unsigned row = 0; row < rowSpan; row++) { |
- unsigned actualRow = row + rowIndex; |
- totalRowSpanCellHeight += m_rowPos[actualRow + 1] - m_rowPos[actualRow]; |
- } |
- totalRowSpanCellHeight -= borderSpacingForRow(rowIndex + rowSpan - 1); |
+ RenderTableCell* cell = rowSpanCell.cells[0]; |
- if (totalRowSpanCellHeight < cell->logicalHeightForRowSizing()) |
- return true; |
- } |
- } |
+ if (cell->rowSpan() < 2) |
+ continue; |
- return false; |
-} |
+ const unsigned cellRowIndex = cell->rowIndex(); |
+ const unsigned cellRowSpan = cell->rowSpan(); |
-unsigned RenderTableSection::calcRowHeightHavingOnlySpanningCells(unsigned row) |
-{ |
- ASSERT(rowHasOnlySpanningCells(row)); |
+ // As we are going from the top of the table to the bottom to calculate the row |
+ // heights for rows that only contain spanning cells and all previous rows are |
+ // processed we only need to find the number of rows with spanning cells from the |
+ // current cell to the end of the current cells spanning height. |
+ unsigned startRowForSpanningCellCount = std::max(cellRowIndex, row); |
+ unsigned endRow = cellRowIndex + cellRowSpan; |
+ unsigned spanningCellsRowsCountHavingZeroHeight = rowsCountWithOnlySpanningCells[endRow - 1]; |
- unsigned totalCols = m_grid[row].row.size(); |
+ if (startRowForSpanningCellCount) |
+ spanningCellsRowsCountHavingZeroHeight -= rowsCountWithOnlySpanningCells[startRowForSpanningCellCount - 1]; |
- if (!totalCols) |
- return 0; |
+ int totalRowspanCellHeight = (m_rowPos[endRow] - m_rowPos[cellRowIndex]) - borderSpacingForRow(endRow - 1); |
- unsigned rowHeight = 0; |
+ totalRowspanCellHeight += accumulatedCellPositionIncrease; |
+ if (rowToApplyExtraHeight >= cellRowIndex && rowToApplyExtraHeight < endRow) |
+ totalRowspanCellHeight += extraTableHeightToPropgate; |
- for (unsigned col = 0; col < totalCols; col++) { |
- const CellStruct& rowSpanCell = cellAt(row, col); |
- if (rowSpanCell.cells.size() && rowSpanCell.cells[0]->rowSpan() > 1) |
- rowHeight = std::max(rowHeight, rowSpanCell.cells[0]->logicalHeightForRowSizing() / rowSpanCell.cells[0]->rowSpan()); |
+ if (totalRowspanCellHeight < cell->logicalHeightForRowSizing()) { |
+ unsigned extraHeightRequired = cell->logicalHeightForRowSizing() - totalRowspanCellHeight; |
+ |
+ rowHeight = std::max(rowHeight, extraHeightRequired / spanningCellsRowsCountHavingZeroHeight); |
+ } |
} |
return rowHeight; |
} |
-void RenderTableSection::updateRowsHeightHavingOnlySpanningCells(RenderTableCell* cell, struct SpanningRowsHeight& spanningRowsHeight) |
+void RenderTableSection::updateRowsHeightHavingOnlySpanningCells(RenderTableCell* cell, struct SpanningRowsHeight& spanningRowsHeight, unsigned& extraHeightToPropagate, Vector<int>& rowsCountWithOnlySpanningCells) |
{ |
ASSERT(spanningRowsHeight.rowHeight.size()); |
@@ -546,8 +548,8 @@ void RenderTableSection::updateRowsHeightHavingOnlySpanningCells(RenderTableCell |
for (unsigned row = 0; row < spanningRowsHeight.rowHeight.size(); row++) { |
unsigned actualRow = row + rowIndex; |
- if (!spanningRowsHeight.rowHeight[row] && rowHasOnlySpanningCells(actualRow) && isHeightNeededForRowHavingOnlySpanningCells(actualRow)) { |
- spanningRowsHeight.rowHeight[row] = calcRowHeightHavingOnlySpanningCells(actualRow); |
+ if (!spanningRowsHeight.rowHeight[row] && rowHasOnlySpanningCells(actualRow)) { |
+ spanningRowsHeight.rowHeight[row] = calcRowHeightHavingOnlySpanningCells(actualRow, accumulatedPositionIncrease, rowIndex + rowSpan, extraHeightToPropagate, rowsCountWithOnlySpanningCells); |
accumulatedPositionIncrease += spanningRowsHeight.rowHeight[row]; |
} |
m_rowPos[actualRow + 1] += accumulatedPositionIncrease; |
@@ -570,6 +572,16 @@ void RenderTableSection::distributeRowSpanHeightToRows(SpanningRenderTableCells& |
unsigned lastRowIndex = 0; |
unsigned lastRowSpan = 0; |
+ Vector<int> rowsCountWithOnlySpanningCells; |
+ |
+ // At this stage, Height of the rows are zero for the one containing only spanning cells. |
+ int count = 0; |
+ for (unsigned row = 0; row < m_grid.size(); row++) { |
+ if (rowHasOnlySpanningCells(row)) |
+ count++; |
+ rowsCountWithOnlySpanningCells.append(count); |
+ } |
+ |
for (unsigned i = 0; i < rowSpanCells.size(); i++) { |
RenderTableCell* cell = rowSpanCells[i]; |
@@ -607,7 +619,7 @@ void RenderTableSection::distributeRowSpanHeightToRows(SpanningRenderTableCells& |
// Here we are handling only row(s) who have only rowspanning cells and do not have any empty cell. |
if (spanningRowsHeight.isAnyRowWithOnlySpanningCells) |
- updateRowsHeightHavingOnlySpanningCells(cell, spanningRowsHeight); |
+ updateRowsHeightHavingOnlySpanningCells(cell, spanningRowsHeight, extraHeightToPropagate, rowsCountWithOnlySpanningCells); |
// This code handle row(s) that have rowspanning cell(s) and at least one empty cell. |
// Such rows are not handled below and end up having a height of 0. That would mean |