diff options
author | Federico Mena Quintero <federico@gnome.org> | 2023-02-22 13:11:25 -0600 |
---|---|---|
committer | Federico Mena Quintero <federico@gnome.org> | 2023-02-23 18:32:03 -0600 |
commit | 9688c442880e848302d1ee32c73c273767539bf5 (patch) | |
tree | d4a205ac95260e797956494f483c799684bcbc61 | |
parent | 4f6d309b096f43a3f1e65fc9a734ded443e06e21 (diff) | |
download | librsvg-9688c442880e848302d1ee32c73c273767539bf5.tar.gz |
Combine the traits SetAttributes and Draw back into a single ElementTrait
This more or less reverts 6608c133d501bca6ffe2d1288539c91882fe5bdb,
with this purpose:
Right now, ElementInner<T> produces a lot of monomorphized code.
E.g. there are 28 implementations of this:
0.0% 0.0% 825B librsvg librsvg::element::ElementInner<T>::set_style_attribute
0.0% 0.0% 825B librsvg librsvg::element::ElementInner<T>::set_style_attribute
0.0% 0.0% 825B librsvg librsvg::element::ElementInner<T>::set_style_attribute
0.0% 0.0% 825B librsvg librsvg::element::ElementInner<T>::set_style_attribute
0.0% 0.0% 825B librsvg librsvg::element::ElementInner<T>::set_style_attribute
(The above comes from "cargo bloat --release -n 0 --filter librsvg".)
Inside ElementInner, I want to basically have a field
"element_impl: Box<dyn ElementTrait>" instead of "element_impl: T".
This should cut down the generated code, so we are basically trading
cache locality or code size for a little dynamic dispatch.
Part-of: <https://gitlab.gnome.org/GNOME/librsvg/-/merge_requests/801>
-rw-r--r-- | src/element.rs | 48 | ||||
-rw-r--r-- | src/filter.rs | 6 | ||||
-rw-r--r-- | src/filters/blend.rs | 4 | ||||
-rw-r--r-- | src/filters/color_matrix.rs | 4 | ||||
-rw-r--r-- | src/filters/component_transfer.rs | 8 | ||||
-rw-r--r-- | src/filters/composite.rs | 4 | ||||
-rw-r--r-- | src/filters/convolve_matrix.rs | 4 | ||||
-rw-r--r-- | src/filters/displacement_map.rs | 4 | ||||
-rw-r--r-- | src/filters/drop_shadow.rs | 4 | ||||
-rw-r--r-- | src/filters/flood.rs | 4 | ||||
-rw-r--r-- | src/filters/gaussian_blur.rs | 4 | ||||
-rw-r--r-- | src/filters/image.rs | 4 | ||||
-rw-r--r-- | src/filters/lighting.rs | 18 | ||||
-rw-r--r-- | src/filters/merge.rs | 9 | ||||
-rw-r--r-- | src/filters/mod.rs | 7 | ||||
-rw-r--r-- | src/filters/morphology.rs | 4 | ||||
-rw-r--r-- | src/filters/offset.rs | 4 | ||||
-rw-r--r-- | src/filters/tile.rs | 4 | ||||
-rw-r--r-- | src/filters/turbulence.rs | 4 | ||||
-rw-r--r-- | src/gradient.rs | 14 | ||||
-rw-r--r-- | src/image.rs | 6 | ||||
-rw-r--r-- | src/marker.rs | 6 | ||||
-rw-r--r-- | src/pattern.rs | 6 | ||||
-rw-r--r-- | src/shapes.rs | 66 | ||||
-rw-r--r-- | src/structure.rs | 44 | ||||
-rw-r--r-- | src/style.rs | 6 | ||||
-rw-r--r-- | src/text.rs | 14 |
27 files changed, 129 insertions, 181 deletions
diff --git a/src/element.rs b/src/element.rs index 2ee4e693..4d97c454 100644 --- a/src/element.rs +++ b/src/element.rs @@ -46,7 +46,7 @@ use crate::style::Style; use crate::text::{TRef, TSpan, Text}; use crate::xml::Attributes; -pub trait SetAttributes { +pub trait ElementTrait { /// Sets per-element attributes. /// /// Each element is supposed to iterate the `attributes`, and parse any ones it needs. @@ -55,11 +55,26 @@ pub trait SetAttributes { /// /// You can use the [`set_attribute`] function to do that. fn set_attributes(&mut self, _attributes: &Attributes, _session: &Session) {} + + /// Draw an element. + /// + /// Each element is supposed to draw itself as needed. + fn draw( + &self, + _node: &Node, + _acquired_nodes: &mut AcquiredNodes<'_>, + _cascaded: &CascadedValues<'_>, + draw_ctx: &mut DrawingCtx, + _clipping: bool, + ) -> Result<BoundingBox, RenderingError> { + // by default elements don't draw themselves + Ok(draw_ctx.empty_bbox()) + } } /// Sets `dest` if `parse_result` is `Ok()`, otherwise just logs the error. /// -/// Implementations of the [`SetAttributes`] trait generally scan a list of attributes +/// Implementations of the [`ElementTrait`] trait generally scan a list of attributes /// for the ones they can handle, and parse their string values. Per the SVG spec, an attribute /// with an invalid value should be ignored, and it should fall back to the default value. /// @@ -80,24 +95,7 @@ pub fn set_attribute<T>(dest: &mut T, parse_result: Result<T, ElementError>, ses } } -pub trait Draw { - /// Draw an element - /// - /// Each element is supposed to draw itself as needed. - fn draw( - &self, - _node: &Node, - _acquired_nodes: &mut AcquiredNodes<'_>, - _cascaded: &CascadedValues<'_>, - draw_ctx: &mut DrawingCtx, - _clipping: bool, - ) -> Result<BoundingBox, RenderingError> { - // by default elements don't draw themselves - Ok(draw_ctx.empty_bbox()) - } -} - -pub struct ElementInner<T: SetAttributes + Draw> { +pub struct ElementInner<T: ElementTrait> { element_name: QualName, attributes: Attributes, specified_values: SpecifiedValues, @@ -109,7 +107,7 @@ pub struct ElementInner<T: SetAttributes + Draw> { pub element_impl: T, } -impl<T: SetAttributes + Draw> ElementInner<T> { +impl<T: ElementTrait> ElementInner<T> { fn new( session: &Session, element_name: QualName, @@ -238,7 +236,7 @@ impl<T: SetAttributes + Draw> ElementInner<T> { } } -impl<T: SetAttributes + Draw> Draw for ElementInner<T> { +impl<T: ElementTrait> ElementTrait for ElementInner<T> { fn draw( &self, node: &Node, @@ -257,7 +255,7 @@ impl<T: SetAttributes + Draw> Draw for ElementInner<T> { } } -impl<T: SetAttributes + Draw> fmt::Display for ElementInner<T> { +impl<T: ElementTrait> fmt::Display for ElementInner<T> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{}", self.element_name().local)?; write!(f, " id={}", self.get_id().unwrap_or("None"))?; @@ -265,7 +263,7 @@ impl<T: SetAttributes + Draw> fmt::Display for ElementInner<T> { } } -impl<T: SetAttributes + Draw> Deref for ElementInner<T> { +impl<T: ElementTrait> Deref for ElementInner<T> { type Target = T; #[inline] @@ -528,7 +526,7 @@ impl Element { } } -impl Draw for Element { +impl ElementTrait for Element { fn draw( &self, node: &Node, diff --git a/src/filter.rs b/src/filter.rs index 9f7d5312..cbe0e038 100644 --- a/src/filter.rs +++ b/src/filter.rs @@ -7,7 +7,7 @@ use std::slice::Iter; use crate::coord_units::CoordUnits; use crate::document::{AcquiredNodes, NodeId}; use crate::drawing_ctx::{DrawingCtx, ViewParams}; -use crate::element::{set_attribute, Draw, Element, SetAttributes}; +use crate::element::{set_attribute, Element, ElementTrait}; use crate::error::ValueErrorKind; use crate::filter_func::FilterFunction; use crate::filters::{FilterResolveError, FilterSpec}; @@ -70,7 +70,7 @@ impl Filter { } } -impl SetAttributes for Filter { +impl ElementTrait for Filter { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { for (attr, value) in attrs.iter() { match attr.expanded() { @@ -94,8 +94,6 @@ impl SetAttributes for Filter { } } -impl Draw for Filter {} - #[derive(Debug, Clone, PartialEq)] pub enum FilterValue { Url(NodeId), diff --git a/src/filters/blend.rs b/src/filters/blend.rs index 28a8be25..30b0bdf7 100644 --- a/src/filters/blend.rs +++ b/src/filters/blend.rs @@ -3,7 +3,7 @@ use markup5ever::{expanded_name, local_name, namespace_url, ns}; use crate::document::AcquiredNodes; use crate::drawing_ctx::DrawingCtx; -use crate::element::{set_attribute, SetAttributes}; +use crate::element::{set_attribute, ElementTrait}; use crate::error::*; use crate::node::{CascadedValues, Node}; use crate::parsers::{Parse, ParseValue}; @@ -59,7 +59,7 @@ pub struct Blend { color_interpolation_filters: ColorInterpolationFilters, } -impl SetAttributes for FeBlend { +impl ElementTrait for FeBlend { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { let (in1, in2) = self.base.parse_two_inputs(attrs, session); self.params.in1 = in1; diff --git a/src/filters/color_matrix.rs b/src/filters/color_matrix.rs index b06cac1f..3701b541 100644 --- a/src/filters/color_matrix.rs +++ b/src/filters/color_matrix.rs @@ -4,7 +4,7 @@ use nalgebra::{Matrix3, Matrix4x5, Matrix5, Vector5}; use crate::document::AcquiredNodes; use crate::drawing_ctx::DrawingCtx; -use crate::element::{set_attribute, SetAttributes}; +use crate::element::{set_attribute, ElementTrait}; use crate::error::*; use crate::node::{CascadedValues, Node}; use crate::parsers::{NumberList, Parse, ParseValue}; @@ -62,7 +62,7 @@ impl Default for ColorMatrix { } } -impl SetAttributes for FeColorMatrix { +impl ElementTrait for FeColorMatrix { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { self.params.in1 = self.base.parse_one_input(attrs, session); diff --git a/src/filters/component_transfer.rs b/src/filters/component_transfer.rs index cd54db2c..c2620622 100644 --- a/src/filters/component_transfer.rs +++ b/src/filters/component_transfer.rs @@ -5,7 +5,7 @@ use markup5ever::{expanded_name, local_name, namespace_url, ns}; use crate::document::AcquiredNodes; use crate::drawing_ctx::DrawingCtx; -use crate::element::{set_attribute, Draw, Element, SetAttributes}; +use crate::element::{set_attribute, Element, ElementTrait}; use crate::error::*; use crate::node::{CascadedValues, Node, NodeBorrow}; use crate::parsers::{NumberList, Parse, ParseValue}; @@ -40,7 +40,7 @@ pub struct ComponentTransfer { pub color_interpolation_filters: ColorInterpolationFilters, } -impl SetAttributes for FeComponentTransfer { +impl ElementTrait for FeComponentTransfer { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { self.params.in1 = self.base.parse_one_input(attrs, session); } @@ -171,13 +171,11 @@ macro_rules! impl_func { #[derive(Clone, Debug, Default, PartialEq)] pub struct $name(pub FeFuncCommon); - impl SetAttributes for $name { + impl ElementTrait for $name { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { self.0.set_attributes(attrs, session); } } - - impl Draw for $name {} }; } diff --git a/src/filters/composite.rs b/src/filters/composite.rs index 2be0e261..c5c02af1 100644 --- a/src/filters/composite.rs +++ b/src/filters/composite.rs @@ -3,7 +3,7 @@ use markup5ever::{expanded_name, local_name, namespace_url, ns}; use crate::document::AcquiredNodes; use crate::drawing_ctx::DrawingCtx; -use crate::element::{set_attribute, SetAttributes}; +use crate::element::{set_attribute, ElementTrait}; use crate::error::*; use crate::node::{CascadedValues, Node}; use crate::parsers::{Parse, ParseValue}; @@ -53,7 +53,7 @@ pub struct Composite { pub color_interpolation_filters: ColorInterpolationFilters, } -impl SetAttributes for FeComposite { +impl ElementTrait for FeComposite { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { let (in1, in2) = self.base.parse_two_inputs(attrs, session); self.params.in1 = in1; diff --git a/src/filters/convolve_matrix.rs b/src/filters/convolve_matrix.rs index 4a78c671..096ad043 100644 --- a/src/filters/convolve_matrix.rs +++ b/src/filters/convolve_matrix.rs @@ -4,7 +4,7 @@ use nalgebra::{DMatrix, Dyn, VecStorage}; use crate::document::AcquiredNodes; use crate::drawing_ctx::DrawingCtx; -use crate::element::{set_attribute, SetAttributes}; +use crate::element::{set_attribute, ElementTrait}; use crate::error::*; use crate::node::{CascadedValues, Node}; use crate::parsers::{NumberList, NumberOptionalNumber, Parse, ParseValue}; @@ -69,7 +69,7 @@ impl Default for ConvolveMatrix { } } -impl SetAttributes for FeConvolveMatrix { +impl ElementTrait for FeConvolveMatrix { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { self.params.in1 = self.base.parse_one_input(attrs, session); diff --git a/src/filters/displacement_map.rs b/src/filters/displacement_map.rs index 773a3135..f0cead68 100644 --- a/src/filters/displacement_map.rs +++ b/src/filters/displacement_map.rs @@ -3,7 +3,7 @@ use markup5ever::{expanded_name, local_name, namespace_url, ns}; use crate::document::AcquiredNodes; use crate::drawing_ctx::DrawingCtx; -use crate::element::{set_attribute, SetAttributes}; +use crate::element::{set_attribute, ElementTrait}; use crate::error::*; use crate::node::{CascadedValues, Node}; use crate::parsers::{Parse, ParseValue}; @@ -49,7 +49,7 @@ pub struct DisplacementMap { color_interpolation_filters: ColorInterpolationFilters, } -impl SetAttributes for FeDisplacementMap { +impl ElementTrait for FeDisplacementMap { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { let (in1, in2) = self.base.parse_two_inputs(attrs, session); self.params.in1 = in1; diff --git a/src/filters/drop_shadow.rs b/src/filters/drop_shadow.rs index 3969d5e5..49abb574 100644 --- a/src/filters/drop_shadow.rs +++ b/src/filters/drop_shadow.rs @@ -1,7 +1,7 @@ use markup5ever::{expanded_name, local_name, namespace_url, ns}; use crate::document::AcquiredNodes; -use crate::element::{set_attribute, SetAttributes}; +use crate::element::{set_attribute, ElementTrait}; use crate::filter_func::drop_shadow_primitives; use crate::node::{CascadedValues, Node}; use crate::paint_server::resolve_color; @@ -39,7 +39,7 @@ impl Default for DropShadow { } } -impl SetAttributes for FeDropShadow { +impl ElementTrait for FeDropShadow { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { self.params.in1 = self.base.parse_one_input(attrs, session); diff --git a/src/filters/flood.rs b/src/filters/flood.rs index cd158f62..4ebf0257 100644 --- a/src/filters/flood.rs +++ b/src/filters/flood.rs @@ -1,6 +1,6 @@ use crate::document::AcquiredNodes; use crate::drawing_ctx::DrawingCtx; -use crate::element::SetAttributes; +use crate::element::ElementTrait; use crate::node::{CascadedValues, Node}; use crate::paint_server::resolve_color; use crate::rect::IRect; @@ -24,7 +24,7 @@ pub struct Flood { pub color: cssparser::RGBA, } -impl SetAttributes for FeFlood { +impl ElementTrait for FeFlood { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { self.base.parse_no_inputs(attrs, session); } diff --git a/src/filters/gaussian_blur.rs b/src/filters/gaussian_blur.rs index 33644354..b56fc9ef 100644 --- a/src/filters/gaussian_blur.rs +++ b/src/filters/gaussian_blur.rs @@ -6,7 +6,7 @@ use nalgebra::{DMatrix, Dyn, VecStorage}; use crate::document::AcquiredNodes; use crate::drawing_ctx::DrawingCtx; -use crate::element::{set_attribute, SetAttributes}; +use crate::element::{set_attribute, ElementTrait}; use crate::node::{CascadedValues, Node}; use crate::parsers::{NumberOptionalNumber, ParseValue}; use crate::properties::ColorInterpolationFilters; @@ -56,7 +56,7 @@ impl Default for GaussianBlur { } } -impl SetAttributes for FeGaussianBlur { +impl ElementTrait for FeGaussianBlur { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { self.params.in1 = self.base.parse_one_input(attrs, session); diff --git a/src/filters/image.rs b/src/filters/image.rs index c3f19c8f..eaeb08f9 100644 --- a/src/filters/image.rs +++ b/src/filters/image.rs @@ -3,7 +3,7 @@ use markup5ever::{expanded_name, local_name, namespace_url, ns}; use crate::aspect_ratio::AspectRatio; use crate::document::{AcquiredNodes, NodeId}; use crate::drawing_ctx::DrawingCtx; -use crate::element::{set_attribute, SetAttributes}; +use crate::element::{set_attribute, ElementTrait}; use crate::href::{is_href, set_href}; use crate::node::{CascadedValues, Node}; use crate::parsers::ParseValue; @@ -115,7 +115,7 @@ impl Image { } } -impl SetAttributes for FeImage { +impl ElementTrait for FeImage { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { self.base.parse_no_inputs(attrs, session); diff --git a/src/filters/lighting.rs b/src/filters/lighting.rs index 6a0b52ee..0f208d5c 100644 --- a/src/filters/lighting.rs +++ b/src/filters/lighting.rs @@ -9,7 +9,7 @@ use std::cmp::max; use crate::document::AcquiredNodes; use crate::drawing_ctx::DrawingCtx; -use crate::element::{set_attribute, Draw, Element, SetAttributes}; +use crate::element::{set_attribute, Element, ElementTrait}; use crate::filters::{ bounds::BoundsBuilder, context::{FilterContext, FilterOutput}, @@ -213,7 +213,7 @@ impl FeDistantLight { } } -impl SetAttributes for FeDistantLight { +impl ElementTrait for FeDistantLight { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { for (attr, value) in attrs.iter() { match attr.expanded() { @@ -229,8 +229,6 @@ impl SetAttributes for FeDistantLight { } } -impl Draw for FeDistantLight {} - #[derive(Clone, Debug, Default, PartialEq)] pub struct FePointLight { x: f64, @@ -249,7 +247,7 @@ impl FePointLight { } } -impl SetAttributes for FePointLight { +impl ElementTrait for FePointLight { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { for (attr, value) in attrs.iter() { match attr.expanded() { @@ -262,8 +260,6 @@ impl SetAttributes for FePointLight { } } -impl Draw for FePointLight {} - #[derive(Clone, Debug, PartialEq)] pub struct FeSpotLight { x: f64, @@ -314,7 +310,7 @@ impl FeSpotLight { } } -impl SetAttributes for FeSpotLight { +impl ElementTrait for FeSpotLight { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { for (attr, value) in attrs.iter() { match attr.expanded() { @@ -345,15 +341,13 @@ impl SetAttributes for FeSpotLight { } } -impl Draw for FeSpotLight {} - /// Applies the `primitiveUnits` coordinate transformation to a non-x or y distance. #[inline] fn transform_dist(t: Transform, d: f64) -> f64 { d * (t.xx.powi(2) + t.yy.powi(2)).sqrt() / std::f64::consts::SQRT_2 } -impl SetAttributes for FeDiffuseLighting { +impl ElementTrait for FeDiffuseLighting { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { self.params.in1 = self.base.parse_one_input(attrs, session); @@ -407,7 +401,7 @@ impl DiffuseLighting { } } -impl SetAttributes for FeSpecularLighting { +impl ElementTrait for FeSpecularLighting { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { self.params.in1 = self.base.parse_one_input(attrs, session); diff --git a/src/filters/merge.rs b/src/filters/merge.rs index f76f9dd0..89dc831c 100644 --- a/src/filters/merge.rs +++ b/src/filters/merge.rs @@ -2,7 +2,7 @@ use markup5ever::{expanded_name, local_name, namespace_url, ns}; use crate::document::AcquiredNodes; use crate::drawing_ctx::DrawingCtx; -use crate::element::{set_attribute, Draw, Element, SetAttributes}; +use crate::element::{set_attribute, Element, ElementTrait}; use crate::node::{CascadedValues, Node, NodeBorrow}; use crate::parsers::ParseValue; use crate::properties::ColorInterpolationFilters; @@ -51,14 +51,13 @@ impl Default for FeMerge { } } -impl SetAttributes for FeMerge { +impl ElementTrait for FeMerge { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { self.base.parse_no_inputs(attrs, session); } } -impl SetAttributes for FeMergeNode { - #[inline] +impl ElementTrait for FeMergeNode { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { for (attr, value) in attrs.iter() { if let expanded_name!("", "in") = attr.expanded() { @@ -68,8 +67,6 @@ impl SetAttributes for FeMergeNode { } } -impl Draw for FeMergeNode {} - impl MergeNode { fn render( &self, diff --git a/src/filters/mod.rs b/src/filters/mod.rs index e6f4724e..f0fee772 100644 --- a/src/filters/mod.rs +++ b/src/filters/mod.rs @@ -8,7 +8,7 @@ use std::time::Instant; use crate::bbox::BoundingBox; use crate::document::AcquiredNodes; use crate::drawing_ctx::DrawingCtx; -use crate::element::{set_attribute, Draw, SetAttributes}; +use crate::element::{set_attribute, ElementTrait}; use crate::error::{ParseError, RenderingError}; use crate::filter::UserSpaceFilter; use crate::length::*; @@ -32,7 +32,7 @@ use self::error::FilterError; pub use self::error::FilterResolveError; /// A filter primitive interface. -pub trait FilterEffect: SetAttributes + Draw { +pub trait FilterEffect: ElementTrait { fn resolve( &self, acquired_nodes: &mut AcquiredNodes<'_>, @@ -40,9 +40,6 @@ pub trait FilterEffect: SetAttributes + Draw { ) -> Result<Vec<ResolvedPrimitive>, FilterResolveError>; } -// Filter Effects do not need to draw themselves -impl<T: FilterEffect> Draw for T {} - pub mod blend; pub mod color_matrix; pub mod component_transfer; diff --git a/src/filters/morphology.rs b/src/filters/morphology.rs index b69b01d4..1ff7ddaa 100644 --- a/src/filters/morphology.rs +++ b/src/filters/morphology.rs @@ -5,7 +5,7 @@ use markup5ever::{expanded_name, local_name, namespace_url, ns}; use crate::document::AcquiredNodes; use crate::drawing_ctx::DrawingCtx; -use crate::element::{set_attribute, SetAttributes}; +use crate::element::{set_attribute, ElementTrait}; use crate::error::*; use crate::node::Node; use crate::parsers::{NumberOptionalNumber, Parse, ParseValue}; @@ -61,7 +61,7 @@ impl Default for Morphology { } } -impl SetAttributes for FeMorphology { +impl ElementTrait for FeMorphology { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { self.params.in1 = self.base.parse_one_input(attrs, session); diff --git a/src/filters/offset.rs b/src/filters/offset.rs index 49a2be19..5b15b583 100644 --- a/src/filters/offset.rs +++ b/src/filters/offset.rs @@ -2,7 +2,7 @@ use markup5ever::{expanded_name, local_name, namespace_url, ns}; use crate::document::AcquiredNodes; use crate::drawing_ctx::DrawingCtx; -use crate::element::{set_attribute, SetAttributes}; +use crate::element::{set_attribute, ElementTrait}; use crate::node::Node; use crate::parsers::ParseValue; use crate::properties::ColorInterpolationFilters; @@ -32,7 +32,7 @@ pub struct Offset { pub dy: f64, } -impl SetAttributes for FeOffset { +impl ElementTrait for FeOffset { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { self.params.in1 = self.base.parse_one_input(attrs, session); diff --git a/src/filters/tile.rs b/src/filters/tile.rs index 358b996b..fb50ce81 100644 --- a/src/filters/tile.rs +++ b/src/filters/tile.rs @@ -1,6 +1,6 @@ use crate::document::AcquiredNodes; use crate::drawing_ctx::DrawingCtx; -use crate::element::SetAttributes; +use crate::element::ElementTrait; use crate::node::Node; use crate::properties::ColorInterpolationFilters; use crate::rect::IRect; @@ -27,7 +27,7 @@ pub struct Tile { in1: Input, } -impl SetAttributes for FeTile { +impl ElementTrait for FeTile { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { self.params.in1 = self.base.parse_one_input(attrs, session); } diff --git a/src/filters/turbulence.rs b/src/filters/turbulence.rs index 191c51ae..9e76a2a6 100644 --- a/src/filters/turbulence.rs +++ b/src/filters/turbulence.rs @@ -3,7 +3,7 @@ use markup5ever::{expanded_name, local_name, namespace_url, ns}; use crate::document::AcquiredNodes; use crate::drawing_ctx::DrawingCtx; -use crate::element::{set_attribute, SetAttributes}; +use crate::element::{set_attribute, ElementTrait}; use crate::error::*; use crate::node::{CascadedValues, Node}; use crate::parsers::{NumberOptionalNumber, Parse, ParseValue}; @@ -74,7 +74,7 @@ impl Default for Turbulence { } } -impl SetAttributes for FeTurbulence { +impl ElementTrait for FeTurbulence { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { self.base.parse_no_inputs(attrs, session); diff --git a/src/gradient.rs b/src/gradient.rs index 194a92c3..b242d147 100644 --- a/src/gradient.rs +++ b/src/gradient.rs @@ -8,7 +8,7 @@ use markup5ever::{ use crate::coord_units::CoordUnits; use crate::document::{AcquiredNodes, NodeId, NodeStack}; use crate::drawing_ctx::ViewParams; -use crate::element::{set_attribute, Draw, Element, SetAttributes}; +use crate::element::{set_attribute, Element, ElementTrait}; use crate::error::*; use crate::href::{is_href, set_href}; use crate::length::*; @@ -65,7 +65,7 @@ pub struct Stop { * they go into property_defs.rs */ } -impl SetAttributes for Stop { +impl ElementTrait for Stop { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { for (attr, value) in attrs.iter() { if attr.expanded() == expanded_name!("", "offset") { @@ -75,8 +75,6 @@ impl SetAttributes for Stop { } } -impl Draw for Stop {} - /// Parameters specific to each gradient type, before being resolved. /// These will be composed together with UnreseolvedVariant from fallback /// nodes (referenced with e.g. <linearGradient xlink:href="#fallback">) to form @@ -539,7 +537,7 @@ impl Common { } } -impl SetAttributes for LinearGradient { +impl ElementTrait for LinearGradient { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { self.common.set_attributes(attrs, session); @@ -556,8 +554,6 @@ impl SetAttributes for LinearGradient { } } -impl Draw for LinearGradient {} - macro_rules! impl_gradient { ($gradient_type:ident, $other_type:ident) => { impl $gradient_type { @@ -629,7 +625,7 @@ macro_rules! impl_gradient { impl_gradient!(LinearGradient, RadialGradient); impl_gradient!(RadialGradient, LinearGradient); -impl SetAttributes for RadialGradient { +impl ElementTrait for RadialGradient { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { self.common.set_attributes(attrs, session); @@ -657,8 +653,6 @@ impl SetAttributes for RadialGradient { } } -impl Draw for RadialGradient {} - impl ResolvedGradient { pub fn to_user_space( &self, diff --git a/src/image.rs b/src/image.rs index 97567d16..4ce6f1e1 100644 --- a/src/image.rs +++ b/src/image.rs @@ -6,7 +6,7 @@ use crate::aspect_ratio::AspectRatio; use crate::bbox::BoundingBox; use crate::document::AcquiredNodes; use crate::drawing_ctx::DrawingCtx; -use crate::element::{set_attribute, Draw, SetAttributes}; +use crate::element::{set_attribute, ElementTrait}; use crate::error::*; use crate::href::{is_href, set_href}; use crate::layout::{self, StackingContext}; @@ -27,7 +27,7 @@ pub struct Image { href: Option<String>, } -impl SetAttributes for Image { +impl ElementTrait for Image { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { for (attr, value) in attrs.iter() { match attr.expanded() { @@ -44,9 +44,7 @@ impl SetAttributes for Image { } } } -} -impl Draw for Image { fn draw( &self, node: &Node, diff --git a/src/marker.rs b/src/marker.rs index f95be8a2..62e3bb26 100644 --- a/src/marker.rs +++ b/src/marker.rs @@ -11,7 +11,7 @@ use crate::aspect_ratio::*; use crate::bbox::BoundingBox; use crate::document::AcquiredNodes; use crate::drawing_ctx::DrawingCtx; -use crate::element::{set_attribute, Draw, SetAttributes}; +use crate::element::{set_attribute, ElementTrait}; use crate::error::*; use crate::float_eq_cairo::ApproxEqCairo; use crate::layout::{self, Shape, StackingContext}; @@ -199,7 +199,7 @@ impl Marker { } } -impl SetAttributes for Marker { +impl ElementTrait for Marker { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { for (attr, value) in attrs.iter() { match attr.expanded() { @@ -233,8 +233,6 @@ impl SetAttributes for Marker { } } -impl Draw for Marker {} - // Machinery to figure out marker orientations #[derive(Debug, PartialEq)] enum Segment { diff --git a/src/pattern.rs b/src/pattern.rs index 8b47343c..e7b19755 100644 --- a/src/pattern.rs +++ b/src/pattern.rs @@ -6,7 +6,7 @@ use crate::aspect_ratio::*; use crate::coord_units::CoordUnits; use crate::document::{AcquiredNode, AcquiredNodes, NodeId, NodeStack}; use crate::drawing_ctx::ViewParams; -use crate::element::{set_attribute, Draw, Element, SetAttributes}; +use crate::element::{set_attribute, Element, ElementTrait}; use crate::error::*; use crate::href::{is_href, set_href}; use crate::length::*; @@ -123,7 +123,7 @@ pub struct Pattern { fallback: Option<NodeId>, } -impl SetAttributes for Pattern { +impl ElementTrait for Pattern { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { for (attr, value) in attrs.iter() { match attr.expanded() { @@ -173,8 +173,6 @@ impl SetAttributes for Pattern { } } -impl Draw for Pattern {} - impl UnresolvedPattern { fn into_resolved(self, opacity: UnitInterval) -> ResolvedPattern { assert!(self.is_resolved()); diff --git a/src/shapes.rs b/src/shapes.rs index c1e7287f..e92d1e85 100644 --- a/src/shapes.rs +++ b/src/shapes.rs @@ -9,7 +9,7 @@ use std::rc::Rc; use crate::bbox::BoundingBox; use crate::document::AcquiredNodes; use crate::drawing_ctx::DrawingCtx; -use crate::element::{set_attribute, Draw, SetAttributes}; +use crate::element::{set_attribute, ElementTrait}; use crate::error::*; use crate::iri::Iri; use crate::layout::{Marker, Shape, StackingContext, Stroke}; @@ -150,18 +150,16 @@ fn draw_basic_shape( } macro_rules! impl_draw { - ($name:ident) => { - impl Draw for $name { - fn draw( - &self, - node: &Node, - acquired_nodes: &mut AcquiredNodes<'_>, - cascaded: &CascadedValues<'_>, - draw_ctx: &mut DrawingCtx, - clipping: bool, - ) -> Result<BoundingBox, RenderingError> { - draw_basic_shape(self, node, acquired_nodes, cascaded, draw_ctx, clipping) - } + () => { + fn draw( + &self, + node: &Node, + acquired_nodes: &mut AcquiredNodes<'_>, + cascaded: &CascadedValues<'_>, + draw_ctx: &mut DrawingCtx, + clipping: bool, + ) -> Result<BoundingBox, RenderingError> { + draw_basic_shape(self, node, acquired_nodes, cascaded, draw_ctx, clipping) } }; } @@ -252,9 +250,7 @@ pub struct Path { path: Rc<SvgPath>, } -impl_draw!(Path); - -impl SetAttributes for Path { +impl ElementTrait for Path { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { for (attr, value) in attrs.iter() { if attr.expanded() == expanded_name!("", "d") { @@ -269,6 +265,8 @@ impl SetAttributes for Path { } } } + + impl_draw!(); } impl BasicShape for Path { @@ -341,9 +339,7 @@ pub struct Polygon { points: Points, } -impl_draw!(Polygon); - -impl SetAttributes for Polygon { +impl ElementTrait for Polygon { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { for (attr, value) in attrs.iter() { if attr.expanded() == expanded_name!("", "points") { @@ -351,6 +347,8 @@ impl SetAttributes for Polygon { } } } + + impl_draw!(); } impl BasicShape for Polygon { @@ -364,9 +362,7 @@ pub struct Polyline { points: Points, } -impl_draw!(Polyline); - -impl SetAttributes for Polyline { +impl ElementTrait for Polyline { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { for (attr, value) in attrs.iter() { if attr.expanded() == expanded_name!("", "points") { @@ -374,6 +370,8 @@ impl SetAttributes for Polyline { } } } + + impl_draw!(); } impl BasicShape for Polyline { @@ -390,9 +388,7 @@ pub struct Line { y2: Length<Vertical>, } -impl_draw!(Line); - -impl SetAttributes for Line { +impl ElementTrait for Line { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { for (attr, value) in attrs.iter() { match attr.expanded() { @@ -404,6 +400,8 @@ impl SetAttributes for Line { } } } + + impl_draw!(); } impl BasicShape for Line { @@ -429,9 +427,9 @@ impl BasicShape for Line { #[derive(Default)] pub struct Rect {} -impl_draw!(Rect); - -impl SetAttributes for Rect {} +impl ElementTrait for Rect { + impl_draw!(); +} impl BasicShape for Rect { #[allow(clippy::many_single_char_names)] @@ -622,9 +620,9 @@ impl BasicShape for Rect { #[derive(Default)] pub struct Circle {} -impl_draw!(Circle); - -impl SetAttributes for Circle {} +impl ElementTrait for Circle { + impl_draw!(); +} impl BasicShape for Circle { fn make_shape(&self, params: &NormalizeParams, values: &ComputedValues) -> ShapeDef { @@ -643,9 +641,9 @@ impl BasicShape for Circle { #[derive(Default)] pub struct Ellipse {} -impl_draw!(Ellipse); - -impl SetAttributes for Ellipse {} +impl ElementTrait for Ellipse { + impl_draw!(); +} impl BasicShape for Ellipse { fn make_shape(&self, params: &NormalizeParams, values: &ComputedValues) -> ShapeDef { diff --git a/src/structure.rs b/src/structure.rs index c7a3c729..88773a41 100644 --- a/src/structure.rs +++ b/src/structure.rs @@ -7,7 +7,7 @@ use crate::bbox::BoundingBox; use crate::coord_units::CoordUnits; use crate::document::{AcquiredNodes, NodeId}; use crate::drawing_ctx::{ClipMode, DrawingCtx, ViewParams}; -use crate::element::{set_attribute, Draw, Element, SetAttributes}; +use crate::element::{set_attribute, Element, ElementTrait}; use crate::error::*; use crate::href::{is_href, set_href}; use crate::layout::StackingContext; @@ -23,9 +23,7 @@ use crate::xml::Attributes; #[derive(Default)] pub struct Group(); -impl SetAttributes for Group {} - -impl Draw for Group { +impl ElementTrait for Group { fn draw( &self, node: &Node, @@ -63,16 +61,13 @@ impl Draw for Group { #[derive(Default)] pub struct NonRendering; -impl SetAttributes for NonRendering {} - -impl Draw for NonRendering {} +impl ElementTrait for NonRendering {} +/// The `<switch>` element. #[derive(Default)] pub struct Switch(); -impl SetAttributes for Switch {} - -impl Draw for Switch { +impl ElementTrait for Switch { fn draw( &self, node: &Node, @@ -273,7 +268,7 @@ impl Svg { } } -impl SetAttributes for Svg { +impl ElementTrait for Svg { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { for (attr, value) in attrs.iter() { match attr.expanded() { @@ -287,9 +282,7 @@ impl SetAttributes for Svg { } } } -} -impl Draw for Svg { fn draw( &self, node: &Node, @@ -323,6 +316,7 @@ impl Draw for Svg { } } +/// The `<use>` element. pub struct Use { link: Option<NodeId>, x: Length<Horizontal>, @@ -354,7 +348,7 @@ impl Default for Use { } } -impl SetAttributes for Use { +impl ElementTrait for Use { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { for (attr, value) in attrs.iter() { match attr.expanded() { @@ -379,9 +373,7 @@ impl SetAttributes for Use { } } } -} -impl Draw for Use { fn draw( &self, node: &Node, @@ -430,6 +422,7 @@ impl Draw for Use { } } +/// The `<symbol>` element. #[derive(Default)] pub struct Symbol { preserve_aspect_ratio: AspectRatio, @@ -446,7 +439,7 @@ impl Symbol { } } -impl SetAttributes for Symbol { +impl ElementTrait for Symbol { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { for (attr, value) in attrs.iter() { match attr.expanded() { @@ -462,10 +455,9 @@ impl SetAttributes for Symbol { } } -impl Draw for Symbol {} - coord_units!(ClipPathUnits, CoordUnits::UserSpaceOnUse); +/// The `<clipPath>` element. #[derive(Default)] pub struct ClipPath { units: ClipPathUnits, @@ -477,7 +469,7 @@ impl ClipPath { } } -impl SetAttributes for ClipPath { +impl ElementTrait for ClipPath { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { for (attr, value) in attrs.iter() { if attr.expanded() == expanded_name!("", "clipPathUnits") { @@ -487,11 +479,10 @@ impl SetAttributes for ClipPath { } } -impl Draw for ClipPath {} - coord_units!(MaskUnits, CoordUnits::ObjectBoundingBox); coord_units!(MaskContentUnits, CoordUnits::UserSpaceOnUse); +/// The `<mask>` element. pub struct Mask { x: Length<Horizontal>, y: Length<Vertical>, @@ -536,7 +527,7 @@ impl Mask { } } -impl SetAttributes for Mask { +impl ElementTrait for Mask { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { for (attr, value) in attrs.iter() { match attr.expanded() { @@ -560,14 +551,13 @@ impl SetAttributes for Mask { } } -impl Draw for Mask {} - +/// The `<a>` element. #[derive(Default)] pub struct Link { pub link: Option<String>, } -impl SetAttributes for Link { +impl ElementTrait for Link { fn set_attributes(&mut self, attrs: &Attributes, _session: &Session) { for (attr, value) in attrs.iter() { let expanded = attr.expanded(); @@ -576,9 +566,7 @@ impl SetAttributes for Link { } } } -} -impl Draw for Link { fn draw( &self, node: &Node, diff --git a/src/style.rs b/src/style.rs index 5c1ffb39..29e65d78 100644 --- a/src/style.rs +++ b/src/style.rs @@ -2,7 +2,7 @@ use markup5ever::{expanded_name, local_name, namespace_url, ns}; -use crate::element::{set_attribute, Draw, SetAttributes}; +use crate::element::{set_attribute, ElementTrait}; use crate::error::*; use crate::session::Session; use crate::xml::Attributes; @@ -53,7 +53,7 @@ impl Style { } } -impl SetAttributes for Style { +impl ElementTrait for Style { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { for (attr, value) in attrs.iter() { if attr.expanded() == expanded_name!("", "type") { @@ -67,8 +67,6 @@ impl SetAttributes for Style { } } -impl Draw for Style {} - #[cfg(test)] mod tests { use super::*; diff --git a/src/text.rs b/src/text.rs index 29d1ccd1..47e87d2b 100644 --- a/src/text.rs +++ b/src/text.rs @@ -10,7 +10,7 @@ use std::sync::Arc; use crate::bbox::BoundingBox; use crate::document::{AcquiredNodes, NodeId}; use crate::drawing_ctx::{create_pango_context, DrawingCtx, FontOptions, ViewParams}; -use crate::element::{set_attribute, Draw, Element, SetAttributes}; +use crate::element::{set_attribute, Element, ElementTrait}; use crate::error::*; use crate::layout::{self, FontProperties, StackingContext, Stroke, TextSpan}; use crate::length::*; @@ -748,7 +748,7 @@ impl Text { } } -impl SetAttributes for Text { +impl ElementTrait for Text { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { for (attr, value) in attrs.iter() { match attr.expanded() { @@ -760,9 +760,7 @@ impl SetAttributes for Text { } } } -} -impl Draw for Text { fn draw( &self, node: &Node, @@ -939,7 +937,7 @@ fn extract_chars_children_to_chunks_recursively( } } -impl SetAttributes for TRef { +impl ElementTrait for TRef { fn set_attributes(&mut self, attrs: &Attributes, _session: &Session) { self.link = attrs .iter() @@ -951,8 +949,6 @@ impl SetAttributes for TRef { } } -impl Draw for TRef {} - #[derive(Default)] pub struct TSpan { x: Option<Length<Horizontal>>, @@ -1005,7 +1001,7 @@ impl TSpan { } } -impl SetAttributes for TSpan { +impl ElementTrait for TSpan { fn set_attributes(&mut self, attrs: &Attributes, session: &Session) { for (attr, value) in attrs.iter() { match attr.expanded() { @@ -1019,8 +1015,6 @@ impl SetAttributes for TSpan { } } -impl Draw for TSpan {} - impl From<FontStyle> for pango::Style { fn from(s: FontStyle) -> pango::Style { match s { |