浏览代码

LibWeb: Resolve `text-decoration-thickness` during layout commit

Refactoring towards stop resolving CSS lengths during paintable
commands recording.
Aliaksandr Kalenik 1 年之前
父节点
当前提交
0d76a9da17

+ 14 - 1
Userland/Libraries/LibWeb/Layout/LayoutState.cpp

@@ -12,6 +12,7 @@
 #include <LibWeb/Layout/Viewport.h>
 #include <LibWeb/Layout/Viewport.h>
 #include <LibWeb/Painting/InlinePaintable.h>
 #include <LibWeb/Painting/InlinePaintable.h>
 #include <LibWeb/Painting/SVGPathPaintable.h>
 #include <LibWeb/Painting/SVGPathPaintable.h>
+#include <LibWeb/Painting/TextPaintable.h>
 
 
 namespace Web::Layout {
 namespace Web::Layout {
 
 
@@ -507,8 +508,20 @@ void LayoutState::commit(Box& root)
         paintable_with_lines.set_fragments(move(fragments_with_inline_paintables_removed));
         paintable_with_lines.set_fragments(move(fragments_with_inline_paintables_removed));
     }
     }
 
 
-    for (auto* text_node : text_nodes)
+    for (auto* text_node : text_nodes) {
         text_node->set_paintable(text_node->create_paintable());
         text_node->set_paintable(text_node->create_paintable());
+        auto* paintable = text_node->paintable();
+        auto const& font = text_node->first_available_font();
+        auto const glyph_height = CSSPixels::nearest_value_for(font.pixel_size());
+        auto const css_line_thickness = [&] {
+            auto computed_thickness = text_node->computed_values().text_decoration_thickness().resolved(*text_node, CSS::Length(1, CSS::Length::Type::Em).to_px(*text_node));
+            if (computed_thickness.is_auto())
+                return max(glyph_height.scaled(0.1), 1);
+            return computed_thickness.to_px(*text_node);
+        }();
+        auto& text_paintable = static_cast<Painting::TextPaintable&>(*paintable);
+        text_paintable.set_text_decoration_thickness(css_line_thickness);
+    }
 
 
     build_paint_tree(root);
     build_paint_tree(root);
 
 

+ 3 - 9
Userland/Libraries/LibWeb/Painting/PaintableBox.cpp

@@ -16,6 +16,7 @@
 #include <LibWeb/Painting/FilterPainting.h>
 #include <LibWeb/Painting/FilterPainting.h>
 #include <LibWeb/Painting/PaintableBox.h>
 #include <LibWeb/Painting/PaintableBox.h>
 #include <LibWeb/Painting/StackingContext.h>
 #include <LibWeb/Painting/StackingContext.h>
+#include <LibWeb/Painting/TextPaintable.h>
 #include <LibWeb/Painting/ViewportPaintable.h>
 #include <LibWeb/Painting/ViewportPaintable.h>
 #include <LibWeb/Platform/FontPlugin.h>
 #include <LibWeb/Platform/FontPlugin.h>
 
 
@@ -508,15 +509,8 @@ void paint_text_decoration(PaintContext& context, Layout::Node const& text_node,
     auto baseline = fragment.baseline();
     auto baseline = fragment.baseline();
 
 
     auto line_color = text_node.computed_values().text_decoration_color();
     auto line_color = text_node.computed_values().text_decoration_color();
-
-    CSSPixels css_line_thickness = [&] {
-        CSS::Length computed_thickness = text_node.computed_values().text_decoration_thickness().resolved(text_node, CSS::Length(1, CSS::Length::Type::Em).to_px(text_node));
-        if (computed_thickness.is_auto())
-            return max(glyph_height.scaled(0.1), 1);
-
-        return computed_thickness.to_px(text_node);
-    }();
-    auto device_line_thickness = context.rounded_device_pixels(css_line_thickness);
+    auto const& text_paintable = static_cast<TextPaintable const&>(fragment.paintable());
+    auto device_line_thickness = context.rounded_device_pixels(text_paintable.text_decoration_thickness());
 
 
     auto text_decoration_lines = text_node.computed_values().text_decoration_line();
     auto text_decoration_lines = text_node.computed_values().text_decoration_line();
     for (auto line : text_decoration_lines) {
     for (auto line : text_decoration_lines) {

+ 5 - 0
Userland/Libraries/LibWeb/Painting/TextPaintable.h

@@ -24,8 +24,13 @@ public:
     virtual DispatchEventOfSameName handle_mouseup(Badge<EventHandler>, CSSPixelPoint, unsigned button, unsigned modifiers) override;
     virtual DispatchEventOfSameName handle_mouseup(Badge<EventHandler>, CSSPixelPoint, unsigned button, unsigned modifiers) override;
     virtual DispatchEventOfSameName handle_mousemove(Badge<EventHandler>, CSSPixelPoint, unsigned button, unsigned modifiers) override;
     virtual DispatchEventOfSameName handle_mousemove(Badge<EventHandler>, CSSPixelPoint, unsigned button, unsigned modifiers) override;
 
 
+    void set_text_decoration_thickness(CSSPixels thickness) { m_text_decoration_thickness = thickness; }
+    CSSPixels text_decoration_thickness() const { return m_text_decoration_thickness; }
+
 private:
 private:
     explicit TextPaintable(Layout::TextNode const&);
     explicit TextPaintable(Layout::TextNode const&);
+
+    CSSPixels m_text_decoration_thickness { 0 };
 };
 };
 
 
 }
 }