mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-30 07:42:07 +00:00 
			
		
		
		
	 f2a917229a
			
		
	
	
		f2a917229a
		
	
	
	
	
		
			
			Here's roughly how this works: - InlineLevelIterator keeps a nesting stack of inline-level nodes with box model metrics. - When entering a node with box model metrics, we add them to the current "leading metrics". - When exiting a node with box model metrics, we add them to the current "trailing metrics". - Pending leading metrics are consumed by the first fragment added to the line. - Pending trailing metrics are consumed by the last fragment added to the line. Like before, the position of a line box fragment is the top left of its content box. However, fragments are placed horizontally along the line with space inserted for padding and border. InlineNode::paint() now expands the content rect as appropriate when painting background and borders. Note that margins and margin collapsing is not yet implemented. This makes the eyes on ACID2 horizontally centered. :^)
		
			
				
	
	
		
			41 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			41 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-2-Clause
 | |
|  */
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include <AK/NonnullOwnPtrVector.h>
 | |
| #include <AK/Vector.h>
 | |
| #include <LibWeb/Layout/LineBoxFragment.h>
 | |
| 
 | |
| namespace Web::Layout {
 | |
| 
 | |
| class LineBox {
 | |
| public:
 | |
|     LineBox() { }
 | |
| 
 | |
|     float width() const { return m_width; }
 | |
| 
 | |
|     void add_fragment(Node& layout_node, int start, int length, float leading_size, float trailing_size, float content_width, float content_height, LineBoxFragment::Type = LineBoxFragment::Type::Normal);
 | |
| 
 | |
|     const NonnullOwnPtrVector<LineBoxFragment>& fragments() const { return m_fragments; }
 | |
|     NonnullOwnPtrVector<LineBoxFragment>& fragments() { return m_fragments; }
 | |
| 
 | |
|     void trim_trailing_whitespace();
 | |
| 
 | |
|     bool is_empty_or_ends_in_whitespace() const;
 | |
|     bool is_empty() const { return m_fragments.is_empty(); }
 | |
|     bool ends_with_forced_line_break() const;
 | |
| 
 | |
| private:
 | |
|     friend class BlockContainer;
 | |
|     friend class InlineFormattingContext;
 | |
|     friend class LineBuilder;
 | |
| 
 | |
|     NonnullOwnPtrVector<LineBoxFragment> m_fragments;
 | |
|     float m_width { 0 };
 | |
| };
 | |
| 
 | |
| }
 |