[librsvg/tests-for-gobject-introspection] Add test to compare the generated GIR file to a reference




commit 3888315ed132db812399265df63c336da1f2e053
Author: Sven Neumann <sven svenfoo org>
Date:   Wed Jan 27 17:10:09 2021 +0100

    Add test to compare the generated GIR file to a reference
    
    Work in progress
    
    Should fix #647

 .gitignore                          |    1 +
 Cargo.lock                          |   27 +
 Cargo.toml                          |    2 +
 tests/Makefile.am                   |    1 +
 tests/fixtures/gir/Rsvg-2.0-ref.gir | 2385 +++++++++++++++++++++++++++++++++++
 tests/src/gir.rs                    |   62 +
 tests/src/main.rs                   |    3 +
 7 files changed, 2481 insertions(+)
---
diff --git a/.gitignore b/.gitignore
index 8e626b78..807b02cf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -80,6 +80,7 @@ po/boldquot.sed
 po/en@boldquot.header
 po/en@quot.header
 po/insert-header.sin
+po/notexist
 po/quot.sed
 po/remove-potcdate.sin
 po/stamp-po
diff --git a/Cargo.lock b/Cargo.lock
index 2349a295..b2a4cc88 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -733,6 +733,20 @@ dependencies = [
  "libc",
 ]
 
+[[package]]
+name = "html5ever"
+version = "0.25.1"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "aafcf38a1a36118242d29b92e1b08ef84e67e4a5ed06e0a80be20e6a32bfed6b"
+dependencies = [
+ "log",
+ "mac",
+ "markup5ever",
+ "proc-macro2 1.0.24",
+ "quote 1.0.7",
+ "syn 1.0.48",
+]
+
 [[package]]
 name = "idna"
 version = "0.2.0"
