LibWeb: Make the type of column whether it's percent or not

Change how we store type of columns. It was used where the specification
only distinguishes between percent and everything else, so it makes more
sense to store and use it as a boolean.
This commit is contained in:
Andi Gallo 2023-07-14 06:57:58 +00:00 committed by Andreas Kling
parent 0314e26ef4
commit 19a26533a9
Notes: sideshowbarker 2024-07-17 11:29:41 +09:00
4 changed files with 17 additions and 32 deletions

View File

@ -11,23 +11,23 @@ Viewport <#document> at (0,0) content-size 800x600 children: not-inline
Box <tr> at (10,10) content-size 776x19.46875 table-row children: not-inline
BlockContainer <(anonymous)> (not painted) children: inline
TextNode <#text>
BlockContainer <th> at (11,11) content-size 300.274545x17.46875 table-cell [BFC] children: inline
BlockContainer <th> at (11,11) content-size 300.639999x17.46875 table-cell [BFC] children: inline
line 0 width: 14.265625, height: 17.46875, bottom: 17.46875, baseline: 13.53125
frag 0 from TextNode start: 0, length: 1, rect: [154,11 14.265625x17.46875]
"A"
TextNode <#text>
BlockContainer <(anonymous)> (not painted) children: inline
TextNode <#text>
BlockContainer <th> at (315.274545,11) content-size 169.470316x17.46875 table-cell [BFC] children: inline
BlockContainer <th> at (315.639999,11) content-size 168.719999x17.46875 table-cell [BFC] children: inline
line 0 width: 9.34375, height: 17.46875, bottom: 17.46875, baseline: 13.53125
frag 0 from TextNode start: 0, length: 1, rect: [395.274545,11 9.34375x17.46875]
frag 0 from TextNode start: 0, length: 1, rect: [395.639999,11 9.34375x17.46875]
"B"
TextNode <#text>
BlockContainer <(anonymous)> (not painted) children: inline
TextNode <#text>
BlockContainer <th> at (488.744861,11) content-size 300.255138x17.46875 table-cell [BFC] children: inline
BlockContainer <th> at (488.36,11) content-size 300.639999x17.46875 table-cell [BFC] children: inline
line 0 width: 29.453125, height: 17.46875, bottom: 17.46875, baseline: 13.53125
frag 0 from TextNode start: 0, length: 3, rect: [623.744861,11 29.453125x17.46875]
frag 0 from TextNode start: 0, length: 3, rect: [624.36,11 29.453125x17.46875]
"C D"
TextNode <#text>
BlockContainer <(anonymous)> (not painted) children: inline
@ -37,23 +37,23 @@ Viewport <#document> at (0,0) content-size 800x600 children: not-inline
Box <tr> at (10,31.46875) content-size 776x19.46875 table-row children: not-inline
BlockContainer <(anonymous)> (not painted) children: inline
TextNode <#text>
BlockContainer <td> at (11,32.46875) content-size 300.274545x17.46875 table-cell [BFC] children: inline
BlockContainer <td> at (11,32.46875) content-size 300.639999x17.46875 table-cell [BFC] children: inline
line 0 width: 11.859375, height: 17.46875, bottom: 17.46875, baseline: 13.53125
frag 0 from TextNode start: 0, length: 1, rect: [155,32.46875 11.859375x17.46875]
"E"
TextNode <#text>
BlockContainer <(anonymous)> (not painted) children: inline
TextNode <#text>
BlockContainer <td> at (315.274545,32.46875) content-size 169.470316x17.46875 table-cell [BFC] children: inline
BlockContainer <td> at (315.639999,32.46875) content-size 168.719999x17.46875 table-cell [BFC] children: inline
line 0 width: 12.546875, height: 17.46875, bottom: 17.46875, baseline: 13.53125
frag 0 from TextNode start: 0, length: 1, rect: [393.274545,32.46875 12.546875x17.46875]
frag 0 from TextNode start: 0, length: 1, rect: [393.639999,32.46875 12.546875x17.46875]
"F"
TextNode <#text>
BlockContainer <(anonymous)> (not painted) children: inline
TextNode <#text>
BlockContainer <td> at (488.744861,32.46875) content-size 300.255138x17.46875 table-cell [BFC] children: inline
BlockContainer <td> at (488.36,32.46875) content-size 300.639999x17.46875 table-cell [BFC] children: inline
line 0 width: 13.234375, height: 17.46875, bottom: 17.46875, baseline: 13.53125
frag 0 from TextNode start: 0, length: 1, rect: [632.744861,32.46875 13.234375x17.46875]
frag 0 from TextNode start: 0, length: 1, rect: [632.36,32.46875 13.234375x17.46875]
"G"
TextNode <#text>
BlockContainer <(anonymous)> (not painted) children: inline

