summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFederico Mena Quintero <federico@gnome.org>2022-10-05 21:03:08 -0500
committerFederico Mena Quintero <federico@gnome.org>2022-10-06 19:14:26 -0500
commitf96bb8029313907f7bb1781dc18ed8996b9e78bc (patch)
tree41a043aee9a32151413340d82dc06ce0e0658f0e
parent51bd20e63a38e97eec36d239df7666fa95afc0ec (diff)
downloadlibrsvg-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.rs16
-rw-r--r--src/gradient.rs7
-rw-r--r--src/paint_server.rs8
-rw-r--r--src/pattern.rs11
-rw-r--r--src/text.rs4
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, &params, values),
+ .to_user_space(&bbox.rect, &params, values),
);
let fill_paint_source = Rc::new(
@@ -823,7 +823,7 @@ impl DrawingCtx {
None,
self.session(),
)
- .to_user_space(&bbox, &params, values),
+ .to_user_space(&bbox.rect, &params, 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,
);