|
@@ -1182,7 +1182,8 @@ void TableFormattingContext::position_cell_boxes()
|
|
|
|
|
|
bool TableFormattingContext::border_is_less_specific(const CSS::BorderData& a, const CSS::BorderData& b)
|
|
|
{
|
|
|
- // Implements criteria for steps 1, 2 and 3 of border conflict resolution algorithm.
|
|
|
+ // Implements criteria for steps 1, 2 and 3 of border conflict resolution algorithm, as described in
|
|
|
+ // https://www.w3.org/TR/CSS22/tables.html#border-conflict-resolution.
|
|
|
static HashMap<CSS::LineStyle, unsigned> const line_style_score = {
|
|
|
{ CSS::LineStyle::Inset, 0 },
|
|
|
{ CSS::LineStyle::Groove, 1 },
|
|
@@ -1194,6 +1195,8 @@ bool TableFormattingContext::border_is_less_specific(const CSS::BorderData& a, c
|
|
|
{ CSS::LineStyle::Double, 7 },
|
|
|
};
|
|
|
|
|
|
+ // 1. Borders with the 'border-style' of 'hidden' take precedence over all other conflicting borders. Any border with this
|
|
|
+ // value suppresses all borders at this location.
|
|
|
if (a.line_style == CSS::LineStyle::Hidden) {
|
|
|
return false;
|
|
|
}
|
|
@@ -1202,12 +1205,17 @@ bool TableFormattingContext::border_is_less_specific(const CSS::BorderData& a, c
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+ // 2. Borders with a style of 'none' have the lowest priority. Only if the border properties of all the elements meeting
|
|
|
+ // at this edge are 'none' will the border be omitted (but note that 'none' is the default value for the border style.)
|
|
|
if (a.line_style == CSS::LineStyle::None) {
|
|
|
return true;
|
|
|
}
|
|
|
if (b.line_style == CSS::LineStyle::None) {
|
|
|
return false;
|
|
|
}
|
|
|
+ // 3. If none of the styles are 'hidden' and at least one of them is not 'none', then narrow borders are discarded in favor
|
|
|
+ // of wider ones. If several have the same 'border-width' then styles are preferred in this order: 'double', 'solid',
|
|
|
+ // 'dashed', 'dotted', 'ridge', 'outset', 'groove', and the lowest: 'inset'.
|
|
|
if (a.width > b.width) {
|
|
|
return false;
|
|
|
} else if (a.width < b.width) {
|
|
@@ -1221,11 +1229,6 @@ bool TableFormattingContext::border_is_less_specific(const CSS::BorderData& a, c
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
-static const CSS::BorderData& winning_border_style(const CSS::BorderData& a, const CSS::BorderData& b)
|
|
|
-{
|
|
|
- return TableFormattingContext::border_is_less_specific(a, b) ? b : a;
|
|
|
-}
|
|
|
-
|
|
|
const CSS::BorderData& TableFormattingContext::border_data_conflicting_edge(TableFormattingContext::ConflictingEdge const& conflicting_edge)
|
|
|
{
|
|
|
auto const& style = conflicting_edge.element->computed_values();
|
|
@@ -1248,10 +1251,52 @@ const CSS::BorderData& TableFormattingContext::border_data_conflicting_edge(Tabl
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+const Painting::PaintableBox::BorderDataWithElementKind TableFormattingContext::border_data_with_element_kind_from_conflicting_edge(ConflictingEdge const& conflicting_edge)
|
|
|
+{
|
|
|
+ auto const& border_data = border_data_conflicting_edge(conflicting_edge);
|
|
|
+ return { .border_data = border_data, .element_kind = conflicting_edge.element_kind };
|
|
|
+}
|
|
|
+
|
|
|
+TableFormattingContext::ConflictingEdge const& TableFormattingContext::winning_conflicting_edge(TableFormattingContext::ConflictingEdge const& a, TableFormattingContext::ConflictingEdge const& b)
|
|
|
+{
|
|
|
+ auto a_border_data = border_data_conflicting_edge(a);
|
|
|
+ auto b_border_data = border_data_conflicting_edge(b);
|
|
|
+ // First check if step 4 of border conflict resolution applies, as described in https://www.w3.org/TR/CSS22/tables.html#border-conflict-resolution.
|
|
|
+ if (a_border_data.line_style == b_border_data.line_style && a_border_data.width == b_border_data.width) {
|
|
|
+ // 4. If border styles differ only in color, then a style set on a cell wins over one on a row, which wins over a
|
|
|
+ // row group, column, column group and, lastly, table. When two elements of the same type conflict, then the one
|
|
|
+ // further to the left (if the table's 'direction' is 'ltr'; right, if it is 'rtl') and further to the top wins.
|
|
|
+ if (static_cast<unsigned>(a.element_kind) < static_cast<unsigned>(b.element_kind)) {
|
|
|
+ return a;
|
|
|
+ } else if (static_cast<unsigned>(a.element_kind) > static_cast<unsigned>(b.element_kind)) {
|
|
|
+ return b;
|
|
|
+ }
|
|
|
+ // Here the element kind is the same, thus the coordinates are either both set or not set.
|
|
|
+ VERIFY(a.column.has_value() == b.column.has_value());
|
|
|
+ VERIFY(a.row.has_value() == b.row.has_value());
|
|
|
+ if (a.column.has_value()) {
|
|
|
+ if (a.column.value() < b.column.value()) {
|
|
|
+ return a;
|
|
|
+ } else if (a.column.value() > b.column.value()) {
|
|
|
+ return b;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (a.row.has_value()) {
|
|
|
+ if (a.row.value() < b.row.value()) {
|
|
|
+ return a;
|
|
|
+ } else if (a.row.value() > b.row.value()) {
|
|
|
+ return b;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return a;
|
|
|
+ }
|
|
|
+ // Apply steps 1, 2 and 3 of the border conflict resolution algorithm.
|
|
|
+ return border_is_less_specific(a_border_data, b_border_data) ? b : a;
|
|
|
+}
|
|
|
+
|
|
|
void TableFormattingContext::border_conflict_resolution()
|
|
|
{
|
|
|
- // Partially implements border conflict resolution, as described in
|
|
|
- // https://www.w3.org/TR/CSS22/tables.html#border-conflict-resolution
|
|
|
+ // Implements border conflict resolution, as described in https://www.w3.org/TR/CSS22/tables.html#border-conflict-resolution.
|
|
|
BorderConflictFinder finder(this);
|
|
|
for (auto& cell : m_cells) {
|
|
|
auto& cell_state = m_state.get_mutable(cell.box);
|
|
@@ -1264,36 +1309,55 @@ void TableFormattingContext::border_conflict_resolution()
|
|
|
if (cell.box->computed_values().border_collapse() == CSS::BorderCollapse::Separate) {
|
|
|
continue;
|
|
|
}
|
|
|
- // Execute steps 1, 2 and 3 of the algorithm for each edge.
|
|
|
- Painting::BordersData override_borders_data;
|
|
|
- auto const& cell_style = cell.box->computed_values();
|
|
|
- auto winning_border_left = cell_style.border_left();
|
|
|
- for (auto const conflicting_edge : finder.conflicting_edges(cell, ConflictingSide::Left)) {
|
|
|
- winning_border_left = winning_border_style(winning_border_left, border_data_conflicting_edge(conflicting_edge));
|
|
|
+ Painting::PaintableBox::BordersDataWithElementKind override_borders_data;
|
|
|
+ ConflictingEdge winning_edge_left {
|
|
|
+ .element = cell.box,
|
|
|
+ .element_kind = Painting::PaintableBox::ConflictingElementKind::Cell,
|
|
|
+ .side = ConflictingSide::Left,
|
|
|
+ .row = cell.row_index,
|
|
|
+ .column = cell.column_index,
|
|
|
+ };
|
|
|
+ for (auto const& conflicting_edge : finder.conflicting_edges(cell, ConflictingSide::Left)) {
|
|
|
+ winning_edge_left = winning_conflicting_edge(winning_edge_left, conflicting_edge);
|
|
|
}
|
|
|
- override_borders_data.left = winning_border_left;
|
|
|
- cell_state.border_left = winning_border_left.width;
|
|
|
- auto winning_border_right = cell_style.border_right();
|
|
|
- for (auto const conflicting_edge : finder.conflicting_edges(cell, ConflictingSide::Right)) {
|
|
|
- winning_border_right = winning_border_style(winning_border_right, border_data_conflicting_edge(conflicting_edge));
|
|
|
+ override_borders_data.left = border_data_with_element_kind_from_conflicting_edge(winning_edge_left);
|
|
|
+ cell_state.border_left = override_borders_data.left.border_data.width;
|
|
|
+ ConflictingEdge winning_edge_right {
|
|
|
+ .element = cell.box,
|
|
|
+ .element_kind = Painting::PaintableBox::ConflictingElementKind::Cell,
|
|
|
+ .side = ConflictingSide::Right,
|
|
|
+ .row = cell.row_index,
|
|
|
+ .column = cell.column_index,
|
|
|
+ };
|
|
|
+ for (auto const& conflicting_edge : finder.conflicting_edges(cell, ConflictingSide::Right)) {
|
|
|
+ winning_edge_right = winning_conflicting_edge(winning_edge_right, conflicting_edge);
|
|
|
}
|
|
|
- override_borders_data.right = winning_border_right;
|
|
|
- cell_state.border_right = winning_border_right.width;
|
|
|
- auto winning_border_top = cell_style.border_top();
|
|
|
- for (auto const conflicting_edge : finder.conflicting_edges(cell, ConflictingSide::Top)) {
|
|
|
- winning_border_top = winning_border_style(winning_border_top, border_data_conflicting_edge(conflicting_edge));
|
|
|
+ override_borders_data.right = border_data_with_element_kind_from_conflicting_edge(winning_edge_right);
|
|
|
+ cell_state.border_right = override_borders_data.right.border_data.width;
|
|
|
+ ConflictingEdge winning_edge_top {
|
|
|
+ .element = cell.box,
|
|
|
+ .element_kind = Painting::PaintableBox::ConflictingElementKind::Cell,
|
|
|
+ .side = ConflictingSide::Top,
|
|
|
+ .row = cell.row_index,
|
|
|
+ .column = cell.column_index,
|
|
|
+ };
|
|
|
+ for (auto const& conflicting_edge : finder.conflicting_edges(cell, ConflictingSide::Top)) {
|
|
|
+ winning_edge_top = winning_conflicting_edge(winning_edge_top, conflicting_edge);
|
|
|
}
|
|
|
- override_borders_data.top = winning_border_top;
|
|
|
- cell_state.border_top = winning_border_top.width;
|
|
|
- auto winning_border_bottom = cell_style.border_bottom();
|
|
|
- for (auto const conflicting_edge : finder.conflicting_edges(cell, ConflictingSide::Bottom)) {
|
|
|
- winning_border_bottom = winning_border_style(winning_border_bottom, border_data_conflicting_edge(conflicting_edge));
|
|
|
+ override_borders_data.top = border_data_with_element_kind_from_conflicting_edge(winning_edge_top);
|
|
|
+ cell_state.border_top = override_borders_data.top.border_data.width;
|
|
|
+ ConflictingEdge winning_edge_bottom {
|
|
|
+ .element = cell.box,
|
|
|
+ .element_kind = Painting::PaintableBox::ConflictingElementKind::Cell,
|
|
|
+ .side = ConflictingSide::Bottom,
|
|
|
+ .row = cell.row_index,
|
|
|
+ .column = cell.column_index,
|
|
|
+ };
|
|
|
+ for (auto const& conflicting_edge : finder.conflicting_edges(cell, ConflictingSide::Bottom)) {
|
|
|
+ winning_edge_bottom = winning_conflicting_edge(winning_edge_bottom, conflicting_edge);
|
|
|
}
|
|
|
- override_borders_data.bottom = winning_border_bottom;
|
|
|
- cell_state.border_bottom = override_borders_data.bottom.width;
|
|
|
- // FIXME: 4. If border styles differ only in color, then a style set on a cell wins over one on a row, which wins over a
|
|
|
- // row group, column, column group and, lastly, table. When two elements of the same type conflict, then the one
|
|
|
- // further to the left (if the table's 'direction' is 'ltr'; right, if it is 'rtl') and further to the top wins.
|
|
|
+ override_borders_data.bottom = border_data_with_element_kind_from_conflicting_edge(winning_edge_bottom);
|
|
|
+ cell_state.border_bottom = override_borders_data.bottom.border_data.width;
|
|
|
cell_state.set_override_borders_data(override_borders_data);
|
|
|
}
|
|
|
}
|
|
@@ -1384,97 +1448,105 @@ Vector<TableFormattingContext::ConflictingEdge> TableFormattingContext::BorderCo
|
|
|
{
|
|
|
Vector<ConflictingEdge> result = {};
|
|
|
if (cell.column_index >= cell.column_span && edge == ConflictingSide::Left) {
|
|
|
- auto maybe_cell_to_left = m_context->m_cells_by_coordinate[cell.row_index][cell.column_index - cell.column_span];
|
|
|
+ auto left_cell_column_index = cell.column_index - cell.column_span;
|
|
|
+ auto maybe_cell_to_left = m_context->m_cells_by_coordinate[cell.row_index][left_cell_column_index];
|
|
|
if (maybe_cell_to_left.has_value()) {
|
|
|
- result.append({ maybe_cell_to_left->box, ConflictingSide::Right });
|
|
|
+ result.append({ maybe_cell_to_left->box, Painting::PaintableBox::ConflictingElementKind::Cell, ConflictingSide::Right, cell.row_index, left_cell_column_index });
|
|
|
}
|
|
|
}
|
|
|
if (cell.column_index + cell.column_span < m_context->m_cells_by_coordinate[cell.row_index].size() && edge == ConflictingSide::Right) {
|
|
|
- auto maybe_cell_to_right = m_context->m_cells_by_coordinate[cell.row_index][cell.column_index + cell.column_span];
|
|
|
+ auto right_cell_column_index = cell.column_index + cell.column_span;
|
|
|
+ auto maybe_cell_to_right = m_context->m_cells_by_coordinate[cell.row_index][right_cell_column_index];
|
|
|
if (maybe_cell_to_right.has_value()) {
|
|
|
- result.append({ maybe_cell_to_right->box, ConflictingSide::Left });
|
|
|
+ result.append({ maybe_cell_to_right->box, Painting::PaintableBox::ConflictingElementKind::Cell, ConflictingSide::Left, cell.row_index, right_cell_column_index });
|
|
|
}
|
|
|
}
|
|
|
if (cell.row_index >= cell.row_span && edge == ConflictingSide::Top) {
|
|
|
- auto maybe_cell_above = m_context->m_cells_by_coordinate[cell.row_index - cell.row_span][cell.column_index];
|
|
|
+ auto above_cell_row_index = cell.row_index - cell.row_span;
|
|
|
+ auto maybe_cell_above = m_context->m_cells_by_coordinate[above_cell_row_index][cell.column_index];
|
|
|
if (maybe_cell_above.has_value()) {
|
|
|
- result.append({ maybe_cell_above->box, ConflictingSide::Bottom });
|
|
|
+ result.append({ maybe_cell_above->box, Painting::PaintableBox::ConflictingElementKind::Cell, ConflictingSide::Bottom, above_cell_row_index, cell.column_index });
|
|
|
}
|
|
|
}
|
|
|
if (cell.row_index + cell.row_span < m_context->m_cells_by_coordinate.size() && edge == ConflictingSide::Bottom) {
|
|
|
- auto maybe_cell_below = m_context->m_cells_by_coordinate[cell.row_index + cell.row_span][cell.column_index];
|
|
|
+ auto below_cell_row_index = cell.row_index + cell.row_span;
|
|
|
+ auto maybe_cell_below = m_context->m_cells_by_coordinate[below_cell_row_index][cell.column_index];
|
|
|
if (maybe_cell_below.has_value()) {
|
|
|
- result.append({ maybe_cell_below->box, ConflictingSide::Top });
|
|
|
+ result.append({ maybe_cell_below->box, Painting::PaintableBox::ConflictingElementKind::Cell, ConflictingSide::Top, below_cell_row_index, cell.column_index });
|
|
|
}
|
|
|
}
|
|
|
if (edge == ConflictingSide::Top) {
|
|
|
- result.append({ m_context->m_rows[cell.row_index].box, ConflictingSide::Top });
|
|
|
+ result.append({ m_context->m_rows[cell.row_index].box, Painting::PaintableBox::ConflictingElementKind::Row, ConflictingSide::Top, cell.row_index, {} });
|
|
|
}
|
|
|
if (edge == ConflictingSide::Bottom) {
|
|
|
- result.append({ m_context->m_rows[cell.row_index].box, ConflictingSide::Bottom });
|
|
|
+ result.append({ m_context->m_rows[cell.row_index].box, Painting::PaintableBox::ConflictingElementKind::Row, ConflictingSide::Bottom, cell.row_index, {} });
|
|
|
}
|
|
|
if (cell.row_index >= cell.row_span && edge == ConflictingSide::Top) {
|
|
|
- result.append({ m_context->m_rows[cell.row_index - cell.row_span].box, ConflictingSide::Bottom });
|
|
|
+ auto above_row_index = cell.row_index - cell.row_span;
|
|
|
+ result.append({ m_context->m_rows[above_row_index].box, Painting::PaintableBox::ConflictingElementKind::Row, ConflictingSide::Bottom, above_row_index, {} });
|
|
|
}
|
|
|
if (cell.row_index + cell.row_span < m_context->m_rows.size() && edge == ConflictingSide::Bottom) {
|
|
|
- result.append({ m_context->m_rows[cell.row_index + cell.row_span].box, ConflictingSide::Top });
|
|
|
+ auto below_row_index = cell.row_index + cell.row_span;
|
|
|
+ result.append({ m_context->m_rows[below_row_index].box, Painting::PaintableBox::ConflictingElementKind::Row, ConflictingSide::Top, below_row_index, {} });
|
|
|
}
|
|
|
auto const& maybe_row_group = m_row_group_elements_by_index[cell.row_index];
|
|
|
if (maybe_row_group.has_value() && cell.row_index == maybe_row_group->start_index && edge == ConflictingSide::Top) {
|
|
|
- result.append({ maybe_row_group->row_group, ConflictingSide::Top });
|
|
|
+ result.append({ maybe_row_group->row_group, Painting::PaintableBox::ConflictingElementKind::RowGroup, ConflictingSide::Top, maybe_row_group->start_index, {} });
|
|
|
}
|
|
|
if (cell.row_index >= cell.row_span) {
|
|
|
auto const& maybe_row_group_above = m_row_group_elements_by_index[cell.row_index - cell.row_span];
|
|
|
if (maybe_row_group_above.has_value() && cell.row_index == maybe_row_group_above->start_index + maybe_row_group_above->row_count && edge == ConflictingSide::Top) {
|
|
|
- result.append({ maybe_row_group_above->row_group, ConflictingSide::Bottom });
|
|
|
+ result.append({ maybe_row_group_above->row_group, Painting::PaintableBox::ConflictingElementKind::RowGroup, ConflictingSide::Bottom, maybe_row_group_above->start_index, {} });
|
|
|
}
|
|
|
}
|
|
|
if (maybe_row_group.has_value() && cell.row_index == maybe_row_group->start_index + maybe_row_group->row_count - 1 && edge == ConflictingSide::Bottom) {
|
|
|
- result.append({ maybe_row_group->row_group, ConflictingSide::Bottom });
|
|
|
+ result.append({ maybe_row_group->row_group, Painting::PaintableBox::ConflictingElementKind::RowGroup, ConflictingSide::Bottom, maybe_row_group->start_index, {} });
|
|
|
}
|
|
|
if (cell.row_index + cell.row_span < m_row_group_elements_by_index.size()) {
|
|
|
auto const& maybe_row_group_below = m_row_group_elements_by_index[cell.row_index + cell.row_span];
|
|
|
if (maybe_row_group_below.has_value() && cell.row_index + cell.row_span == maybe_row_group_below->start_index && edge == ConflictingSide::Bottom) {
|
|
|
- result.append({ maybe_row_group_below->row_group, ConflictingSide::Top });
|
|
|
+ result.append({ maybe_row_group_below->row_group, Painting::PaintableBox::ConflictingElementKind::RowGroup, ConflictingSide::Top, maybe_row_group_below->start_index, {} });
|
|
|
}
|
|
|
}
|
|
|
if (m_col_elements_by_index[cell.column_index] && edge == ConflictingSide::Left) {
|
|
|
- result.append({ m_col_elements_by_index[cell.column_index], ConflictingSide::Left });
|
|
|
+ result.append({ m_col_elements_by_index[cell.column_index], Painting::PaintableBox::ConflictingElementKind::ColumnGroup, ConflictingSide::Left, {}, cell.column_index });
|
|
|
}
|
|
|
if (cell.column_index >= cell.column_span && m_col_elements_by_index[cell.column_index - cell.column_span] && edge == ConflictingSide::Left) {
|
|
|
- result.append({ m_col_elements_by_index[cell.column_index - cell.column_span], ConflictingSide::Right });
|
|
|
+ auto left_column_index = cell.column_index - cell.column_span;
|
|
|
+ result.append({ m_col_elements_by_index[left_column_index], Painting::PaintableBox::ConflictingElementKind::ColumnGroup, ConflictingSide::Right, {}, left_column_index });
|
|
|
}
|
|
|
if (m_col_elements_by_index[cell.column_index] && edge == ConflictingSide::Right) {
|
|
|
- result.append({ m_col_elements_by_index[cell.column_index], ConflictingSide::Right });
|
|
|
+ result.append({ m_col_elements_by_index[cell.column_index], Painting::PaintableBox::ConflictingElementKind::ColumnGroup, ConflictingSide::Right, {}, cell.column_index });
|
|
|
}
|
|
|
if (cell.column_index + cell.column_span < m_col_elements_by_index.size() && m_col_elements_by_index[cell.column_index + cell.column_span] && edge == ConflictingSide::Right) {
|
|
|
- result.append({ m_col_elements_by_index[cell.column_index + cell.column_span], ConflictingSide::Left });
|
|
|
+ auto right_column_index = cell.column_index + cell.column_span;
|
|
|
+ result.append({ m_col_elements_by_index[right_column_index], Painting::PaintableBox::ConflictingElementKind::ColumnGroup, ConflictingSide::Left, {}, right_column_index });
|
|
|
}
|
|
|
if (cell.row_index == 0 && edge == ConflictingSide::Top) {
|
|
|
if (m_col_elements_by_index[cell.column_index]) {
|
|
|
- result.append({ m_col_elements_by_index[cell.column_index], ConflictingSide::Top });
|
|
|
+ result.append({ m_col_elements_by_index[cell.column_index], Painting::PaintableBox::ConflictingElementKind::ColumnGroup, ConflictingSide::Top, {}, cell.column_index });
|
|
|
}
|
|
|
- result.append({ &m_context->table_box(), ConflictingSide::Top });
|
|
|
+ result.append({ &m_context->table_box(), Painting::PaintableBox::ConflictingElementKind::Table, ConflictingSide::Top, {}, {} });
|
|
|
}
|
|
|
if (cell.row_index == m_context->m_rows.size() - 1 && edge == ConflictingSide::Bottom) {
|
|
|
if (m_col_elements_by_index[cell.column_index]) {
|
|
|
- result.append({ m_col_elements_by_index[cell.column_index], ConflictingSide::Bottom });
|
|
|
+ result.append({ m_col_elements_by_index[cell.column_index], Painting::PaintableBox::ConflictingElementKind::ColumnGroup, ConflictingSide::Bottom, {}, cell.column_index });
|
|
|
}
|
|
|
- result.append({ &m_context->table_box(), ConflictingSide::Bottom });
|
|
|
+ result.append({ &m_context->table_box(), Painting::PaintableBox::ConflictingElementKind::Table, ConflictingSide::Bottom, {}, {} });
|
|
|
}
|
|
|
if (cell.column_index == 0 && edge == ConflictingSide::Left) {
|
|
|
- result.append({ m_context->m_rows[cell.row_index].box, ConflictingSide::Left });
|
|
|
+ result.append({ m_context->m_rows[cell.row_index].box, Painting::PaintableBox::ConflictingElementKind::Row, ConflictingSide::Left, cell.row_index, {} });
|
|
|
if (m_row_group_elements_by_index[cell.row_index].has_value()) {
|
|
|
- result.append({ m_row_group_elements_by_index[cell.row_index]->row_group, ConflictingSide::Left });
|
|
|
+ result.append({ m_row_group_elements_by_index[cell.row_index]->row_group, Painting::PaintableBox::ConflictingElementKind::RowGroup, ConflictingSide::Left, cell.row_index, {} });
|
|
|
}
|
|
|
- result.append({ &m_context->table_box(), ConflictingSide::Left });
|
|
|
+ result.append({ &m_context->table_box(), Painting::PaintableBox::ConflictingElementKind::Table, ConflictingSide::Left, {}, {} });
|
|
|
}
|
|
|
if (cell.column_index == m_context->m_columns.size() - 1 && edge == ConflictingSide::Right) {
|
|
|
- result.append({ m_context->m_rows[cell.row_index].box, ConflictingSide::Right });
|
|
|
+ result.append({ m_context->m_rows[cell.row_index].box, Painting::PaintableBox::ConflictingElementKind::Row, ConflictingSide::Right, cell.row_index, {} });
|
|
|
if (m_row_group_elements_by_index[cell.row_index].has_value()) {
|
|
|
- result.append({ m_row_group_elements_by_index[cell.row_index]->row_group, ConflictingSide::Right });
|
|
|
+ result.append({ m_row_group_elements_by_index[cell.row_index]->row_group, Painting::PaintableBox::ConflictingElementKind::RowGroup, ConflictingSide::Right, cell.row_index, {} });
|
|
|
}
|
|
|
- result.append({ &m_context->table_box(), ConflictingSide::Right });
|
|
|
+ result.append({ &m_context->table_box(), Painting::PaintableBox::ConflictingElementKind::Table, ConflictingSide::Right, {}, {} });
|
|
|
}
|
|
|
return result;
|
|
|
}
|