diff options
author | Federico Mena Quintero <federico@gnome.org> | 2022-10-05 21:03:08 -0500 |
---|---|---|
committer | Federico Mena Quintero <federico@gnome.org> | 2022-10-06 19:14:26 -0500 |
commit | f96bb8029313907f7bb1781dc18ed8996b9e78bc (patch) | |
tree | 41a043aee9a32151413340d82dc06ce0e0658f0e | |
parent | 51bd20e63a38e97eec36d239df7666fa95afc0ec (diff) | |
download | librsvg-f96bb8029313907f7bb1781dc18ed8996b9e78bc.tar.gz |
PaintSource::to_user_space() - take an Option<Rect>, not a whole BoundingBox
Let's see if we can make layout::Shape carry user-space paint sources
instead of just the unnormalized PaintSource.
Part-of: <https://gitlab.gnome.org/GNOME/librsvg/-/merge_requests/757>
-rw-r--r-- | src/drawing_ctx.rs | 16 | ||||
-rw-r--r-- | src/gradient.rs | 7 | ||||
-rw-r--r-- | src/paint_server.rs | 8 | ||||
-rw-r--r-- | src/pattern.rs | 11 | ||||
-rw-r--r-- | src/text.rs | 4 |
5 files changed, 25 insertions, 21 deletions
diff --git a/src/drawing_ctx.rs b/src/drawing_ctx.rs index 9dd6b66c..c2b670b5 100644 --- a/src/drawing_ctx.rs +++ b/src/drawing_ctx.rs @@ -808,7 +808,7 @@ impl DrawingCtx { None, self.session(), ) - .to_user_space(&bbox, ¶ms, values), + .to_user_space(&bbox.rect, ¶ms, values), ); let fill_paint_source = Rc::new( @@ -823,7 +823,7 @@ impl DrawingCtx { None, self.session(), ) - .to_user_space(&bbox, ¶ms, values), + .to_user_space(&bbox.rect, ¶ms, values), ); // Filter functions (like "blend()", not the <filter> element) require @@ -1280,7 +1280,7 @@ impl DrawingCtx { values: &ComputedValues, clipping: bool, ) -> Result<BoundingBox, RenderingError> { - if shape.path.is_empty() { + if shape.extents.is_none() { return Ok(self.empty_bbox()); } @@ -1317,8 +1317,14 @@ impl DrawingCtx { &dc.initial_viewport, )?; - let stroke_paint = shape.stroke_paint.to_user_space(&bbox, view_params, values); - let fill_paint = shape.fill_paint.to_user_space(&bbox, view_params, values); + let stroke_paint = + shape + .stroke_paint + .to_user_space(&shape.extents, view_params, values); + let fill_paint = + shape + .fill_paint + .to_user_space(&shape.extents, view_params, values); if shape.is_visible { for &target in &shape.paint_order.targets { diff --git a/src/gradient.rs b/src/gradient.rs index f0becdda..6c3e8ff5 100644 --- a/src/gradient.rs +++ b/src/gradient.rs @@ -5,7 +5,6 @@ use markup5ever::{ expanded_name, local_name, namespace_url, ns, ExpandedName, LocalName, Namespace, }; -use crate::bbox::BoundingBox; use crate::coord_units::CoordUnits; use crate::document::{AcquiredNodes, NodeId, NodeStack}; use crate::drawing_ctx::ViewParams; @@ -17,7 +16,7 @@ use crate::node::{CascadedValues, Node, NodeBorrow}; use crate::paint_server::resolve_color; use crate::parsers::{Parse, ParseValue}; use crate::properties::ComputedValues; -use crate::rect::rect_to_transform; +use crate::rect::{rect_to_transform, Rect}; use crate::session::Session; use crate::transform::{Transform, TransformAttribute}; use crate::unit_interval::UnitInterval; @@ -679,12 +678,12 @@ impl Draw for RadialGradient {} impl ResolvedGradient { pub fn to_user_space( &self, - bbox: &BoundingBox, + object_bbox: &Option<Rect>, current_params: &ViewParams, values: &ComputedValues, ) -> Option<UserSpaceGradient> { let units = self.units.0; - let transform = rect_to_transform(&bbox.rect, units).ok()?; + let transform = rect_to_transform(&object_bbox, units).ok()?; let view_params = current_params.with_units(units); let params = NormalizeParams::new(values, &view_params); diff --git a/src/paint_server.rs b/src/paint_server.rs index e9832bd3..07d8dafc 100644 --- a/src/paint_server.rs +++ b/src/paint_server.rs @@ -4,7 +4,6 @@ use std::sync::Arc; use cssparser::Parser; -use crate::bbox::BoundingBox; use crate::document::{AcquiredNodes, NodeId}; use crate::drawing_ctx::ViewParams; use crate::element::Element; @@ -14,6 +13,7 @@ use crate::node::NodeBorrow; use crate::parsers::Parse; use crate::pattern::{ResolvedPattern, UserSpacePattern}; use crate::properties::ComputedValues; +use crate::rect::Rect; use crate::session::Session; use crate::unit_interval::UnitInterval; use crate::util; @@ -242,7 +242,7 @@ impl PaintSource { /// Converts lengths to user-space. pub fn to_user_space( &self, - bbox: &BoundingBox, + object_bbox: &Option<Rect>, current_params: &ViewParams, values: &ComputedValues, ) -> UserSpacePaintSource { @@ -251,7 +251,7 @@ impl PaintSource { PaintSource::SolidColor(c) => UserSpacePaintSource::SolidColor(c), PaintSource::Gradient(ref g, c) => { - match (g.to_user_space(bbox, current_params, values), c) { + match (g.to_user_space(object_bbox, current_params, values), c) { (Some(gradient), c) => UserSpacePaintSource::Gradient(gradient, c), (None, Some(c)) => UserSpacePaintSource::SolidColor(c), (None, None) => UserSpacePaintSource::None, @@ -259,7 +259,7 @@ impl PaintSource { } PaintSource::Pattern(ref p, c) => { - match (p.to_user_space(bbox, current_params, values), c) { + match (p.to_user_space(object_bbox, current_params, values), c) { (Some(pattern), c) => UserSpacePaintSource::Pattern(pattern, c), (None, Some(c)) => UserSpacePaintSource::SolidColor(c), (None, None) => UserSpacePaintSource::None, diff --git a/src/pattern.rs b/src/pattern.rs index 6b1d394c..6841586e 100644 --- a/src/pattern.rs +++ b/src/pattern.rs @@ -3,7 +3,6 @@ use markup5ever::{expanded_name, local_name, namespace_url, ns}; use crate::aspect_ratio::*; -use crate::bbox::BoundingBox; use crate::coord_units::CoordUnits; use crate::document::{AcquiredNode, AcquiredNodes, NodeId, NodeStack}; use crate::drawing_ctx::ViewParams; @@ -308,8 +307,8 @@ impl UnresolvedChildren { } } -fn nonempty_rect_from_bbox(bbox: &BoundingBox) -> Option<Rect> { - match bbox.rect { +fn nonempty_rect(bbox: &Option<Rect>) -> Option<Rect> { + match *bbox { None => None, Some(r) if r.is_empty() => None, Some(r) => Some(r), @@ -338,7 +337,7 @@ impl ResolvedPattern { pub fn to_user_space( &self, - bbox: &BoundingBox, + object_bbox: &Option<Rect>, current_params: &ViewParams, values: &ComputedValues, ) -> Option<UserSpacePattern> { @@ -352,7 +351,7 @@ impl ResolvedPattern { // Create the pattern coordinate system let (width, height, coord_transform) = match self.units { PatternUnits(CoordUnits::ObjectBoundingBox) => { - let bbrect = nonempty_rect_from_bbox(bbox)?; + let bbrect = nonempty_rect(object_bbox)?; ( rect.width() * bbrect.width(), rect.height() * bbrect.height(), @@ -387,7 +386,7 @@ impl ResolvedPattern { } else { match self.content_units { PatternContentUnits(CoordUnits::ObjectBoundingBox) => { - let bbrect = nonempty_rect_from_bbox(bbox)?; + let bbrect = nonempty_rect(object_bbox)?; Transform::new_scale(bbrect.width(), bbrect.height()) } PatternContentUnits(CoordUnits::UserSpaceOnUse) => Transform::identity(), diff --git a/src/text.rs b/src/text.rs index 430ffcc0..0b657518 100644 --- a/src/text.rs +++ b/src/text.rs @@ -830,12 +830,12 @@ impl Draw for Text { let mut text_spans = Vec::new(); for span in layout_spans { let stroke_paint = span.stroke_paint.to_user_space( - &text_bbox, + &text_bbox.rect, &layout_context.view_params, &span.values, ); let fill_paint = span.fill_paint.to_user_space( - &text_bbox, + &text_bbox.rect, &layout_context.view_params, &span.values, ); |