[librsvg: 5/9] node: use 'default' to create nodes when possible



commit 507b2bea459fd2635306458208fdfdc38aeaa9ba
Author: Paolo Borelli <pborelli gnome org>
Date:   Sun May 26 10:43:21 2019 +0200

    node: use 'default' to create nodes when possible
    
    Using default instead of a new is more idiomatic and lets us
    derive some of the boiler plate.

 rsvg_internals/src/clip_path.rs                  |  7 +-
 rsvg_internals/src/create_node.rs                | 84 ++++++++++++------------
 rsvg_internals/src/filters/blend.rs              |  4 +-
 rsvg_internals/src/filters/color_matrix.rs       |  4 +-
 rsvg_internals/src/filters/component_transfer.rs |  4 +-
 rsvg_internals/src/filters/composite.rs          |  4 +-
 rsvg_internals/src/filters/convolve_matrix.rs    |  4 +-
 rsvg_internals/src/filters/displacement_map.rs   |  4 +-
 rsvg_internals/src/filters/flood.rs              |  4 +-
 rsvg_internals/src/filters/gaussian_blur.rs      |  4 +-
 rsvg_internals/src/filters/image.rs              |  6 +-
 rsvg_internals/src/filters/merge.rs              | 15 +----
 rsvg_internals/src/filters/morphology.rs         |  4 +-
 rsvg_internals/src/filters/node.rs               |  6 +-
 rsvg_internals/src/filters/offset.rs             |  4 +-
 rsvg_internals/src/filters/tile.rs               |  4 +-
 rsvg_internals/src/filters/turbulence.rs         |  4 +-
 rsvg_internals/src/image.rs                      | 14 +---
 rsvg_internals/src/link.rs                       |  9 +--
 rsvg_internals/src/marker.rs                     |  6 +-
 rsvg_internals/src/mask.rs                       |  6 +-
 rsvg_internals/src/pattern.rs                    |  4 +-
 rsvg_internals/src/shapes.rs                     | 59 ++---------------
 rsvg_internals/src/stop.rs                       |  7 +-
 rsvg_internals/src/structure.rs                  | 56 ++--------------
 rsvg_internals/src/style.rs                      |  7 +-
 rsvg_internals/src/text.rs                       | 27 +-------
 rsvg_internals/src/unit_interval.rs              |  2 +-
 28 files changed, 107 insertions(+), 256 deletions(-)
---
diff --git a/rsvg_internals/src/clip_path.rs b/rsvg_internals/src/clip_path.rs
index 00ad514d..9a97d18c 100644
--- a/rsvg_internals/src/clip_path.rs
+++ b/rsvg_internals/src/clip_path.rs
@@ -12,17 +12,12 @@ use crate::property_bag::PropertyBag;
 
 coord_units!(ClipPathUnits, CoordUnits::UserSpaceOnUse);
 