View File

@ -192,19 +192,13 @@ void TableFormattingContext::compute_cell_measures(AvailableSpace const& availab
}
if (computed_values.width().is_percentage()) {
m_columns[cell.column_index].type = SizeType::Percent;
m_columns[cell.column_index].has_percentage_width = true;
m_columns[cell.column_index].percentage_width = max(m_columns[cell.column_index].percentage_width, computed_values.width().percentage().value());
} else {
// FIXME: Columns with no specified width should remain SizeType::Auto.
m_columns[cell.column_index].type = SizeType::Pixel;
}
if (computed_values.height().is_percentage()) {
m_rows[cell.row_index].type = SizeType::Percent;
m_rows[cell.row_index].has_percentage_height = true;
m_rows[cell.row_index].percentage_height = max(m_rows[cell.row_index].percentage_height, computed_values.height().percentage().value());
} else {
// FIXME: Rows with no specified width should remain SizeType::Auto.
m_rows[cell.row_index].type = SizeType::Pixel;
}
}
@ -282,10 +276,7 @@ void TableFormattingContext::initialize_table_measures<TableFormattingContext::R
for (auto& cell : m_cells) {
auto const& computed_values = cell.box->computed_values();
if (cell.row_span == 1) {
// FIXME: Implement intrinsic percentage width of a column based on cells of span up to 1.
auto specified_height = m_rows[cell.row_index].type == SizeType::Pixel
? computed_values.height().to_px(cell.box, containing_block.content_height())
: 0;
auto specified_height = computed_values.height().to_px(cell.box, containing_block.content_height());
// https://www.w3.org/TR/css-tables-3/#row-layout makes specified cell height part of the initialization formula for row table measures:
// This is done by running the same algorithm as the column measurement, with the span=1 value being initialized (for min-content) with
// the largest of the resulting height of the previous row layout, the height specified on the corresponding table-row (if any), and
@ -531,7 +522,7 @@ void TableFormattingContext::distribute_width_to_columns()
// - all other columns are assigned their min-content width.
for (size_t i = 0; i < m_columns.size(); ++i) {
auto& column = m_columns[i];
if (column.type == SizeType::Percent) {
if (column.has_percentage_width) {
candidate_widths[i] = max(column.min_size, column.percentage_width / 100 * available_width);
}
}
@ -574,7 +565,7 @@ void TableFormattingContext::distribute_width_to_columns()
// - all other columns are assigned their max-content width.
for (size_t i = 0; i < m_columns.size(); ++i) {
auto& column = m_columns[i];
if (column.type != SizeType::Percent) {
if (!column.has_percentage_width) {
candidate_widths[i] = column.max_size;
}
}

View File

@ -58,18 +58,12 @@ private:
Optional<AvailableSpace> m_available_space;
enum class SizeType {
Percent,
Pixel,
Auto
};
struct Column {
SizeType type { SizeType::Auto };
CSSPixels left_offset { 0 };
CSSPixels min_size { 0 };
CSSPixels max_size { 0 };
CSSPixels used_width { 0 };
bool has_percentage_width { false };
double percentage_width { 0 };
// Store whether the column is constrained: https://www.w3.org/TR/css-tables-3/#constrainedness
bool is_constrained { false };
@ -81,9 +75,9 @@ private:
CSSPixels reference_height { 0 };
CSSPixels final_height { 0 };
CSSPixels baseline { 0 };
SizeType type { SizeType::Auto };
CSSPixels min_size { 0 };
CSSPixels max_size { 0 };
bool has_percentage_height { false };
double percentage_height { 0 };
// Store whether the row is constrained: https://www.w3.org/TR/css-tables-3/#constrainedness
bool is_constrained { false };