[librsvg: 7/10] Don't create the RsvgDefs in the RsvgHandle; do it in the XmlState



commit 5af4ebcf89351bb9287f111e291a3d6039b40944
Author: Federico Mena Quintero <federico gnome org>
Date:   Thu Nov 22 13:09:15 2018 -0600

    Don't create the RsvgDefs in the RsvgHandle; do it in the XmlState
    
    Again, decoupling defs from handle.

 librsvg/rsvg-handle.c      |  7 +++++--
 librsvg/rsvg-load.c        |  9 ++++++---
 librsvg/rsvg-load.h        |  3 ++-
 librsvg/rsvg-private.h     |  4 ----
 rsvg_internals/src/defs.rs |  7 +------
 rsvg_internals/src/lib.rs  |  2 +-
 rsvg_internals/src/xml.rs  | 25 +++++++++++++++++--------
 7 files changed, 32 insertions(+), 25 deletions(-)
---
diff --git a/librsvg/rsvg-handle.c b/librsvg/rsvg-handle.c
index 4ba6ad48..88c05779 100644
--- a/librsvg/rsvg-handle.c
+++ b/librsvg/rsvg-handle.c
@@ -156,7 +156,7 @@ rsvg_handle_init (RsvgHandle * self)
 
     self->priv->flags = RSVG_HANDLE_FLAGS_NONE;
     self->priv->hstate = RSVG_HANDLE_STATE_START;
-    self->priv->defs = rsvg_defs_new ();
+    self->priv->defs = NULL;
     self->priv->dpi_x = rsvg_internal_dpi_x;
     self->priv->dpi_y = rsvg_internal_dpi_y;
 
@@ -678,6 +678,7 @@ static gboolean
 finish_load (RsvgHandle *handle, gboolean was_successful, GError **error)
 {
     RsvgTree *tree = NULL;
+    RsvgDefs *defs = NULL;
 
     g_assert (handle->priv->load != NULL);
     g_assert (handle->priv->tree == NULL);
@@ -685,10 +686,11 @@ finish_load (RsvgHandle *handle, gboolean was_successful, GError **error)
     if (was_successful) {
         g_assert (error == NULL || *error == NULL);
 
-        rsvg_load_steal_result (handle->priv->load, &tree);
+        rsvg_load_steal_result (handle->priv->load, &tree, &defs);
         was_successful = tree_is_valid (tree, error);
         if (!was_successful) {
             g_clear_pointer (&tree, rsvg_tree_free);
+            g_clear_pointer (&defs, rsvg_defs_free);
         }
     }
 
@@ -701,6 +703,7 @@ finish_load (RsvgHandle *handle, gboolean was_successful, GError **error)
 
     g_clear_pointer (&handle->priv->load, rsvg_load_free);
     handle->priv->tree = tree;
+    handle->priv->defs = defs;
 
     return was_successful;
 }
diff --git a/librsvg/rsvg-load.c b/librsvg/rsvg-load.c
index bb2861a9..69d591a2 100644
--- a/librsvg/rsvg-load.c
+++ b/librsvg/rsvg-load.c
@@ -51,7 +51,9 @@ typedef struct RsvgXmlState RsvgXmlState;
 /* Implemented in rsvg_internals/src/xml.rs */
 extern RsvgXmlState *rsvg_xml_state_new ();
 extern void rsvg_xml_state_free (RsvgXmlState *xml);
-extern void rsvg_xml_state_steal_result(RsvgXmlState *xml, RsvgTree **out_tree);
+extern void rsvg_xml_state_steal_result(RsvgXmlState *xml,
+                                        RsvgTree **out_tree,
+                                        RsvgDefs **out_defs);
 extern void rsvg_xml_state_start_element(RsvgXmlState *xml, RsvgHandle *handle, const char *name, 
RsvgPropertyBag atts);
 extern void rsvg_xml_state_end_element(RsvgXmlState *xml, RsvgHandle *handle, const char *name);
 extern void rsvg_xml_state_characters(RsvgXmlState *xml, const char *unterminated_text, gsize len);
@@ -143,9 +145,10 @@ rsvg_load_free (RsvgLoad *load)
 
 void
 rsvg_load_steal_result (RsvgLoad *load,
-                        RsvgTree **out_tree)
+                        RsvgTree **out_tree,
+                        RsvgDefs **out_defs)
 {
-    rsvg_xml_state_steal_result (load->xml.rust_state, out_tree);
+    rsvg_xml_state_steal_result (load->xml.rust_state, out_tree, out_defs);
 }
 
 static void
diff --git a/librsvg/rsvg-load.h b/librsvg/rsvg-load.h
index 647b3e58..6c62cdbd 100644
--- a/librsvg/rsvg-load.h
+++ b/librsvg/rsvg-load.h
@@ -36,7 +36,8 @@ gboolean rsvg_load_handle_xml_xinclude (RsvgHandle *handle, const char *url);
 
 G_GNUC_INTERNAL
 void rsvg_load_steal_result (RsvgLoad *load,
-                             RsvgTree **out_tree);
+                             RsvgTree **out_tree,
+                             RsvgDefs **out_defs);
 
 G_GNUC_INTERNAL
 gboolean rsvg_load_write (RsvgLoad *load, const guchar *buf, gsize count, GError **error) 