@@ -820,6 +834,7 @@ dependencies = [
  "locale_config",
  "lopdf",
  "markup5ever",
+ "markup5ever_rcdom",
  "matches",
  "nalgebra",
  "num-traits",
@@ -929,6 +944,18 @@ dependencies = [
  "tendril",
 ]
 
+[[package]]
+name = "markup5ever_rcdom"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "f015da43bcd8d4f144559a3423f4591d69b8ce0652c905374da7205df336ae2b"
+dependencies = [
+ "html5ever",
+ "markup5ever",
+ "tendril",
+ "xml5ever",
+]
+
 [[package]]
 name = "matches"
 version = "0.1.8"
diff --git a/Cargo.toml b/Cargo.toml
index e9557480..ccf738e2 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -57,6 +57,7 @@ criterion = "0.3"
 glib = "0.9.0"
 libc = "0.2"
 lopdf = "0.26.0"
+markup5ever_rcdom = "0.1.0"
 matches = "0.1"
 pkg-config = "0.3.14"
 pango = "0.8.0"
@@ -67,6 +68,7 @@ predicates = "1.0.2"
 proptest = "0.10.1"
 tempfile = "3"
 test-generator = "0.3"
+xml5ever = "0.16.1"
 yeslogic-fontconfig-sys = "2.11.1"
 
 [build-dependencies]
diff --git a/tests/Makefile.am b/tests/Makefile.am
index a74e5ae8..82ea38f3 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -49,6 +49,7 @@ test_fixtures =                                                               \
        $(wildcard $(srcdir)/fixtures/crash/*.svg)                      \
        $(wildcard $(srcdir)/fixtures/crash/*.png)                      \
        $(wildcard $(srcdir)/fixtures/errors/*)                         \
+       $(wildcard $(srcdir)/fixtures/gir/*.gir)                        \
        $(wildcard $(srcdir)/fixtures/loading/*)                        \
        $(wildcard $(srcdir)/fixtures/reftests/*.css)                   \
        $(wildcard $(srcdir)/fixtures/reftests/*.svg)                   \
diff --git a/tests/fixtures/gir/Rsvg-2.0-ref.gir b/tests/fixtures/gir/Rsvg-2.0-ref.gir
new file mode 100644
index 00000000..4fdea0c3
--- /dev/null
+++ b/tests/fixtures/gir/Rsvg-2.0-ref.gir
@@ -0,0 +1,2385 @@
+<?xml version="1.0"?>
+<!-- This file was automatically generated from C sources - DO NOT EDIT!
+To affect the contents of this file, edit the original C definitions,
+and/or use gtk-doc annotations.  -->
+<repository version="1.2"
+            xmlns="http://www.gtk.org/introspection/core/1.0";
+            xmlns:c="http://www.gtk.org/introspection/c/1.0";
+            xmlns:glib="http://www.gtk.org/introspection/glib/1.0";>
+  <include name="GLib" version="2.0"/>
+  <include name="GObject" version="2.0"/>
+  <include name="GdkPixbuf" version="2.0"/>
+  <include name="Gio" version="2.0"/>
+  <include name="cairo" version="1.0"/>
+  <package name="librsvg-2.0"/>
+  <c:include name="librsvg/rsvg.h"/>
+  <namespace name="Rsvg"
+             version="2.0"
+             shared-library="librsvg-2.so.2"
+             c:identifier-prefixes="Rsvg"
+             c:symbol-prefixes="rsvg,librsvg">
+    <function-macro name="CHECK_VERSION"
+                    c:identifier="LIBRSVG_CHECK_VERSION"
+                    introspectable="0">
+      <doc xml:space="preserve"
+           filename="rsvg-features.h"
+           line="106">This C macro returns #TRUE if the the version of librsvg being
+compiled against is the same or newer than the specified version.
+
+Note that this a compile-time check for C programs.  If you want a
+run-time check for the version of librsvg being used, or if you are
+using another programming language, see the variables
+@rsvg_major_version, @rsvg_minor_version, @rsvg_micro_version
+instead.</doc>
+      <source-position filename="rsvg-features.h" line="121"/>
+      <parameters>
+        <parameter name="major">
+          <doc xml:space="preserve"
+               filename="rsvg-features.h"
+               line="108">component for the major version to check</doc>
+        </parameter>
+        <parameter name="minor">
+          <doc xml:space="preserve"
+               filename="rsvg-features.h"
+               line="109">component for the minor version to check</doc>
+        </parameter>
+        <parameter name="micro">
+          <doc xml:space="preserve"
+               filename="rsvg-features.h"
+               line="110">component for the micro version to check</doc>
+        </parameter>
+      </parameters>
+    </function-macro>
+    <function-macro name="DEPRECATED_FOR"
+                    c:identifier="RSVG_DEPRECATED_FOR"
+                    introspectable="0">
+      <source-position filename="rsvg.h" line="47"/>
+      <parameters>
+        <parameter name="f">
+        </parameter>
+      </parameters>
+    </function-macro>
+    <record name="DimensionData"
+            c:type="RsvgDimensionData"
+            deprecated="1"
+            deprecated-version="2.46.">
+      <doc xml:space="preserve"
+           filename="rsvg.h"
+           line="409">Dimensions of an SVG image from rsvg_handle_get_dimensions(), or an
+individual element from rsvg_handle_get_dimensions_sub().  Please see
+the deprecation documentation for those functions.</doc>
+      <doc-deprecated xml:space="preserve">FIXME: point to deprecation documentation.</doc-deprecated>
+      <source-position filename="rsvg.h" line="427"/>
+      <field name="width" writable="1">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="411">SVG's width, in pixels</doc>
+        <type name="gint" c:type="int"/>
+      </field>
+      <field name="height" writable="1">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="412">SVG's height, in pixels</doc>
+        <type name="gint" c:type="int"/>
+      </field>
+      <field name="em" writable="1">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="413">SVG's original width, unmodified by #RsvgSizeFunc</doc>
+        <type name="gdouble" c:type="gdouble"/>
+      </field>
+      <field name="ex" writable="1">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="414">SVG's original height, unmodified by #RsvgSizeFunc</doc>
+        <type name="gdouble" c:type="gdouble"/>
+      </field>
+    </record>
+    <enumeration name="Error"
+                 glib:type-name="RsvgError"
+                 glib:get-type="rsvg_error_get_type"
+                 c:type="RsvgError"
+                 glib:error-domain="rsvg-error-quark">
+      <doc xml:space="preserve"
+           filename="rsvg.h"
+           line="55">An enumeration representing possible errors</doc>
+      <member name="failed"
+              value="0"
+              c:identifier="RSVG_ERROR_FAILED"
+              glib:nick="failed">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="57">the request failed</doc>
+      </member>
+      <function name="quark" c:identifier="rsvg_error_quark">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="67">The error domain for RSVG</doc>
+        <return-value transfer-ownership="none">
+          <doc xml:space="preserve"
+               filename="rsvg.h"
+               line="72">The error domain</doc>
+          <type name="GLib.Quark" c:type="GQuark"/>
+        </return-value>
+      </function>
+    </enumeration>
+    <function-macro name="HANDLE"
+                    c:identifier="RSVG_HANDLE"
+                    introspectable="0">
+      <source-position filename="rsvg.h" line="368"/>
+      <parameters>
+        <parameter name="obj">
+        </parameter>
+      </parameters>
+    </function-macro>
+    <function-macro name="HANDLE_CLASS"
+                    c:identifier="RSVG_HANDLE_CLASS"
+                    introspectable="0">
+      <source-position filename="rsvg.h" line="369"/>
+      <parameters>
+        <parameter name="klass">
+        </parameter>
+      </parameters>
+    </function-macro>
+    <function-macro name="HANDLE_GET_CLASS"
+                    c:identifier="RSVG_HANDLE_GET_CLASS"
+                    introspectable="0">
+      <source-position filename="rsvg.h" line="372"/>
+      <parameters>
+        <parameter name="obj">
+        </parameter>
+      </parameters>
+    </function-macro>
+    <class name="Handle"
+           c:symbol-prefix="handle"
+           c:type="RsvgHandle"
+           parent="GObject.Object"
+           glib:type-name="RsvgHandle"
+           glib:get-type="rsvg_handle_get_type"
+           glib:type-struct="HandleClass">
+      <doc xml:space="preserve"
+           filename="rsvg.h"
+           line="396">Lets you load SVG data and render it.</doc>
+      <source-position filename="rsvg.h" line="394"/>
+      <constructor name="new" c:identifier="rsvg_handle_new">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="541">Returns a new rsvg handle.  Must be freed with @g_object_unref.  This
+handle can be used to load an image.
+
+The preferred way of loading SVG data into the returned #RsvgHandle is with
+rsvg_handle_read_stream_sync().
+
+The deprecated way of loading SVG data is with rsvg_handle_write() and
+rsvg_handle_close(); note that these require buffering the entire file
+internally, and for this reason it is better to use the stream functions:
+rsvg_handle_new_from_stream_sync(), rsvg_handle_read_stream_sync(), or
+rsvg_handle_new_from_gfile_sync().
+
+After loading the #RsvgHandle with data, you can render it using Cairo or get
+a GdkPixbuf from it. When finished, free the handle with g_object_unref(). No
+more than one image can be loaded with one handle.
+
+Note that this function creates an #RsvgHandle with no flags set.  If you
+require any of #RsvgHandleFlags to be set, use any of
+rsvg_handle_new_with_flags(), rsvg_handle_new_from_stream_sync(), or
+rsvg_handle_new_from_gfile_sync().</doc>
+        <source-position filename="rsvg.h" line="568"/>
+        <return-value transfer-ownership="full">
+          <doc xml:space="preserve"
+               filename="rsvg.h"
+               line="565">A new #RsvgHandle with no flags set.</doc>
+          <type name="Handle" c:type="RsvgHandle*"/>
+        </return-value>
+      </constructor>
+      <constructor name="new_from_data"
+                   c:identifier="rsvg_handle_new_from_data"
+                   version="2.14"
+                   throws="1">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="1106">Loads the SVG specified by @data.  Note that this function creates an
+#RsvgHandle without a base URL, and without any #RsvgHandleFlags.  If you
+need these, use rsvg_handle_new_from_stream_sync() instead by creating
+a #GMemoryInputStream from your data.</doc>
+        <source-position filename="rsvg.h" line="1121"/>
+        <return-value transfer-ownership="full">
+          <doc xml:space="preserve"
+               filename="rsvg.h"
+               line="1117">A #RsvgHandle or %NULL if an error occurs.</doc>
+          <type name="Handle" c:type="RsvgHandle*"/>
+        </return-value>
+        <parameters>
+          <parameter name="data" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="1108">The SVG data</doc>
+            <array length="1" zero-terminated="0" c:type="const guint8*">
+              <type name="guint8" c:type="guint8"/>
+            </array>
+          </parameter>
+          <parameter name="data_len" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="1109">The length of @data, in bytes</doc>
+            <type name="gsize" c:type="gsize"/>
+          </parameter>
+        </parameters>
+      </constructor>
+      <constructor name="new_from_file"
+                   c:identifier="rsvg_handle_new_from_file"
+                   version="2.14"
+                   throws="1">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="1123">Loads the SVG specified by @file_name.  Note that this function, like
+rsvg_handle_new(), does not specify any loading flags for the resulting
+handle.  If you require the use of #RsvgHandleFlags, use
+rsvg_handle_new_from_gfile_sync().</doc>
+        <source-position filename="rsvg.h" line="1137"/>
+        <return-value transfer-ownership="full">
+          <doc xml:space="preserve"
+               filename="rsvg.h"
+               line="1133">A #RsvgHandle or %NULL if an error occurs.</doc>
+          <type name="Handle" c:type="RsvgHandle*"/>
+        </return-value>
+        <parameters>
+          <parameter name="filename" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="1125">The file name to load, or a URI.</doc>
+            <type name="utf8" c:type="const gchar*"/>
+          </parameter>
+        </parameters>
+      </constructor>
+      <constructor name="new_from_gfile_sync"
+                   c:identifier="rsvg_handle_new_from_gfile_sync"
+                   version="2.32"
+                   throws="1">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="1048">Creates a new #RsvgHandle for @file.
+
+This function sets the "base file" of the handle to be @file itself, so SVG
+elements like &lt;literal&gt;&amp;lt;image&amp;gt;&lt;/literal&gt; which reference external
+resources will be resolved relative to the location of @file.
+
+If @cancellable is not %NULL, then the operation can be cancelled by
+triggering the cancellable object from another thread. If the
+operation was cancelled, the error %G_IO_ERROR_CANCELLED will be
+returned in @error.</doc>
+        <source-position filename="rsvg.h" line="1071"/>
+        <return-value transfer-ownership="full">
+          <doc xml:space="preserve"
+               filename="rsvg.h"
+               line="1066">a new #RsvgHandle on success, or %NULL with @error filled in</doc>
+          <type name="Handle" c:type="RsvgHandle*"/>
+        </return-value>
+        <parameters>
+          <parameter name="file" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="1050">a #GFile</doc>
+            <type name="Gio.File" c:type="GFile*"/>
+          </parameter>
+          <parameter name="flags" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="1051">flags from #RsvgHandleFlags</doc>
+            <type name="HandleFlags" c:type="RsvgHandleFlags"/>
+          </parameter>
+          <parameter name="cancellable"
+                     transfer-ownership="none"
+                     nullable="1"
+                     allow-none="1">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="1052">a #GCancellable, or %NULL</doc>
+            <type name="Gio.Cancellable" c:type="GCancellable*"/>
+          </parameter>
+        </parameters>
+      </constructor>
+      <constructor name="new_from_stream_sync"
+                   c:identifier="rsvg_handle_new_from_stream_sync"
+                   version="2.32"
+                   throws="1">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="1076">Creates a new #RsvgHandle for @stream.
+
+This function sets the "base file" of the handle to be @base_file if
+provided.  SVG elements like &lt;literal&gt;&amp;lt;image&amp;gt;&lt;/literal&gt; which reference
+external resources will be resolved relative to the location of @base_file.
+
+If @cancellable is not %NULL, then the operation can be cancelled by
+triggering the cancellable object from another thread. If the
+operation was cancelled, the error %G_IO_ERROR_CANCELLED will be
+returned in @error.</doc>
+        <source-position filename="rsvg.h" line="1100"/>
+        <return-value transfer-ownership="full">
+          <doc xml:space="preserve"
+               filename="rsvg.h"
+               line="1095">a new #RsvgHandle on success, or %NULL with @error filled in</doc>
+          <type name="Handle" c:type="RsvgHandle*"/>
+        </return-value>
+        <parameters>
+          <parameter name="input_stream" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="1078">a #GInputStream</doc>
+            <type name="Gio.InputStream" c:type="GInputStream*"/>
+          </parameter>
+          <parameter name="base_file"
+                     transfer-ownership="none"
+                     nullable="1"
+                     allow-none="1">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="1079">a #GFile, or %NULL</doc>
+            <type name="Gio.File" c:type="GFile*"/>
+          </parameter>
+          <parameter name="flags" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="1080">flags from #RsvgHandleFlags</doc>
+            <type name="HandleFlags" c:type="RsvgHandleFlags"/>
+          </parameter>
+          <parameter name="cancellable"
+                     transfer-ownership="none"
+                     nullable="1"
+                     allow-none="1">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="1081">a #GCancellable, or %NULL</doc>
+            <type name="Gio.Cancellable" c:type="GCancellable*"/>
+          </parameter>
+        </parameters>
+      </constructor>
+      <constructor name="new_with_flags"
+                   c:identifier="rsvg_handle_new_with_flags"
+                   version="2.36">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="986">Creates a new #RsvgHandle with flags @flags.  After calling this function,
+you can feed the resulting handle with SVG data by using
+rsvg_handle_read_stream_sync().</doc>
+        <source-position filename="rsvg.h" line="999"/>
+        <return-value transfer-ownership="full">
+          <doc xml:space="preserve"
+               filename="rsvg.h"
+               line="994">a new #RsvgHandle</doc>
+          <type name="Handle" c:type="RsvgHandle*"/>
+        </return-value>
+        <parameters>
+          <parameter name="flags" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="988">flags from #RsvgHandleFlags</doc>
+            <type name="HandleFlags" c:type="RsvgHandleFlags"/>
+          </parameter>
+        </parameters>
+      </constructor>
+      <method name="close"
+              c:identifier="rsvg_handle_close"
+              deprecated="1"
+              deprecated-version="2.46."
+              throws="1">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="600">Closes @handle, to indicate that loading the image is complete.  This will
+return %TRUE if the loader closed successfully and the SVG data was parsed
+correctly.  Note that @handle isn't freed until @g_object_unref is called.</doc>
+        <doc-deprecated xml:space="preserve">Use rsvg_handle_read_stream_sync() or the constructor
+functions rsvg_handle_new_from_gfile_sync() or
+rsvg_handle_new_from_stream_sync().  See the deprecation notes for
+rsvg_handle_write() for more information.</doc-deprecated>
+        <source-position filename="rsvg.h" line="617"/>
+        <return-value transfer-ownership="none">
+          <doc xml:space="preserve"
+               filename="rsvg.h"
+               line="609">%TRUE on success, or %FALSE on error.</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+        <parameters>
+          <instance-parameter name="handle" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="602">a #RsvgHandle</doc>
+            <type name="Handle" c:type="RsvgHandle*"/>
+          </instance-parameter>
+        </parameters>
+      </method>
+      <method name="get_base_uri"
+              c:identifier="rsvg_handle_get_base_uri"
+              version="2.8">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="670">Gets the base uri for this #RsvgHandle.</doc>
+        <source-position filename="rsvg.h" line="680"/>
+        <return-value transfer-ownership="none">
+          <doc xml:space="preserve"
+               filename="rsvg.h"
+               line="676">the base uri, possibly null</doc>
+          <type name="utf8" c:type="const char*"/>
+        </return-value>
+        <parameters>
+          <instance-parameter name="handle" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="672">A #RsvgHandle</doc>
+            <type name="Handle" c:type="RsvgHandle*"/>
+          </instance-parameter>
+        </parameters>
+      </method>
+      <method name="get_dimensions"
+              c:identifier="rsvg_handle_get_dimensions"
+              version="2.14">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="697">Get the SVG's size. Do not call from within the size_func callback, because
+an infinite loop will occur.
+
+This function depends on the #RsvgHandle's DPI to compute dimensions in
+pixels, so you should call rsvg_handle_set_dpi() beforehand.</doc>
+        <source-position filename="rsvg.h" line="711"/>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+        <parameters>
+          <instance-parameter name="handle" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="699">A #RsvgHandle</doc>
+            <type name="Handle" c:type="RsvgHandle*"/>
+          </instance-parameter>
+          <parameter name="dimension_data"
+                     direction="out"
+                     caller-allocates="1"
+                     transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="700">A place to store the SVG's size</doc>
+            <type name="DimensionData" c:type="RsvgDimensionData*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="get_dimensions_sub"
+              c:identifier="rsvg_handle_get_dimensions_sub"
+              version="2.22"
+              deprecated="1"
+              deprecated-version="2.46.">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="713">Get the size of a subelement of the SVG file. Do not call from within the
+size_func callback, because an infinite loop will occur.
+
+This function depends on the #RsvgHandle's DPI to compute dimensions in
+pixels, so you should call rsvg_handle_set_dpi() beforehand.
+
+Element IDs should look like an URL fragment identifier; for example, pass
+"##foo" (hash &lt;literal&gt;foo&lt;/literal&gt;) to get the geometry of the element that
+has an &lt;literal&gt;id="foo"&lt;/literal&gt; attribute.</doc>
+        <doc-deprecated xml:space="preserve">Use rsvg_handle_get_geometry_for_layer() 
instead.</doc-deprecated>
+        <source-position filename="rsvg.h" line="736"/>
+        <return-value transfer-ownership="none">
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+        <parameters>
+          <instance-parameter name="handle" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="715">A #RsvgHandle</doc>
+            <type name="Handle" c:type="RsvgHandle*"/>
+          </instance-parameter>
+          <parameter name="dimension_data"
+                     direction="out"
+                     caller-allocates="1"
+                     transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="716">A place to store the SVG's size</doc>
+            <type name="DimensionData" c:type="RsvgDimensionData*"/>
+          </parameter>
+          <parameter name="id"
+                     transfer-ownership="none"
+                     nullable="1"
+                     allow-none="1">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="717">An element's id within the SVG, starting with "##" (a single
+hash character), for example, "##layer1".  This notation corresponds to a
+URL's fragment ID.  Alternatively, pass %NULL to use the whole SVG.</doc>
+            <type name="utf8" c:type="const char*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="get_geometry_for_element"
+              c:identifier="rsvg_handle_get_geometry_for_element"
+              version="2.46"
+              throws="1">
+        <doc xml:space="preserve"
+             filename="rsvg-cairo.h"
+             line="292">Computes the ink rectangle and logical rectangle of a single SVG element.
+
+While `rsvg_handle_get_geometry_for_layer` computes the geometry of an SVG element subtree with
+its transformation matrix, this other function will compute the element's geometry
+as if it were being rendered under an identity transformation by itself.  That is,
+the resulting geometry is as if the element got extracted by itself from the SVG.
+
+This function is the counterpart to `rsvg_handle_render_element`.
+
+Element IDs should look like an URL fragment identifier; for example, pass
+"##foo" (hash &lt;literal&gt;foo&lt;/literal&gt;) to get the geometry of the element that
+has an &lt;literal&gt;id="foo"&lt;/literal&gt; attribute.
+
+The "ink rectangle" is the bounding box that would be painted
+for fully- stroked and filled elements.
+
+The "logical rectangle" just takes into account the unstroked
+paths and text outlines.
+
+Note that these bounds are not minimum bounds; for example,
+clipping paths are not taken into account.
+
+You can pass #NULL for the @id if you want to measure all
+the elements in the SVG, i.e. to measure everything from the
+root element.
+
+This operation is not constant-time, as it involves going through all
+the child elements.
+
+API ordering: This function must be called on a fully-loaded @handle.  See
+the section &lt;ulink url="#API-ordering"&gt;API ordering&lt;/ulink&gt; for details.
+
+Panics: this function will panic if the @handle is not fully-loaded.</doc>
+        <source-position filename="rsvg-cairo.h" line="340"/>
+        <return-value transfer-ownership="none">
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+        <parameters>
+          <instance-parameter name="handle" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg-cairo.h"
+                 line="294">An #RsvgHandle</doc>
+            <type name="Handle" c:type="RsvgHandle*"/>
+          </instance-parameter>
+          <parameter name="id"
+                     transfer-ownership="none"
+                     nullable="1"
+                     allow-none="1">
+            <doc xml:space="preserve"
+                 filename="rsvg-cairo.h"
+                 line="295">An element's id within the SVG, starting with "##" (a single
+hash character), for example, "##layer1".  This notation corresponds to a
+URL's fragment ID.  Alternatively, pass %NULL to compute the geometry for the
+whole SVG.</doc>
+            <type name="utf8" c:type="const char*"/>
+          </parameter>
+          <parameter name="out_ink_rect"
+                     direction="out"
+                     caller-allocates="1"
+                     transfer-ownership="none"
+                     optional="1"
+                     allow-none="1">
+            <doc xml:space="preserve"
+                 filename="rsvg-cairo.h"
+                 line="299">Place to store the ink rectangle of the element.</doc>
+            <type name="Rectangle" c:type="RsvgRectangle*"/>
+          </parameter>
+          <parameter name="out_logical_rect"
+                     direction="out"
+                     caller-allocates="1"
+                     transfer-ownership="none"
+                     optional="1"
+                     allow-none="1">
+            <doc xml:space="preserve"
+                 filename="rsvg-cairo.h"
+                 line="300">Place to store the logical rectangle of the element.</doc>
+            <type name="Rectangle" c:type="RsvgRectangle*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="get_geometry_for_layer"
+              c:identifier="rsvg_handle_get_geometry_for_layer"
+              version="2.46"
+              throws="1">
+        <doc xml:space="preserve"
+             filename="rsvg-cairo.h"
+             line="197">Computes the ink rectangle and logical rectangle of an SVG element, or the
+whole SVG, as if the whole SVG were rendered to a specific viewport.
+
+Element IDs should look like an URL fragment identifier; for example, pass
+"##foo" (hash &lt;literal&gt;foo&lt;/literal&gt;) to get the geometry of the element that
+has an &lt;literal&gt;id="foo"&lt;/literal&gt; attribute.
+
+The "ink rectangle" is the bounding box that would be painted
+for fully- stroked and filled elements.
+
+The "logical rectangle" just takes into account the unstroked
+paths and text outlines.
+
+Note that these bounds are not minimum bounds; for example,
+clipping paths are not taken into account.
+
+You can pass #NULL for the @id if you want to measure all
+the elements in the SVG, i.e. to measure everything from the
+root element.
+
+This operation is not constant-time, as it involves going through all
+the child elements.
+
+API ordering: This function must be called on a fully-loaded @handle.  See
+the section &lt;ulink url="#API-ordering"&gt;API ordering&lt;/ulink&gt; for details.
+
+Panics: this function will panic if the @handle is not fully-loaded.</doc>
+        <source-position filename="rsvg-cairo.h" line="240"/>
+        <return-value transfer-ownership="none">
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+        <parameters>
+          <instance-parameter name="handle" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg-cairo.h"
+                 line="199">An #RsvgHandle</doc>
+            <type name="Handle" c:type="RsvgHandle*"/>
+          </instance-parameter>
+          <parameter name="id"
+                     transfer-ownership="none"
+                     nullable="1"
+                     allow-none="1">
+            <doc xml:space="preserve"
+                 filename="rsvg-cairo.h"
+                 line="200">An element's id within the SVG, starting with "##" (a single
+hash character), for example, "##layer1".  This notation corresponds to a
+URL's fragment ID.  Alternatively, pass %NULL to compute the geometry for the
+whole SVG.</doc>
+            <type name="utf8" c:type="const char*"/>
+          </parameter>
+          <parameter name="viewport" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg-cairo.h"
+                 line="204">Viewport size at which the whole SVG would be fitted.</doc>
+            <type name="Rectangle" c:type="const RsvgRectangle*"/>
+          </parameter>
+          <parameter name="out_ink_rect"
+                     direction="out"
+                     caller-allocates="1"
+                     transfer-ownership="none"
+                     optional="1"
+                     allow-none="1">
+            <doc xml:space="preserve"
+                 filename="rsvg-cairo.h"
+                 line="205">Place to store the ink rectangle of the element.</doc>
+            <type name="Rectangle" c:type="RsvgRectangle*"/>
+          </parameter>
+          <parameter name="out_logical_rect"
+                     direction="out"
+                     caller-allocates="1"
+                     transfer-ownership="none"
+                     optional="1"
+                     allow-none="1">
+            <doc xml:space="preserve"
+                 filename="rsvg-cairo.h"
+                 line="206">Place to store the logical rectangle of the element.</doc>
+            <type name="Rectangle" c:type="RsvgRectangle*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="get_intrinsic_dimensions"
+              c:identifier="rsvg_handle_get_intrinsic_dimensions"
+              version="2.46">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="839">Queries the &lt;literal&gt;width&lt;/literal&gt;, 
&lt;literal&gt;height&lt;/literal&gt;, and
+&lt;literal&gt;viewBox&lt;/literal&gt; attributes in an SVG document.
+
+If you are calling this function to compute a scaling factor to render the SVG,
+consider simply using rsvg_handle_render_document() instead; it will do the
+scaling computations automatically.
+
+As an example, the following SVG element has a &lt;literal&gt;width&lt;/literal&gt; of 100 pixels and a 
&lt;literal&gt;height&lt;/literal&gt; of 400 pixels, but no &lt;literal&gt;viewBox&lt;/literal&gt;:
+
+|[
+&lt;svg xmlns="http://www.w3.org/2000/svg"; width="100" height="400"&gt;
+]|
+
+Conversely, the following element has a &lt;literal&gt;viewBox&lt;/literal&gt;, but no 
&lt;literal&gt;width&lt;/literal&gt; or &lt;literal&gt;height&lt;/literal&gt;:
+
+|[
+&lt;svg xmlns="http://www.w3.org/2000/svg"; viewBox="0 0 100 400"&gt;
+]|
+
+Note that the #RsvgLength return values have #RsvgUnits in them; you should
+not assume that they are always in pixels.  For example, the following SVG element
+will return a width value whose &lt;literal&gt;units&lt;/literal&gt; field is RSVG_UNIT_MM.
+
+|[
+&lt;svg xmlns="http://www.w3.org/2000/svg"; width="210mm" height="297mm"&gt;
+]|
+
+API ordering: This function must be called on a fully-loaded @handle.  See
+the section &lt;ulink url="#API-ordering"&gt;API ordering&lt;/ulink&gt; for details.
+
+Panics: this function will panic if the @handle is not fully-loaded.</doc>
+        <source-position filename="rsvg.h" line="884"/>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+        <parameters>
+          <instance-parameter name="handle" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="841">An #RsvgHandle</doc>
+            <type name="Handle" c:type="RsvgHandle*"/>
+          </instance-parameter>
+          <parameter name="out_has_width"
+                     direction="out"
+                     caller-allocates="0"
+                     transfer-ownership="full"
+                     optional="1"
+                     allow-none="1">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="842">Will be set to #TRUE if the toplevel SVG has a 
&lt;literal&gt;width&lt;/literal&gt; attribute</doc>
+            <type name="gboolean" c:type="gboolean*"/>
+          </parameter>
+          <parameter name="out_width"
+                     direction="out"
+                     caller-allocates="1"
+                     transfer-ownership="none"
+                     optional="1"
+                     allow-none="1">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="843">Will be set to the value of the &lt;literal&gt;width&lt;/literal&gt; attribute 
in the toplevel SVG</doc>
+            <type name="Length" c:type="RsvgLength*"/>
+          </parameter>
+          <parameter name="out_has_height"
+                     direction="out"
+                     caller-allocates="0"
+                     transfer-ownership="full"
+                     optional="1"
+                     allow-none="1">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="844">Will be set to #TRUE if the toplevel SVG has a 
&lt;literal&gt;height&lt;/literal&gt; attribute</doc>
+            <type name="gboolean" c:type="gboolean*"/>
+          </parameter>
+          <parameter name="out_height"
+                     direction="out"
+                     caller-allocates="1"
+                     transfer-ownership="none"
+                     optional="1"
+                     allow-none="1">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="845">Will be set to the value of the &lt;literal&gt;height&lt;/literal&gt; attribute 
in the toplevel SVG</doc>
+            <type name="Length" c:type="RsvgLength*"/>
+          </parameter>
+          <parameter name="out_has_viewbox"
+                     direction="out"
+                     caller-allocates="0"
+                     transfer-ownership="full"
+                     optional="1"
+                     allow-none="1">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="846">Will be set to #TRUE if the toplevel SVG has a 
&lt;literal&gt;viewBox&lt;/literal&gt; attribute</doc>
+            <type name="gboolean" c:type="gboolean*"/>
+          </parameter>
+          <parameter name="out_viewbox"
+                     direction="out"
+                     caller-allocates="1"
+                     transfer-ownership="none"
+                     optional="1"
+                     allow-none="1">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="847">Will be set to the value of the &lt;literal&gt;viewBox&lt;/literal&gt; attribute 
in the toplevel SVG</doc>
+            <type name="Rectangle" c:type="RsvgRectangle*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="get_intrinsic_size_in_pixels"
+              c:identifier="rsvg_handle_get_intrinsic_size_in_pixels"
+              version="2.52">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="892">Converts an SVG document's intrinsic dimensions to pixels, and returns the result.
+
+This function is able to extract the size in pixels from an SVG document if the
+document has both &lt;literal&gt;width&lt;/literal&gt; and &lt;literal&gt;height&lt;/literal&gt; attributes
+with physical units (px, in, cm, mm, pt, pc) or font-based units (em, ex).  For
+physical units, the dimensions are normalized to pixels using the dots-per-inch (DPI)
+value set previously with rsvg_handle_set_dpi().  For font-based units, this function
+uses the computed value of the `font-size` property for the toplevel
+&lt;literal&gt;&amp;lt;svg&amp;gt;&lt;/literal&gt; element.  In those cases, this function returns %TRUE.
+
+This function is not able to extract the size in pixels directly from the intrinsic
+dimensions of the SVG document if the &lt;literal&gt;width&lt;/literal&gt; or
+&lt;literal&gt;height&lt;/literal&gt; are in percentage units (or if they do not exist, in which
+case the SVG spec mandates that they default to 100%), as these require a
+&lt;firstterm&gt;viewport&lt;/firstterm&gt; to be resolved to a final size.  In this case, the
+function returns %FALSE.
+
+For example, the following document fragment has intrinsic dimensions that will resolve
+to 20x30 pixels.
+
+|[
+&lt;svg xmlns="http://www.w3.org/2000/svg"; width="20" height="30"/&gt;
+]|
+
+Similarly, if the DPI is set to 96, this document will resolve to 192x288 pixels (i.e. 96*2 x 96*3).
+
+|[
+&lt;svg xmlns="http://www.w3.org/2000/svg"; width="2in" height="3in"/&gt;
+]|
+
+The dimensions of the following documents cannot be resolved to pixels directly, and
+this function would return %FALSE for them:
+
+|[
+&lt;!-- Needs a viewport against which to compute the percentages. --&gt;
+&lt;svg xmlns="http://www.w3.org/2000/svg"; width="100%" height="100%"/&gt;
+
+&lt;!-- Does not have intrinsic width/height, just a 1:2 aspect ratio which
+     needs to be fitted within a viewport. --&gt;
+&lt;svg xmlns="http://www.w3.org/2000/svg"; viewBox="0 0 100 200"/&gt;
+]|</doc>
+        <source-position filename="rsvg.h" line="948"/>
+        <return-value transfer-ownership="none">
+          <doc xml:space="preserve"
+               filename="rsvg.h"
+               line="941">%TRUE if the dimensions could be converted directly to pixels; in this case
+@out_width and @out_height will be set accordingly.  If the dimensions cannot be converted
+to pixels, returns %FALSE and puts 0.0 in both @out_width and @out_height.</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+        <parameters>
+          <instance-parameter name="handle" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="894">An #RsvgHandle</doc>
+            <type name="Handle" c:type="RsvgHandle*"/>
+          </instance-parameter>
+          <parameter name="out_width"
+                     direction="out"
+                     caller-allocates="0"
+                     transfer-ownership="full"
+                     optional="1"
+                     allow-none="1">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="895">Will be set to the computed width</doc>
+            <type name="gdouble" c:type="gdouble*"/>
+          </parameter>
+          <parameter name="out_height"
+                     direction="out"
+                     caller-allocates="0"
+                     transfer-ownership="full"
+                     optional="1"
+                     allow-none="1">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="896">Will be set to the computed height</doc>
+            <type name="gdouble" c:type="gdouble*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="get_pixbuf" c:identifier="rsvg_handle_get_pixbuf">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="619">Returns the pixbuf loaded by @handle.  The pixbuf returned will be reffed, so
+the caller of this function must assume that ref.  If insufficient data has
+been read to create the pixbuf, or an error occurred in loading, then %NULL
+will be returned.  Note that the pixbuf may not be complete until
+@rsvg_handle_close has been called.
+
+This function depends on the #RsvgHandle's DPI to compute dimensions in
+pixels, so you should call rsvg_handle_set_dpi() beforehand.</doc>
+        <source-position filename="rsvg.h" line="635"/>
+        <return-value transfer-ownership="full" nullable="1">
+          <doc xml:space="preserve"
+               filename="rsvg.h"
+               line="632">the pixbuf loaded by @handle, or %NULL.</doc>
+          <type name="GdkPixbuf.Pixbuf" c:type="GdkPixbuf*"/>
+        </return-value>
+        <parameters>
+          <instance-parameter name="handle" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="621">An #RsvgHandle</doc>
+            <type name="Handle" c:type="RsvgHandle*"/>
+          </instance-parameter>
+        </parameters>
+      </method>
+      <method name="get_pixbuf_sub"
+              c:identifier="rsvg_handle_get_pixbuf_sub"
+              version="2.14">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="637">Creates a #GdkPixbuf the same size as the entire SVG loaded into @handle, but
+only renders the sub-element that has the specified @id (and all its
+sub-sub-elements recursively).  If @id is #NULL, this function renders the
+whole SVG.
+
+This function depends on the #RsvgHandle's DPI to compute dimensions in
+pixels, so you should call rsvg_handle_set_dpi() beforehand.
+
+If you need to render an image which is only big enough to fit a particular
+sub-element of the SVG, consider using rsvg_handle_render_cairo_sub(), upon a
+surface that is just the size returned by rsvg_handle_get_dimensions_sub().
+You will need to offset the rendering by the amount returned in
+rsvg_handle_get_position_sub().
+
+Element IDs should look like an URL fragment identifier; for example, pass
+"##foo" (hash &lt;literal&gt;foo&lt;/literal&gt;) to get the geometry of the element that
+has an &lt;literal&gt;id="foo"&lt;/literal&gt; attribute.</doc>
+        <source-position filename="rsvg.h" line="668"/>
+        <return-value transfer-ownership="full" nullable="1">
+          <doc xml:space="preserve"
+               filename="rsvg.h"
+               line="662">a pixbuf, or %NULL if an error occurs
+during rendering.</doc>
+          <type name="GdkPixbuf.Pixbuf" c:type="GdkPixbuf*"/>
+        </return-value>
+        <parameters>
+          <instance-parameter name="handle" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="639">An #RsvgHandle</doc>
+            <type name="Handle" c:type="RsvgHandle*"/>
+          </instance-parameter>
+          <parameter name="id"
+                     transfer-ownership="none"
+                     nullable="1"
+                     allow-none="1">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="640">An element's id within the SVG, starting with "##" (a single
+hash character), for example, "##layer1".  This notation corresponds to a
+URL's fragment ID.  Alternatively, pass %NULL to use the whole SVG.</doc>
+            <type name="utf8" c:type="const char*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="get_position_sub"
+              c:identifier="rsvg_handle_get_position_sub"
+              version="2.22"
+              deprecated="1"
+              deprecated-version="2.46.">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="740">Get the position of a subelement of the SVG file. Do not call from within
+the size_func callback, because an infinite loop will occur.
+
+This function depends on the #RsvgHandle's DPI to compute dimensions in
+pixels, so you should call rsvg_handle_set_dpi() beforehand.
+
+Element IDs should look like an URL fragment identifier; for example, pass
+"##foo" (hash &lt;literal&gt;foo&lt;/literal&gt;) to get the geometry of the element that
+has an &lt;literal&gt;id="foo"&lt;/literal&gt; attribute.</doc>
+        <doc-deprecated xml:space="preserve">Use rsvg_handle_get_geometry_for_layer() 
instead.</doc-deprecated>
+        <source-position filename="rsvg.h" line="763"/>
+        <return-value transfer-ownership="none">
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+        <parameters>
+          <instance-parameter name="handle" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="742">A #RsvgHandle</doc>
+            <type name="Handle" c:type="RsvgHandle*"/>
+          </instance-parameter>
+          <parameter name="position_data"
+                     direction="out"
+                     caller-allocates="1"
+                     transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="743">A place to store the SVG fragment's position.</doc>
+            <type name="PositionData" c:type="RsvgPositionData*"/>
+          </parameter>
+          <parameter name="id"
+                     transfer-ownership="none"
+                     nullable="1"
+                     allow-none="1">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="744">An element's id within the SVG, starting with "##" (a single
+hash character), for example, "##layer1".  This notation corresponds to a
+URL's fragment ID.  Alternatively, pass %NULL to use the whole SVG.</doc>
+            <type name="utf8" c:type="const char*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="has_sub" c:identifier="rsvg_handle_has_sub" version="2.22">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="767">Checks whether the element @id exists in the SVG document.
+
+Element IDs should look like an URL fragment identifier; for example, pass
+"##foo" (hash &lt;literal&gt;foo&lt;/literal&gt;) to get the geometry of the element that
+has an &lt;literal&gt;id="foo"&lt;/literal&gt; attribute.</doc>
+        <source-position filename="rsvg.h" line="785"/>
+        <return-value transfer-ownership="none">
+          <doc xml:space="preserve"
+               filename="rsvg.h"
+               line="780">%TRUE if @id exists in the SVG document, %FALSE otherwise.</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+        <parameters>
+          <instance-parameter name="handle" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="769">a #RsvgHandle</doc>
+            <type name="Handle" c:type="RsvgHandle*"/>
+          </instance-parameter>
+          <parameter name="id" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="770">An element's id within the SVG, starting with "##" (a single hash
+character), for example, "##layer1".  This notation corresponds to a URL's
+fragment ID.</doc>
+            <type name="utf8" c:type="const char*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="internal_set_testing"
+              c:identifier="rsvg_handle_internal_set_testing">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="1167">Do not call this function.  This is intended for librsvg's internal
+test suite only.</doc>
+        <source-position filename="rsvg.h" line="1176"/>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+        <parameters>
+          <instance-parameter name="handle" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="1169">a #RsvgHandle</doc>
+            <type name="Handle" c:type="RsvgHandle*"/>
+          </instance-parameter>
+          <parameter name="testing" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="1170">Whether to enable testing mode</doc>
+            <type name="gboolean" c:type="gboolean"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="read_stream_sync"
+              c:identifier="rsvg_handle_read_stream_sync"
+              version="2.32"
+              throws="1">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="1017">Reads @stream and writes the data from it to @handle.
+
+Before calling this function, you may need to call rsvg_handle_set_base_uri()
+or rsvg_handle_set_base_gfile() to set the "base file" for resolving
+references to external resources.  SVG elements like
+&lt;literal&gt;&amp;lt;image&amp;gt;&lt;/literal&gt; which reference external resources will be
+resolved relative to the location you specify with those functions.
+
+If @cancellable is not %NULL, then the operation can be cancelled by
+triggering the cancellable object from another thread. If the
+operation was cancelled, the error %G_IO_ERROR_CANCELLED will be
+returned.</doc>
+        <source-position filename="rsvg.h" line="1043"/>
+        <return-value transfer-ownership="none">
+          <doc xml:space="preserve"
+               filename="rsvg.h"
+               line="1037">%TRUE if reading @stream succeeded, or %FALSE otherwise
+  with @error filled in</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+        <parameters>
+          <instance-parameter name="handle" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="1019">a #RsvgHandle</doc>
+            <type name="Handle" c:type="RsvgHandle*"/>
+          </instance-parameter>
+          <parameter name="stream" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="1020">a #GInputStream</doc>
+            <type name="Gio.InputStream" c:type="GInputStream*"/>
+          </parameter>
+          <parameter name="cancellable"
+                     transfer-ownership="none"
+                     nullable="1"
+                     allow-none="1">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="1021">a #GCancellable, or %NULL</doc>
+            <type name="Gio.Cancellable" c:type="GCancellable*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="render_cairo"
+              c:identifier="rsvg_handle_render_cairo"
+              version="2.14"
+              deprecated="1"
+              deprecated-version="2.52.">
+        <doc xml:space="preserve"
+             filename="rsvg-cairo.h"
+             line="36">Draws a loaded SVG handle to a Cairo context.  Please try to use
+rsvg_handle_render_document() instead, which allows you to pick the size
+at which the document will be rendered.
+
+Historically this function has picked a size by itself, based on the following rules:
+
+&lt;itemizedlist&gt;
+  &lt;listitem&gt;
+    If the SVG document has both &lt;literal&gt;width&lt;/literal&gt; and 
&lt;literal&gt;height&lt;/literal&gt;
+    attributes with physical units (px, in, cm, mm, pt, pc) or font-based units (em,
+    ex), the function computes the size directly based on the dots-per-inch (DPI) you
+    have configured with rsvg_handle_set_dpi().  This is the same approach as
+    rsvg_handle_get_intrinsic_size_in_pixels().
+  &lt;/listitem&gt;
+  &lt;listitem&gt;
+    Otherwise, if there is a &lt;literal&gt;viewBox&lt;/literal&gt; attribute and both
+    &lt;literal&gt;width&lt;/literal&gt; and &lt;literal&gt;height&lt;/literal&gt; are set to
+    &lt;literal&gt;100%&lt;/literal&gt; (or if they don't exist at all and thus default to 100%),
+    the function uses the width and height of the viewBox as a pixel size.  This
+    produces a rendered document with the correct aspect ratio.
+  &lt;/listitem&gt;
+  &lt;listitem&gt;
+     Otherwise, this function computes the extents of every graphical object in the SVG
+     document to find the total extents.  This is moderately expensive, but no more expensive
+     than rendering the whole document, for example.
+  &lt;/listitem&gt;
+  &lt;listitem&gt;
+    This function cannot deal with percentage-based units for &lt;literal&gt;width&lt;/literal&gt;
+    and &lt;literal&gt;height&lt;/literal&gt; because there is no viewport against which they could
+    be resolved; that is why it will compute the extents of objects in that case.  This
+    is why we recommend that you use rsvg_handle_render_document() instead, which takes
+    in a viewport and follows the sizing policy from the web platform.
+  &lt;/listitem&gt;
+&lt;/itemizedlist&gt;
+
+Drawing will occur with respect to the @cr's current transformation: for example, if
+the @cr has a rotated current transformation matrix, the whole SVG will be rotated in
+the rendered version.
+
+This function depends on the #RsvgHandle's DPI to compute dimensions in
+pixels, so you should call rsvg_handle_set_dpi() beforehand.
+
+Note that @cr must be a Cairo context that is not in an error state, that is,
+cairo_status() must return #CAIRO_STATUS_SUCCESS for it.  Cairo can set a
+context to be in an error state in various situations, for example, if it was
+passed an invalid matrix or if it was created for an invalid surface.</doc>
+        <doc-deprecated xml:space="preserve">Please use rsvg_handle_render_document() instead; that function 
lets
+you pass a viewport and obtain a good error message.</doc-deprecated>
+        <source-position filename="rsvg-cairo.h" line="95"/>
+        <return-value transfer-ownership="none">
+          <doc xml:space="preserve"
+               filename="rsvg-cairo.h"
+               line="88">%TRUE if drawing succeeded; %FALSE otherwise.</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+        <parameters>
+          <instance-parameter name="handle" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg-cairo.h"
+                 line="38">A #RsvgHandle</doc>
+            <type name="Handle" c:type="RsvgHandle*"/>
+          </instance-parameter>
+          <parameter name="cr" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg-cairo.h"
+                 line="39">A Cairo context</doc>
+            <type name="cairo.Context" c:type="cairo_t*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="render_cairo_sub"
+              c:identifier="rsvg_handle_render_cairo_sub"
+              version="2.14"
+              deprecated="1"
+              deprecated-version="2.52.">
+        <doc xml:space="preserve"
+             filename="rsvg-cairo.h"
+             line="97">Renders a single SVG element in the same place as for a whole SVG document (a "subset"
+of the document).  Please try to use rsvg_handle_render_layer() instead, which allows
+you to pick the size at which the document with the layer will be rendered.
+
+This is equivalent to rsvg_handle_render_cairo(), but it renders only a single
+element and its children, as if they composed an individual layer in the SVG.
+
+Historically this function has picked a size for the whole document by itself, based
+on the following rules:
+
+&lt;itemizedlist&gt;
+  &lt;listitem&gt;
+    If the SVG document has both &lt;literal&gt;width&lt;/literal&gt; and 
&lt;literal&gt;height&lt;/literal&gt;
+    attributes with physical units (px, in, cm, mm, pt, pc) or font-based units (em,
+    ex), the function computes the size directly based on the dots-per-inch (DPI) you
+    have configured with rsvg_handle_set_dpi().  This is the same approach as
+    rsvg_handle_get_intrinsic_size_in_pixels().
+  &lt;/listitem&gt;
+  &lt;listitem&gt;
+    Otherwise, if there is a &lt;literal&gt;viewBox&lt;/literal&gt; attribute and both
+    &lt;literal&gt;width&lt;/literal&gt; and &lt;literal&gt;height&lt;/literal&gt; are set to
+    &lt;literal&gt;100%&lt;/literal&gt; (or if they don't exist at all and thus default to 100%),
+    the function uses the width and height of the viewBox as a pixel size.  This
+    produces a rendered document with the correct aspect ratio.
+  &lt;/listitem&gt;
+  &lt;listitem&gt;
+    Otherwise, this function computes the extents of every graphical object in the SVG
+    document to find the total extents.  This is moderately expensive, but no more expensive
+    than rendering the whole document, for example.
+  &lt;/listitem&gt;
+  &lt;listitem&gt;
+    This function cannot deal with percentage-based units for &lt;literal&gt;width&lt;/literal&gt;
+    and &lt;literal&gt;height&lt;/literal&gt; because there is no viewport against which they could
+    be resolved; that is why it will compute the extents of objects in that case.  This
+    is why we recommend that you use rsvg_handle_render_layer() instead, which takes
+    in a viewport and follows the sizing policy from the web platform.
+  &lt;/listitem&gt;
+&lt;/itemizedlist&gt;
+
+Drawing will occur with respect to the @cr's current transformation: for example, if
+the @cr has a rotated current transformation matrix, the whole SVG will be rotated in
+the rendered version.
+
+This function depends on the #RsvgHandle's DPI to compute dimensions in
+pixels, so you should call rsvg_handle_set_dpi() beforehand.
+
+Note that @cr must be a Cairo context that is not in an error state, that is,
+cairo_status() must return #CAIRO_STATUS_SUCCESS for it.  Cairo can set a
+context to be in an error state in various situations, for example, if it was
+passed an invalid matrix or if it was created for an invalid surface.
+
+Element IDs should look like an URL fragment identifier; for example, pass
+"##foo" (hash &lt;literal&gt;foo&lt;/literal&gt;) to get the geometry of the element that
+has an &lt;literal&gt;id="foo"&lt;/literal&gt; attribute.</doc>
+        <doc-deprecated xml:space="preserve">Please use rsvg_handle_render_layer() instead; that function 
lets
+you pass a viewport and obtain a good error message.</doc-deprecated>
+        <source-position filename="rsvg-cairo.h" line="167"/>
+        <return-value transfer-ownership="none">
+          <doc xml:space="preserve"
+               filename="rsvg-cairo.h"
+               line="160">%TRUE if drawing succeeded; %FALSE otherwise.</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+        <parameters>
+          <instance-parameter name="handle" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg-cairo.h"
+                 line="99">A #RsvgHandle</doc>
+            <type name="Handle" c:type="RsvgHandle*"/>
+          </instance-parameter>
+          <parameter name="cr" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg-cairo.h"
+                 line="100">A Cairo context</doc>
+            <type name="cairo.Context" c:type="cairo_t*"/>
+          </parameter>
+          <parameter name="id"
+                     transfer-ownership="none"
+                     nullable="1"
+                     allow-none="1">
+            <doc xml:space="preserve"
+                 filename="rsvg-cairo.h"
+                 line="101">An element's id within the SVG, starting with "##" (a single
+hash character), for example, "##layer1".  This notation corresponds to a
+URL's fragment ID.  Alternatively, pass %NULL to render the whole SVG.</doc>
+            <type name="utf8" c:type="const char*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="render_document"
+              c:identifier="rsvg_handle_render_document"
+              version="2.46"
+              throws="1">
+        <doc xml:space="preserve"
+             filename="rsvg-cairo.h"
+             line="169">Renders the whole SVG document fitted to a viewport.
+
+The @viewport gives the position and size at which the whole SVG document will be
+rendered.  The document is scaled proportionally to fit into this viewport.
+
+The @cr must be in a #CAIRO_STATUS_SUCCESS state, or this function will not
+render anything, and instead will return an error.
+
+API ordering: This function must be called on a fully-loaded @handle.  See
+the section &lt;ulink url="#API-ordering"&gt;API ordering&lt;/ulink&gt; for details.
+
+Panics: this function will panic if the @handle is not fully-loaded.</doc>
+        <source-position filename="rsvg-cairo.h" line="192"/>
+        <return-value transfer-ownership="none">
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+        <parameters>
+          <instance-parameter name="handle" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg-cairo.h"
+                 line="171">An #RsvgHandle</doc>
+            <type name="Handle" c:type="RsvgHandle*"/>
+          </instance-parameter>
+          <parameter name="cr" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg-cairo.h"
+                 line="172">A Cairo context</doc>
+            <type name="cairo.Context" c:type="cairo_t*"/>
+          </parameter>
+          <parameter name="viewport" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg-cairo.h"
+                 line="173">Viewport size at which the whole SVG would be fitted.</doc>
+            <type name="Rectangle" c:type="const RsvgRectangle*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="render_element"
+              c:identifier="rsvg_handle_render_element"
+              version="2.46"
+              throws="1">
+        <doc xml:space="preserve"
+             filename="rsvg-cairo.h"
+             line="346">Renders a single SVG element to a given viewport
+
+This function can be used to extract individual element subtrees and render them,
+scaled to a given @element_viewport.  This is useful for applications which have
+reusable objects in an SVG and want to render them individually; for example, an
+SVG full of icons that are meant to be be rendered independently of each other.
+
+Element IDs should look like an URL fragment identifier; for example, pass
+"##foo" (hash &lt;literal&gt;foo&lt;/literal&gt;) to get the geometry of the element that
+has an &lt;literal&gt;id="foo"&lt;/literal&gt; attribute.
+
+You can pass #NULL for the @id if you want to render all
+the elements in the SVG, i.e. to render everything from the
+root element.
+
+The `element_viewport` gives the position and size at which the named element will
+be rendered.  FIXME: mention proportional scaling.
+
+API ordering: This function must be called on a fully-loaded @handle.  See
+the section &lt;ulink url="#API-ordering"&gt;API ordering&lt;/ulink&gt; for details.
+
+Panics: this function will panic if the @handle is not fully-loaded.</doc>
+        <source-position filename="rsvg-cairo.h" line="382"/>
+        <return-value transfer-ownership="none">
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+        <parameters>
+          <instance-parameter name="handle" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg-cairo.h"
+                 line="348">An #RsvgHandle</doc>
+            <type name="Handle" c:type="RsvgHandle*"/>
+          </instance-parameter>
+          <parameter name="cr" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg-cairo.h"
+                 line="349">A Cairo context</doc>
+            <type name="cairo.Context" c:type="cairo_t*"/>
+          </parameter>
+          <parameter name="id"
+                     transfer-ownership="none"
+                     nullable="1"
+                     allow-none="1">
+            <doc xml:space="preserve"
+                 filename="rsvg-cairo.h"
+                 line="350">An element's id within the SVG, starting with "##" (a single
+hash character), for example, "##layer1".  This notation corresponds to a
+URL's fragment ID.  Alternatively, pass %NULL to render the whole SVG document tree.</doc>
+            <type name="utf8" c:type="const char*"/>
+          </parameter>
+          <parameter name="element_viewport" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg-cairo.h"
+                 line="353">Viewport size in which to fit the element</doc>
+            <type name="Rectangle" c:type="const RsvgRectangle*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="render_layer"
+              c:identifier="rsvg_handle_render_layer"
+              version="2.46"
+              throws="1">
+        <doc xml:space="preserve"
+             filename="rsvg-cairo.h"
+             line="247">Renders a single SVG element in the same place as for a whole SVG document.
+
+The @viewport gives the position and size at which the whole SVG document would be
+rendered.  The document is scaled proportionally to fit into this viewport; hence the
+individual layer may be smaller than this.
+
+This is equivalent to rsvg_handle_render_document(), but it renders only a
+single element and its children, as if they composed an individual layer in
+the SVG.  The element is rendered with the same transformation matrix as it
+has within the whole SVG document.  Applications can use this to re-render a
+single element and repaint it on top of a previously-rendered document, for
+example.
+
+Element IDs should look like an URL fragment identifier; for example, pass
+"##foo" (hash &lt;literal&gt;foo&lt;/literal&gt;) to get the geometry of the element that
+has an &lt;literal&gt;id="foo"&lt;/literal&gt; attribute.
+
+You can pass #NULL for the @id if you want to render all
+the elements in the SVG, i.e. to render everything from the
+root element.
+
+API ordering: This function must be called on a fully-loaded @handle.  See
+the section &lt;ulink url="#API-ordering"&gt;API ordering&lt;/ulink&gt; for details.
+
+Panics: this function will panic if the @handle is not fully-loaded.</doc>
+        <source-position filename="rsvg-cairo.h" line="286"/>
+        <return-value transfer-ownership="none">
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+        <parameters>
+          <instance-parameter name="handle" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg-cairo.h"
+                 line="249">An #RsvgHandle</doc>
+            <type name="Handle" c:type="RsvgHandle*"/>
+          </instance-parameter>
+          <parameter name="cr" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg-cairo.h"
+                 line="250">A Cairo context</doc>
+            <type name="cairo.Context" c:type="cairo_t*"/>
+          </parameter>
+          <parameter name="id"
+                     transfer-ownership="none"
+                     nullable="1"
+                     allow-none="1">
+            <doc xml:space="preserve"
+                 filename="rsvg-cairo.h"
+                 line="251">An element's id within the SVG, starting with "##" (a single
+hash character), for example, "##layer1".  This notation corresponds to a
+URL's fragment ID.  Alternatively, pass %NULL to render the whole SVG document tree.</doc>
+            <type name="utf8" c:type="const char*"/>
+          </parameter>
+          <parameter name="viewport" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg-cairo.h"
+                 line="254">Viewport size at which the whole SVG would be fitted.</doc>
+            <type name="Rectangle" c:type="const RsvgRectangle*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="set_base_gfile"
+              c:identifier="rsvg_handle_set_base_gfile"
+              version="2.32">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="1001">Set the base URI for @handle from @file.
+
+Note: This function may only be called before rsvg_handle_write() or
+rsvg_handle_read_stream_sync() have been called.</doc>
+        <source-position filename="rsvg.h" line="1014"/>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+        <parameters>
+          <instance-parameter name="handle" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="1003">a #RsvgHandle</doc>
+            <type name="Handle" c:type="RsvgHandle*"/>
+          </instance-parameter>
+          <parameter name="base_file" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="1004">a #GFile</doc>
+            <type name="Gio.File" c:type="GFile*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="set_base_uri"
+              c:identifier="rsvg_handle_set_base_uri"
+              version="2.9">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="682">Set the base URI for this SVG.
+
+Note: This function may only be called before rsvg_handle_write() or
+rsvg_handle_read_stream_sync() have been called.</doc>
+        <source-position filename="rsvg.h" line="695"/>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+        <parameters>
+          <instance-parameter name="handle" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="684">A #RsvgHandle</doc>
+            <type name="Handle" c:type="RsvgHandle*"/>
+          </instance-parameter>
+          <parameter name="base_uri" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="685">The base uri</doc>
+            <type name="utf8" c:type="const char*"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="set_dpi" c:identifier="rsvg_handle_set_dpi" version="2.8">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="506">Sets the DPI at which the @handle will be rendered. Common values are
+75, 90, and 300 DPI.
+
+Passing a number &lt;= 0 to @dpi will reset the DPI to whatever the default
+value happens to be, but since rsvg_set_default_dpi() is deprecated, please
+do not pass values &lt;= 0 to this function.</doc>
+        <source-position filename="rsvg.h" line="521"/>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+        <parameters>
+          <instance-parameter name="handle" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="508">An #RsvgHandle</doc>
+            <type name="Handle" c:type="RsvgHandle*"/>
+          </instance-parameter>
+          <parameter name="dpi" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="509">Dots Per Inch (i.e. as Pixels Per Inch)</doc>
+            <type name="gdouble" c:type="double"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="set_dpi_x_y"
+              c:identifier="rsvg_handle_set_dpi_x_y"
+              version="2.8">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="523">Sets the DPI at which the @handle will be rendered. Common values are
+75, 90, and 300 DPI.
+
+Passing a number &lt;= 0 to @dpi will reset the DPI to whatever the default
+value happens to be, but since rsvg_set_default_dpi_x_y() is deprecated,
+please do not pass values &lt;= 0 to this function.</doc>
+        <source-position filename="rsvg.h" line="539"/>
+        <return-value transfer-ownership="none">
+          <type name="none" c:type="void"/>
+        </return-value>
+        <parameters>
+          <instance-parameter name="handle" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="525">An #RsvgHandle</doc>
+            <type name="Handle" c:type="RsvgHandle*"/>
+          </instance-parameter>
+          <parameter name="dpi_x" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="526">Dots Per Inch (i.e. Pixels Per Inch)</doc>
+            <type name="gdouble" c:type="double"/>
+          </parameter>
+          <parameter name="dpi_y" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="527">Dots Per Inch (i.e. Pixels Per Inch)</doc>
+            <type name="gdouble" c:type="double"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="set_stylesheet"
+              c:identifier="rsvg_handle_set_stylesheet"
+              version="2.48"
+              throws="1">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="1139">Sets a CSS stylesheet to use for an SVG document.
+
+The @css_len argument is mandatory; this function will not compute the length
+of the @css string.  This is because a provided stylesheet, which the calling
+program could read from a file, can have nul characters in it.
+
+During the CSS cascade, the specified stylesheet will be used with a "User"
+&lt;ulink
+url="https://drafts.csswg.org/css-cascade-3/#cascading-origins"&gt;origin&lt;/ulink&gt;.
+
+Note that `@import` rules will not be resolved, except for `data:` URLs.</doc>
+        <source-position filename="rsvg.h" line="1161"/>
+        <return-value transfer-ownership="none">
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+        <parameters>
+          <instance-parameter name="handle" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="1141">A #RsvgHandle.</doc>
+            <type name="Handle" c:type="RsvgHandle*"/>
+          </instance-parameter>
+          <parameter name="css" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="1142">String with CSS data; must be valid UTF-8.</doc>
+            <array length="1" zero-terminated="0" c:type="const guint8*">
+              <type name="guint8" c:type="guint8"/>
+            </array>
+          </parameter>
+          <parameter name="css_len" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="1143">Length of the @css data in bytes.</doc>
+            <type name="gsize" c:type="gsize"/>
+          </parameter>
+        </parameters>
+      </method>
+      <method name="write"
+              c:identifier="rsvg_handle_write"
+              deprecated="1"
+              deprecated-version="2.46."
+              throws="1">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="570">Loads the next @count bytes of the image.
+
+Before calling this function for the first time, you may need to call
+rsvg_handle_set_base_uri() or rsvg_handle_set_base_gfile() to set the "base
+file" for resolving references to external resources.  SVG elements like
+&lt;literal&gt;&amp;lt;image&amp;gt;&lt;/literal&gt; which reference external resources will be
+resolved relative to the location you specify with those functions.</doc>
+        <doc-deprecated xml:space="preserve">Use rsvg_handle_read_stream_sync() or the constructor
+functions rsvg_handle_new_from_gfile_sync() or
+rsvg_handle_new_from_stream_sync().  This function is deprecated because it
+will accumulate data from the @buf in memory until rsvg_handle_close() gets
+called.  To avoid a big temporary buffer, use the suggested functions, which
+take a #GFile or a #GInputStream and do not require a temporary buffer.</doc-deprecated>
+        <source-position filename="rsvg.h" line="595"/>
+        <return-value transfer-ownership="none">
+          <doc xml:space="preserve"
+               filename="rsvg.h"
+               line="585">%TRUE on success, or %FALSE on error.</doc>
+          <type name="gboolean" c:type="gboolean"/>
+        </return-value>
+        <parameters>
+          <instance-parameter name="handle" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="572">an #RsvgHandle</doc>
+            <type name="Handle" c:type="RsvgHandle*"/>
+          </instance-parameter>
+          <parameter name="buf" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="573">pointer to svg data</doc>
+            <array length="1" zero-terminated="0" c:type="const guchar*">
+              <type name="guint8"/>
+            </array>
+          </parameter>
+          <parameter name="count" transfer-ownership="none">
+            <doc xml:space="preserve"
+                 filename="rsvg.h"
+                 line="574">length of the @buf buffer in bytes</doc>
+            <type name="gsize" c:type="gsize"/>
+          </parameter>
+        </parameters>
+      </method>
+      <property name="base-uri"
+                writable="1"
+                construct="1"
+                transfer-ownership="none">
+        <type name="utf8" c:type="gchar*"/>
+      </property>
+      <property name="desc"
+                deprecated="1"
+                deprecated-version="2.36."
+                transfer-ownership="none">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="349">SVG's description.</doc>
+        <doc-deprecated xml:space="preserve">Reading this property always returns #NULL.</doc-deprecated>
+        <type name="utf8" c:type="gchar*"/>
+      </property>
+      <property name="dpi-x"
+                writable="1"
+                construct="1"
+                transfer-ownership="none">
+        <type name="gdouble" c:type="gdouble"/>
+      </property>
+      <property name="dpi-y"
+                writable="1"
+                construct="1"
+                transfer-ownership="none">
+        <type name="gdouble" c:type="gdouble"/>
+      </property>
+      <property name="em"
+                deprecated="1"
+                deprecated-version="2.46."
+                transfer-ownership="none">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="317">Exact width, in pixels, of the rendered SVG before calling the size callback
+as specified by rsvg_handle_set_size_callback().</doc>
+        <doc-deprecated xml:space="preserve">Reading each of the size properties causes the size of the
+SVG to be recomputed, so reading both the &lt;literal&gt;em&lt;/literal&gt; and
+&lt;literal&gt;ex&lt;/literal&gt; properties will cause two such computations.  Please
+use rsvg_handle_get_intrinsic_dimensions() instead.</doc-deprecated>
+        <type name="gdouble" c:type="gdouble"/>
+      </property>
+      <property name="ex"
+                deprecated="1"
+                deprecated-version="2.46."
+                transfer-ownership="none">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="329">Exact height, in pixels, of the rendered SVG before calling the size callback
+as specified by rsvg_handle_set_size_callback().</doc>
+        <doc-deprecated xml:space="preserve">Reading each of the size properties causes the size of the
+SVG to be recomputed, so reading both the &lt;literal&gt;em&lt;/literal&gt; and
+&lt;literal&gt;ex&lt;/literal&gt; properties will cause two such computations.  Please
+use rsvg_handle_get_intrinsic_dimensions() instead.</doc-deprecated>
+        <type name="gdouble" c:type="gdouble"/>
+      </property>
+      <property name="flags"
+                version="2.36"
+                writable="1"
+                construct-only="1"
+                transfer-ownership="none">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="263">Flags from #RsvgHandleFlags.</doc>
+        <type name="HandleFlags"/>
+      </property>
+      <property name="height"
+                deprecated="1"
+                deprecated-version="2.46."
+                transfer-ownership="none">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="303">Height, in pixels, of the rendered SVG after calling the size callback
+as specified by rsvg_handle_set_size_callback().</doc>
+        <doc-deprecated xml:space="preserve">For historical reasons, this property is of integer type,
+which cannot give the exact size of SVG images that are not pixel-aligned.
+Moreover, reading each of the size properties causes the size of the SVG to
+be recomputed, so reading both the &lt;literal&gt;width&lt;/literal&gt; and
+&lt;literal&gt;height&lt;/literal&gt; properties will cause two such computations.
+Please use rsvg_handle_get_intrinsic_dimensions() instead.</doc-deprecated>
+        <type name="gint" c:type="gint"/>
+      </property>
+      <property name="metadata"
+                deprecated="1"
+                deprecated-version="2.36."
+                transfer-ownership="none">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="357">SVG's metadata</doc>
+        <doc-deprecated xml:space="preserve">Reading this property always returns #NULL.</doc-deprecated>
+        <type name="utf8" c:type="gchar*"/>
+      </property>
+      <property name="title"
+                deprecated="1"
+                deprecated-version="2.36."
+                transfer-ownership="none">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="341">SVG's title.</doc>
+        <doc-deprecated xml:space="preserve">Reading this property always returns #NULL.</doc-deprecated>
+        <type name="utf8" c:type="gchar*"/>
+      </property>
+      <property name="width"
+                deprecated="1"
+                deprecated-version="2.46."
+                transfer-ownership="none">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="289">Width, in pixels, of the rendered SVG after calling the size callback
+as specified by rsvg_handle_set_size_callback().</doc>
+        <doc-deprecated xml:space="preserve">For historical reasons, this property is of integer type,
+which cannot give the exact size of SVG images that are not pixel-aligned.
+Moreover, reading each of the size properties causes the size of the SVG to
+be recomputed, so reading both the &lt;literal&gt;width&lt;/literal&gt; and
+&lt;literal&gt;height&lt;/literal&gt; properties will cause two such computations.
+Please use rsvg_handle_get_intrinsic_dimensions() instead.</doc-deprecated>
+        <type name="gint" c:type="gint"/>
+      </property>
+      <field name="parent">
+        <type name="GObject.Object" c:type="GObject"/>
+      </field>
+      <field name="_abi_padding" readable="0" private="1">
+        <array zero-terminated="0" fixed-size="16">
+          <type name="gpointer" c:type="gpointer"/>
+        </array>
+      </field>
+    </class>
+    <record name="HandleClass"
+            c:type="RsvgHandleClass"
+            glib:is-gtype-struct-for="Handle">
+      <doc xml:space="preserve"
+           filename="rsvg.h"
+           line="383">Class structure for #RsvgHandle.</doc>
+      <source-position filename="rsvg.h" line="394"/>
+      <field name="parent">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="385">parent class</doc>
+        <type name="GObject.ObjectClass" c:type="GObjectClass"/>
+      </field>
+      <field name="_abi_padding" readable="0" private="1">
+        <array zero-terminated="0" fixed-size="15">
+          <type name="gpointer" c:type="gpointer"/>
+        </array>
+      </field>
+    </record>
+    <bitfield name="HandleFlags"
+              glib:type-name="RsvgHandleFlags"
+              glib:get-type="rsvg_handle_flags_get_type"
+              c:type="RsvgHandleFlags">
+      <member name="flags_none"
+              value="0"
+              c:identifier="RSVG_HANDLE_FLAGS_NONE"
+              glib:nick="flags-none">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="956">No flags are set.</doc>
+      </member>
+      <member name="flag_unlimited"
+              value="1"
+              c:identifier="RSVG_HANDLE_FLAG_UNLIMITED"
+              glib:nick="flag-unlimited">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="957">Disable safety limits in the XML parser.
+  Libxml2 has &lt;ulink
+  url="https://gitlab.gnome.org/GNOME/libxml2/blob/master/include/libxml/parserInternals.h"&gt;several
+  limits&lt;/ulink&gt; designed to keep malicious XML content from consuming too
+  much memory while parsing.  For security reasons, this should only be used
+  for trusted input!
+  Since: 2.40.3</doc>
+      </member>
+      <member name="flag_keep_image_data"
+              value="2"
+              c:identifier="RSVG_HANDLE_FLAG_KEEP_IMAGE_DATA"
+              glib:nick="flag-keep-image-data">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="964">Use this if the Cairo surface to which you
+ are rendering is a PDF, PostScript, SVG, or Win32 Printing surface.  This
+ will make librsvg and Cairo use the original, compressed data for images in
+ the final output, instead of passing uncompressed images.  This will make a
+ Keeps the image data when loading images, for use by cairo when painting to
+ e.g. a PDF surface.  For example, this will make the a resulting PDF file
+ smaller and faster.  Please see &lt;ulink
+ url="https://www.cairographics.org/manual/cairo-cairo-surface-t.html#cairo-surface-set-mime-data"&gt;the
+ Cairo documentation&lt;/ulink&gt; for details.
+ Since: 2.40.3</doc>
+      </member>
+    </bitfield>
+    <function-macro name="IS_HANDLE"
+                    c:identifier="RSVG_IS_HANDLE"
+                    introspectable="0">
+      <source-position filename="rsvg.h" line="370"/>
+      <parameters>
+        <parameter name="obj">
+        </parameter>
+      </parameters>
+    </function-macro>
+    <function-macro name="IS_HANDLE_CLASS"
+                    c:identifier="RSVG_IS_HANDLE_CLASS"
+                    introspectable="0">
+      <source-position filename="rsvg.h" line="371"/>
+      <parameters>
+        <parameter name="klass">
+        </parameter>
+      </parameters>
+    </function-macro>
+    <record name="Length" c:type="RsvgLength">
+      <doc xml:space="preserve"
+           filename="rsvg.h"
+           line="815">#RsvgLength values are used in rsvg_handle_get_intrinsic_dimensions(), for
+example, to return the CSS length values of the &lt;literal&gt;width&lt;/literal&gt; and
+&lt;literal&gt;height&lt;/literal&gt; attributes of an &lt;literal&gt;&amp;lt;svg&amp;gt;&lt;/literal&gt;
+element.
+
+This is equivalent to &lt;ulink
+url="https://www.w3.org/TR/CSS21/syndata.html#length-units"&gt;CSS lengths&lt;/ulink&gt;.
+
+It is up to the calling application to convert lengths in non-pixel units
+(i.e. those where the @unit field is not #RSVG_UNIT_PX) into something
+meaningful to the application.  For example, if your application knows the
+dots-per-inch (DPI) it is using, it can convert lengths with @unit in
+#RSVG_UNIT_IN or other physical units.</doc>
+      <source-position filename="rsvg.h" line="837"/>
+      <field name="length" writable="1">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="817">numeric part of the length</doc>
+        <type name="gdouble" c:type="double"/>
+      </field>
+      <field name="unit" writable="1">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="818">unit part of the length</doc>
+        <type name="Unit" c:type="RsvgUnit"/>
+      </field>
+    </record>
+    <constant name="MAJOR_VERSION" value="2" c:type="LIBRSVG_MAJOR_VERSION">
+      <doc xml:space="preserve"
+           filename="rsvg-features.h"
+           line="25">This is a C macro that expands to a number with the major version
+of librsvg against which your program is compiled.
+
+For example, for librsvg-2.3.4, the major version is 2.
+
+C programs can use this as a compile-time check for the required
+version, but note that generally it is a better idea to do
+compile-time checks by calling &lt;ulink
+url="https://www.freedesktop.org/wiki/Software/pkg-config/"&gt;pkg-config&lt;/ulink&gt;
+in your build scripts.
+
+Note: for a run-time check on the version of librsvg that your
+program is running with (e.g. the version which the linker used for
+your program), or for programs not written in C, use
+@rsvg_major_version instead.</doc>
+      <source-position filename="rsvg-version.h" line="8"/>
+      <type name="gint" c:type="gint"/>
+    </constant>
+    <constant name="MICRO_VERSION" value="0" c:type="LIBRSVG_MICRO_VERSION">
+      <doc xml:space="preserve"
+           filename="rsvg-features.h"
+           line="65">This is a C macro that expands to a number with the micro version
+of librsvg against which your program is compiled.
+
+For example, for librsvg-2.3.4, the micro version is 4.
+
+C programs can use this as a compile-time check for the required
+version, but note that generally it is a better idea to do
+compile-time checks by calling &lt;ulink
+url="https://www.freedesktop.org/wiki/Software/pkg-config/"&gt;pkg-config&lt;/ulink&gt;
+in your build scripts.
+
+Note: for a run-time check on the version of librsvg that your
+program is running with (e.g. the version which the linker used for
+your program), or for programs not written in C, use
+@rsvg_micro_version instead.</doc>
+      <source-position filename="rsvg-version.h" line="10"/>
+      <type name="gint" c:type="gint"/>
+    </constant>
+    <constant name="MINOR_VERSION" value="51" c:type="LIBRSVG_MINOR_VERSION">
+      <doc xml:space="preserve"
+           filename="rsvg-features.h"
+           line="45">This is a C macro that expands to a number with the minor version
+of librsvg against which your program is compiled.
+
+For example, for librsvg-2.3.4, the minor version is 3.
+
+C programs can use this as a compile-time check for the required
+version, but note that generally it is a better idea to do
+compile-time checks by calling &lt;ulink
+url="https://www.freedesktop.org/wiki/Software/pkg-config/"&gt;pkg-config&lt;/ulink&gt;
+in your build scripts.
+
+Note: for a run-time check on the version of librsvg that your
+program is running with (e.g. the version which the linker used for
+your program), or for programs not written in C, use
+@rsvg_minor_version instead.</doc>
+      <source-position filename="rsvg-version.h" line="9"/>
+      <type name="gint" c:type="gint"/>
+    </constant>
+    <record name="PositionData"
+            c:type="RsvgPositionData"
+            deprecated="1"
+            deprecated-version="2.46.">
+      <doc xml:space="preserve"
+           filename="rsvg.h"
+           line="429">Position of an SVG fragment from rsvg_handle_get_position_sub().  Please
+the deprecation documentation for that function.</doc>
+      <doc-deprecated xml:space="preserve">FIXME: point to deprecation documentation.</doc-deprecated>
+      <source-position filename="rsvg.h" line="442"/>
+      <field name="x" writable="1">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="431">position on the x axis</doc>
+        <type name="gint" c:type="int"/>
+      </field>
+      <field name="y" writable="1">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="432">position on the y axis</doc>
+        <type name="gint" c:type="int"/>
+      </field>
+    </record>
+    <record name="Rectangle" c:type="RsvgRectangle" version="2.46">
+      <doc xml:space="preserve"
+           filename="rsvg.h"
+           line="444">A data structure for holding a rectangle.</doc>
+      <source-position filename="rsvg.h" line="460"/>
+      <field name="x" writable="1">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="446">X coordinate of the left side of the rectangle</doc>
+        <type name="gdouble" c:type="double"/>
+      </field>
+      <field name="y" writable="1">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="447">Y coordinate of the the top side of the rectangle</doc>
+        <type name="gdouble" c:type="double"/>
+      </field>
+      <field name="width" writable="1">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="448">width of the rectangle</doc>
+        <type name="gdouble" c:type="double"/>
+      </field>
+      <field name="height" writable="1">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="449">height of the rectangle</doc>
+        <type name="gdouble" c:type="double"/>
+      </field>
+    </record>
+    <enumeration name="Unit" c:type="RsvgUnit">
+      <doc xml:space="preserve"
+           filename="rsvg.h"
+           line="787">Units for the #RsvgLength struct.  These have the same meaning as &lt;ulink
+url="https://www.w3.org/TR/CSS21/syndata.html#length-units"&gt;CSS length
+units&lt;/ulink&gt;.</doc>
+      <source-position filename="rsvg.h" line="813"/>
+      <member name="percent" value="0" c:identifier="RSVG_UNIT_PERCENT">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="789">percentage values; where &lt;literal&gt;1.0&lt;/literal&gt; means 100%.</doc>
+      </member>
+      <member name="px" value="1" c:identifier="RSVG_UNIT_PX">
+        <doc xml:space="preserve" filename="rsvg.h" line="790">pixels</doc>
+      </member>
+      <member name="em" value="2" c:identifier="RSVG_UNIT_EM">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="791">em, or the current font size</doc>
+      </member>
+      <member name="ex" value="3" c:identifier="RSVG_UNIT_EX">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="792">x-height of the current font</doc>
+      </member>
+      <member name="in" value="4" c:identifier="RSVG_UNIT_IN">
+        <doc xml:space="preserve" filename="rsvg.h" line="793">inches</doc>
+      </member>
+      <member name="cm" value="5" c:identifier="RSVG_UNIT_CM">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="794">centimeters</doc>
+      </member>
+      <member name="mm" value="6" c:identifier="RSVG_UNIT_MM">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="795">millimeters</doc>
+      </member>
+      <member name="pt" value="7" c:identifier="RSVG_UNIT_PT">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="796">points, or 1/72 inch</doc>
+      </member>
+      <member name="pc" value="8" c:identifier="RSVG_UNIT_PC">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="797">picas, or 1/6 inch (12 points)</doc>
+      </member>
+    </enumeration>
+    <constant name="VERSION" value="2.51.0" c:type="LIBRSVG_VERSION">
+      <doc xml:space="preserve"
+           filename="rsvg-features.h"
+           line="85">This is a C macro that expands to a string with the version of
+librsvg against which your program is compiled.
+
+For example, for librsvg-2.3.4, this macro expands to
+&lt;literal&gt;"2.3.4"&lt;/literal&gt;.
+
+C programs can use this as a compile-time check for the required
+version, but note that generally it is a better idea to do
+compile-time checks by calling &lt;ulink
+url="https://www.freedesktop.org/wiki/Software/pkg-config/"&gt;pkg-config&lt;/ulink&gt;
+in your build scripts.
+
+Note: for a run-time check on the version of librsvg that your
+program is running with (e.g. the version which the linker used for
+your program), or for programs not written in C, use
+@rsvg_version instead.</doc>
+      <source-position filename="rsvg-version.h" line="11"/>
+      <type name="utf8" c:type="gchar*"/>
+    </constant>
+    <function name="cleanup"
+              c:identifier="rsvg_cleanup"
+              version="2.36"
+              deprecated="1"
+              deprecated-version="2.46">
+      <doc-deprecated xml:space="preserve">No-op. This function should not be called from normal 
programs.</doc-deprecated>
+      <source-position filename="rsvg.h" line="469"/>
+      <return-value transfer-ownership="none">
+        <type name="none" c:type="void"/>
+      </return-value>
+    </function>
+    <function name="error_quark"
+              c:identifier="rsvg_error_quark"
+              moved-to="Error.quark">
+      <doc xml:space="preserve"
+           filename="rsvg.h"
+           line="67">The error domain for RSVG</doc>
+      <return-value transfer-ownership="none">
+        <doc xml:space="preserve"
+             filename="rsvg.h"
+             line="72">The error domain</doc>
+        <type name="GLib.Quark" c:type="GQuark"/>
+      </return-value>
+    </function>
+    <docsection name="rsvg-features">
+      <doc xml:space="preserve"
+           filename="rsvg-features.h"
+           line="8">Librsvg provides a few C macros that C and C++ programs can use to
+check the version being used at compile-time, that is, the API that
+the program expects to have.  This is useful for programs that need
+to conditionally compile code with &lt;literal&gt;#ifdef&lt;/literal&gt; blocks
+depending on the version of librsvg that may be available during
+compilation.
+
+Librsvg also provides a few global constants that can be used to
+check the version of librsvg being used at run-time.  This is
+useful to know which version of librsvg is actually being used on
+the system where the program is running.</doc>
+    </docsection>
+    <docsection name="rsvg-handle">
+      <doc xml:space="preserve"
+           filename="rsvg.h"
+           line="81">This is the main entry point into the librsvg library.  An RsvgHandle is an
+object that represents SVG data in memory.  Your program creates an
+RsvgHandle from an SVG file, or from a memory buffer that contains SVG data,
+or in the most general form, from a #GInputStream that will provide SVG data.
+
+Librsvg can load SVG images and render them to Cairo surfaces,
+using a mixture of SVG's [static mode] and [secure static mode].
+Librsvg does not do animation nor scripting, and can load
+references to external data only in some situations; see below.
+
+Librsvg supports reading &lt;ulink
+url="https://www.w3.org/TR/SVG11/"&gt;SVG 1.1&lt;/ulink&gt; data, and is
+gradually adding support for features in &lt;ulink
+url="https://www.w3.org/TR/SVG2/"&gt;SVG 2&lt;/ulink&gt;.  Librsvg also supports
+SVGZ files, which are just an SVG stream compressed with the GZIP algorithm.
+
+# The "base file" and resolving references to external files
+
+When you load an SVG, librsvg needs to know the location of the "base file"
+for it.  This is so that librsvg can determine the location of referenced
+entities.  For example, say you have an SVG in &lt;filename&gt;/foo/bar/foo.svg&lt;/filename&gt;
+and that it has an image element like this:
+
+|[
+&lt;image href="resources/foo.png" .../&gt;
+]|
+
+In this case, librsvg needs to know the location of the toplevel
+&lt;filename&gt;/foo/bar/foo.svg&lt;/filename&gt; so that it can generate the appropriate
+reference to &lt;filename&gt;/foo/bar/resources/foo.png&lt;/filename&gt;.
+
+## Security and locations of referenced files
+
+When processing an SVG, librsvg will only load referenced files if they are
+in the same directory as the base file, or in a subdirectory of it.  That is,
+if the base file is &lt;filename&gt;/foo/bar/baz.svg&lt;/filename&gt;, then librsvg will
+only try to load referenced files (from SVG's
+&lt;literal&gt;&amp;lt;image&amp;gt;&lt;/literal&gt; element, for example, or from content
+included through XML entities) if those files are in &lt;filename&gt;/foo/bar/&lt;!--
+--&gt;*&lt;/filename&gt; or in &lt;filename&gt;/foo/bar/&lt;!-- --&gt;*&lt;!-- --&gt;/.../&lt;!--
+--&gt;*&lt;/filename&gt;.  This is so that malicious SVG files cannot include files
+that are in a directory above.
+
+The full set of rules for deciding which URLs may be loaded is as follows;
+they are applied in order.  A referenced URL will not be loaded as soon as
+one of these rules fails:
+
+&lt;orderedlist&gt;
+  &lt;listitem&gt;
+    All &lt;literal&gt;data:&lt;/literal&gt; URLs may be loaded.  These are sometimes used
+    to include raster image data, encoded as base-64, directly in an SVG file.
+  &lt;/listitem&gt;
+
+  &lt;listitem&gt;
+    All other URL schemes in references require a base URL.  For
+    example, this means that if you load an SVG with
+    rsvg_handle_new_from_data() without calling rsvg_handle_set_base_uri(),
+    then any referenced files will not be allowed (e.g. raster images to be
+    loaded from other files will not work).
+  &lt;/listitem&gt;
+
+  &lt;listitem&gt;
+    If referenced URLs are absolute, rather than relative, then they must
+    have the same scheme as the base URL.  For example, if the base URL has a
+    "&lt;literal&gt;file&lt;/literal&gt;" scheme, then all URL references inside the SVG must
+    also have the "&lt;literal&gt;file&lt;/literal&gt;" scheme, or be relative references which
+    will be resolved against the base URL.
+  &lt;/listitem&gt;
+
+  &lt;listitem&gt;
+    If referenced URLs have a "&lt;literal&gt;resource&lt;/literal&gt;" scheme, that is,
+    if they are included into your binary program with GLib's resource
+    mechanism, they are allowed to be loaded (provided that the base URL is
+    also a "&lt;literal&gt;resource&lt;/literal&gt;", per the previous rule).
+  &lt;/listitem&gt;
+
+  &lt;listitem&gt;
+    Otherwise, non-&lt;literal&gt;file&lt;/literal&gt; schemes are not allowed.  For
+    example, librsvg will not load &lt;literal&gt;http&lt;/literal&gt; resources, to keep
+    malicious SVG data from "phoning home".
+  &lt;/listitem&gt;
+
+  &lt;listitem&gt;
+    A relative URL must resolve to the same directory as the base URL, or to
+    one of its subdirectories.  Librsvg will canonicalize filenames, by
+    removing ".." path components and resolving symbolic links, to decide whether
+    files meet these conditions.
+  &lt;/listitem&gt;
+&lt;/orderedlist&gt;
+
+# Loading an SVG with GIO
+
+This is the easiest and most resource-efficient way of loading SVG data into
+an #RsvgHandle.
+
+If you have a #GFile that stands for an SVG file, you can simply call
+rsvg_handle_new_from_gfile_sync() to load an RsvgHandle from it.
+
+Alternatively, if you have a #GInputStream, you can use
+rsvg_handle_new_from_stream_sync().
+
+Both of those methods allow specifying a #GCancellable, so the loading
+process can be cancelled from another thread.
+
+## Loading an SVG from memory
+
+If you already have SVG data in a byte buffer in memory, you can create a
+memory input stream with g_memory_input_stream_new_from_data() and feed that
+to rsvg_handle_new_from_stream_sync().
+
+Note that in this case, it is important that you specify the base_file for
+the in-memory SVG data.  Librsvg uses the base_file to resolve links to
+external content, like raster images.
+
+# Loading an SVG without GIO
+
+You can load an RsvgHandle from a simple filename or URI with
+rsvg_handle_new_from_file().  Note that this is a blocking operation; there
+is no way to cancel it if loading a remote URI takes a long time.  Also, note that
+this method does not let you specify #RsvgHandleFlags.
+
+Otherwise, loading an SVG without GIO is not recommended, since librsvg will
+need to buffer your entire data internally before actually being able to
+parse it.  The deprecated way of doing this is by creating a handle with
+rsvg_handle_new() or rsvg_handle_new_with_flags(), and then using
+rsvg_handle_write() and rsvg_handle_close() to feed the handle with SVG data.
+Still, please try to use the GIO stream functions instead.
+
+# Resolution of the rendered image (dots per inch, or DPI)
+
+SVG images can contain dimensions like "&lt;literal&gt;5 cm&lt;/literal&gt;" or
+"&lt;literal&gt;2 pt&lt;/literal&gt;" that must be converted from physical units into
+device units.  To do this, librsvg needs to know the actual dots per inch
+(DPI) of your target device.  You can call rsvg_handle_set_dpi() or
+rsvg_handle_set_dpi_x_y() on an RsvgHandle to set the DPI before rendering
+it.
+
+# Rendering
+
+The preferred way to render a whole SVG document is to use
+rsvg_handle_render_document().  Please see its documentation for
+details.
+
+# API ordering
+
+Due to the way the librsvg API evolved over time, an #RsvgHandle object is available
+for use as soon as it is constructed.  However, not all of its methods can be
+called at any time.  For example, an #RsvgHandle just constructed with rsvg_handle_new()
+is not loaded yet, and it does not make sense to call rsvg_handle_get_dimensions() on it
+just at that point.
+
+The documentation for the available methods in #RsvgHandle may mention that a particular
+method is only callable on a "fully loaded handle".  This means either:
+
+&lt;itemizedlist&gt;
+  &lt;listitem&gt;
+    The handle was loaded with rsvg_handle_write() and rsvg_handle_close(), and
+    those functions returned no errors.
+  &lt;/listitem&gt;
+  &lt;listitem&gt;
+    The handle was loaded with rsvg_handle_read_stream_sync() and that function
+    returned no errors.
+  &lt;/listitem&gt;
+&lt;/itemizedlist&gt;
+
+Before librsvg 2.46, the library did not fully verify that a handle was in a
+fully loaded state for the methods that require it.  To preserve
+compatibility with old code which inadvertently called the API without
+checking for errors, or which called some methods outside of the expected
+order, librsvg will just emit a g_critical() message in those cases.
+
+New methods introduced in librsvg 2.46 and later will check for the correct
+ordering, and panic if they are called out of order.  This will abort
+the program as if it had a failed assertion.</doc>
+    </docsection>
+    <function name="set_default_dpi"
+              c:identifier="rsvg_set_default_dpi"
+              version="2.8"
+              deprecated="1"
+              deprecated-version="2.42.3">
+      <doc xml:space="preserve"
+           filename="rsvg.h"
+           line="471">Do not use this function.  Create an #RsvgHandle and call
+rsvg_handle_set_dpi() on it instead.</doc>
+      <doc-deprecated xml:space="preserve">This function used to set a global default DPI.  However,
+it only worked if it was called before any #RsvgHandle objects had been
+created; it would not work after that.  To avoid global mutable state, please
+use rsvg_handle_set_dpi() instead.</doc-deprecated>
+      <source-position filename="rsvg.h" line="486"/>
+      <return-value transfer-ownership="none">
+        <type name="none" c:type="void"/>
+      </return-value>
+      <parameters>
+        <parameter name="dpi" transfer-ownership="none">
+          <doc xml:space="preserve"
+               filename="rsvg.h"
+               line="473">Dots Per Inch (aka Pixels Per Inch)</doc>
+          <type name="gdouble" c:type="double"/>
+        </parameter>
+      </parameters>
+    </function>
+    <function name="set_default_dpi_x_y"
+              c:identifier="rsvg_set_default_dpi_x_y"
+              version="2.8"
+              deprecated="1"
+              deprecated-version="2.42.3">
+      <doc xml:space="preserve"
+           filename="rsvg.h"
+           line="488">Do not use this function.  Create an #RsvgHandle and call
+rsvg_handle_set_dpi_x_y() on it instead.</doc>
+      <doc-deprecated xml:space="preserve">This function used to set a global default DPI.  However,
+it only worked if it was called before any #RsvgHandle objects had been
+created; it would not work after that.  To avoid global mutable state, please
+use rsvg_handle_set_dpi() instead.</doc-deprecated>
+      <source-position filename="rsvg.h" line="504"/>
+      <return-value transfer-ownership="none">
+        <type name="none" c:type="void"/>
+      </return-value>
+      <parameters>
+        <parameter name="dpi_x" transfer-ownership="none">
+          <doc xml:space="preserve"
+               filename="rsvg.h"
+               line="490">Dots Per Inch (aka Pixels Per Inch)</doc>
+          <type name="gdouble" c:type="double"/>
+        </parameter>
+        <parameter name="dpi_y" transfer-ownership="none">
+          <doc xml:space="preserve"
+               filename="rsvg.h"
+               line="491">Dots Per Inch (aka Pixels Per Inch)</doc>
+          <type name="gdouble" c:type="double"/>
+        </parameter>
+      </parameters>
+    </function>
+  </namespace>
+</repository>
diff --git a/tests/src/gir.rs b/tests/src/gir.rs
new file mode 100644
index 00000000..b338a247
--- /dev/null
+++ b/tests/src/gir.rs
@@ -0,0 +1,62 @@
+extern crate markup5ever_rcdom as rcdom;
+extern crate xml5ever;
+
+use std::default::Default;
+use std::fs::File;
+use std::path::Path;
+
+use rcdom::{Handle, NodeData, RcDom};
+use xml5ever::driver::parse_document;
+use xml5ever::tendril::TendrilSink;
+
+fn build_dir() -> &'static Path {
+    match option_env!("LIBRSVG_BUILD_DIR") {
+        Some(dir) => Path::new(dir),
+        None => Path::new(env!("CARGO_MANIFEST_DIR")),
+    }
+}
+
+fn parse(path: &Path) -> std::io::Result<RcDom> {
+    let mut file = File::open(path)?;
+    parse_document(RcDom::default(), Default::default())
+        .from_utf8()
+        .read_from(&mut file)
+}
+
+fn diff(a: &NodeData, b: &NodeData) -> Option<String> {
+    match a {
+        NodeData::Document if !matches!(b, NodeData::Document) => Some(String::from("root")),
+        NodeData::Text { contents: ref c } if !matches!(b, NodeData::Text { contents: ref d } if c.eq(d)) => 
{
+            Some(format!("text: {:?}", c))
+        }
+        NodeData::Element { name: ref c, .. } if !matches!(b, NodeData::Element { name: ref d, .. } if 
c.eq(d)) => {
+            Some(format!("element: {:?}", c))
+        }
+        _ => None,
+    }
+}
+
+fn walk(a: &Handle, b: &Handle) {
+    if let Some(diff) = diff(&a.data, &b.data) {
+        panic!("files differ: {}", diff);
+    }
+
+    for (a, b) in a.children.borrow().iter().zip(b.children.borrow().iter()) {
+        walk(a, b);
+    }
+}
+
+fn escape_default(s: &str) -> String {
+    s.chars().flat_map(|c| c.escape_default()).collect()
+}
+
+#[test]
+fn gobject_introspection_matches_reference() {
+    let reference = Path::new("tests/fixtures/gir/Rsvg-2.0-ref.gir");
+    let generated = build_dir().join("Rsvg-2.0.gir");
+
+    let a = parse(&generated).unwrap();
+    let b = parse(&reference).unwrap();
+
+    walk(&a.document, &b.document);
+}
diff --git a/tests/src/main.rs b/tests/src/main.rs
index adfb52f2..b350bd38 100644
--- a/tests/src/main.rs
+++ b/tests/src/main.rs
@@ -14,6 +14,9 @@ mod cmdline;
 #[cfg(test)]
 mod errors;
 
+#[cfg(test)]
+mod gir;
+
 #[cfg(test)]
 mod intrinsic_dimensions;
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]