Index: third_party/WebKit/Source/core/layout/LayoutTableSection.cpp |
diff --git a/third_party/WebKit/Source/core/layout/LayoutTableSection.cpp b/third_party/WebKit/Source/core/layout/LayoutTableSection.cpp |
index 43e67934103d977a14c7d199a7903eb9ec8f6bd3..8818174333d8c7f1919c86b9828c49c0b86756d7 100644 |
--- a/third_party/WebKit/Source/core/layout/LayoutTableSection.cpp |
+++ b/third_party/WebKit/Source/core/layout/LayoutTableSection.cpp |
@@ -1529,89 +1529,75 @@ LayoutRect LayoutTableSection::LogicalRectForWritingModeAndDirection( |
return table_aligned_rect; |
} |
-CellSpan LayoutTableSection::DirtiedRows(const LayoutRect& damage_rect) const { |
- if (force_full_paint_) |
- return FullSectionRowSpan(); |
+void LayoutTableSection::DirtiedRowsAndEffectiveColumns( |
+ const LayoutRect& damage_rect, |
+ CellSpan& rows, |
+ CellSpan& columns) const { |
+ if (!grid_.size()) { |
+ rows = CellSpan(); |
+ columns = CellSpan(); |
+ } |
- if (!grid_.size()) |
- return CellSpan(0, 0); |
- |
- CellSpan covered_rows = SpannedRows(damage_rect); |
- |
- // To paint the border we might need to paint the first or last row even if |
- // they are not spanned themselves. |
- CHECK_LT(covered_rows.Start(), row_pos_.size()); |
- if (covered_rows.Start() == row_pos_.size() - 1 && |
- row_pos_[row_pos_.size() - 1] + Table()->OuterBorderAfter() >= |
- damage_rect.Y()) |
- covered_rows.DecreaseStart(); |
- |
- if (!covered_rows.end() && |
- row_pos_[0] - Table()->OuterBorderBefore() <= damage_rect.MaxY()) |
- covered_rows.IncreaseEnd(); |
- |
- covered_rows.EnsureConsistency(grid_.size()); |
- if (!has_spanning_cells_ || !covered_rows.Start() || |
- covered_rows.Start() >= grid_.size()) |
- return covered_rows; |
- |
- // If there are any cells spanning into the first row, expand covered_rows |
- // to cover the primary cells. |
- unsigned n_cols = NumEffectiveColumns(covered_rows.Start()); |
- unsigned smallest_row = covered_rows.Start(); |
- CellSpan covered_columns = SpannedEffectiveColumns(damage_rect); |
- for (unsigned c = covered_columns.Start(); |
- c < std::min(covered_columns.end(), n_cols); ++c) { |
- if (const auto* cell = PrimaryCellAt(covered_rows.Start(), c)) { |
- smallest_row = std::min(smallest_row, cell->RowIndex()); |
- if (!smallest_row) |
- break; |
- } |
+ if (force_full_paint_) { |
+ rows = FullSectionRowSpan(); |
+ columns = FullTableEffectiveColumnSpan(); |
+ return; |
} |
- return CellSpan(smallest_row, covered_rows.end()); |
-} |
-CellSpan LayoutTableSection::DirtiedEffectiveColumns( |
- const LayoutRect& damage_rect) const { |
- if (force_full_paint_) |
- return FullTableEffectiveColumnSpan(); |
+ rows = SpannedRows(damage_rect); |
+ columns = SpannedEffectiveColumns(damage_rect); |
+ |
+ // Expand by one cell in each direction to cover any collapsed borders. |
+ if (Table()->ShouldCollapseBorders()) { |
+ if (rows.Start() > 0) |
+ rows.DecreaseStart(); |
+ if (rows.End() < grid_.size()) |
+ rows.IncreaseEnd(); |
+ if (columns.Start() > 0) |
+ columns.DecreaseStart(); |
+ if (columns.End() < Table()->NumEffectiveColumns()) |
+ columns.IncreaseEnd(); |
+ } |
- CHECK(Table()->NumEffectiveColumns()); |
- CellSpan covered_columns = SpannedEffectiveColumns(damage_rect); |
+ rows.EnsureConsistency(grid_.size()); |
+ columns.EnsureConsistency(Table()->NumEffectiveColumns()); |
- const Vector<int>& column_pos = Table()->EffectiveColumnPositions(); |
- // To paint the border we might need to paint the first or last column even if |
- // they are not spanned themselves. |
- CHECK_LT(covered_columns.Start(), column_pos.size()); |
- if (covered_columns.Start() == column_pos.size() - 1 && |
- column_pos[column_pos.size() - 1] + Table()->OuterBorderEnd() >= |
- damage_rect.X()) |
- covered_columns.DecreaseStart(); |
- |
- if (!covered_columns.end() && |
- column_pos[0] - Table()->OuterBorderStart() <= damage_rect.MaxX()) |
- covered_columns.IncreaseEnd(); |
- |
- covered_columns.EnsureConsistency(Table()->NumEffectiveColumns()); |
- if (!has_spanning_cells_ || !covered_columns.Start()) |
- return covered_columns; |
- |
- // If there are any cells spanning into the first column, expand |
- // covered_columns to cover the primary cells. |
- unsigned smallest_column = covered_columns.Start(); |
- CellSpan covered_rows = SpannedRows(damage_rect); |
- for (unsigned r = covered_rows.Start(); r < covered_rows.end(); ++r) { |
- const auto& grid_cells = grid_[r].grid_cells; |
- if (covered_columns.Start() < grid_cells.size()) { |
- unsigned c = covered_columns.Start(); |
- while (c && grid_cells[c].InColSpan()) |
- --c; |
- smallest_column = std::min(c, smallest_column); |
- if (!smallest_column) |
- break; |
+ if (!has_spanning_cells_) |
+ return; |
+ |
+ if (rows.Start() > 0 && rows.Start() < grid_.size()) { |
+ // If there are any cells spanning into the first row, expand |rows| to |
+ // cover the cells. |
+ unsigned n_cols = NumEffectiveColumns(rows.Start()); |
+ unsigned smallest_row = rows.Start(); |
+ for (unsigned c = columns.Start(); c < std::min(columns.End(), n_cols); |
+ ++c) { |
+ for (const auto* cell : GridCellAt(rows.Start(), c).Cells()) { |
+ smallest_row = std::min(smallest_row, cell->RowIndex()); |
+ if (!smallest_row) |
+ break; |
+ } |
+ } |
+ rows = CellSpan(smallest_row, rows.End()); |
+ } |
+ |
+ if (columns.Start() > 0 && columns.Start() < Table()->NumEffectiveColumns()) { |
+ // If there are any cells spanning into the first column, expand |columns| |
+ // to cover the cells. |
+ unsigned smallest_column = columns.Start(); |
+ for (unsigned r = rows.Start(); r < rows.End(); ++r) { |
+ const auto& grid_cells = grid_[r].grid_cells; |
+ if (columns.Start() < grid_cells.size()) { |
+ unsigned c = columns.Start(); |
+ while (c && grid_cells[c].InColSpan()) |
+ --c; |
+ smallest_column = std::min(c, smallest_column); |
+ if (!smallest_column) |
+ break; |
+ } |
} |
+ columns = CellSpan(smallest_column, columns.End()); |
} |
- return CellSpan(smallest_column, covered_columns.end()); |
} |
CellSpan LayoutTableSection::SpannedRows(const LayoutRect& flipped_rect) const { |
@@ -1869,11 +1855,11 @@ bool LayoutTableSection::NodeAtPoint( |
CellSpan column_span = SpannedEffectiveColumns(table_aligned_rect); |
// Now iterate over the spanned rows and columns. |
- for (unsigned hit_row = row_span.Start(); hit_row < row_span.end(); |
+ for (unsigned hit_row = row_span.Start(); hit_row < row_span.End(); |
++hit_row) { |
unsigned n_cols = NumEffectiveColumns(hit_row); |
for (unsigned hit_column = column_span.Start(); |
- hit_column < n_cols && hit_column < column_span.end(); ++hit_column) { |
+ hit_column < n_cols && hit_column < column_span.End(); ++hit_column) { |
auto& grid_cell = GridCellAt(hit_row, hit_column); |
// If the cell is empty, there's nothing to do |