From 847b2326802de4f062d9f8910c34af20f53d873a Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Mon, 25 Nov 2019 18:12:12 +0100 Subject: [PATCH] LibHTML: Divide the "line spacing" evenly between lines of text Before this patch, all of the excess spacing caused by line-height was "padding" the line boxes below the text. To fix this, we make line box fragments use the font height as their height, and then let the inline layout algorithm adjust the Y positions to distribute the vertical space. --- Libraries/LibHTML/Layout/LayoutBlock.cpp | 3 ++- Libraries/LibHTML/Layout/LayoutText.cpp | 7 +++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Libraries/LibHTML/Layout/LayoutBlock.cpp b/Libraries/LibHTML/Layout/LayoutBlock.cpp index df883947d3..e011214016 100644 --- a/Libraries/LibHTML/Layout/LayoutBlock.cpp +++ b/Libraries/LibHTML/Layout/LayoutBlock.cpp @@ -67,6 +67,7 @@ void LayoutBlock::layout_inline_children() } float min_line_height = style().line_height(); + float line_spacing = min_line_height - style().font().glyph_height(); float content_height = 0; // FIXME: This should be done by the CSS parser! @@ -121,7 +122,7 @@ void LayoutBlock::layout_inline_children() // Vertically align everyone's bottom to the line. // FIXME: Support other kinds of vertical alignment. fragment.rect().set_x(roundf(x_offset + fragment.rect().x())); - fragment.rect().set_y(y() + content_height + (max_height - fragment.rect().height())); + fragment.rect().set_y(y() + content_height + (max_height - fragment.rect().height()) - (line_spacing / 2)); if (text_align == CSS::ValueID::Justify) { if (fragment.is_justifiable_whitespace()) { diff --git a/Libraries/LibHTML/Layout/LayoutText.cpp b/Libraries/LibHTML/Layout/LayoutText.cpp index 885c89fea5..a3a2ec14f8 100644 --- a/Libraries/LibHTML/Layout/LayoutText.cpp +++ b/Libraries/LibHTML/Layout/LayoutText.cpp @@ -54,7 +54,7 @@ void LayoutText::render_fragment(RenderingContext& context, const LineBoxFragmen bool is_underline = text_decoration == "underline"; if (is_underline) - painter.draw_line(enclosing_int_rect(fragment.rect()).bottom_left().translated(0, -1), enclosing_int_rect(fragment.rect()).bottom_right().translated(0, -1), color); + painter.draw_line(enclosing_int_rect(fragment.rect()).bottom_left().translated(0, 1), enclosing_int_rect(fragment.rect()).bottom_right().translated(0, 1), color); painter.draw_text(enclosing_int_rect(fragment.rect()), m_text_for_rendering.substring_view(fragment.start(), fragment.length()), TextAlignment::TopLeft, color); } @@ -131,7 +131,6 @@ void LayoutText::split_into_lines(LayoutBlock& container) { auto& font = style().font(); float space_width = font.glyph_width(' ') + font.glyph_spacing(); - float line_height = style().line_height(); auto& line_boxes = container.line_boxes(); if (line_boxes.is_empty()) @@ -142,7 +141,7 @@ void LayoutText::split_into_lines(LayoutBlock& container) if (is_preformatted) { m_text_for_rendering = node().data(); for_each_source_line([&](const Utf8View& view, int start, int length) { - line_boxes.last().add_fragment(*this, start, length, font.width(view), line_height); + line_boxes.last().add_fragment(*this, start, length, font.width(view), font.glyph_height()); line_boxes.append(LineBox()); }); return; @@ -196,7 +195,7 @@ void LayoutText::split_into_lines(LayoutBlock& container) if (is_whitespace && line_boxes.last().fragments().is_empty()) continue; - line_boxes.last().add_fragment(*this, word.start, is_whitespace ? 1 : word.length, word_width, line_height); + line_boxes.last().add_fragment(*this, word.start, is_whitespace ? 1 : word.length, word_width, font.glyph_height()); available_width -= word_width; if (available_width < 0) {