css: Render the background-clip area, not the background-origin
authorBenjamin Otte <otte@redhat.com>
Thu, 7 Oct 2021 17:50:02 +0000 (19:50 +0200)
committerBenjamin Otte <otte@redhat.com>
Thu, 7 Oct 2021 17:59:44 +0000 (19:59 +0200)
Testcase included

Fixes #4324

gtk/gtkrenderbackground.c
testsuite/reftests/background-repeat-clip.css [new file with mode: 0644]
testsuite/reftests/background-repeat-clip.ref.ui [new file with mode: 0644]
testsuite/reftests/background-repeat-clip.ui [new file with mode: 0644]
testsuite/reftests/meson.build

index 7630ab704b41af3913fa877e89728d6bdeb025c9..92a29ca9fbac7e3f817fb347b68329d4fb86eb8e 100644 (file)
@@ -210,27 +210,17 @@ gtk_theming_background_snapshot_layer (GtkCssBoxes *bg,
       else
         repeat_height = round (image_height);
 
+      fill_rect = clip->bounds;
       if (hrepeat == GTK_CSS_REPEAT_STYLE_NO_REPEAT)
         {
           fill_rect.origin.x = _gtk_css_position_value_get_x (pos, width - image_width);
           fill_rect.size.width = image_width;
         }
-      else
-        {
-          fill_rect.origin.x = 0;
-          fill_rect.size.width = width;
-        }
-
       if (vrepeat == GTK_CSS_REPEAT_STYLE_NO_REPEAT)
         {
           fill_rect.origin.y = _gtk_css_position_value_get_y (pos, height - image_height);
           fill_rect.size.height = image_height;
         }
-      else
-        {
-          fill_rect.origin.y = 0;
-          fill_rect.size.height = height;
-        }
 
       gtk_snapshot_push_repeat (snapshot,
                                 &fill_rect,
diff --git a/testsuite/reftests/background-repeat-clip.css b/testsuite/reftests/background-repeat-clip.css
new file mode 100644 (file)
index 0000000..0ef6141
--- /dev/null
@@ -0,0 +1,21 @@
+* {
+  all: unset;
+}
+
+window {
+  background: pink;
+}
+
+grid {
+  background-image: linear-gradient(rebeccapurple, rebeccapurple);
+  background-size: 10px 10px;
+  padding: 10px;
+  background-repeat: repeat;
+  background-origin: content-box;
+  background-clip: border-box;
+}
+
+/* reference */
+box {
+  background: rebeccapurple;
+}
diff --git a/testsuite/reftests/background-repeat-clip.ref.ui b/testsuite/reftests/background-repeat-clip.ref.ui
new file mode 100644 (file)
index 0000000..e1eb659
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <object class="GtkWindow">
+    <property name="width_request">100</property>
+    <property name="height_request">100</property>
+    <property name="decorated">0</property>
+    <property name="child">
+      <object class="GtkBox" />
+    </property>
+  </object>
+</interface>
diff --git a/testsuite/reftests/background-repeat-clip.ui b/testsuite/reftests/background-repeat-clip.ui
new file mode 100644 (file)
index 0000000..d60a873
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <object class="GtkWindow">
+    <property name="width_request">100</property>
+    <property name="height_request">100</property>
+    <property name="decorated">0</property>
+    <property name="child">
+      <object class="GtkGrid" />
+    </property>
+  </object>
+</interface>
index 6806ece0316ad523dbfafdcb2a98190eb5644502..d4322f5c637d11cb04e7d880181da1a5acebea49 100644 (file)
@@ -93,6 +93,9 @@ testdata = [
   'background-position-simple.css',
   'background-position-simple.ref.ui',
   'background-position-simple.ui',
+  'background-repeat-clip.css',
+  'background-repeat-clip.ref.ui',
+  'background-repeat-clip.ui',
   'background-size.css',
   'background-size.ref.ui',
   'background-size.ui',