| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 1997 Martin Jones (mjones@kde.org) | 2 * Copyright (C) 1997 Martin Jones (mjones@kde.org) |
| 3 * (C) 1997 Torben Weis (weis@kde.org) | 3 * (C) 1997 Torben Weis (weis@kde.org) |
| 4 * (C) 1998 Waldo Bastian (bastian@kde.org) | 4 * (C) 1998 Waldo Bastian (bastian@kde.org) |
| 5 * (C) 1999 Lars Knoll (knoll@kde.org) | 5 * (C) 1999 Lars Knoll (knoll@kde.org) |
| 6 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 6 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
| 7 * Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009, 2010, 2013 Apple Inc. | 7 * Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009, 2010, 2013 Apple Inc. |
| 8 * All rights reserved. | 8 * All rights reserved. |
| 9 * Copyright (C) 2006 Alexey Proskuryakov (ap@nypop.com) | 9 * Copyright (C) 2006 Alexey Proskuryakov (ap@nypop.com) |
| 10 * | 10 * |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 124 LayoutTableBoxComponent::StyleDidChange(diff, old_style); | 124 LayoutTableBoxComponent::StyleDidChange(diff, old_style); |
| 125 PropagateStyleToAnonymousChildren(); | 125 PropagateStyleToAnonymousChildren(); |
| 126 | 126 |
| 127 if (!old_style) | 127 if (!old_style) |
| 128 return; | 128 return; |
| 129 | 129 |
| 130 LayoutTable* table = this->Table(); | 130 LayoutTable* table = this->Table(); |
| 131 if (!table) | 131 if (!table) |
| 132 return; | 132 return; |
| 133 | 133 |
| 134 LayoutTableBoxComponent::InvalidateCollapsedBordersOnStyleChange( | 134 if (LayoutTableBoxComponent::NeedsInvalidateCollapsedBordersOnStyleChange( |
| 135 *this, *table, diff, *old_style); | 135 *this, *table, diff, *old_style)) |
| 136 InvalidateCollapsedBordersOfAffectedCells(); |
| 136 | 137 |
| 137 if (LayoutTableBoxComponent::DoCellsHaveDirtyWidth(*this, *table, diff, | 138 if (LayoutTableBoxComponent::DoCellsHaveDirtyWidth(*this, *table, diff, |
| 138 *old_style)) | 139 *old_style)) |
| 139 MarkAllCellsWidthsDirtyAndOrNeedsLayout( | 140 MarkAllCellsWidthsDirtyAndOrNeedsLayout( |
| 140 LayoutTable::kMarkDirtyAndNeedsLayout); | 141 LayoutTable::kMarkDirtyAndNeedsLayout); |
| 141 } | 142 } |
| 142 | 143 |
| 143 void LayoutTableSection::WillBeRemovedFromTree() { | 144 void LayoutTableSection::WillBeRemovedFromTree() { |
| 144 LayoutTableBoxComponent::WillBeRemovedFromTree(); | 145 LayoutTableBoxComponent::WillBeRemovedFromTree(); |
| 145 | 146 |
| (...skipping 2019 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2165 | 2166 |
| 2166 bool LayoutTableSection::PaintedOutputOfObjectHasNoEffectRegardlessOfSize() | 2167 bool LayoutTableSection::PaintedOutputOfObjectHasNoEffectRegardlessOfSize() |
| 2167 const { | 2168 const { |
| 2168 // LayoutTableSection paints background from columns. | 2169 // LayoutTableSection paints background from columns. |
| 2169 if (Table()->HasColElements()) | 2170 if (Table()->HasColElements()) |
| 2170 return false; | 2171 return false; |
| 2171 return LayoutTableBoxComponent:: | 2172 return LayoutTableBoxComponent:: |
| 2172 PaintedOutputOfObjectHasNoEffectRegardlessOfSize(); | 2173 PaintedOutputOfObjectHasNoEffectRegardlessOfSize(); |
| 2173 } | 2174 } |
| 2174 | 2175 |
| 2176 void LayoutTableSection::InvalidateCellCollapsedBordersIntersectingRow( |
| 2177 unsigned row_index) { |
| 2178 auto& row_struct = grid_[row_index].row; |
| 2179 for (auto& cell_struct : row_struct) { |
| 2180 if (cell_struct.in_col_span) |
| 2181 continue; |
| 2182 if (auto* cell = cell_struct.PrimaryCell()) |
| 2183 cell->InvalidateCollapsedBorderValues(); |
| 2184 } |
| 2185 } |
| 2186 |
| 2187 void LayoutTableSection::InvalidateCollapsedBordersOfAffectedCells() { |
| 2188 auto* table = this->Table(); |
| 2189 DCHECK(table->CollapseBorders()); |
| 2190 if (table->NeedsInvalidateCollapsedBordersForAllCells()) |
| 2191 return; |
| 2192 |
| 2193 table->RecalcSectionsIfNeeded(); |
| 2194 table->InvalidateCollapsedBorders(); |
| 2195 |
| 2196 if (NumRows()) { |
| 2197 // Invalidate cells intersecting the top row. |
| 2198 InvalidateCellCollapsedBordersIntersectingRow(0); |
| 2199 // Invalidate cells intersecting the bottom row. |
| 2200 if (NumRows() > 1) |
| 2201 InvalidateCellCollapsedBordersIntersectingRow(NumRows() - 1); |
| 2202 |
| 2203 // Invalidate cell in start and end columns. |
| 2204 auto num_effective_columns = this->NumEffectiveColumns(); |
| 2205 for (unsigned r = 0; r < NumRows(); ++r) { |
| 2206 if (auto* cell = PrimaryCellAt(r, 0)) |
| 2207 cell->InvalidateCollapsedBorderValues(); |
| 2208 if (auto* cell = PrimaryCellAt(r, num_effective_columns - 1)) |
| 2209 cell->InvalidateCollapsedBorderValues(); |
| 2210 } |
| 2211 } |
| 2212 |
| 2213 // Invalidate cells in the row above the top row. |
| 2214 if (auto* section = table->SectionAbove(this, kSkipEmptySections)) { |
| 2215 section->InvalidateCellCollapsedBordersIntersectingRow(section->NumRows() - |
| 2216 1); |
| 2217 } |
| 2218 // Invalidate cells in the row below the bottom row. |
| 2219 if (auto* section = table->SectionBelow(this, kSkipEmptySections)) { |
| 2220 section->InvalidateCellCollapsedBordersIntersectingRow(0); |
| 2221 } |
| 2222 } |
| 2223 |
| 2224 LayoutTableCell* LayoutTableSection::PrimaryCellAboveInTable( |
| 2225 unsigned row, |
| 2226 unsigned effective_column) { |
| 2227 DCHECK(PrimaryCellAt(row, effective_column)->RowIndex() == row); |
| 2228 if (row) |
| 2229 return PrimaryCellAt(row - 1, effective_column); |
| 2230 if (auto* section_above = Table()->SectionAbove(this, kSkipEmptySections)) { |
| 2231 return section_above->PrimaryCellAt(section_above->NumRows() - 1, |
| 2232 effective_column); |
| 2233 } |
| 2234 return nullptr; |
| 2235 } |
| 2236 |
| 2237 LayoutTableCell* LayoutTableSection::PrimaryCellBelowInTable( |
| 2238 unsigned row, |
| 2239 unsigned effective_column) { |
| 2240 DCHECK(PrimaryCellAt(row, effective_column)->RowIndex() == row); |
| 2241 unsigned row_below = row + PrimaryCellAt(row, effective_column)->RowSpan(); |
| 2242 if (row_below < NumRows()) |
| 2243 return PrimaryCellAt(row_below, effective_column); |
| 2244 if (auto* section_below = Table()->SectionBelow(this, kSkipEmptySections)) |
| 2245 return section_below->PrimaryCellAt(0, effective_column); |
| 2246 return nullptr; |
| 2247 } |
| 2248 |
| 2175 } // namespace blink | 2249 } // namespace blink |
| OLD | NEW |