+#[derive(Default)]
 pub struct NodeClipPath {
     units: Cell<ClipPathUnits>,
 }
 
 impl NodeClipPath {
-    pub fn new() -> NodeClipPath {
-        NodeClipPath {
-            units: Cell::new(ClipPathUnits::default()),
-        }
-    }
-
     pub fn get_units(&self) -> ClipPathUnits {
         self.units.get()
     }
diff --git a/rsvg_internals/src/create_node.rs b/rsvg_internals/src/create_node.rs
index 8a17dad7..0e8ed4b5 100644
--- a/rsvg_internals/src/create_node.rs
+++ b/rsvg_internals/src/create_node.rs
@@ -60,66 +60,66 @@ macro_rules! n {
 mod creators {
     use super::*;
 
-    n!(create_circle,                    Circle,                     NodeCircle::new);
-    n!(create_clip_path,                 ClipPath,                   NodeClipPath::new);
-    n!(create_blend,                     FeBlend,                    Blend::new);
-    n!(create_color_matrix,              FeColorMatrix,              ColorMatrix::new);
-    n!(create_component_transfer,        FeComponentTransfer,        ComponentTransfer::new);
+    n!(create_circle,                    Circle,                     NodeCircle::default);
+    n!(create_clip_path,                 ClipPath,                   NodeClipPath::default);
+    n!(create_blend,                     FeBlend,                    Blend::default);
+    n!(create_color_matrix,              FeColorMatrix,              ColorMatrix::default);
+    n!(create_component_transfer,        FeComponentTransfer,        ComponentTransfer::default);
     n!(create_component_transfer_func_a, ComponentTransferFunctionA, FuncX::new_a);
     n!(create_component_transfer_func_b, ComponentTransferFunctionB, FuncX::new_b);
     n!(create_component_transfer_func_g, ComponentTransferFunctionG, FuncX::new_g);
     n!(create_component_transfer_func_r, ComponentTransferFunctionR, FuncX::new_r);
-    n!(create_composite,                 FeComposite,                Composite::new);
-    n!(create_convolve_matrix,           FeConvolveMatrix,           ConvolveMatrix::new);
-    n!(create_defs,                      Defs,                       NodeNonRendering::new);
+    n!(create_composite,                 FeComposite,                Composite::default);
+    n!(create_convolve_matrix,           FeConvolveMatrix,           ConvolveMatrix::default);
+    n!(create_defs,                      Defs,                       NodeNonRendering::default);
     n!(create_diffuse_lighting,          FeDiffuseLighting,          Lighting::new_diffuse);
     n!(create_distant_light,             DistantLight,               LightSource::new_distant_light);
-    n!(create_displacement_map,          FeDisplacementMap,          DisplacementMap::new);
-    n!(create_ellipse,                   Ellipse,                    NodeEllipse::new);
-    n!(create_filter,                    Filter,                     NodeFilter::new);
-    n!(create_flood,                     FeFlood,                    Flood::new);
-    n!(create_gaussian_blur,             FeGaussianBlur,             GaussianBlur::new);
-    n!(create_group,                     Group,                      NodeGroup::new);
-    n!(create_image,                     Image,                      NodeImage::new);
-    n!(create_fe_image,                  FeImage,                    Image::new);
+    n!(create_displacement_map,          FeDisplacementMap,          DisplacementMap::default);
+    n!(create_ellipse,                   Ellipse,                    NodeEllipse::default);
+    n!(create_filter,                    Filter,                     NodeFilter::default);
+    n!(create_flood,                     FeFlood,                    Flood::default);
+    n!(create_gaussian_blur,             FeGaussianBlur,             GaussianBlur::default);
+    n!(create_group,                     Group,                      NodeGroup::default);
+    n!(create_image,                     Image,                      NodeImage::default);
+    n!(create_fe_image,                  FeImage,                    Image::default);
     n!(create_linear_gradient,           LinearGradient,             NodeGradient::new_linear);
-    n!(create_line,                      Line,                       NodeLine::new);
-    n!(create_link,                      Link,                       NodeLink::new);
-    n!(create_marker,                    Marker,                     NodeMarker::new);
-    n!(create_mask,                      Mask,                       NodeMask::new);
-    n!(create_merge,                     FeMerge,                    Merge::new);
-    n!(create_merge_node,                FeMergeNode,                MergeNode::new);
-    n!(create_morphology,                FeMorphology,               Morphology::new);
-    n!(create_non_rendering,             NonRendering,               NodeNonRendering::new);
-    n!(create_offset,                    FeOffset,                   Offset::new);
-    n!(create_path,                      Path,                       NodePath::new);
-    n!(create_pattern,                   Pattern,                    NodePattern::new);
+    n!(create_line,                      Line,                       NodeLine::default);
+    n!(create_link,                      Link,                       NodeLink::default);
+    n!(create_marker,                    Marker,                     NodeMarker::default);
+    n!(create_mask,                      Mask,                       NodeMask::default);
+    n!(create_merge,                     FeMerge,                    Merge::default);
+    n!(create_merge_node,                FeMergeNode,                MergeNode::default);
+    n!(create_morphology,                FeMorphology,               Morphology::default);
+    n!(create_non_rendering,             NonRendering,               NodeNonRendering::default);
+    n!(create_offset,                    FeOffset,                   Offset::default);
+    n!(create_path,                      Path,                       NodePath::default);
+    n!(create_pattern,                   Pattern,                    NodePattern::default);
     n!(create_point_light,               PointLight,                 LightSource::new_point_light);
     n!(create_polygon,                   Polygon,                    NodePoly::new_closed);
     n!(create_polyline,                  Polyline,                   NodePoly::new_open);
     n!(create_radial_gradient,           RadialGradient,             NodeGradient::new_radial);
-    n!(create_rect,                      Rect,                       NodeRect::new);
+    n!(create_rect,                      Rect,                       NodeRect::default);
     n!(create_specular_lighting,         FeSpecularLighting,         Lighting::new_specular);
     n!(create_spot_light,                SpotLight,                  LightSource::new_spot_light);
-    n!(create_stop,                      Stop,                       NodeStop::new);
-    n!(create_style,                     Style,                      NodeStyle::new);
-    n!(create_svg,                       Svg,                        NodeSvg::new);
-    n!(create_switch,                    Switch,                     NodeSwitch::new);
-    n!(create_symbol,                    Symbol,                     NodeSymbol::new);
-    n!(create_text,                      Text,                       NodeText::new);
-    n!(create_tref,                      TRef,                       NodeTRef::new);
-    n!(create_tspan,                     TSpan,                      NodeTSpan::new);
-    n!(create_tile,                      FeTile,                     Tile::new);
-    n!(create_turbulence,                FeTurbulence,               Turbulence::new);
-    n!(create_use,                       Use,                        NodeUse::new);
+    n!(create_stop,                      Stop,                       NodeStop::default);
+    n!(create_style,                     Style,                      NodeStyle::default);
+    n!(create_svg,                       Svg,                        NodeSvg::default);
+    n!(create_switch,                    Switch,                     NodeSwitch::default);
+    n!(create_symbol,                    Symbol,                     NodeSymbol::default);
+    n!(create_text,                      Text,                       NodeText::default);
+    n!(create_tref,                      TRef,                       NodeTRef::default);
+    n!(create_tspan,                     TSpan,                      NodeTSpan::default);
+    n!(create_tile,                      FeTile,                     Tile::default);
+    n!(create_turbulence,                FeTurbulence,               Turbulence::default);
+    n!(create_use,                       Use,                        NodeUse::default);
 
     // hack to partially support conical gradient
     n!(create_conical_gradient,          RadialGradient,             NodeGradient::new_radial);
 
     // hack to make multiImage sort-of work
-    n!(create_multi_image,               Switch,                     NodeSwitch::new);
-    n!(create_sub_image,                 Group,                      NodeGroup::new);
-    n!(create_sub_image_ref,             Image,                      NodeImage::new);
+    n!(create_multi_image,               Switch,                     NodeSwitch::default);
+    n!(create_sub_image,                 Group,                      NodeGroup::default);
+    n!(create_sub_image_ref,             Image,                      NodeImage::default);
 }
 
 use creators::*;
diff --git a/rsvg_internals/src/filters/blend.rs b/rsvg_internals/src/filters/blend.rs
index 0344aec1..993f468a 100644
--- a/rsvg_internals/src/filters/blend.rs
+++ b/rsvg_internals/src/filters/blend.rs
@@ -31,10 +31,10 @@ pub struct Blend {
     mode: Cell<Mode>,
 }
 
-impl Blend {
+impl Default for Blend {
     /// Constructs a new `Blend` with empty properties.
     #[inline]
-    pub fn new() -> Blend {
+    fn default() -> Blend {
         Blend {
             base: PrimitiveWithInput::new::<Self>(),
             in2: RefCell::new(None),
diff --git a/rsvg_internals/src/filters/color_matrix.rs b/rsvg_internals/src/filters/color_matrix.rs
index 62ac5557..c70ecc65 100644
--- a/rsvg_internals/src/filters/color_matrix.rs
+++ b/rsvg_internals/src/filters/color_matrix.rs
@@ -36,10 +36,10 @@ pub struct ColorMatrix {
     matrix: RefCell<Matrix5<f64>>,
 }
 
-impl ColorMatrix {
+impl Default for ColorMatrix {
     /// Constructs a new `ColorMatrix` with empty properties.
     #[inline]
-    pub fn new() -> ColorMatrix {
+    fn default() -> ColorMatrix {
         ColorMatrix {
             base: PrimitiveWithInput::new::<Self>(),
             matrix: RefCell::new(Matrix5::identity()),
diff --git a/rsvg_internals/src/filters/component_transfer.rs 
b/rsvg_internals/src/filters/component_transfer.rs
index 2b3ac234..21a00780 100644
--- a/rsvg_internals/src/filters/component_transfer.rs
+++ b/rsvg_internals/src/filters/component_transfer.rs
@@ -112,10 +112,10 @@ fn gamma(params: &FunctionParameters<'_>, value: f64) -> f64 {
     params.amplitude * value.powf(params.exponent) + params.offset
 }
 
-impl ComponentTransfer {
+impl Default for ComponentTransfer {
     /// Constructs a new `ComponentTransfer` with empty properties.
     #[inline]
-    pub fn new() -> ComponentTransfer {
+    fn default() -> ComponentTransfer {
         ComponentTransfer {
             base: PrimitiveWithInput::new::<Self>(),
         }
diff --git a/rsvg_internals/src/filters/composite.rs b/rsvg_internals/src/filters/composite.rs
index dc5761d3..fa247fce 100644
--- a/rsvg_internals/src/filters/composite.rs
+++ b/rsvg_internals/src/filters/composite.rs
@@ -43,10 +43,10 @@ pub struct Composite {
     k4: Cell<f64>,
 }
 
-impl Composite {
+impl Default for Composite {
     /// Constructs a new `Composite` with empty properties.
     #[inline]
-    pub fn new() -> Composite {
+    fn default() -> Composite {
         Composite {
             base: PrimitiveWithInput::new::<Self>(),
             in2: RefCell::new(None),
diff --git a/rsvg_internals/src/filters/convolve_matrix.rs b/rsvg_internals/src/filters/convolve_matrix.rs
index b0bb684b..6f2c1c5d 100644
--- a/rsvg_internals/src/filters/convolve_matrix.rs
+++ b/rsvg_internals/src/filters/convolve_matrix.rs
@@ -37,10 +37,10 @@ pub struct ConvolveMatrix {
     preserve_alpha: Cell<bool>,
 }
 
-impl ConvolveMatrix {
+impl Default for ConvolveMatrix {
     /// Constructs a new `ConvolveMatrix` with empty properties.
     #[inline]
-    pub fn new() -> ConvolveMatrix {
+    fn default() -> ConvolveMatrix {
         ConvolveMatrix {
             base: PrimitiveWithInput::new::<Self>(),
             order: Cell::new((3, 3)),
diff --git a/rsvg_internals/src/filters/displacement_map.rs b/rsvg_internals/src/filters/displacement_map.rs
index e25cc7b8..68374d3a 100644
--- a/rsvg_internals/src/filters/displacement_map.rs
+++ b/rsvg_internals/src/filters/displacement_map.rs
@@ -31,10 +31,10 @@ pub struct DisplacementMap {
     y_channel_selector: Cell<ColorChannel>,
 }
 
-impl DisplacementMap {
+impl Default for DisplacementMap {
     /// Constructs a new `DisplacementMap` with empty properties.
     #[inline]
-    pub fn new() -> DisplacementMap {
+    fn default() -> DisplacementMap {
         DisplacementMap {
             base: PrimitiveWithInput::new::<Self>(),
             in2: RefCell::new(None),
diff --git a/rsvg_internals/src/filters/flood.rs b/rsvg_internals/src/filters/flood.rs
index 929bfb81..a501b5cf 100644
--- a/rsvg_internals/src/filters/flood.rs
+++ b/rsvg_internals/src/filters/flood.rs
@@ -14,10 +14,10 @@ pub struct Flood {
     base: Primitive,
 }
 
-impl Flood {
+impl Default for Flood {
     /// Constructs a new `Flood` with empty properties.
     #[inline]
-    pub fn new() -> Flood {
+    fn default() -> Flood {
         Flood {
             base: Primitive::new::<Self>(),
         }
diff --git a/rsvg_internals/src/filters/gaussian_blur.rs b/rsvg_internals/src/filters/gaussian_blur.rs
index 69a4d0d9..40bf098e 100644
--- a/rsvg_internals/src/filters/gaussian_blur.rs
+++ b/rsvg_internals/src/filters/gaussian_blur.rs
@@ -30,10 +30,10 @@ pub struct GaussianBlur {
     std_deviation: Cell<(f64, f64)>,
 }
 
-impl GaussianBlur {
+impl Default for GaussianBlur {
     /// Constructs a new `GaussianBlur` with empty properties.
     #[inline]
-    pub fn new() -> GaussianBlur {
+    fn default() -> GaussianBlur {
         GaussianBlur {
             base: PrimitiveWithInput::new::<Self>(),
             std_deviation: Cell::new((0.0, 0.0)),
diff --git a/rsvg_internals/src/filters/image.rs b/rsvg_internals/src/filters/image.rs
index 318abf3b..bf2f90eb 100644
--- a/rsvg_internals/src/filters/image.rs
+++ b/rsvg_internals/src/filters/image.rs
@@ -24,17 +24,19 @@ pub struct Image {
     href: RefCell<Option<Href>>,
 }
 
-impl Image {
+impl Default for Image {
     /// Constructs a new `Image` with empty properties.
     #[inline]
-    pub fn new() -> Image {
+    fn default() -> Image {
         Image {
             base: Primitive::new::<Self>(),
             aspect: Cell::new(AspectRatio::default()),
             href: RefCell::new(None),
         }
     }
+}
 
+impl Image {
     /// Renders the filter if the source is an existing node.
     fn render_node(
         &self,
diff --git a/rsvg_internals/src/filters/merge.rs b/rsvg_internals/src/filters/merge.rs
index 5ff87210..f42742c8 100644
--- a/rsvg_internals/src/filters/merge.rs
+++ b/rsvg_internals/src/filters/merge.rs
@@ -18,30 +18,21 @@ pub struct Merge {
 }
 
 /// The `<feMergeNode>` element.
+#[derive(Default)]
 pub struct MergeNode {
     in_: RefCell<Option<Input>>,
 }
 
-impl Merge {
+impl Default for Merge {
     /// Constructs a new `Merge` with empty properties.
     #[inline]
-    pub fn new() -> Merge {
+    fn default() -> Merge {
         Merge {
             base: Primitive::new::<Self>(),
         }
     }
 }
 
-impl MergeNode {
-    /// Constructs a new `MergeNode` with empty properties.
-    #[inline]
-    pub fn new() -> MergeNode {
-        MergeNode {
-            in_: RefCell::new(None),
-        }
-    }
-}
-
 impl NodeTrait for Merge {
     #[inline]
     fn set_atts(&self, node: &RsvgNode, pbag: &PropertyBag<'_>) -> NodeResult {
diff --git a/rsvg_internals/src/filters/morphology.rs b/rsvg_internals/src/filters/morphology.rs
index a5738408..9eabfa87 100644
--- a/rsvg_internals/src/filters/morphology.rs
+++ b/rsvg_internals/src/filters/morphology.rs
@@ -35,10 +35,10 @@ pub struct Morphology {
     radius: Cell<(f64, f64)>,
 }
 
-impl Morphology {
+impl Default for Morphology {
     /// Constructs a new `Morphology` with empty properties.
     #[inline]
-    pub fn new() -> Morphology {
+    fn default() -> Morphology {
         Morphology {
             base: PrimitiveWithInput::new::<Self>(),
             operator: Cell::new(Operator::Erode),
diff --git a/rsvg_internals/src/filters/node.rs b/rsvg_internals/src/filters/node.rs
index 38bfb3bb..ac3f30a1 100644
--- a/rsvg_internals/src/filters/node.rs
+++ b/rsvg_internals/src/filters/node.rs
@@ -23,10 +23,10 @@ pub struct NodeFilter {
     pub primitiveunits: Cell<CoordUnits>,
 }
 
-impl NodeFilter {
+impl Default for NodeFilter {
     /// Constructs a new `NodeFilter` with default properties.
     #[inline]
-    pub fn new() -> Self {
+    fn default() -> Self {
         Self {
             x: Cell::new(LengthHorizontal::parse_str("-10%").unwrap()),
             y: Cell::new(LengthVertical::parse_str("-10%").unwrap()),
@@ -36,7 +36,9 @@ impl NodeFilter {
             primitiveunits: Cell::new(CoordUnits::UserSpaceOnUse),
         }
     }
+}
 
+impl NodeFilter {
     /// Computes and returns the filter effects region.
     pub fn compute_effects_region(
         &self,
diff --git a/rsvg_internals/src/filters/offset.rs b/rsvg_internals/src/filters/offset.rs
index 8e88787f..94ebb235 100644
--- a/rsvg_internals/src/filters/offset.rs
+++ b/rsvg_internals/src/filters/offset.rs
@@ -21,10 +21,10 @@ pub struct Offset {
     dy: Cell<f64>,
 }
 
-impl Offset {
+impl Default for Offset {
     /// Constructs a new `Offset` with empty properties.
     #[inline]
-    pub fn new() -> Offset {
+    fn default() -> Offset {
         Offset {
             base: PrimitiveWithInput::new::<Self>(),
             dx: Cell::new(0f64),
diff --git a/rsvg_internals/src/filters/tile.rs b/rsvg_internals/src/filters/tile.rs
index ddf1062c..4269eebb 100644
--- a/rsvg_internals/src/filters/tile.rs
+++ b/rsvg_internals/src/filters/tile.rs
@@ -13,10 +13,10 @@ pub struct Tile {
     base: PrimitiveWithInput,
 }
 
-impl Tile {
+impl Default for Tile {
     /// Constructs a new `Tile` with empty properties.
     #[inline]
-    pub fn new() -> Tile {
+    fn default() -> Tile {
         Tile {
             base: PrimitiveWithInput::new::<Self>(),
         }
diff --git a/rsvg_internals/src/filters/turbulence.rs b/rsvg_internals/src/filters/turbulence.rs
index 855cd2ab..be9d5421 100644
--- a/rsvg_internals/src/filters/turbulence.rs
+++ b/rsvg_internals/src/filters/turbulence.rs
@@ -43,10 +43,10 @@ pub struct Turbulence {
     type_: Cell<NoiseType>,
 }
 
-impl Turbulence {
+impl Default for Turbulence {
     /// Constructs a new `Turbulence` with empty properties.
     #[inline]
-    pub fn new() -> Turbulence {
+    fn default() -> Turbulence {
         Turbulence {
             base: Primitive::new::<Self>(),
             base_frequency: Cell::new((0.0, 0.0)),
diff --git a/rsvg_internals/src/image.rs b/rsvg_internals/src/image.rs
index e351db5d..fab5c2c6 100644
--- a/rsvg_internals/src/image.rs
+++ b/rsvg_internals/src/image.rs
@@ -15,6 +15,7 @@ use crate::property_bag::PropertyBag;
 use crate::rect::RectangleExt;
 use crate::viewbox::ViewBox;
 
+#[derive(Default)]
 pub struct NodeImage {
     aspect: Cell<AspectRatio>,
     x: Cell<LengthHorizontal>,
@@ -24,19 +25,6 @@ pub struct NodeImage {
     href: RefCell<Option<Href>>,
 }
 
-impl NodeImage {
-    pub fn new() -> NodeImage {
-        NodeImage {
-            aspect: Cell::new(AspectRatio::default()),
-            x: Cell::new(Default::default()),
-            y: Cell::new(Default::default()),
-            w: Cell::new(Default::default()),
-            h: Cell::new(Default::default()),
-            href: RefCell::new(None),
-        }
-    }
-}
-
 impl NodeTrait for NodeImage {
     fn set_atts(&self, _node: &RsvgNode, pbag: &PropertyBag<'_>) -> NodeResult {
         for (attr, value) in pbag.iter() {
diff --git a/rsvg_internals/src/link.rs b/rsvg_internals/src/link.rs
index b0cc189c..2e27f830 100644
--- a/rsvg_internals/src/link.rs
+++ b/rsvg_internals/src/link.rs
@@ -7,18 +7,11 @@ use crate::error::RenderingError;
 use crate::node::*;
 use crate::property_bag::PropertyBag;
 
+#[derive(Default)]
 pub struct NodeLink {
     link: RefCell<Option<String>>,
 }
 
-impl NodeLink {
-    pub fn new() -> NodeLink {
-        NodeLink {
-            link: RefCell::new(None),
-        }
-    }
-}
-
 impl NodeTrait for NodeLink {
     fn set_atts(&self, _: &RsvgNode, pbag: &PropertyBag<'_>) -> NodeResult {
         for (attr, value) in pbag.iter() {
diff --git a/rsvg_internals/src/marker.rs b/rsvg_internals/src/marker.rs
index 836db1c3..fbdf5f27 100644
--- a/rsvg_internals/src/marker.rs
+++ b/rsvg_internals/src/marker.rs
@@ -98,8 +98,8 @@ pub struct NodeMarker {
     vbox: Cell<Option<ViewBox>>,
 }
 
-impl NodeMarker {
-    pub fn new() -> NodeMarker {
+impl Default for NodeMarker {
+    fn default() -> NodeMarker {
         NodeMarker {
             units: Cell::new(MarkerUnits::default()),
             ref_x: Cell::new(Default::default()),
@@ -112,7 +112,9 @@ impl NodeMarker {
             vbox: Cell::new(None),
         }
     }
+}
 
+impl NodeMarker {
     fn render(
         &self,
         node: &RsvgNode,
diff --git a/rsvg_internals/src/mask.rs b/rsvg_internals/src/mask.rs
index ac002dd2..4fa59490 100644
--- a/rsvg_internals/src/mask.rs
+++ b/rsvg_internals/src/mask.rs
@@ -32,8 +32,8 @@ pub struct NodeMask {
     content_units: Cell<MaskContentUnits>,
 }
 
-impl NodeMask {
-    pub fn new() -> NodeMask {
+impl Default for NodeMask {
+    fn default() -> NodeMask {
         NodeMask {
             // these values are per the spec
             x: Cell::new(LengthHorizontal::parse_str("-10%").unwrap()),
@@ -46,7 +46,9 @@ impl NodeMask {
             content_units: Cell::new(MaskContentUnits::default()),
         }
     }
+}
 
+impl NodeMask {
     pub fn generate_cairo_mask(
         &self,
         mask_node: &RsvgNode,
diff --git a/rsvg_internals/src/pattern.rs b/rsvg_internals/src/pattern.rs
index a684a733..7723e31b 100644
--- a/rsvg_internals/src/pattern.rs
+++ b/rsvg_internals/src/pattern.rs
@@ -161,8 +161,8 @@ pub struct NodePattern {
     pattern: RefCell<Pattern>,
 }
 
-impl NodePattern {
-    pub fn new() -> NodePattern {
+impl Default for NodePattern {
+    fn default() -> NodePattern {
         NodePattern {
             pattern: RefCell::new(Pattern::unresolved()),
         }
diff --git a/rsvg_internals/src/shapes.rs b/rsvg_internals/src/shapes.rs
index fffba81f..439ef76d 100644
--- a/rsvg_internals/src/shapes.rs
+++ b/rsvg_internals/src/shapes.rs
@@ -109,18 +109,11 @@ fn render_ellipse(
     render_path_builder(&builder, draw_ctx, node, values, false, clipping)
 }
 
+#[derive(Default)]
 pub struct NodePath {
     builder: RefCell<Option<PathBuilder>>,
 }
 
-impl NodePath {
-    pub fn new() -> NodePath {
-        NodePath {
-            builder: RefCell::new(None),
-        }
-    }
-}
-
 impl NodeTrait for NodePath {
     fn set_atts(&self, node: &RsvgNode, pbag: &PropertyBag<'_>) -> NodeResult {
         for (attr, value) in pbag.iter() {
@@ -267,6 +260,7 @@ impl NodeTrait for NodePoly {
     }
 }
 
+#[derive(Default)]
 pub struct NodeLine {
     x1: Cell<LengthHorizontal>,
     y1: Cell<LengthVertical>,
@@ -274,17 +268,6 @@ pub struct NodeLine {
     y2: Cell<LengthVertical>,
 }
 
-impl NodeLine {
-    pub fn new() -> NodeLine {
-        NodeLine {
-            x1: Cell::new(Default::default()),
-            y1: Cell::new(Default::default()),
-            x2: Cell::new(Default::default()),
-            y2: Cell::new(Default::default()),
-        }
-    }
-}
-
 impl NodeTrait for NodeLine {
     fn set_atts(&self, _: &RsvgNode, pbag: &PropertyBag<'_>) -> NodeResult {
         for (attr, value) in pbag.iter() {
@@ -325,6 +308,7 @@ impl NodeTrait for NodeLine {
     }
 }
 
+#[derive(Default)]
 pub struct NodeRect {
     // x, y, width, height
     x: Cell<LengthHorizontal>,
@@ -337,20 +321,6 @@ pub struct NodeRect {
     ry: Cell<Option<LengthVertical>>,
 }
 
-impl NodeRect {
-    pub fn new() -> NodeRect {
-        NodeRect {
-            x: Cell::new(Default::default()),
-            y: Cell::new(Default::default()),
-            w: Cell::new(Default::default()),
-            h: Cell::new(Default::default()),
-
-            rx: Cell::new(None),
-            ry: Cell::new(None),
-        }
-    }
-}
-
 impl NodeTrait for NodeRect {
     fn set_atts(&self, _: &RsvgNode, pbag: &PropertyBag<'_>) -> NodeResult {
         for (attr, value) in pbag.iter() {
@@ -559,22 +529,13 @@ impl NodeTrait for NodeRect {
     }
 }
 
+#[derive(Default)]
 pub struct NodeCircle {
     cx: Cell<LengthHorizontal>,
     cy: Cell<LengthVertical>,
     r: Cell<LengthBoth>,
 }
 
-impl NodeCircle {
-    pub fn new() -> NodeCircle {
-        NodeCircle {
-            cx: Cell::new(Default::default()),
-            cy: Cell::new(Default::default()),
-            r: Cell::new(Default::default()),
-        }
-    }
-}
-
 impl NodeTrait for NodeCircle {
     fn set_atts(&self, _: &RsvgNode, pbag: &PropertyBag<'_>) -> NodeResult {
         for (attr, value) in pbag.iter() {
@@ -611,6 +572,7 @@ impl NodeTrait for NodeCircle {
     }
 }
 
+#[derive(Default)]
 pub struct NodeEllipse {
     cx: Cell<LengthHorizontal>,
     cy: Cell<LengthVertical>,
@@ -618,17 +580,6 @@ pub struct NodeEllipse {
     ry: Cell<LengthVertical>,
 }
 
-impl NodeEllipse {
-    pub fn new() -> NodeEllipse {
-        NodeEllipse {
-            cx: Cell::new(Default::default()),
-            cy: Cell::new(Default::default()),
-            rx: Cell::new(Default::default()),
-            ry: Cell::new(Default::default()),
-        }
-    }
-}
-
 impl NodeTrait for NodeEllipse {
     fn set_atts(&self, _: &RsvgNode, pbag: &PropertyBag<'_>) -> NodeResult {
         for (attr, value) in pbag.iter() {
diff --git a/rsvg_internals/src/stop.rs b/rsvg_internals/src/stop.rs
index 84f9bf6a..4274075d 100644
--- a/rsvg_internals/src/stop.rs
+++ b/rsvg_internals/src/stop.rs
@@ -7,17 +7,12 @@ use crate::parsers::ParseValue;
 use crate::property_bag::PropertyBag;
 use crate::unit_interval::UnitInterval;
 
+#[derive(Default)]
 pub struct NodeStop {
     offset: Cell<UnitInterval>,
 }
 
 impl NodeStop {
-    pub fn new() -> NodeStop {
-        NodeStop {
-            offset: Cell::new(UnitInterval(0.0)),
-        }
-    }
-
     pub fn get_offset(&self) -> UnitInterval {
         self.offset.get()
     }
diff --git a/rsvg_internals/src/structure.rs b/rsvg_internals/src/structure.rs
index b35e6f37..34ade742 100644
--- a/rsvg_internals/src/structure.rs
+++ b/rsvg_internals/src/structure.rs
@@ -19,14 +19,9 @@ use crate::rect::RectangleExt;
 use crate::tree_utils::Node;
 use crate::viewbox::*;
 
+#[derive(Default)]
 pub struct NodeGroup();
 
-impl NodeGroup {
-    pub fn new() -> NodeGroup {
-        NodeGroup()
-    }
-}
-
 impl NodeTrait for NodeGroup {
     fn set_atts(&self, _: &RsvgNode, _: &PropertyBag<'_>) -> NodeResult {
         Ok(())
@@ -51,28 +46,18 @@ impl NodeTrait for NodeGroup {
 ///
 /// Sometimes we just need a node that can contain children, but doesn't
 /// render itself or its children.  This is just that kind of node.
+#[derive(Default)]
 pub struct NodeNonRendering;
 
-impl NodeNonRendering {
-    pub fn new() -> NodeNonRendering {
-        NodeNonRendering
-    }
-}
-
 impl NodeTrait for NodeNonRendering {
     fn set_atts(&self, _: &RsvgNode, _: &PropertyBag<'_>) -> NodeResult {
         Ok(())
     }
 }
 
+#[derive(Default)]
 pub struct NodeSwitch();
 
-impl NodeSwitch {
-    pub fn new() -> NodeSwitch {
-        NodeSwitch()
-    }
-}
-
 impl NodeTrait for NodeSwitch {
     fn set_atts(&self, _: &RsvgNode, _: &PropertyBag<'_>) -> NodeResult {
         Ok(())
@@ -109,6 +94,7 @@ pub struct IntrinsicDimensions {
     pub vbox: Option<ViewBox>,
 }
 
+#[derive(Default)]
 pub struct NodeSvg {
     preserve_aspect_ratio: Cell<AspectRatio>,
     x: Cell<Option<LengthHorizontal>>,
@@ -119,17 +105,6 @@ pub struct NodeSvg {
 }
 
 impl NodeSvg {
-    pub fn new() -> NodeSvg {
-        NodeSvg {
-            preserve_aspect_ratio: Cell::new(AspectRatio::default()),
-            x: Cell::new(None),
-            y: Cell::new(None),
-            w: Cell::new(None),
-            h: Cell::new(None),
-            vbox: Cell::new(None),
-        }
-    }
-
     pub fn get_size(&self, values: &ComputedValues, dpi: Dpi) -> Option<(i32, i32)> {
         let (_, _, w, h) = self.get_unnormalized_viewport();
 
@@ -308,6 +283,7 @@ impl NodeTrait for NodeSvg {
     }
 }
 
+#[derive(Default)]
 pub struct NodeUse {
     link: RefCell<Option<Fragment>>,
     x: Cell<LengthHorizontal>,
@@ -316,18 +292,6 @@ pub struct NodeUse {
     h: Cell<Option<LengthVertical>>,
 }
 
-impl NodeUse {
-    pub fn new() -> NodeUse {
-        NodeUse {
-            link: RefCell::new(None),
-            x: Cell::new(Default::default()),
-            y: Cell::new(Default::default()),
-            w: Cell::new(None),
-            h: Cell::new(None),
-        }
-    }
-}
-
 impl NodeTrait for NodeUse {
     fn set_atts(&self, _: &RsvgNode, pbag: &PropertyBag<'_>) -> NodeResult {
         for (attr, value) in pbag.iter() {
@@ -458,20 +422,12 @@ impl NodeTrait for NodeUse {
     }
 }
 
+#[derive(Default)]
 pub struct NodeSymbol {
     preserve_aspect_ratio: Cell<AspectRatio>,
     vbox: Cell<Option<ViewBox>>,
 }
 
-impl NodeSymbol {
-    pub fn new() -> NodeSymbol {
-        NodeSymbol {
-            preserve_aspect_ratio: Cell::new(AspectRatio::default()),
-            vbox: Cell::new(None),
-        }
-    }
-}
-
 impl NodeTrait for NodeSymbol {
     fn set_atts(&self, _node: &RsvgNode, pbag: &PropertyBag<'_>) -> NodeResult {
         for (attr, value) in pbag.iter() {
diff --git a/rsvg_internals/src/style.rs b/rsvg_internals/src/style.rs
index 61e92576..baf2c2b4 100644
--- a/rsvg_internals/src/style.rs
+++ b/rsvg_internals/src/style.rs
@@ -8,17 +8,12 @@ use std::cell::RefCell;
 ///
 /// It does not render itself, and just holds CSS stylesheet information for the rest of
 /// the code to use.
+#[derive(Default)]
 pub struct NodeStyle {
     type_: RefCell<Option<String>>,
 }
 
 impl NodeStyle {
-    pub fn new() -> NodeStyle {
-        NodeStyle {
-            type_: RefCell::new(None),
-        }
-    }
-
     pub fn get_css(&self, node: &RsvgNode) -> String {
         // FIXME: See these:
         //
diff --git a/rsvg_internals/src/text.rs b/rsvg_internals/src/text.rs
index 5890f85c..c26f434b 100644
--- a/rsvg_internals/src/text.rs
+++ b/rsvg_internals/src/text.rs
@@ -558,6 +558,7 @@ impl NodeTrait for NodeChars {
     }
 }
 
+#[derive(Default)]
 pub struct NodeText {
     x: Cell<LengthHorizontal>,
     y: Cell<LengthVertical>,
@@ -566,15 +567,6 @@ pub struct NodeText {
 }
 
 impl NodeText {
-    pub fn new() -> NodeText {
-        NodeText {
-            x: Cell::new(Default::default()),
-            y: Cell::new(Default::default()),
-            dx: Cell::new(None),
-            dy: Cell::new(None),
-        }
-    }
-
     fn make_chunks(
         &self,
         node: &RsvgNode,
@@ -659,17 +651,12 @@ impl NodeTrait for NodeText {
     }
 }
 
+#[derive(Default)]
 pub struct NodeTRef {
     link: RefCell<Option<Fragment>>,
 }
 
 impl NodeTRef {
-    pub fn new() -> NodeTRef {
-        NodeTRef {
-            link: RefCell::new(Default::default()),
-        }
-    }
-
     fn to_chunks(
         &self,
         node: &RsvgNode,
@@ -732,6 +719,7 @@ impl NodeTrait for NodeTRef {
     }
 }
 
+#[derive(Default)]
 pub struct NodeTSpan {
     x: Cell<Option<LengthHorizontal>>,
     y: Cell<Option<LengthVertical>>,
@@ -740,15 +728,6 @@ pub struct NodeTSpan {
 }
 
 impl NodeTSpan {
-    pub fn new() -> NodeTSpan {
-        NodeTSpan {
-            x: Cell::new(Default::default()),
-            y: Cell::new(Default::default()),
-            dx: Cell::new(None),
-            dy: Cell::new(None),
-        }
-    }
-
     fn to_chunks(
         &self,
         node: &RsvgNode,
diff --git a/rsvg_internals/src/unit_interval.rs b/rsvg_internals/src/unit_interval.rs
index 8befc2ee..cd9d4491 100644
--- a/rsvg_internals/src/unit_interval.rs
+++ b/rsvg_internals/src/unit_interval.rs
@@ -4,7 +4,7 @@ use crate::error::*;
 use crate::parsers::{CssParserExt, Parse, ParseError};
 use crate::util;
 
-#[derive(Debug, Copy, Clone, PartialEq, PartialOrd)]
+#[derive(Debug, Default, Copy, Clone, PartialEq, PartialOrd)]
 pub struct UnitInterval(pub f64);
 
 impl UnitInterval {


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