[librsvg: 7/10] Don't create the RsvgDefs in the RsvgHandle; do it in the XmlState
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg: 7/10] Don't create the RsvgDefs in the RsvgHandle; do it in the XmlState
- Date: Thu, 22 Nov 2018 20:22:07 +0000 (UTC)
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]