mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 15:42:44 +00:00 
			
		
		
		
	LibWeb: Store the used font in Layout::NodeWithStyle
This is a step towards not having to carry the full set of specified values around with every layout node.
This commit is contained in:
		
							parent
							
								
									5721b2a3da
								
							
						
					
					
						commit
						e187a5365a
					
				
					 7 changed files with 22 additions and 10 deletions
				
			
		|  | @ -35,7 +35,7 @@ float Length::relative_length_to_px(const Layout::Node& layout_node) const | |||
| { | ||||
|     switch (m_type) { | ||||
|     case Type::Ex: | ||||
|         return m_value * layout_node.specified_style().font().x_height(); | ||||
|         return m_value * layout_node.font().x_height(); | ||||
|     case Type::Em: | ||||
|         return m_value * layout_node.font_size(); | ||||
|     case Type::Rem: | ||||
|  |  | |||
|  | @ -45,8 +45,7 @@ ButtonBox::~ButtonBox() | |||
| 
 | ||||
| void ButtonBox::prepare_for_replaced_layout() | ||||
| { | ||||
|     auto& font = specified_style().font(); | ||||
|     set_intrinsic_width(font.width(dom_node().value()) + 20); | ||||
|     set_intrinsic_width(font().width(dom_node().value()) + 20); | ||||
|     set_has_intrinsic_width(true); | ||||
| 
 | ||||
|     set_intrinsic_height(20); | ||||
|  | @ -67,7 +66,7 @@ void ButtonBox::paint(PaintContext& context, PaintPhase phase) | |||
|         auto text_rect = enclosing_int_rect(absolute_rect()); | ||||
|         if (m_being_pressed) | ||||
|             text_rect.move_by(1, 1); | ||||
|         context.painter().draw_text(text_rect, dom_node().value(), specified_style().font(), Gfx::TextAlignment::Center, context.palette().button_text()); | ||||
|         context.painter().draw_text(text_rect, dom_node().value(), font(), Gfx::TextAlignment::Center, context.palette().button_text()); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -65,7 +65,7 @@ void LineBox::trim_trailing_whitespace() | |||
|         return; | ||||
|     auto& last_fragment = m_fragments.last(); | ||||
| 
 | ||||
|     int space_width = last_fragment.layout_node().specified_style().font().glyph_width(' '); | ||||
|     int space_width = last_fragment.layout_node().font().glyph_width(' '); | ||||
|     while (last_fragment.length() && isspace(last_text[last_fragment.length() - 1])) { | ||||
|         last_fragment.m_length -= 1; | ||||
|         last_fragment.set_width(last_fragment.width() - space_width); | ||||
|  |  | |||
|  | @ -78,7 +78,7 @@ int LineBoxFragment::text_index_at(float x) const | |||
|     if (!is<TextNode>(layout_node())) | ||||
|         return 0; | ||||
|     auto& layout_text = downcast<TextNode>(layout_node()); | ||||
|     auto& font = layout_text.specified_style().font(); | ||||
|     auto& font = layout_text.font(); | ||||
|     Utf8View view(text()); | ||||
| 
 | ||||
|     float relative_x = x - absolute_x(); | ||||
|  |  | |||
|  | @ -222,6 +222,8 @@ void NodeWithStyle::apply_style(const CSS::StyleProperties& specified_style) | |||
| { | ||||
|     auto& computed_values = static_cast<CSS::MutableComputedValues&>(m_computed_values); | ||||
| 
 | ||||
|     m_font = specified_style.font(); | ||||
| 
 | ||||
|     auto position = specified_style.position(); | ||||
|     if (position.has_value()) | ||||
|         computed_values.set_position(position.value()); | ||||
|  |  | |||
|  | @ -125,6 +125,7 @@ public: | |||
| 
 | ||||
|     bool can_contain_boxes_with_position_absolute() const; | ||||
| 
 | ||||
|     const Gfx::Font& font() const; | ||||
|     const CSS::StyleProperties& specified_style() const; | ||||
|     const CSS::ImmutableComputedValues& style() const; | ||||
| 
 | ||||
|  | @ -204,11 +205,14 @@ public: | |||
| 
 | ||||
|     void apply_style(const CSS::StyleProperties&); | ||||
| 
 | ||||
|     const Gfx::Font& font() const { return *m_font; } | ||||
| 
 | ||||
| protected: | ||||
|     NodeWithStyle(DOM::Document&, DOM::Node*, NonnullRefPtr<CSS::StyleProperties>); | ||||
| 
 | ||||
| private: | ||||
|     CSS::ComputedValues m_computed_values; | ||||
|     RefPtr<Gfx::Font> m_font; | ||||
| 
 | ||||
|     NonnullRefPtr<CSS::StyleProperties> m_specified_style; | ||||
|     CSS::Position m_position; | ||||
|  | @ -229,6 +233,13 @@ private: | |||
|     BoxModelMetrics m_box_model; | ||||
| }; | ||||
| 
 | ||||
| inline const Gfx::Font& Node::font() const | ||||
| { | ||||
|     if (m_has_style) | ||||
|         return static_cast<const NodeWithStyle*>(this)->font(); | ||||
|     return parent()->font(); | ||||
| } | ||||
| 
 | ||||
| inline const CSS::StyleProperties& Node::specified_style() const | ||||
| { | ||||
|     if (m_has_style) | ||||
|  |  | |||
|  | @ -81,7 +81,7 @@ void TextNode::paint_fragment(PaintContext& context, const LineBoxFragment& frag | |||
|     } | ||||
| 
 | ||||
|     if (phase == PaintPhase::Foreground) { | ||||
|         painter.set_font(specified_style().font()); | ||||
|         painter.set_font(font()); | ||||
| 
 | ||||
|         if (document().inspected_node() == &dom_node()) | ||||
|             context.painter().draw_rect(enclosing_int_rect(fragment.absolute_rect()), Color::Magenta); | ||||
|  | @ -99,7 +99,7 @@ void TextNode::paint_fragment(PaintContext& context, const LineBoxFragment& frag | |||
| 
 | ||||
|         painter.draw_text(enclosing_int_rect(fragment.absolute_rect()), text.substring_view(fragment.start(), fragment.length()), Gfx::TextAlignment::CenterLeft, style().color()); | ||||
| 
 | ||||
|         auto selection_rect = fragment.selection_rect(specified_style().font()); | ||||
|         auto selection_rect = fragment.selection_rect(font()); | ||||
|         if (!selection_rect.is_empty()) { | ||||
|             painter.fill_rect(enclosing_int_rect(selection_rect), context.palette().selection()); | ||||
|             Gfx::PainterStateSaver saver(painter); | ||||
|  | @ -130,7 +130,7 @@ void TextNode::paint_cursor_if_needed(PaintContext& context, const LineBoxFragme | |||
| 
 | ||||
|     auto fragment_rect = fragment.absolute_rect(); | ||||
| 
 | ||||
|     float cursor_x = fragment_rect.x() + specified_style().font().width(fragment.text().substring_view(0, frame().cursor_position().offset() - fragment.start())); | ||||
|     float cursor_x = fragment_rect.x() + font().width(fragment.text().substring_view(0, frame().cursor_position().offset() - fragment.start())); | ||||
|     float cursor_top = fragment_rect.top(); | ||||
|     float cursor_height = fragment_rect.height(); | ||||
|     Gfx::IntRect cursor_rect(cursor_x, cursor_top, 1, cursor_height); | ||||
|  | @ -195,7 +195,7 @@ void TextNode::split_into_lines_by_rules(InlineFormattingContext& context, Layou | |||
| { | ||||
|     auto& containing_block = context.containing_block(); | ||||
| 
 | ||||
|     auto& font = specified_style().font(); | ||||
|     auto& font = this->font(); | ||||
| 
 | ||||
|     auto& line_boxes = containing_block.line_boxes(); | ||||
|     containing_block.ensure_last_line_box(); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Andreas Kling
						Andreas Kling