summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFederico Mena Quintero <federico@gnome.org>2023-02-22 13:11:25 -0600
committerFederico Mena Quintero <federico@gnome.org>2023-02-23 18:32:03 -0600
commit9688c442880e848302d1ee32c73c273767539bf5 (patch)
treed4a205ac95260e797956494f483c799684bcbc61
parent4f6d309b096f43a3f1e65fc9a734ded443e06e21 (diff)
downloadlibrsvg-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.rs48
-rw-r--r--src/filter.rs6
-rw-r--r--src/filters/blend.rs4
-rw-r--r--src/filters/color_matrix.rs4
-rw-r--r--src/filters/component_transfer.rs8
-rw-r--r--src/filters/composite.rs4
-rw-r--r--src/filters/convolve_matrix.rs4
-rw-r--r--src/filters/displacement_map.rs4
-rw-r--r--src/filters/drop_shadow.rs4
-rw-r--r--src/filters/flood.rs4
-rw-r--r--src/filters/gaussian_blur.rs4
-rw-r--r--src/filters/image.rs4
-rw-r--r--src/filters/lighting.rs18
-rw-r--r--src/filters/merge.rs9
-rw-r--r--src/filters/mod.rs7
-rw-r--r--src/filters/morphology.rs4
-rw-r--r--src/filters/offset.rs4
-rw-r--r--src/filters/tile.rs4
-rw-r--r--src/filters/turbulence.rs4
-rw-r--r--src/gradient.rs14
-rw-r--r--src/image.rs6
-rw-r--r--src/marker.rs6
-rw-r--r--src/pattern.rs6
-rw-r--r--src/shapes.rs66
-rw-r--r--src/structure.rs44
-rw-r--r--src/style.rs6
-rw-r--r--src/text.rs14
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 {