G_GNUC_WARN_UNUSED_RESULT;
diff --git a/librsvg/rsvg-private.h b/librsvg/rsvg-private.h
index b2803fe7..a2173775 100644
--- a/librsvg/rsvg-private.h
+++ b/librsvg/rsvg-private.h
@@ -240,10 +240,6 @@ void rsvg_return_if_fail_warning (const char *pretty_function,
 G_GNUC_INTERNAL
 RsvgNode *rsvg_load_destroy (RsvgLoad *load) G_GNUC_WARN_UNUSED_RESULT;
 
-/* Defined in rsvg_internals/src/defs.rs */
-G_GNUC_INTERNAL
-RsvgDefs *rsvg_defs_new (void);
-
 /* Defined in rsvg_internals/src/defs.rs */
 G_GNUC_INTERNAL
 void rsvg_defs_free (RsvgDefs *defs);
diff --git a/rsvg_internals/src/defs.rs b/rsvg_internals/src/defs.rs
index b5a67cb9..c13dff39 100644
--- a/rsvg_internals/src/defs.rs
+++ b/rsvg_internals/src/defs.rs
@@ -16,7 +16,7 @@ pub struct Defs {
 }
 
 impl Defs {
-    fn new() -> Defs {
+    pub fn new() -> Defs {
         Defs {
             nodes: Default::default(),
             externs: Default::default(),
@@ -104,11 +104,6 @@ impl<'a> Reference<'a> {
     }
 }
 
-#[no_mangle]
-pub extern "C" fn rsvg_defs_new() -> *mut RsvgDefs {
-    Box::into_raw(Box::new(Defs::new())) as *mut RsvgDefs
-}
-
 #[no_mangle]
 pub extern "C" fn rsvg_defs_free(defs: *mut RsvgDefs) {
     assert!(!defs.is_null());
diff --git a/rsvg_internals/src/lib.rs b/rsvg_internals/src/lib.rs
index 281b8442..ffd5dd9a 100644
--- a/rsvg_internals/src/lib.rs
+++ b/rsvg_internals/src/lib.rs
@@ -33,7 +33,7 @@ pub use color::{rsvg_css_parse_color, ColorKind, ColorSpec};
 
 pub use css::{rsvg_css_parse_into_handle, rsvg_css_styles_free, rsvg_css_styles_new};
 
-pub use defs::{rsvg_defs_free, rsvg_defs_lookup, rsvg_defs_new};
+pub use defs::{rsvg_defs_free, rsvg_defs_lookup};
 
 pub use drawing_ctx::{
     rsvg_drawing_ctx_add_node_and_ancestors_to_stack,
diff --git a/rsvg_internals/src/xml.rs b/rsvg_internals/src/xml.rs
index 269627c3..075421db 100644
--- a/rsvg_internals/src/xml.rs
+++ b/rsvg_internals/src/xml.rs
@@ -9,6 +9,7 @@ use std::str;
 
 use attributes::Attribute;
 use css;
+use defs::{Defs, RsvgDefs};
 use handle::{self, RsvgHandle};
 use load::rsvg_load_new_node;
 use node::{node_new, Node, NodeType};
@@ -72,6 +73,7 @@ pub enum RsvgXmlState {}
 /// what creates normal graphical elements.
 struct XmlState {
     tree: Option<Box<Tree>>,
+    defs: Option<Defs>,
     context: Context,
     context_stack: Vec<Context>,
     current_node: Option<Rc<Node>>,
@@ -81,6 +83,7 @@ impl XmlState {
     fn new() -> XmlState {
         XmlState {
             tree: None,
+            defs: Some(Defs::new()),
             context: Context::empty(),
             context_stack: Vec::new(),
             current_node: None,
@@ -95,8 +98,8 @@ impl XmlState {
         self.tree = Some(Box::new(Tree::new(root)));
     }
 
-    pub fn steal_tree(&mut self) -> Option<Box<Tree>> {
-        self.tree.take()
+    pub fn steal_result(&mut self) -> (Option<Box<Tree>>, Box<Defs>) {
+        (self.tree.take(), Box::new(self.defs.take().unwrap()))
     }
 
     fn push_context(&mut self, ctx: Context) {
@@ -158,7 +161,8 @@ impl XmlState {
         match name {
             "include" => self.xinclude_start_element(handle, name, pbag),
             _ => {
-                let node = self.create_node(self.current_node.as_ref(), handle, name, pbag);
+                let parent = self.current_node.clone();
+                let node = self.create_node(parent.as_ref(), handle, name, pbag);
                 if self.current_node.is_none() {
                     self.set_root(&node);
                 }
@@ -218,15 +222,15 @@ impl XmlState {
     }
 
     fn create_node(
-        &self,
+        &mut self,
         parent: Option<&Rc<Node>>,
         handle: *mut RsvgHandle,
         name: &str,
         pbag: &PropertyBag,
     ) -> Rc<Node> {
-        let mut defs = handle::get_defs(handle);
+        let defs = self.defs.as_mut().unwrap();
 
-        let new_node = rsvg_load_new_node(name, parent, pbag, &mut defs);
+        let new_node = rsvg_load_new_node(name, parent, pbag, defs);
 
         if let Some(parent) = parent {
             parent.add_child(&new_node);
@@ -398,16 +402,21 @@ pub extern "C" fn rsvg_xml_state_free(xml: *mut RsvgXmlState) {
 pub unsafe extern "C" fn rsvg_xml_state_steal_result(
     xml: *mut RsvgXmlState,
     out_tree: *mut *mut RsvgTree,
+    out_defs: *mut *mut RsvgDefs,
 ) {
     assert!(!xml.is_null());
     assert!(!out_tree.is_null());
+    assert!(!out_defs.is_null());
 
     let xml = &mut *(xml as *mut XmlState);
 
-    *out_tree = xml
-        .steal_tree()
+    let (tree, defs) = xml.steal_result();
+
+    *out_tree = tree
         .map(|tree| Box::into_raw(tree) as *mut RsvgTree)
         .unwrap_or(ptr::null_mut());
+
+    *out_defs = Box::into_raw(defs) as *mut RsvgDefs;
 }
 
 #[no_mangle]


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