Преглед на файлове

LibWeb: Implement very naive layout of <path> within <svg>

Andreas Kling преди 3 години
родител
ревизия
684f7cca9f
променени са 1 файла, в които са добавени 21 реда и са изтрити 1 реда
  1. 21 1
      Userland/Libraries/LibWeb/Layout/SVGFormattingContext.cpp

+ 21 - 1
Userland/Libraries/LibWeb/Layout/SVGFormattingContext.cpp

@@ -6,6 +6,7 @@
 
 #include <AK/Format.h>
 #include <LibWeb/Layout/SVGFormattingContext.h>
+#include <LibWeb/Layout/SVGPathBox.h>
 #include <LibWeb/Layout/SVGSVGBox.h>
 
 namespace Web::Layout {
@@ -19,8 +20,27 @@ SVGFormattingContext::~SVGFormattingContext()
 {
 }
 
-void SVGFormattingContext::run(Box&, LayoutMode)
+void SVGFormattingContext::run(Box& box, LayoutMode)
 {
+    // FIXME: This formatting context is basically a total hack.
+    //        It works by computing the united bounding box of all <path>'s
+    //        within an <svg>, and using that as the size of this box.
+
+    Gfx::FloatRect total_bounding_box;
+
+    box.for_each_in_subtree_of_type<SVGBox>([&](auto& descendant) {
+        if (is<SVGPathBox>(descendant)) {
+            auto& path_box = static_cast<SVGPathBox&>(descendant);
+            auto& path = path_box.dom_node().get_path();
+            path_box.set_size(path.bounding_box().size());
+
+            total_bounding_box = total_bounding_box.united(path.bounding_box());
+        }
+
+        return IterationDecision::Continue;
+    });
+
+    box.set_size(total_bounding_box.size());
 }
 
 }