[librsvg: 6/8] Store each element's name as a LocalName instead of generating it



commit c216653450a5fbacc99ff796ed9db88a3cde74db
Author: Federico Mena Quintero <federico gnome org>
Date:   Mon May 20 19:20:21 2019 -0500

    Store each element's name as a LocalName instead of generating it

 rsvg_internals/src/create_node.rs | 28 ++++++++++++++----
 rsvg_internals/src/node.rs        | 61 ++++-----------------------------------
 rsvg_internals/src/xml.rs         |  8 ++++-
 3 files changed, 35 insertions(+), 62 deletions(-)
---
diff --git a/rsvg_internals/src/create_node.rs b/rsvg_internals/src/create_node.rs
index c6758dd4..98f58188 100644
--- a/rsvg_internals/src/create_node.rs
+++ b/rsvg_internals/src/create_node.rs
@@ -1,3 +1,4 @@
+use markup5ever::LocalName;
 use std::collections::HashMap;
 
 use crate::clip_path::NodeClipPath;
@@ -35,9 +36,20 @@ use crate::text::{NodeTRef, NodeTSpan, NodeText};
 
 macro_rules! n {
     ($name:ident, $node_type:ident, $new_fn:expr) => {
-        pub fn $name(id: Option<&str>, class: Option<&str>, parent: Option<&RsvgNode>) -> RsvgNode {
+        pub fn $name(
+            element_name: LocalName,
+            id: Option<&str>,
+            class: Option<&str>,
+            parent: Option<&RsvgNode>,
+        ) -> RsvgNode {
             RsvgNode::new(
-                NodeData::new(NodeType::$node_type, id, class, Box::new($new_fn())),
+                NodeData::new(
+                    NodeType::$node_type,
+                    element_name,
+                    id,
+                    class,
+                    Box::new($new_fn()),
+                ),
                 parent,
             )
         }
@@ -112,8 +124,12 @@ mod creators {
 
 use creators::*;
 
-type NodeCreateFn =
-    fn(id: Option<&str>, class: Option<&str>, parent: Option<&RsvgNode>) -> RsvgNode;
+type NodeCreateFn = fn(
+    element_name: LocalName,
+    id: Option<&str>,
+    class: Option<&str>,
+    parent: Option<&RsvgNode>,
+) -> RsvgNode;
 
 lazy_static! {
     // Lines in comments are elements that we don't support.
@@ -234,11 +250,13 @@ pub fn create_node_and_register_id(
         None => &(true, create_non_rendering as NodeCreateFn),
     };
 
+    let element_name = LocalName::from(name);
+
     if !supports_class {
         class = None;
     };
 
-    let node = create_fn(id, class, parent);
+    let node = create_fn(element_name, id, class, parent);
 
     if let Some(id) = id {
         // This is so we don't overwrite an existing id
diff --git a/rsvg_internals/src/node.rs b/rsvg_internals/src/node.rs
index 62be59a4..7a37a04a 100644
--- a/rsvg_internals/src/node.rs
+++ b/rsvg_internals/src/node.rs
@@ -23,6 +23,7 @@ pub type RsvgWeakNode = NodeWeakRef<NodeData>;
 /// Contents of a tree node
 pub struct NodeData {
     node_type: NodeType,
+    element_name: LocalName,
     id: Option<String>,    // id attribute from XML element
     class: Option<String>, // class attribute from XML element
     specified_values: RefCell<SpecifiedValues>,
@@ -38,12 +39,14 @@ pub struct NodeData {
 impl NodeData {
     pub fn new(
         node_type: NodeType,
+        element_name: LocalName,
         id: Option<&str>,
         class: Option<&str>,
         node_impl: Box<NodeTrait>,
     ) -> NodeData {
         NodeData {
             node_type,
+            element_name,
             id: id.map(str::to_string),
             class: class.map(str::to_string),
             specified_values: RefCell::new(Default::default()),
@@ -415,62 +418,8 @@ impl RsvgNode {
         self.borrow().node_type
     }
 
-    pub fn element_name(&self) -> &'static str {
-        match self.get_type() {
-            NodeType::Chars => "rsvg-chars", // Dummy element name for chars
-            NodeType::Circle => "circle",
-            NodeType::ClipPath => "clipPath",
-            NodeType::ComponentTransferFunctionA => "feFuncA",
-            NodeType::ComponentTransferFunctionB => "feFuncB",
-            NodeType::ComponentTransferFunctionG => "feFuncG",
-            NodeType::ComponentTransferFunctionR => "feFuncR",
-            NodeType::Defs => "defs",
-            NodeType::DistantLight => "feDistantLight",
-            NodeType::Ellipse => "ellipse",
-            NodeType::Filter => "filter",
-            NodeType::Group => "g",
-            NodeType::Image => "image",
-            NodeType::Line => "line",
-            NodeType::LinearGradient => "linearGradient",
-            NodeType::Link => "a",
-            NodeType::Marker => "marker",
-            NodeType::Mask => "mask",
-            NodeType::NonRendering => "rsvg-non-rendering", // Dummy element name
-            NodeType::Path => "path",
-            NodeType::Pattern => "pattern",
-            NodeType::PointLight => "fePointight",
-            NodeType::Polygon => "polygon",
-            NodeType::Polyline => "polyline",
-            NodeType::RadialGradient => "radialGradient",
-            NodeType::Rect => "rect",
-            NodeType::SpotLight => "feSpotLight",
-            NodeType::Stop => "stop",
-            NodeType::Style => "style",
-            NodeType::Svg => "svg",
-            NodeType::Switch => "switch",
-            NodeType::Symbol => "symbol",
-            NodeType::Text => "text",
-            NodeType::TRef => "tref",
-            NodeType::TSpan => "tspan",
-            NodeType::Use => "use",
-            NodeType::FeBlend => "feBlend",
-            NodeType::FeColorMatrix => "feColorMatrix",
-            NodeType::FeComponentTransfer => "feComponentTransfer",
-            NodeType::FeComposite => "feComposite",
-            NodeType::FeConvolveMatrix => "feConvolveMatrix",
-            NodeType::FeDiffuseLighting => "feDiffuseLighting",
-            NodeType::FeDisplacementMap => "feDisplacementMap",
-            NodeType::FeFlood => "feFlood",
-            NodeType::FeGaussianBlur => "feGaussianBlur",
-            NodeType::FeImage => "feImage",
-            NodeType::FeMerge => "feMerge",
-            NodeType::FeMergeNode => "feMergeNode",
-            NodeType::FeMorphology => "feMorphology",
-            NodeType::FeOffset => "feOffset",
-            NodeType::FeSpecularLighting => "feSpecularLighting",
-            NodeType::FeTile => "feTile",
-            NodeType::FeTurbulence => "feTurbulence",
-        }
+    pub fn element_name(&self) -> &str {
+        self.borrow().element_name.as_ref()
     }
 
     pub fn get_id(&self) -> Option<&str> {
diff --git a/rsvg_internals/src/xml.rs b/rsvg_internals/src/xml.rs
index f1e2d6a0..053b7292 100644
--- a/rsvg_internals/src/xml.rs
+++ b/rsvg_internals/src/xml.rs
@@ -290,7 +290,13 @@ impl XmlState {
                 child
             } else {
                 let child = RsvgNode::new(
-                    NodeData::new(NodeType::Chars, None, None, Box::new(NodeChars::new())),
+                    NodeData::new(
+                        NodeType::Chars,
+                        LocalName::from("rsvg-chars"),
+                        None,
+                        None,
+                        Box::new(NodeChars::new()),
+                    ),
                     Some(node),
                 );
                 node.append(&child);


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