1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 15:27:35 +00:00

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
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 Box <tr> at (10,10) content-size 776x19.46875 table-row children: not-inline
BlockContainer <(anonymous)> (not painted) children: inline BlockContainer <(anonymous)> (not painted) children: inline
TextNode <#text> 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 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] frag 0 from TextNode start: 0, length: 1, rect: [154,11 14.265625x17.46875]
"A" "A"
TextNode <#text> TextNode <#text>
BlockContainer <(anonymous)> (not painted) children: inline BlockContainer <(anonymous)> (not painted) children: inline
TextNode <#text> 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 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" "B"
TextNode <#text> TextNode <#text>
BlockContainer <(anonymous)> (not painted) children: inline BlockContainer <(anonymous)> (not painted) children: inline
TextNode <#text> 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 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" "C D"
TextNode <#text> TextNode <#text>
BlockContainer <(anonymous)> (not painted) children: inline 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 Box <tr> at (10,31.46875) content-size 776x19.46875 table-row children: not-inline
BlockContainer <(anonymous)> (not painted) children: inline BlockContainer <(anonymous)> (not painted) children: inline
TextNode <#text> 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 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] frag 0 from TextNode start: 0, length: 1, rect: [155,32.46875 11.859375x17.46875]
"E" "E"
TextNode <#text> TextNode <#text>
BlockContainer <(anonymous)> (not painted) children: inline BlockContainer <(anonymous)> (not painted) children: inline
TextNode <#text> 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 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" "F"
TextNode <#text> TextNode <#text>
BlockContainer <(anonymous)> (not painted) children: inline BlockContainer <(anonymous)> (not painted) children: inline
TextNode <#text> 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 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" "G"
TextNode <#text> TextNode <#text>
BlockContainer <(anonymous)> (not painted) children: inline 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()) { 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()); 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()) { 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()); 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) { for (auto& cell : m_cells) {
auto const& computed_values = cell.box->computed_values(); auto const& computed_values = cell.box->computed_values();
if (cell.row_span == 1) { if (cell.row_span == 1) {
// FIXME: Implement intrinsic percentage width of a column based on cells of span up to 1. auto specified_height = computed_values.height().to_px(cell.box, containing_block.content_height());
auto specified_height = m_rows[cell.row_index].type == SizeType::Pixel
? computed_values.height().to_px(cell.box, containing_block.content_height())
: 0;
// https://www.w3.org/TR/css-tables-3/#row-layout makes specified cell height part of the initialization formula for row table measures: // 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 // 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 // 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. // - all other columns are assigned their min-content width.
for (size_t i = 0; i < m_columns.size(); ++i) { for (size_t i = 0; i < m_columns.size(); ++i) {
auto& column = m_columns[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); 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. // - all other columns are assigned their max-content width.
for (size_t i = 0; i < m_columns.size(); ++i) { for (size_t i = 0; i < m_columns.size(); ++i) {
auto& column = m_columns[i]; auto& column = m_columns[i];
if (column.type != SizeType::Percent) { if (!column.has_percentage_width) {
candidate_widths[i] = column.max_size; candidate_widths[i] = column.max_size;
} }
} }

View file

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