瀏覽代碼

LibWeb: Attach BackgroundAttachment::Fixed to the window view port

This fixes the placement of several background images on Acid2, most
notably the background of the eyes and the red rectangle near the bottom
of the head.
Timothy Flynn 3 年之前
父節點
當前提交
e5db67d6dd
共有 1 個文件被更改,包括 13 次插入3 次删除
  1. 13 3
      Userland/Libraries/LibWeb/Painting/BackgroundPainting.cpp

+ 13 - 3
Userland/Libraries/LibWeb/Painting/BackgroundPainting.cpp

@@ -6,12 +6,14 @@
  */
 
 #include <LibGfx/Painter.h>
+#include <LibWeb/Layout/InitialContainingBlock.h>
 #include <LibWeb/Layout/Node.h>
 #include <LibWeb/Painting/BackgroundPainting.h>
 #include <LibWeb/Painting/PaintContext.h>
 
 namespace Web::Painting {
 
+// https://www.w3.org/TR/css-backgrounds-3/#backgrounds
 void paint_background(PaintContext& context, Layout::NodeWithStyleAndBoxModelMetrics const& layout_node, Gfx::IntRect const& border_rect, Color background_color, Vector<CSS::BackgroundLayerData> const* background_layers, BorderRadiusData const& border_radius)
 {
     auto& painter = context.painter();
@@ -57,10 +59,18 @@ void paint_background(PaintContext& context, Layout::NodeWithStyleAndBoxModelMet
         painter.save();
         painter.add_clip_rect(clip_rect);
 
-        // FIXME: Attachment
+        Gfx::IntRect background_positioning_area;
 
-        // Origin
-        auto background_positioning_area = get_box(layer.origin);
+        // Attachment and Origin
+        switch (layer.attachment) {
+        case CSS::BackgroundAttachment::Fixed:
+            background_positioning_area = layout_node.root().browsing_context().viewport_rect();
+            break;
+        case CSS::BackgroundAttachment::Local:
+        case CSS::BackgroundAttachment::Scroll:
+            background_positioning_area = get_box(layer.origin);
+            break;
+        }
 
         // Size
         Gfx::IntRect image_rect;