|
@@ -216,8 +216,12 @@ void LineBuilder::update_last_line()
|
|
|
|
|
|
// NOTE: For fragments with a <length> vertical-align, shift the line box baseline down by the length.
|
|
|
// This ensures that we make enough vertical space on the line for any manually-aligned fragments.
|
|
|
- if (auto length_percentage = fragment.layout_node().computed_values().vertical_align().template get_pointer<CSS::LengthPercentage>(); length_percentage && length_percentage->is_length())
|
|
|
- fragment_baseline += length_percentage->length().to_px(fragment.layout_node());
|
|
|
+ if (auto const* length_percentage = fragment.layout_node().computed_values().vertical_align().get_pointer<CSS::LengthPercentage>()) {
|
|
|
+ if (length_percentage->is_length())
|
|
|
+ fragment_baseline += length_percentage->length().to_px(fragment.layout_node());
|
|
|
+ else if (length_percentage->is_percentage())
|
|
|
+ fragment_baseline += length_percentage->percentage().as_fraction() * line_height;
|
|
|
+ }
|
|
|
|
|
|
line_box_baseline = max(line_box_baseline, fragment_baseline);
|
|
|
}
|
|
@@ -265,9 +269,14 @@ void LineBuilder::update_last_line()
|
|
|
if (vertical_align.has<CSS::VerticalAlign>()) {
|
|
|
new_fragment_y = y_value_for_alignment(vertical_align.get<CSS::VerticalAlign>());
|
|
|
} else {
|
|
|
- if (auto length_percentage = vertical_align.get_pointer<CSS::LengthPercentage>(); length_percentage && length_percentage->is_length()) {
|
|
|
- auto vertical_align_amount = length_percentage->length().to_px(fragment.layout_node());
|
|
|
- new_fragment_y = y_value_for_alignment(CSS::VerticalAlign::Baseline) - vertical_align_amount;
|
|
|
+ if (auto const* length_percentage = vertical_align.get_pointer<CSS::LengthPercentage>()) {
|
|
|
+ if (length_percentage->is_length()) {
|
|
|
+ auto vertical_align_amount = length_percentage->length().to_px(fragment.layout_node());
|
|
|
+ new_fragment_y = y_value_for_alignment(CSS::VerticalAlign::Baseline) - vertical_align_amount;
|
|
|
+ } else if (length_percentage->is_percentage()) {
|
|
|
+ auto vertical_align_amount = length_percentage->percentage().as_fraction() * m_context.containing_block().line_height();
|
|
|
+ new_fragment_y = y_value_for_alignment(CSS::VerticalAlign::Baseline) - vertical_align_amount;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -289,8 +298,12 @@ void LineBuilder::update_last_line()
|
|
|
top_of_inline_box = (fragment.offset().y() + fragment.baseline() - font_metrics.ascent - half_leading);
|
|
|
bottom_of_inline_box = (fragment.offset().y() + fragment.baseline() + font_metrics.descent + half_leading);
|
|
|
}
|
|
|
- if (auto length_percentage = fragment.layout_node().computed_values().vertical_align().template get_pointer<CSS::LengthPercentage>(); length_percentage && length_percentage->is_length())
|
|
|
- bottom_of_inline_box += length_percentage->length().to_px(fragment.layout_node());
|
|
|
+ if (auto const* length_percentage = fragment.layout_node().computed_values().vertical_align().get_pointer<CSS::LengthPercentage>()) {
|
|
|
+ if (length_percentage->is_length())
|
|
|
+ bottom_of_inline_box += length_percentage->length().to_px(fragment.layout_node());
|
|
|
+ else if (length_percentage->is_percentage())
|
|
|
+ bottom_of_inline_box += length_percentage->percentage().as_fraction() * m_context.containing_block().line_height();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
uppermost_box_top = min(uppermost_box_top, top_of_inline_box);
|