css: Add data URL parsing to images
authorBenjamin Otte <otte@redhat.com>
Thu, 9 May 2019 01:11:48 +0000 (03:11 +0200)
committerBenjamin Otte <otte@redhat.com>
Sun, 12 May 2019 15:27:01 +0000 (17:27 +0200)
gtk/gtkcssimageurl.c
testsuite/reftests/data-url.css [new file with mode: 0644]
testsuite/reftests/data-url.ref.ui [new file with mode: 0644]
testsuite/reftests/data-url.ui [new file with mode: 0644]
testsuite/reftests/meson.build

index e46dd0ac9b2af37a3e4c1ff9cbd391b2e3d6b884..361844394d25d6add113d23ee39ee7d0a03c7375 100644 (file)
@@ -27,6 +27,8 @@
 #include "gtkcssimagepaintableprivate.h"
 #include "gtkstyleproviderprivate.h"
 
+#include "gtk/css/gtkcssdataurlprivate.h"
+
 G_DEFINE_TYPE (GtkCssImageUrl, _gtk_css_image_url, GTK_TYPE_CSS_IMAGE)
 
 static GtkCssImage *
@@ -52,6 +54,31 @@ gtk_css_image_url_load_image (GtkCssImageUrl  *url,
       g_free (resource_path);
       g_free (uri);
     }
+  else if (g_file_has_uri_scheme (url->file, "data"))
+    {
+      GInputStream *stream;
+      char *uri;
+      GdkPixbuf *pixbuf;
+      GBytes *bytes;
+
+      uri = g_file_get_uri (url->file);
+      texture = NULL;
+
+      bytes = gtk_css_data_url_parse (uri, NULL, &local_error);
+      if (bytes)
+        {
+          stream = g_memory_input_stream_new_from_bytes (bytes);
+          pixbuf = gdk_pixbuf_new_from_stream (stream, NULL, &local_error);
+          g_object_unref (stream);
+          if (pixbuf != NULL)
+            {
+              texture = gdk_texture_new_for_pixbuf (pixbuf);
+              g_object_unref (pixbuf);
+            }
+        }
+
+      g_free (uri);
+    }
   else
     {
       texture = gdk_texture_new_from_file (url->file, &local_error);
diff --git a/testsuite/reftests/data-url.css b/testsuite/reftests/data-url.css
new file mode 100644 (file)
index 0000000..94d9625
--- /dev/null
@@ -0,0 +1,3 @@
+.background {
+  background: red url('data:,<svg><rect width="20" height="20" style="fill:lime"/></svg>');
+}
diff --git a/testsuite/reftests/data-url.ref.ui b/testsuite/reftests/data-url.ref.ui
new file mode 100644 (file)
index 0000000..7a09474
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <object class="GtkWindow">
+    <property name="type">popup</property>
+    <child>
+      <object class="GtkPicture">
+        <property name="can-shrink">0</property>
+        <property name="paintable">green-20x20.png</property>
+      </object>
+    </child>
+  </object>
+</interface>
diff --git a/testsuite/reftests/data-url.ui b/testsuite/reftests/data-url.ui
new file mode 100644 (file)
index 0000000..6fa4172
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <object class="GtkWindow" id="window1">
+    <property name="width_request">20</property>
+    <property name="height_request">20</property>
+    <property name="type">popup</property>
+  </object>
+</interface>
index 3bbfe1abddf1d9ba171d1843a29a44d79dd6db64..6039ae709f7d34e3a6c49b8f2b109895bc62caff 100644 (file)
@@ -194,6 +194,9 @@ testdata = [
   'css-multi-state.css',
   'css-multi-state.ref.ui',
   'css-multi-state.ui',
+  'data-url.css',
+  'data-url.ref.ui',
+  'data-url.ui',
   'fixed-widget-stacking.ref.ui',
   'fixed-widget-stacking.ui',
   'flipping-icons.ref.ui',