mirror of
https://github.com/RGBCube/serenity
synced 2025-07-24 11:37:41 +00:00
LibWeb: Don't add an extra glyph spacing to width of TextNode
When calculating the width of text using a bitmap font, a glyph spacing is added at the end of each fragment, including the last one. This meant that everything was 1 pixel too long. This bug did not affect vector fonts.
This commit is contained in:
parent
2660bbb94f
commit
6b30847120
3 changed files with 25 additions and 1 deletions
17
Tests/LibWeb/Layout/expected/textnode-width-bitmap-font.txt
Normal file
17
Tests/LibWeb/Layout/expected/textnode-width-bitmap-font.txt
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
Viewport <#document> at (0,0) content-size 800x600 children: not-inline
|
||||||
|
BlockContainer <html> at (0,0) content-size 800x38 [BFC] children: not-inline
|
||||||
|
BlockContainer <body> at (8,13) content-size 784x17 children: not-inline
|
||||||
|
BlockContainer <p> at (8,13) content-size 784x17 children: inline
|
||||||
|
line 0 width: 102, height: 17, bottom: 17, baseline: 11
|
||||||
|
frag 0 from TextNode start: 0, length: 18, rect: [8,13 102x17]
|
||||||
|
"This is some text."
|
||||||
|
TextNode <#text>
|
||||||
|
BlockContainer <(anonymous)> at (8,43) content-size 784x0 children: inline
|
||||||
|
TextNode <#text>
|
||||||
|
|
||||||
|
ViewportPaintable (Viewport<#document>) [0,0 800x600]
|
||||||
|
PaintableWithLines (BlockContainer<HTML>) [0,0 800x38] overflow: [0,0 800x43]
|
||||||
|
PaintableWithLines (BlockContainer<BODY>) [8,13 784x17] overflow: [8,13 784x30]
|
||||||
|
PaintableWithLines (BlockContainer<P>) [8,13 784x17]
|
||||||
|
TextPaintable (TextNode<#text>)
|
||||||
|
PaintableWithLines (BlockContainer(anonymous)) [8,43 784x0]
|
|
@ -0,0 +1 @@
|
||||||
|
<!DOCTYPE html><p style="font-family: Katica">This is some text.</p>
|
|
@ -180,7 +180,6 @@ Optional<InlineLevelIterator::Item> InlineLevelIterator::next_without_lookahead(
|
||||||
m_text_node_context->is_last_chunk = true;
|
m_text_node_context->is_last_chunk = true;
|
||||||
|
|
||||||
auto& chunk = chunk_opt.value();
|
auto& chunk = chunk_opt.value();
|
||||||
CSSPixels chunk_width = CSSPixels::nearest_value_for(text_node.font().width(chunk.view) + text_node.font().glyph_spacing());
|
|
||||||
|
|
||||||
if (m_text_node_context->do_respect_linebreaks && chunk.has_breaking_newline) {
|
if (m_text_node_context->do_respect_linebreaks && chunk.has_breaking_newline) {
|
||||||
return Item {
|
return Item {
|
||||||
|
@ -188,6 +187,13 @@ Optional<InlineLevelIterator::Item> InlineLevelIterator::next_without_lookahead(
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CSSPixels chunk_width;
|
||||||
|
|
||||||
|
if (m_text_node_context->is_last_chunk)
|
||||||
|
chunk_width = CSSPixels::nearest_value_for(text_node.font().width(chunk.view));
|
||||||
|
else
|
||||||
|
chunk_width = CSSPixels::nearest_value_for(text_node.font().width(chunk.view) + text_node.font().glyph_spacing());
|
||||||
|
|
||||||
// NOTE: We never consider `content: ""` to be collapsible whitespace.
|
// NOTE: We never consider `content: ""` to be collapsible whitespace.
|
||||||
bool is_generated_empty_string = text_node.is_generated() && chunk.length == 0;
|
bool is_generated_empty_string = text_node.is_generated() && chunk.length == 0;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue