[librsvg: 4/9] PaintSource::to_user_space() - take an Option<Rect>, not a whole BoundingBox




commit f96bb8029313907f7bb1781dc18ed8996b9e78bc
Author: Federico Mena Quintero <federico gnome org>
Date:   Wed Oct 5 21:03:08 2022 -0500

    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>

 src/drawing_ctx.rs  | 16 +++++++++++-----
 src/gradient.rs     |  7 +++----
 src/paint_server.rs |  8 ++++----
 src/pattern.rs      | 11 +++++------
 src/text.rs         |  4 ++--
 5 files changed, 25 insertions(+), 21 deletions(-)
---
diff --git a/src/drawing_ctx.rs b/src/drawing_ctx.rs
index 9dd6b66cc..c2b670b5b 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 f0becddaa..6c3e8ff5c 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 e9832bd30..07d8dafc4 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 6b1d394c5..6841586ed 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 430ffcc03..0b6575183 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,
                     );


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